diff --git a/NonLinearSolver/Domain/partDomain.cpp b/NonLinearSolver/Domain/partDomain.cpp index 68cc85828453fa23fb5c71ec759628b30c6c73fe..b5d4483ae0d07644e063f221f9917891c2866c3d 100644 --- a/NonLinearSolver/Domain/partDomain.cpp +++ b/NonLinearSolver/Domain/partDomain.cpp @@ -338,34 +338,6 @@ void partDomain::createIPMap(){ } } }; - -void partDomain::getBlockDissipationIps(std::vector<int>& blockDissipationIPs) const{ - blockDissipationIPs.reserve(blockDissipationIPs.size()+_blockedDissipationPs.size()); - for (std::set<int>::const_iterator it = _blockedDissipationPs.begin(); it != _blockedDissipationPs.end(); it++){ - blockDissipationIPs.push_back(*it); - } -}; -void partDomain::getBrokenIPs(std::vector<int>& brkIps) const{ - brkIps.reserve(brkIps.size() + _brokenIPs.size()); - for (std::set<int>::const_iterator it = _brokenIPs.begin(); it != _brokenIPs.end(); it++){ - brkIps.push_back(*it); - } -}; - -void partDomain::blockDissipationIP(const int ip){ - _blockedDissipationPs.insert(ip); -}; - -void partDomain::clearBlockDissipationIPs(){ - _blockedDissipationPs.clear(); -} -void partDomain::brokenIP(const int ip){ - _brokenIPs.insert(ip); -}; -void partDomain::clearBrokenIPs(){ - _brokenIPs.clear(); -} - #endif //HAVE_MPI void partDomain::initMicroMeshId(){ @@ -426,7 +398,7 @@ void partDomain::computeActiveDissipationAverageStressIncrement(const IPField* i for (groupOfElements::elementContainer::iterator it= g->begin(); it!=g->end(); it++){ MElement* ele= *it; - AllIPState::ipstateElementContainer *vips = ipf->getAips()->getIPstate(ele->getNum()); + const AllIPState::ipstateElementContainer *vips = ipf->getAips()->getIPstate(ele->getNum()); int npts= integBulk->getIntPoints(ele,&GP); for (int i=0; i<npts; i++){ @@ -456,7 +428,7 @@ void partDomain::computeAverageHighOrderStress(const IPField* ipf, STensor33& si if (g->size()>0){ IntPt* GP; const ipFiniteStrain *vipv[256]; - FunctionSpaceBase* space = this->getFunctionSpace(); + const FunctionSpaceBase* space = this->getFunctionSpace(); for (groupOfElements::elementContainer::iterator it= g->begin(); it!=g->end(); it++){ MElement* ele= *it; if(ele->getParent()) ele = ele->getParent(); @@ -510,7 +482,7 @@ void partDomain::computeActiveDissipationCenter(const IPField* ipf, SPoint3& pos // compute from damaging zone for (groupOfElements::elementContainer::iterator it= g->begin(); it!=g->end(); it++){ MElement* ele= *it; - AllIPState::ipstateElementContainer *vips = ipf->getAips()->getIPstate(ele->getNum()); + const AllIPState::ipstateElementContainer *vips = ipf->getAips()->getIPstate(ele->getNum()); int npts= integBulk->getIntPoints(ele,&GP); for (int i=0; i<npts; i++){ const IPStateBase *ips = (*vips)[i]; @@ -539,7 +511,7 @@ void partDomain::computeActiveDissipationAverageStrainIncrement(const IPField* i // compute from damaging zone for (groupOfElements::elementContainer::iterator it= g->begin(); it!=g->end(); it++){ MElement* ele= *it; - AllIPState::ipstateElementContainer *vips = ipf->getAips()->getIPstate(ele->getNum()); + const AllIPState::ipstateElementContainer *vips = ipf->getAips()->getIPstate(ele->getNum()); int npts= integBulk->getIntPoints(ele,&GP); for (int i=0; i<npts; i++){ const IPStateBase *ips = (*vips)[i]; diff --git a/NonLinearSolver/Domain/partDomain.h b/NonLinearSolver/Domain/partDomain.h index bd80b1993dd3f8bdfa70f542b0977e7d5bd91ff7..9c41edc39216d466aa48ff72e63a68ec44df36f6 100644 --- a/NonLinearSolver/Domain/partDomain.h +++ b/NonLinearSolver/Domain/partDomain.h @@ -64,10 +64,6 @@ class partDomain{ std::set<int> _otherRanks; std::set<int> _domainIPBulk; // bulk integration points lie on this domain std::map<int,std::set<int> > _mapIPBulk; // map IP for bulk elements - - // for damage blockage - std::set<int> _blockedDissipationPs; - std::set<int> _brokenIPs; #endif //HAVE_MPI bool _distributedOtherRanks; @@ -179,7 +175,7 @@ public: int getPhysical() const{return _phys;} //check cohesive element insertion, failure - virtual void checkFailure(AllIPState* aips) = 0; + virtual void checkFailure(IPField* ipf) const = 0; virtual void initializeTerms(unknownField *uf,IPField *ip)=0; // alocate the object (new) but is not responsiblefor the delete (the NeumannBC is in charged of the delete) @@ -192,8 +188,9 @@ public: // true is domain has interface terms virtual bool IsInterfaceTerms() const=0; functionSpaceType::whichSpace getFunctionSpaceType() const{return _wsp;} - // can be return const FunctionSpaceBase if the function of this class are declarated const - virtual FunctionSpaceBase* getFunctionSpace() const=0; + + virtual FunctionSpaceBase* getFunctionSpace() =0; + virtual const FunctionSpaceBase* getFunctionSpace() const=0; // some data of BC have to be set by domain virtual FunctionSpaceBase* getSpaceForBC(const nonLinearBoundaryCondition::type bc_type, const nonLinearBoundaryCondition::location bc_location, const int dof_comp,const groupOfElements *groupBC) const=0; // for dirichlet, neumann and initial @@ -294,22 +291,11 @@ public: virtual void createIPMap(); virtual const std::map<int,std::set<int> >& getMapIPBulk() const {return _mapIPBulk;}; virtual const std::set<int>& getDomainIPBulk() const {return _domainIPBulk;}; - - virtual void getBlockDissipationIps(std::vector<int>& blockDissipationIPs) const; - virtual void getBrokenIPs(std::vector<int>& brkIps) const; - virtual void blockDissipationIP(const int ip); - virtual void clearBlockDissipationIPs(); - virtual void brokenIP(const int ip); - virtual void clearBrokenIPs(); #endif //HAVE_MPI virtual bool considerForTimeStep(AllIPState *aips,MElement *e) {return true;}; virtual double computeMeanValueDomain(const int num, const IPField* ipf, double& volume) const; virtual double averagingOnActiveDissipationZone(const int num, const IPField* ipf, double & volume, const IPStateBase::whichState ws = IPStateBase::current) const; virtual void initMicroMeshId(); - virtual void writeDeformationGradient(const IPField* ipf, FILE* file){ - Msg::Info("get deformation to file"); - } - #endif // SWIG }; // class for Dg part domain (pure virtual) @@ -430,10 +416,18 @@ class dgPartDomain : public partDomain{ virtual void createIPState(AllIPState::ipstateContainer& map, const bool *state) const; virtual int getDim() const=0; virtual bool IsInterfaceTerms() const{return true;} - virtual FunctionSpaceBase* getFunctionSpace() const=0; - virtual FunctionSpaceBase* getFunctionSpaceMinus() const=0; - virtual FunctionSpaceBase* getFunctionSpacePlus() const=0; - virtual FunctionSpaceBase* getInterfaceFunctionSpace() const =0; + virtual FunctionSpaceBase* getFunctionSpace() =0; + virtual const FunctionSpaceBase* getFunctionSpace() const=0; + + virtual FunctionSpaceBase* getFunctionSpaceMinus()=0; + virtual const FunctionSpaceBase* getFunctionSpaceMinus() const=0; + + virtual FunctionSpaceBase* getFunctionSpacePlus()=0; + virtual const FunctionSpaceBase* getFunctionSpacePlus() const=0; + + virtual FunctionSpaceBase* getInterfaceFunctionSpace() =0; + virtual const FunctionSpaceBase* getInterfaceFunctionSpace() const =0; + virtual void matrixByPerturbation(const int ibulk, const int iinter, const int ivirt,const double eps=1e-8)=0; virtual void setMaterialLaw(const std::map<int,materialLaw*> &maplaw)=0; virtual materialLaw* getMaterialLaw(){Msg::Error("The law to retrieve is not given on a dgdom"); return NULL;} diff --git a/NonLinearSolver/contact/contactFunctionSpace.h b/NonLinearSolver/contact/contactFunctionSpace.h index 19a8e31d285d0285ba9b855c8742184c6a3c8a4e..fc775177b69687fda0f6085d36daaa69c8ef5ed2 100644 --- a/NonLinearSolver/contact/contactFunctionSpace.h +++ b/NonLinearSolver/contact/contactFunctionSpace.h @@ -34,10 +34,10 @@ template <class T1> class ContactSpaceBase : public FunctionSpaceBase{ } virtual int getId(void) const{return _id;}; - virtual void getKeys(MElement *ele,std::vector<Dof> &keys){ + virtual void getKeys(MElement *ele,std::vector<Dof> &keys) const{ _space->getKeys(ele,keys); } - virtual int getNumKeys(MElement *ele){ + virtual int getNumKeys(MElement *ele) const{ return _space->getNumKeys(ele); } }; @@ -49,12 +49,12 @@ class rigidContactSpaceBase : public ContactSpaceBase<double>{ rigidContactSpaceBase(const int id, FunctionSpace<double> *sp, MVertex *ver) : ContactSpaceBase<double>(id,sp), _gc(ver){} rigidContactSpaceBase(const int id, FunctionSpace<double> *sp, MVertex *ver, const int comp1, const int comp2 = -1, const int comp3 =-1) : ContactSpaceBase<double>(id,sp,comp1,comp2,comp3),_gc(ver){} - virtual void getKeys(MElement *ele,std::vector<Dof> &keys)=0; - virtual int getNumKeys(MElement *ele)=0; - virtual void getKeysOfGravityCenter(std::vector<Dof> &keys)=0; - virtual int getNumKeysOfGravityCenter()=0; - virtual void getKeys(MElement *ele, const int ind, std::vector<Dof> &keys)=0; - virtual int getNumKeys(MElement *ele, int ind)=0; // number key in one component + number of key of GC + virtual void getKeys(MElement *ele,std::vector<Dof> &keys) const=0; + virtual int getNumKeys(MElement *ele) const =0; + virtual void getKeysOfGravityCenter(std::vector<Dof> &keys) const=0; + virtual int getNumKeysOfGravityCenter() const=0; + virtual void getKeys(MElement *ele, const int ind, std::vector<Dof> &keys) const=0; + virtual int getNumKeys(MElement *ele, int ind) const=0; // number key in one component + number of key of GC }; #endif // CONTACTSPACE_H_ diff --git a/NonLinearSolver/field/energyField.cpp b/NonLinearSolver/field/energyField.cpp index 5c43836e0b38e37881f3cd24dbf182848a3f42bc..f307d8f861a58be6c41a8ff118aa6d344ec78e23 100644 --- a/NonLinearSolver/field/energyField.cpp +++ b/NonLinearSolver/field/energyField.cpp @@ -175,7 +175,7 @@ double energeticField::kineticEnergy(MElement *ele, const partDomain *dom) const std::vector<Dof> R; std::vector<double> velocities; std::vector<double> vmass; - FunctionSpaceBase *sp = dom->getFunctionSpace(); + const FunctionSpaceBase *sp = dom->getFunctionSpace(); sp->getKeys(ele,R); int nkeys = sp->getNumKeys(ele); _solver->getStaticDofManager()->getDofValue(R,velocities,nonLinearBoundaryCondition::velocity); diff --git a/NonLinearSolver/internalPoints/IntPtData.h b/NonLinearSolver/internalPoints/IntPtData.h index ca4f4e520556567a424e2c39cafac7b398dad635..b44684a9a696c36f2312ae78ea4018bc261c0d5e 100644 --- a/NonLinearSolver/internalPoints/IntPtData.h +++ b/NonLinearSolver/internalPoints/IntPtData.h @@ -55,10 +55,10 @@ class IntPtData{ return *this; }; - std::vector<ValType>& f(FunctionSpaceBase* space, MElement* ele, IntPt &GP){ + std::vector<ValType>& f(const FunctionSpaceBase* space, MElement* ele, IntPt &GP){ if (!_valEstimated){ _valEstimated = true; - FunctionSpace<T>* spT = dynamic_cast<FunctionSpace<T>*>(space); + const FunctionSpace<T>* spT = dynamic_cast<const FunctionSpace<T>*>(space); if (spT!=NULL){ spT->f(ele,GP.pt[0],GP.pt[1],GP.pt[2],val); }; @@ -66,10 +66,10 @@ class IntPtData{ return val; }; - std::vector<GradType>& gradf(FunctionSpaceBase* space, MElement* ele, IntPt &GP){ + std::vector<GradType>& gradf(const FunctionSpaceBase* space, MElement* ele, IntPt &GP){ if (!_gradEstimated){ _gradEstimated=true; - FunctionSpace<T>* spT = dynamic_cast<FunctionSpace<T>*>(space); + const FunctionSpace<T>* spT = dynamic_cast<const FunctionSpace<T>*>(space); if (spT!=NULL){ spT->gradf(ele,GP.pt[0],GP.pt[1],GP.pt[2],grad); }; @@ -77,10 +77,10 @@ class IntPtData{ return grad; }; - std::vector<HessType>& hessf(FunctionSpaceBase* space, MElement* ele, IntPt &GP){ + std::vector<HessType>& hessf(const FunctionSpaceBase* space, MElement* ele, IntPt &GP){ if (!_hessEstimated){ _hessEstimated = true; - FunctionSpace<T>* spT = dynamic_cast<FunctionSpace<T>*>(space); + const FunctionSpace<T>* spT = dynamic_cast<const FunctionSpace<T>*>(space); if (spT!=NULL){ spT->hessf(ele,GP.pt[0],GP.pt[1],GP.pt[2],hess); }; @@ -88,10 +88,10 @@ class IntPtData{ return hess; }; - std::vector<ThirdDevType>& thirdDevf(FunctionSpaceBase* space, MElement* ele, IntPt &GP){ + std::vector<ThirdDevType>& thirdDevf(const FunctionSpaceBase* space, MElement* ele, IntPt &GP){ if (!_thirdEstimated){ _thirdEstimated = true; - FunctionSpace<T>* spT = dynamic_cast<FunctionSpace<T>*>(space); + const FunctionSpace<T>* spT = dynamic_cast<const FunctionSpace<T>*>(space); if (spT!=NULL){ spT->thirdDevf(ele,GP.pt[0],GP.pt[1],GP.pt[2],third); }; diff --git a/NonLinearSolver/internalPoints/ipField.cpp b/NonLinearSolver/internalPoints/ipField.cpp index 693882a1896f1fc42568769f9be325a024a82b1e..cc2444f8953a2a6413287c0a18267a864147d0a7 100644 --- a/NonLinearSolver/internalPoints/ipField.cpp +++ b/NonLinearSolver/internalPoints/ipField.cpp @@ -230,12 +230,21 @@ void IPField::compute1state(IPStateBase::whichState ws, bool stiff){ } void IPField::checkFailure(){ + #if defined(HAVE_MPI) + if (_solver->isMultiscale() and _solver->rankOnSolver(Msg::GetCommRank())){ + // get data in order to send to other procs + // only new block and broken ips are filled in the group + this->clearBlockDissipationIPs(); + this->clearBrokenIPs(); + } + #endif //MPI + //Msg::Info("checking failure all IP"); //too many output in explicit std::vector<partDomain*>* domainVector = _solver->getDomainVector(); // check failure, cohesive insertion at current time step for (int idom=0; idom < domainVector->size(); idom++){ partDomain* dom = (*domainVector)[idom]; - dom->checkFailure(_AIPS); + dom->checkFailure(this); } #if defined(HAVE_MPI) @@ -248,13 +257,9 @@ void IPField::checkFailure(){ std::set<int> otherRanks; _solver->getOtherRanks(Msg::GetCommRank(),otherRanks); if (otherRanks.size() > 0){ - std::vector<int> brokenIPs; - std::vector<int> blockDissipationIPs; - for (int idom=0; idom< domainVector->size(); idom++){ - (*domainVector)[idom]->getBrokenIPs(brokenIPs); - (*domainVector)[idom]->getBlockDissipationIps(blockDissipationIPs); - } - // send data + std::vector<int> brokenIPs(_brokenIPs.begin(),_brokenIPs.end()); + std::vector<int> blockDissipationIPs(_blockedDissipationPs.begin(),_blockedDissipationPs.end()); + // send data for (std::set<int>::const_iterator it = otherRanks.begin(); it != otherRanks.end(); it++){ int otherRank = *it; int sizeIPData[2]; @@ -479,7 +484,7 @@ double IPField::computeBulkDeformationEnergy(MElement *ele, const partDomain *do double ener =0.; // Jacobian values; std::vector<double> vdetJ(npts); - nlsFunctionSpaceUVW<double>* nlsspace = dynamic_cast<nlsFunctionSpaceUVW<double>*>(dom->getFunctionSpace()); + const nlsFunctionSpaceUVW<double>* nlsspace = dynamic_cast<const nlsFunctionSpaceUVW<double>*>(dom->getFunctionSpace()); if(nlsspace!=NULL) { std::vector<std::vector<TensorialTraits<double>::GradType> > vgradsuvw; @@ -526,7 +531,7 @@ double IPField::computeInterfaceDeformationEnergy(MElement *ele, const dgPartDom double ener =0.; // Jacobian values; std::vector<double> vdetJ(npts); - nlsFunctionSpaceUVW<double>* nlsspace = dynamic_cast<nlsFunctionSpaceUVW<double>*>(dom->getFunctionSpace()); + const nlsFunctionSpaceUVW<double>* nlsspace = dynamic_cast<const nlsFunctionSpaceUVW<double>*>(dom->getFunctionSpace()); if(nlsspace!=NULL) { std::vector<std::vector<TensorialTraits<double>::GradType> > vgradsuvw; @@ -618,7 +623,7 @@ double IPField::computeBulkPlasticEnergy(MElement *ele, const partDomain *dom, c double ener =0.; // Jacobian values; std::vector<double> vdetJ(npts); - nlsFunctionSpaceUVW<double>* nlsspace = dynamic_cast<nlsFunctionSpaceUVW<double>*>(dom->getFunctionSpace()); + const nlsFunctionSpaceUVW<double>* nlsspace = dynamic_cast<const nlsFunctionSpaceUVW<double>*>(dom->getFunctionSpace()); if(nlsspace!=NULL) { std::vector<std::vector<TensorialTraits<double>::GradType> > vgradsuvw; @@ -664,7 +669,7 @@ double IPField::computeInterfacePlasticEnergy(MElement *ele, const dgPartDomain double ener =0.; // Jacobian values; std::vector<double> vdetJ(npts); - nlsFunctionSpaceUVW<double>* nlsspace = dynamic_cast<nlsFunctionSpaceUVW<double>*>(dom->getFunctionSpace()); + const nlsFunctionSpaceUVW<double>* nlsspace = dynamic_cast<const nlsFunctionSpaceUVW<double>*>(dom->getFunctionSpace()); if(nlsspace!=NULL) { std::vector<std::vector<TensorialTraits<double>::GradType> > vgradsuvw; @@ -756,7 +761,7 @@ double IPField::computeBulkDamageEnergy(MElement *ele, const partDomain *dom, co double ener =0.; // Jacobian values; std::vector<double> vdetJ(npts); - nlsFunctionSpaceUVW<double>* nlsspace = dynamic_cast<nlsFunctionSpaceUVW<double>*>(dom->getFunctionSpace()); + const nlsFunctionSpaceUVW<double>* nlsspace = dynamic_cast<const nlsFunctionSpaceUVW<double>*>(dom->getFunctionSpace()); if(nlsspace!=NULL) { std::vector<std::vector<TensorialTraits<double>::GradType> > vgradsuvw; @@ -802,7 +807,7 @@ double IPField::computeInterfaceDamageEnergy(MElement *ele, const dgPartDomain * double ener =0.; // Jacobian values; std::vector<double> vdetJ(npts); - nlsFunctionSpaceUVW<double>* nlsspace = dynamic_cast<nlsFunctionSpaceUVW<double>*>(dom->getFunctionSpace()); + const nlsFunctionSpaceUVW<double>* nlsspace = dynamic_cast<const nlsFunctionSpaceUVW<double>*>(dom->getFunctionSpace()); if(nlsspace!=NULL) { std::vector<std::vector<TensorialTraits<double>::GradType> > vgradsuvw; @@ -893,7 +898,7 @@ double IPField::computeBulkPathFollowingLocalValue(MElement *ele, const partDoma double ener =0.; // Jacobian values; std::vector<double> vdetJ(npts); - nlsFunctionSpaceUVW<double>* nlsspace = dynamic_cast<nlsFunctionSpaceUVW<double>*>(dom->getFunctionSpace()); + const nlsFunctionSpaceUVW<double>* nlsspace = dynamic_cast<const nlsFunctionSpaceUVW<double>*>(dom->getFunctionSpace()); if(nlsspace!=NULL) { std::vector<std::vector<TensorialTraits<double>::GradType> > vgradsuvw; @@ -938,7 +943,7 @@ double IPField::computeInterfacePathFollowingLocalValue(MElement *ele, const dgP double ener =0.; // Jacobian values; std::vector<double> vdetJ(npts); - nlsFunctionSpaceUVW<double>* nlsspace = dynamic_cast<nlsFunctionSpaceUVW<double>*>(dom->getFunctionSpace()); + const nlsFunctionSpaceUVW<double>* nlsspace = dynamic_cast<const nlsFunctionSpaceUVW<double>*>(dom->getFunctionSpace()); if(nlsspace!=NULL) { std::vector<std::vector<TensorialTraits<double>::GradType> > vgradsuvw; @@ -1071,7 +1076,7 @@ int IPField::computeFractureEnergy(MElement *ele, const dgPartDomain *dom,double AllIPState::ipstateElementContainer *vips = _AIPS->getIPstate(ele->getNum()); // Jacobian values; std::vector<double> vdetJ(npts); - nlsFunctionSpaceUVW<double>* nlsspace = dynamic_cast<nlsFunctionSpaceUVW<double>*>(dom->getFunctionSpace()); + const nlsFunctionSpaceUVW<double>* nlsspace = dynamic_cast<const nlsFunctionSpaceUVW<double>*>(dom->getFunctionSpace()); if(nlsspace!=NULL) { std::vector<std::vector<TensorialTraits<double>::GradType> > vgradsuvw; @@ -1454,7 +1459,7 @@ double IPField::getIPcompAndVolume(const partDomain *ef,MElement *ele, const IPS AllIPState::ipstateElementContainer *vips = _AIPS->getIPstate(ele->getNum()); // Jacobian values; std::vector<double> vdetJ(npts); - nlsFunctionSpaceUVW<double>* nlsspace = dynamic_cast<nlsFunctionSpaceUVW<double>*>(ef->getFunctionSpace()); + const nlsFunctionSpaceUVW<double>* nlsspace = dynamic_cast<const nlsFunctionSpaceUVW<double>*>(ef->getFunctionSpace()); if(nlsspace!=NULL) { std::vector<std::vector<TensorialTraits<double>::GradType> > vgradsuvw; @@ -1580,3 +1585,47 @@ void IPField::resetFile(){ viparch[i].openFile(); } }; + + +void IPField::blockDissipationBulkElement(const int elnum){ + _blockedDissipationBulkElements.insert(elnum); +}; + +bool IPField::dissipationIsBlockedBulkElement(const int elnum) const{ + return (_blockedDissipationBulkElements.find(elnum) != _blockedDissipationBulkElements.end()); +}; + +void IPField::brokenBulkElement(const int elnum){ + _brokenBulkElements.insert(elnum); +}; + +bool IPField::bulkElementIsBroken(const int elnum) const{ + return (_brokenBulkElements.find(elnum) != _brokenBulkElements.end()); +}; + +void IPField::brokenInterfaceElement(const int el1, const int el2){ + TwoNum key(el1,el2); + _brokenInterfaceElements.insert(key); +}; + +bool IPField::interfaceElementIsBroken(const int el1, const int el2) const{ + TwoNum key(el1,el2); + return (_brokenInterfaceElements.find(key) != _brokenInterfaceElements.end()); +}; + +#if defined(HAVE_MPI) +void IPField::blockDissipationIP(const int ip){ + _blockedDissipationPs.insert(ip); +}; + +void IPField::clearBlockDissipationIPs(){ + _blockedDissipationPs.clear(); +} +void IPField::brokenIP(const int ip){ + _brokenIPs.insert(ip); +}; +void IPField::clearBrokenIPs(){ + _brokenIPs.clear(); +} + +#endif //HAVE_MPI \ No newline at end of file diff --git a/NonLinearSolver/internalPoints/ipField.h b/NonLinearSolver/internalPoints/ipField.h index 0453385d2fdadcf804742575193ea2663d7be469..88b06e28350769f2c7604544fea7958787b3cc2b 100644 --- a/NonLinearSolver/internalPoints/ipField.h +++ b/NonLinearSolver/internalPoints/ipField.h @@ -11,6 +11,8 @@ // # ifndef _IPFIELD_H_ # define _IPFIELD_H_ + +#ifndef SWIG #include<vector> #include"quadratureRules.h" #include "unknownField.h" @@ -18,7 +20,41 @@ #include "GModel.h" #include "ipstate.h" #include "partDomain.h" -struct archiveIPVariable; +#include "InterfaceKeys.h" + +class TwoNum{ + public: + int small, large; + TwoNum(const int e1, const int e2){ + if (e1 < e2) { + small = e1; + large = e2; + } + else{ + small = e2; + large = e1; + } + } + TwoNum(const TwoNum& src): small(src.small),large(src.large){} + ~TwoNum(){}; + TwoNum& operator = (const TwoNum& other) { + small = other.small; + large = other.large; + return *this; + }; + bool operator < (const TwoNum &other) const{ + if (small < other.small) return true; + if (small > other.small) return false; + if (large < other.large) return true; + return false; + } + bool operator == (const TwoNum &other) const{ + return (small == other.small && large == other.large); + } + +}; +#endif //SWIG + class IPField : public elementsField { public: enum Output { SVM=0,SIG_XX, SIG_YY, SIG_ZZ, SIG_XY, SIG_YZ, SIG_XZ, DAMAGE, PLASTICSTRAIN, GL_EQUIVALENT_STRAIN, @@ -183,6 +219,16 @@ class IPField : public elementsField { nonLinearMechSolver* _solver; // solver to which ipField belongs int _numOfActiveDissipationIPs; int _numOfActiveDissipationIPsReached; + + std::set<TwoNum> _brokenInterfaceElements; //all interface broken element is stored in order to avoid rechecking + std::set<int> _brokenBulkElements; // all broken element is stored in order to avoid rechecking + std::set<int> _blockedDissipationBulkElements; // all broken element is stored in order to avoid rechecking + + #if defined(HAVE_MPI) + // for damage blockage + std::set<int> _blockedDissipationPs; + std::set<int> _brokenIPs; + #endif //HAVE_MPI public : IPField(nonLinearMechSolver* sl, std::vector<ip2archive> &vaip, @@ -191,7 +237,9 @@ class IPField : public elementsField { static std::string ToString(const int i); - AllIPState* getAips() const {return _AIPS;} + AllIPState* getAips() {return _AIPS;} + const AllIPState* getAips() const {return _AIPS;} + const std::vector<partDomain*>& getDomainVector() const; virtual ~IPField(){delete _AIPS;} @@ -370,6 +418,23 @@ class IPField : public elementsField { virtual void checkCritialInterfaceIP(); virtual void resetFile(); + + void blockDissipationBulkElement(const int elnum); // bulk element + bool dissipationIsBlockedBulkElement(const int elnum) const; + + void brokenBulkElement(const int elnum); + bool bulkElementIsBroken(const int elnum) const; + + void brokenInterfaceElement(const int elnum1, const int elnum2); + bool interfaceElementIsBroken(const int elnum1, const int elnum2) const; + + #if defined(HAVE_MPI) + void blockDissipationIP(const int ip); + void clearBlockDissipationIPs(); + void brokenIP(const int ip); + void clearBrokenIPs(); + #endif //HAVE_MPI + #endif // swig }; #endif // IPField diff --git a/NonLinearSolver/internalPoints/ipFiniteStrain.cpp b/NonLinearSolver/internalPoints/ipFiniteStrain.cpp index dba79dcc209d37fa368fa63b0ea55b564b29f118..f078b9e0bf1b3803c55969cc63e8fd1cc49bc7d3 100644 --- a/NonLinearSolver/internalPoints/ipFiniteStrain.cpp +++ b/NonLinearSolver/internalPoints/ipFiniteStrain.cpp @@ -29,27 +29,27 @@ ipFiniteStrain::~ipFiniteStrain(){ } } // get shape function information from ipvariable -std::vector<TensorialTraits<double>::ValType>& ipFiniteStrain::f(FunctionSpaceBase* space, MElement* ele, IntPt &GP) const { +std::vector<TensorialTraits<double>::ValType>& ipFiniteStrain::f(const FunctionSpaceBase* space, MElement* ele, IntPt &GP) const { if (_GPData == NULL){ _GPData = new IntPtData<double>(); }; return _GPData->f(space,ele,GP); }; -std::vector<TensorialTraits<double>::GradType>& ipFiniteStrain::gradf(FunctionSpaceBase* space, MElement* ele, IntPt &GP) const { +std::vector<TensorialTraits<double>::GradType>& ipFiniteStrain::gradf(const FunctionSpaceBase* space, MElement* ele, IntPt &GP) const { if (_GPData == NULL){ _GPData = new IntPtData<double>(); }; return _GPData->gradf(space,ele,GP); }; -std::vector<TensorialTraits<double>::HessType>& ipFiniteStrain::hessf(FunctionSpaceBase* space, MElement* ele, IntPt &GP) const { +std::vector<TensorialTraits<double>::HessType>& ipFiniteStrain::hessf(const FunctionSpaceBase* space, MElement* ele, IntPt &GP) const { if (_GPData == NULL){ _GPData = new IntPtData<double>(); }; return _GPData->hessf(space,ele,GP); }; -std::vector<TensorialTraits<double>::ThirdDevType>& ipFiniteStrain::thirdDevf(FunctionSpaceBase* space, MElement* ele, IntPt &GP) const { +std::vector<TensorialTraits<double>::ThirdDevType>& ipFiniteStrain::thirdDevf(const FunctionSpaceBase* space, MElement* ele, IntPt &GP) const { if (_GPData == NULL){ _GPData = new IntPtData<double>(); }; @@ -64,14 +64,14 @@ double& ipFiniteStrain::getJacobianDeterminant(MElement* ele, IntPt &GP) const{ }; -std::vector<TensorialTraits<double>::ValType>& ipFiniteStrain::f(FunctionSpaceBase* space, MInterfaceElement* ele, IntPt &GP) const { +std::vector<TensorialTraits<double>::ValType>& ipFiniteStrain::f(const FunctionSpaceBase* space, MInterfaceElement* ele, IntPt &GP) const { if (_interfaceGPData == NULL){ _interfaceGPData = new IntPtData<double>(); }; MElement* e = dynamic_cast<MElement*>(ele); return _interfaceGPData->f(space,e,GP); }; -std::vector<TensorialTraits<double>::GradType>& ipFiniteStrain::gradf(FunctionSpaceBase* space, MInterfaceElement* ele, IntPt &GP) const { +std::vector<TensorialTraits<double>::GradType>& ipFiniteStrain::gradf(const FunctionSpaceBase* space, MInterfaceElement* ele, IntPt &GP) const { if (_interfaceGPData == NULL){ _interfaceGPData = new IntPtData<double>(); }; @@ -79,7 +79,7 @@ std::vector<TensorialTraits<double>::GradType>& ipFiniteStrain::gradf(FunctionSp return _interfaceGPData->gradf(space,e,GP); }; -std::vector<TensorialTraits<double>::HessType>& ipFiniteStrain::hessf(FunctionSpaceBase* space, MInterfaceElement* ele, IntPt &GP) const { +std::vector<TensorialTraits<double>::HessType>& ipFiniteStrain::hessf(const FunctionSpaceBase* space, MInterfaceElement* ele, IntPt &GP) const { if (_interfaceGPData == NULL){ _interfaceGPData = new IntPtData<double>(); }; @@ -87,7 +87,7 @@ std::vector<TensorialTraits<double>::HessType>& ipFiniteStrain::hessf(FunctionSp return _interfaceGPData->hessf(space,e,GP); }; -std::vector<TensorialTraits<double>::ThirdDevType>& ipFiniteStrain::thirdDevf(FunctionSpaceBase* space, MInterfaceElement* ele, IntPt &GP) const { +std::vector<TensorialTraits<double>::ThirdDevType>& ipFiniteStrain::thirdDevf(const FunctionSpaceBase* space, MInterfaceElement* ele, IntPt &GP) const { if (_interfaceGPData == NULL){ _interfaceGPData = new IntPtData<double>(); }; diff --git a/NonLinearSolver/internalPoints/ipFiniteStrain.h b/NonLinearSolver/internalPoints/ipFiniteStrain.h index 19ae750e731209ddddaf96e7f42bd1ff40429865..78c943ef5d7b8bbb18aaebb80cf77aedc643a50e 100644 --- a/NonLinearSolver/internalPoints/ipFiniteStrain.h +++ b/NonLinearSolver/internalPoints/ipFiniteStrain.h @@ -26,16 +26,16 @@ class ipFiniteStrain : public IPVariableMechanics{ virtual ~ipFiniteStrain(); // get shape function information from ipvariable - virtual std::vector<TensorialTraits<double>::ValType>& f(FunctionSpaceBase* space, MElement* ele, IntPt &GP) const; - virtual std::vector<TensorialTraits<double>::GradType>& gradf(FunctionSpaceBase* space, MElement* ele, IntPt &GP) const; - virtual std::vector<TensorialTraits<double>::HessType>& hessf(FunctionSpaceBase* space, MElement* ele, IntPt &GP) const; - virtual std::vector<TensorialTraits<double>::ThirdDevType>& thirdDevf(FunctionSpaceBase* space, MElement* ele, IntPt &GP) const; + virtual std::vector<TensorialTraits<double>::ValType>& f(const FunctionSpaceBase* space, MElement* ele, IntPt &GP) const; + virtual std::vector<TensorialTraits<double>::GradType>& gradf(const FunctionSpaceBase* space, MElement* ele, IntPt &GP) const; + virtual std::vector<TensorialTraits<double>::HessType>& hessf(const FunctionSpaceBase* space, MElement* ele, IntPt &GP) const; + virtual std::vector<TensorialTraits<double>::ThirdDevType>& thirdDevf(const FunctionSpaceBase* space, MElement* ele, IntPt &GP) const; virtual double& getJacobianDeterminant(MElement* ele, IntPt &GP) const; - virtual std::vector<TensorialTraits<double>::ValType>& f(FunctionSpaceBase* space, MInterfaceElement* ele, IntPt &GP) const; - virtual std::vector<TensorialTraits<double>::GradType>& gradf(FunctionSpaceBase* space, MInterfaceElement* ele, IntPt &GP) const; - virtual std::vector<TensorialTraits<double>::HessType>& hessf(FunctionSpaceBase* space, MInterfaceElement* ele, IntPt &GP) const; - virtual std::vector<TensorialTraits<double>::ThirdDevType>& thirdDevf(FunctionSpaceBase* space, MInterfaceElement* ele, IntPt &GP) const; + virtual std::vector<TensorialTraits<double>::ValType>& f(const FunctionSpaceBase* space, MInterfaceElement* ele, IntPt &GP) const; + virtual std::vector<TensorialTraits<double>::GradType>& gradf(const FunctionSpaceBase* space, MInterfaceElement* ele, IntPt &GP) const; + virtual std::vector<TensorialTraits<double>::HessType>& hessf(const FunctionSpaceBase* space, MInterfaceElement* ele, IntPt &GP) const; + virtual std::vector<TensorialTraits<double>::ThirdDevType>& thirdDevf(const FunctionSpaceBase* space, MInterfaceElement* ele, IntPt &GP) const; virtual double& getJacobianDeterminant(MInterfaceElement* ele, IntPt &GP) const; diff --git a/NonLinearSolver/internalPoints/ipHardening.cpp b/NonLinearSolver/internalPoints/ipHardening.cpp index 335908094ce6e02b1fdf63a54aca6ac5f69f8d42..e4c86895857edcb14cc98cf9da9ab35951558cb1 100644 --- a/NonLinearSolver/internalPoints/ipHardening.cpp +++ b/NonLinearSolver/internalPoints/ipHardening.cpp @@ -215,6 +215,41 @@ IPVariable * IPLinearExponentialJ2IsotropicHardening::clone() const return new IPLinearExponentialJ2IsotropicHardening(*this); } + + +/* IPLinearFollowedByExponentialJ2IsotropicHardening */ +IPLinearFollowedByExponentialJ2IsotropicHardening::IPLinearFollowedByExponentialJ2IsotropicHardening(): IPJ2IsotropicHardening() +{ +} + +IPLinearFollowedByExponentialJ2IsotropicHardening::IPLinearFollowedByExponentialJ2IsotropicHardening(const IPLinearFollowedByExponentialJ2IsotropicHardening &source) : IPJ2IsotropicHardening(source) +{ +} + +IPLinearFollowedByExponentialJ2IsotropicHardening &IPLinearFollowedByExponentialJ2IsotropicHardening::operator=(const IPVariable &source) +{ + IPJ2IsotropicHardening::operator=(source); + const IPLinearFollowedByExponentialJ2IsotropicHardening* src = dynamic_cast<const IPLinearFollowedByExponentialJ2IsotropicHardening*>(&source); + if(src != NULL) + { + } + return *this; +} + +void IPLinearFollowedByExponentialJ2IsotropicHardening::restart() +{ + IPJ2IsotropicHardening::restart(); +} + +IPVariable * IPLinearFollowedByExponentialJ2IsotropicHardening::clone() const +{ + return new IPLinearFollowedByExponentialJ2IsotropicHardening(*this); +} + + + + + IPPolynomialJ2IsotropicHardening::IPPolynomialJ2IsotropicHardening(): IPJ2IsotropicHardening() { diff --git a/NonLinearSolver/internalPoints/ipHardening.h b/NonLinearSolver/internalPoints/ipHardening.h index cbea2540c76fab71a41d947a7ef88fe38a038206..d4f41c209bbf608fd86b8721b786f013757c120a 100644 --- a/NonLinearSolver/internalPoints/ipHardening.h +++ b/NonLinearSolver/internalPoints/ipHardening.h @@ -147,7 +147,6 @@ class IPSwiftJ2IsotropicHardening : public IPJ2IsotropicHardening class IPLinearExponentialJ2IsotropicHardening : public IPJ2IsotropicHardening { - protected: public: @@ -160,6 +159,24 @@ class IPLinearExponentialJ2IsotropicHardening : public IPJ2IsotropicHardening }; + +/* IPLinearFollowedByExponentialJ2IsotropicHardening */ +class IPLinearFollowedByExponentialJ2IsotropicHardening : public IPJ2IsotropicHardening +{ + protected: + // nothing to add to IPJ2IsotropicHardening basis + public: + IPLinearFollowedByExponentialJ2IsotropicHardening(); + IPLinearFollowedByExponentialJ2IsotropicHardening(const IPLinearFollowedByExponentialJ2IsotropicHardening &source); + virtual IPLinearFollowedByExponentialJ2IsotropicHardening &operator=(const IPVariable &source); + virtual ~IPLinearFollowedByExponentialJ2IsotropicHardening(){} + virtual void restart(); + virtual IPVariable * clone() const; + +}; + + + class IPPolynomialJ2IsotropicHardening : public IPJ2IsotropicHardening{ public: IPPolynomialJ2IsotropicHardening(); diff --git a/NonLinearSolver/internalPoints/ipSMP.h b/NonLinearSolver/internalPoints/ipSMP.h index e9ef771708bb684d323872a2f2449830ff0f0eb9..3b2f0b75e8e2e2a4ea4bb8452c0fda0d4ce1911f 100644 --- a/NonLinearSolver/internalPoints/ipSMP.h +++ b/NonLinearSolver/internalPoints/ipSMP.h @@ -19,7 +19,7 @@ class IPSMP : public IPVariableMechanics//: public IPLinearThermoMechanics //, public: double _SMPEnergy; protected: - mutable STensor3 Fp2,Fp1; + STensor3 Fp2,Fp1; double Sa1,phia1,Sastar1,phiastar1; //double _SMPEnergy; double _thermalEnergy; diff --git a/NonLinearSolver/internalPoints/ipstate.cpp b/NonLinearSolver/internalPoints/ipstate.cpp index 5d66e692a4e88177c83f1dd2f2ae48b8335ea93a..f595d8ddd3f0cf114639852d142982eabfe2f54f 100644 --- a/NonLinearSolver/internalPoints/ipstate.cpp +++ b/NonLinearSolver/internalPoints/ipstate.cpp @@ -461,6 +461,27 @@ AllIPState::ipstateElementContainer* AllIPState::operator[](const long int num) return &(_mapall.find(num)->second); } +const AllIPState::ipstateElementContainer* AllIPState::getIPstate(const long int num) const +{ + + ipstateContainer::const_iterator it = _mapall.find(num); + #ifdef _DEBUG + if(it == _mapall.end()){ + Msg::Error("Try to get an inexisting IPState on rank %d",Msg::GetCommRank()); + return NULL; + } + else + #endif // _DEBUG + { + return &(it->second); + } +} + +const AllIPState::ipstateElementContainer* AllIPState::operator[](const long int num) const +{ + return &(_mapall.find(num)->second); +} + void AllIPState::restart() { for(ipstateContainer::iterator its=_mapall.begin(); its!=_mapall.end();++its) diff --git a/NonLinearSolver/internalPoints/ipstate.h b/NonLinearSolver/internalPoints/ipstate.h index b0a56f25eb0c6df862d9967156e958461d1a2161..3799fd7618883c41277bd728acad320e690c4537 100644 --- a/NonLinearSolver/internalPoints/ipstate.h +++ b/NonLinearSolver/internalPoints/ipstate.h @@ -33,12 +33,12 @@ class IPStateBase{ return *this; } virtual ~IPStateBase(); - + enum whichState{initial, previous, current, temp, activeDissipation}; virtual IPVariable* getState(const whichState wst=IPStateBase::current) const=0; virtual void restart()=0; - virtual void getAllIPVariable(std::vector<IPVariable*>& allIP) const = 0; - + virtual void getAllIPVariable(std::vector<IPVariable*>& allIP) = 0; + virtual void setLocation(const IPVariable::LOCATION loc){ std::vector<IPVariable*> allIP; getAllIPVariable(allIP); @@ -46,7 +46,7 @@ class IPStateBase{ allIP[i]->setLocation(loc); } } - + virtual void setSolver(nonLinearMechSolver* s){ _solver = s; std::vector<IPVariable*> allIP; @@ -70,7 +70,10 @@ class IP1State : public IPStateBase{ virtual IP1State & operator = (const IPStateBase &source); IPVariable* getState(const whichState wst=IPStateBase::current) const; virtual void restart(); - virtual void getAllIPVariable(std::vector<IPVariable*>& allIP) const {allIP.push_back(_current); }; + virtual void getAllIPVariable(std::vector<IPVariable*>& allIP) { + allIP.clear(); + allIP.push_back(_current); + }; }; class IP3State : public IPStateBase{ @@ -90,7 +93,8 @@ class IP3State : public IPStateBase{ virtual IP3State & operator = (const IPStateBase &source); IPVariable* getState(const whichState wst=IPStateBase::current) const; virtual void restart(); - virtual void getAllIPVariable(std::vector<IPVariable*>& allIP) const { + virtual void getAllIPVariable(std::vector<IPVariable*>& allIP) { + allIP.clear(); allIP.push_back(_initial); allIP.push_back(_step1); allIP.push_back(_step2); @@ -114,8 +118,12 @@ class AllIPState{ ~AllIPState(); ipstateElementContainer* getIPstate(const long int num); ipstateElementContainer* operator[](const long int num); + + const ipstateElementContainer* getIPstate(const long int num) const; + const ipstateElementContainer* operator[] (const long int num) const; + const std::vector<partDomain*>& getDomainVector() const {return _domainVector;}; - + void nextStep(); void copy(const IPStateBase::whichState ws1, const IPStateBase::whichState ws2){ for(ipstateContainer::iterator it=_mapall.begin(); it!=_mapall.end();++it){ @@ -131,7 +139,7 @@ class AllIPState{ ipstateContainer* getAIPSContainer() {return &_mapall;}; const ipstateContainer* getAIPSContainer() const {return &_mapall;}; - + ipstateContainer::const_iterator begin() const {return _mapall.begin();}; ipstateContainer::const_iterator end() const {return _mapall.end();}; }; diff --git a/NonLinearSolver/materialLaw/CLengthLaw.cpp b/NonLinearSolver/materialLaw/CLengthLaw.cpp index 31ec9424ee5e863f9ef38f0e8829a5a1d3c39d01..93a3aeaeff7d03de3d2112f44e6da6b588ca5e60 100644 --- a/NonLinearSolver/materialLaw/CLengthLaw.cpp +++ b/NonLinearSolver/materialLaw/CLengthLaw.cpp @@ -11,6 +11,7 @@ // #include "CLengthLaw.h" #include <math.h> +#include "STensorOperations.h" CLengthLaw::CLengthLaw(const int num, const bool init): _num(num), _initialized(init) { @@ -55,16 +56,14 @@ void ZeroCLengthLaw::createIPVariable(IPCLength* &ipcl) const double tol=1.e-10; if(ipcl != NULL) delete ipcl; ipcl = new IPZeroCLength(); - STensor3 &cl = ipcl->getRefToCL(); - cl=0; - for(int i=0; i<3; i++) cl(i,i)=tol; + computeCL(0,*ipcl); } void ZeroCLengthLaw::computeCL(double p, IPCLength &ipcl) const { double tol=1.e-10; STensor3 &cl = ipcl.getRefToCL(); - cl=0; + STensorOperation::zero(cl); for(int i=0; i<3; i++) cl(i,i)=tol; } CLengthLaw * ZeroCLengthLaw::clone() const @@ -99,15 +98,13 @@ void IsotropicCLengthLaw::createIPVariable(IPCLength* &ipcl) const if(ipcl != NULL) delete ipcl; ipcl = new IPIsotropicCLength(); STensor3 &clm = ipcl->getRefToCL(); - clm=0; computeCL(0.,*ipcl); - } void IsotropicCLengthLaw::computeCL(double p, IPCLength &ipcl) const { STensor3 &clm = ipcl.getRefToCL(); - clm=0; + STensorOperation::zero(clm); for(int i=0; i<3; i++) clm(i,i)=cl; } CLengthLaw * IsotropicCLengthLaw::clone() const @@ -147,16 +144,14 @@ void AnisotropicCLengthLaw::createIPVariable(IPCLength* &ipcl) const if(ipcl != NULL) delete ipcl; ipcl = new IPAnisotropicCLength(); - STensor3 &clm = ipcl->getRefToCL(); - clm=0; - computeCL(0.,*ipcl); } void AnisotropicCLengthLaw::computeCL(double p, IPCLength &ipcl) const { STensor3 &clm = ipcl.getRefToCL(); - clm=0; + STensorOperation::zero(clm); + static double fpi = M_PI/180.; static double sq2 = sqrt(2.); static double c1 = cos(euler(0)*fpi); @@ -223,17 +218,14 @@ void VariableIsotropicCLengthLaw::createIPVariable(IPCLength* &ipcl) const if(ipcl != NULL) delete ipcl; ipcl = new IPVariableIsotropicCLength(); - STensor3 &clm = ipcl->getRefToCL(); - clm=0; computeCL(0.,*ipcl); - } void VariableIsotropicCLengthLaw::computeCL(double p, IPCLength &ipcl) const { double lcurrent=0.; STensor3 &clm = ipcl.getRefToCL(); - clm=0; + STensorOperation::zero(clm); if (p <= el){ lcurrent=cl*pow(p/el, nl); @@ -293,17 +285,13 @@ void VariableAnisotropicCLengthLaw::createIPVariable(IPCLength* &ipcl) const if(ipcl != NULL) delete ipcl; ipcl = new IPVariableAnisotropicCLength(); - STensor3 &clm = ipcl->getRefToCL(); - clm=0; - computeCL(0.,*ipcl); } void VariableAnisotropicCLengthLaw::computeCL(double p, IPCLength &ipcl) const { double lcurrent=0.; - STensor3 &clm = ipcl.getRefToCL(); - clm=0; + static double fpi = M_PI/180.; static double sq2 = sqrt(2.); static double c1 = cos(euler(0)*fpi); @@ -328,7 +316,7 @@ void VariableAnisotropicCLengthLaw::computeCL(double p, IPCLength &ipcl) const PT(2,1) = (-c1*s2); PT(2,2) = (c2); - T=0; + STensorOperation::zero(T); if (p <= el){ for(int i=0;i<3;i++) { @@ -344,6 +332,8 @@ void VariableAnisotropicCLengthLaw::computeCL(double p, IPCLength &ipcl) const if(T(i,i) <1.e-10) T(i,i) = 1.e-10; } } + + STensor3 &clm = ipcl.getRefToCL(); clm = PT.transpose(); clm*=T; clm*=PT; diff --git a/NonLinearSolver/materialLaw/DamageLaw.cpp b/NonLinearSolver/materialLaw/DamageLaw.cpp index 47c94bb0170dcdbeb0f8fce3ea2990251507b76f..3176f91e9064a2073df3779d1b19ace8d36fabbf 100644 --- a/NonLinearSolver/materialLaw/DamageLaw.cpp +++ b/NonLinearSolver/materialLaw/DamageLaw.cpp @@ -11,6 +11,7 @@ // #include "DamageLaw.h" #include <math.h> +#include "STensorOperations.h" DamageLaw::DamageLaw(const int num, const bool init): _num(num), _initialized(init), _Dc(0.99999999999) { @@ -81,7 +82,7 @@ void LemaitreChabocheDamageLaw::computeDamage(double p1, double p0, double phiel double DeltaD = 0.; double dDdp = 0.; static STensor3 dDdFe; - dDdFe =0; + STensorOperation::zero(dDdFe); double D=D0; double maxp = maxp0; @@ -180,7 +181,7 @@ void PowerDamageLaw::computeDamage(const double p1, const double p0, double phie double DeltaD(0.); // Variation of D double dDdp(0.); // Partial damage on partial memory variable static STensor3 dDdFe; // Partial damage on elastic strains ??? - dDdFe *= 0; + STensorOperation::zero(dDdFe); double D = D0; // Current new values of damage double maxp = maxp0; // Current new values of memory variable @@ -225,7 +226,7 @@ void PowerDamageLaw::computeDamage(const double p1, const double p0, double phie double DeltaD(0.); // Variation of D double dDdp(0.); // Partial damage on partial memory variable static STensor3 dDdFe; // Partial damage on elastic strains ??? - dDdFe *= 0; + STensorOperation::zero(dDdFe); double D = D0; // Current new values of damage double maxp = maxp0; // Current new values of memory variable @@ -292,7 +293,7 @@ void ExponentialDamageLaw::computeDamage(double p1, double p0, double phiel, con double DeltaD = 0.; double dDdp = 0.; static STensor3 dDdFe; - dDdFe =0; + STensorOperation::zero(dDdFe); double D=D0; double maxp = maxp0; @@ -340,7 +341,7 @@ void ThreeParametersExponentialDamageLaw::computeDamage(double p1, double p0, do double DeltaD = 0.; double dDdp = 0.; static STensor3 dDdFe; - dDdFe =0; + STensorOperation::zero(dDdFe); double D=D0; double maxp = maxp0; @@ -418,7 +419,8 @@ void SimpleSaturateDamageLaw::computeDamage(double p1, double p0, double phiel, double maxp0 = ipvprev.getMaximalP(); double DeltaD = 0.; double dDdp = 0.; - STensor3 dDdFe(0.); + STensor3 dDdFe; + STensorOperation::zero(dDdFe); double D=D0; double maxp = maxp0; @@ -512,7 +514,8 @@ void PowerBrittleDamagelaw::computeDamage(double p1, double p0, double phiel, co double maxp0 = ipvprev.getMaximalP(); // Previous memory variable values double DeltaD(0.); // Variation of D double dDdp(0.); // Partial damage on partial memory variable - STensor3 dDdFe(0.); + STensor3 dDdFe; + STensorOperation::zero(dDdFe); double D = D0; // Current new values of damage double maxp = maxp0; // Current new values of memory variable diff --git a/NonLinearSolver/materialLaw/STensorOperations.cpp b/NonLinearSolver/materialLaw/STensorOperations.cpp index c79929e24cc302a24aa4b3c17cfd38060ab02149..d7ed57f35d639f8d0b3b7cbdbe57d4e14138f3d1 100644 --- a/NonLinearSolver/materialLaw/STensorOperations.cpp +++ b/NonLinearSolver/materialLaw/STensorOperations.cpp @@ -1,5 +1,82 @@ #include "STensorOperations.h" +void STensorOperation::zero(double& a){ + a= 0.; +}; + +void STensorOperation::zero(SVector3& a){ + a(0) = 0.; a(1) = 0.; a(2) = 0.; +}; + +void STensorOperation::zero(STensor3& a){ + a(0,0) = 0.; a(0,1) = 0.; a(0,2) = 0.; + a(1,0) = 0.; a(1,1) = 0.; a(1,2) = 0.; + a(2,0) = 0.; a(2,1) = 0.; a(2,2) = 0.; +}; +void STensorOperation::unity(STensor3& a){ + a(0,0) = 1.; a(0,1) = 0.; a(0,2) = 0.; + a(1,0) = 0.; a(1,1) = 1.; a(1,2) = 0.; + a(2,0) = 0.; a(2,1) = 0.; a(2,2) = 1.; +}; + + +void STensorOperation::diag(STensor3& a, const double s){ + a(0,0) = s; a(0,1) = 0.; a(0,2) = 0.; + a(1,0) = 0.; a(1,1) = s; a(1,2) = 0.; + a(2,0) = 0.; a(2,1) = 0.; a(2,2) = s; +}; + +void STensorOperation::zero(STensor33& a){ + for (int i=0; i<3; i++){ + for (int j=0; j<3; j++){ + for (int k=0; k<3; k++){ + a(i,j,k) = 0.; + } + } + } +}; + +void STensorOperation::zero(STensor43& a){ + for (int i=0; i<3; i++){ + for (int j=0; j<3; j++){ + for (int k=0; k<3; k++){ + for (int l=0; l<3; l++){ + a(i,j,k,l) = 0.; + } + } + } + } +}; +void STensorOperation::zero(STensor53& a){ + for (int i=0; i<3; i++){ + for (int j=0; j<3; j++){ + for (int k=0; k<3; k++){ + for (int l=0; l<3; l++){ + for (int p=0; p<3; p++){ + a(i,j,k,l,p) = 0.; + } + } + } + } + } +}; +void STensorOperation::zero(STensor63& a){ + for (int i=0; i<3; i++){ + for (int j=0; j<3; j++){ + for (int k=0; k<3; k++){ + for (int l=0; l<3; l++){ + for (int p=0; p<3; p++){ + for (int q=0; q<3; q++){ + a(i,j,k,l,p,q) = 0.; + } + } + } + } + } + } +}; + + bool STensorOperation::isnan(const STensor3& a){ for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ diff --git a/NonLinearSolver/materialLaw/STensorOperations.h b/NonLinearSolver/materialLaw/STensorOperations.h index 00423f30906a10706f77a23685acd7b63d1f25e9..7915985562f96b2bc5101f7706a5349bd39d2911 100644 --- a/NonLinearSolver/materialLaw/STensorOperations.h +++ b/NonLinearSolver/materialLaw/STensorOperations.h @@ -2,10 +2,23 @@ #define STENSOROPERATIONS_H_ #include "STensor3.h" +#include "STensor33.h" #include "STensor43.h" +#include "STensor53.h" #include "STensor63.h" namespace STensorOperation{ + void zero(double& a); + void zero(SVector3& a); + void zero(STensor3& a); + void zero(STensor33& a); + void zero(STensor43& a); + void zero(STensor53& a); + void zero(STensor63& a); + + void unity(STensor3& a); + void diag(STensor3& a, const double s); + bool isnan(const STensor3& a); void decomposeDevTr(const STensor3& E, STensor3& devE, double& trE); double determinantSTensor3(const STensor3 &a); diff --git a/NonLinearSolver/materialLaw/cohesiveElasticPotential.cpp b/NonLinearSolver/materialLaw/cohesiveElasticPotential.cpp index 666fdb14bbe00c6853952cb6691bd9c56c09905c..583527138310d99a54768fe4605851769d085572 100644 --- a/NonLinearSolver/materialLaw/cohesiveElasticPotential.cpp +++ b/NonLinearSolver/materialLaw/cohesiveElasticPotential.cpp @@ -8,6 +8,7 @@ // #include "cohesiveElasticPotential.h" +#include "STensorOperations.h" linearCohesiveElasticPotential::linearCohesiveElasticPotential(const int num): cohesiveElasticPotential(num){}; @@ -31,7 +32,8 @@ double linearCohesiveElasticPotential::getPositiveValue(const SVector3& ujump, c if (deltan >=0.){ PoPlus += 0.5*Kp*deltan*deltan; } - SVector3 deltat(ujump); + static SVector3 deltat; + deltat = (ujump); for (int i=0; i< 3; i++){ deltat(i) -= deltan*normal(i); } @@ -54,46 +56,48 @@ void linearCohesiveElasticPotential::constitutivePositive(const SVector3& ujump, for (int i=0; i< 3; i++){ deltat(i) -= deltan*normal(i); } - T *= 0.; for (int i=0; i<3; i++){ + T(i) = beta*beta*Kp*deltat(i); if (deltan >=0.){ T(i) += Kp*deltan*normal(i); } - T(i) += beta*beta*Kp*deltat(i); } if (stiff){ - (*L) *= 0.; static STensor3 I(1.); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ + (*L)(i,j) = beta*beta*Kp*(I(i,j) -normal(i)*normal(j)); if (deltan >=0.){ (*L)(i,j) += Kp*normal(i)*normal(j); } - (*L)(i,j) += beta*beta*Kp*(I(i,j) -normal(i)*normal(j)) ; } } } }; void linearCohesiveElasticPotential::constitutiveNegative(const SVector3& ujump, const SVector3& normal,const double Kp, const double beta, SVector3& T, const bool stiff, STensor3* L) const{ - double deltan = dot(ujump,normal); - T *= 0.; + double deltan = dot(ujump,normal); if (deltan <0.){ for (int i=0; i<3; i++){ T(i) = Kp*deltan*normal(i); } } + else{ + STensorOperation::zero(T); + } if (stiff){ - (*L) *= 0.; if (deltan <0.){ for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ - (*L)(i,j) += beta*beta*Kp*normal(i)*normal(j); + (*L)(i,j) = beta*beta*Kp*normal(i)*normal(j); } } } + else{ + STensorOperation::zero(*L); + } } }; @@ -114,8 +118,7 @@ void linearCohesiveElasticPotential::getEffectiveJump(const SVector3& ujump, con } if (stiff){ - (*deffJumpdUjump)*= 0.; - + STensorOperation::zero(*deffJumpdUjump); for (int i=0; i<3; i++){ (*deffJumpdUjump)(i) += beta*beta*deltat(i)/effJump; if (deltan >=0.){ diff --git a/NonLinearSolver/materialLaw/elasticLaw.cpp b/NonLinearSolver/materialLaw/elasticLaw.cpp index 7f9708a6415f6f994c500f2905479e1529d92110..5b796a41ddeebe08479e7622369f4d0bd674c0a1 100644 --- a/NonLinearSolver/materialLaw/elasticLaw.cpp +++ b/NonLinearSolver/materialLaw/elasticLaw.cpp @@ -182,14 +182,13 @@ linearElasticLaw::linearElasticLaw(const double K, const double mu): elasticLaw( linearElasticLaw::linearElasticLaw(const linearElasticLaw& src): elasticLaw(src){} void linearElasticLaw::constitutive(const STensor3& F, STensor3& P, STensor43& H, const bool stiff) const{ - static const STensor3 E2_(-2.); static STensor3 E; - E =E2_; - E += F; - static STensor3 Ft; - STensorOperation::transposeSTensor3(F,Ft); - E += Ft; - E*= 0.5; + STensorOperation::diag(E,-1.); + for (int i=0; i<3; i++){ + for (int j=0; j<3; j++){ + E(i,j) += 0.5*(F(i,j)+F(j,i)); + } + } double _K = this->getParameter("BULK_MODULUS"); double _mu = this->getParameter("SHEAR_MODULUS"); @@ -206,7 +205,7 @@ void linearElasticLaw::constitutive(const STensor3& F, STensor3& P, STensor43& H P += E; if (stiff){ - H*= 0; + STensorOperation::zero(H); H(0,0,0,0) = lambda + twicemu; H(1,1,0,0) = lambda; H(2,2,0,0) = lambda; @@ -249,25 +248,23 @@ void NeoHookeanElasticLaw::getStress(const STensor3& F, STensor3& P) const{ double lnJ = log(J); double div23 = 2.0/3.0; double J23 = pow(J,div23); + static STensor3 C; //C = FT*F; - C*=0.; for (int i=0; i<3; i++) for (int j=0; j<3;j++) C(i,j) = F(0,i)*F(0,j)+F(1,i)*F(1,j)+F(2,i)*F(2,j); + double trC = C(0,0)+C(1,1)+C(2,2); static STensor3 invF,invFt; STensorOperation::inverseSTensor3(F,invF); STensorOperation::transposeSTensor3(invF,invFt); - //fullMatrix<double> temp(3,3); - //for (int i=0; i<3; i++){ - // for (int j=0; j<3; j++){ - // temp(i,j)= mu/J23*F(i,j)+ (K*lnJ-1.0/3.0*trC*mu/J23)*invF(j,i); - // }; - // }; - // P.setMat(temp); - P=0.; - P.daxpy(F,mu/J23); - P.daxpy(invFt,K*lnJ-1.0/3.0*trC*mu/J23); + + // P = mu/J23*F + (K*lnJ-1.0/3.0*trC*mu/J23)*invFT + double fact = mu/J23; + P= F; + P *= (fact); + fact = K*lnJ-1.0/3.0*trC*mu/J23; + P.daxpy(invFt,fact); }; /*Compute tangent operator by perturbation */ @@ -304,24 +301,23 @@ biLogarithmicElasticLaw::biLogarithmicElasticLaw(const double K, const double mu this->setParameter("BULK_MODULUS",K); this->setParameter("SHEAR_MODULUS",mu); }; -biLogarithmicElasticLaw::biLogarithmicElasticLaw(const biLogarithmicElasticLaw& src): elasticLaw(src),_order(-1){}; +biLogarithmicElasticLaw::biLogarithmicElasticLaw(const biLogarithmicElasticLaw& src): elasticLaw(src){}; void biLogarithmicElasticLaw::constitutive(const STensor3& F, STensor3& P, STensor43& L, const bool stiff) const{ - static STensor3 C, E, Sig; - C*=0.; E*=0.; Sig*=0.; + static STensor3 C; // C = FTF for (int i=0; i<3; i++) for (int j=0; j<3; j++) C(i,j) = F(0,i)*F(0,j)+F(1,i)*F(1,j)+F(2,i)*F(2,j); //this->loga(C,E); - - static STensor43 tmp; + static STensor3 E; + static STensor43 dlogCdC; - STensorOperation::logSTensor3(C,_order,E,&tmp); - + STensorOperation::logSTensor3(C,1,E,&dlogCdC); E*=0.5; + double _K = this->getParameter("BULK_MODULUS"); double _mu = this->getParameter("SHEAR_MODULUS"); double lambda = _K - 2./3.*_mu; @@ -339,8 +335,8 @@ void biLogarithmicElasticLaw::constitutive(const STensor3& F, STensor3& P, STens if (stiff){ static STensor43 H; - H=tmp; - H*=_mu; + H=dlogCdC; + H*= (twicemu); H(0,0,0,0) += lambda; H(1,1,0,0) += lambda; H(2,2,0,0) += lambda; @@ -351,31 +347,7 @@ void biLogarithmicElasticLaw::constitutive(const STensor3& F, STensor3& P, STens H(1,1,2,2) += lambda; H(2,2,2,2) += lambda; - //H(0,0,0,0) = lambda + twicemu; - //H(1,1,0,0) = lambda; - //H(2,2,0,0) = lambda; - //H(0,0,1,1) = lambda; - //H(1,1,1,1) = lambda + twicemu; - //H(2,2,1,1) = lambda; - //H(0,0,2,2) = lambda; - //H(1,1,2,2) = lambda; - //H(2,2,2,2) = lambda + twicemu; - - //H(1,0,1,0) = _mu; - //H(2,0,2,0) = _mu; - //H(0,1,0,1) = _mu; - //H(2,1,2,1) = _mu; - //H(0,2,0,2) = _mu; - //H(1,2,1,2) = _mu; - - //H(0,1,1,0) = _mu; - //H(0,2,2,0) = _mu; - //H(1,0,0,1) = _mu; - //H(1,2,2,1) = _mu; - //H(2,0,0,2) = _mu; - //H(2,1,1,2) = _mu; - - L*=0; + STensorOperation::zero(L); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ @@ -415,10 +387,10 @@ void linearElasticSecondOrderLaw::constitutive(const STensor33& G, STensor33& Q, //Msg::Error("a1 = %e, a2 = %e, a3 = %e, a4 = %e, a5 = %e",a1,a2,a3,a4,a5); - Q*= 0; for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ for (int k=0; k<3; k++){ + Q(i,j,k) = 0.; for (int p=0; p<3; p++){ Q(i,j,k) += a1*(G(p,p,j)*delta(i,k)+G(p,p,k)*delta(i,j)); Q(i,j,k) += 0.5*a2*(G(j,p,p)*delta(i,k)+G(k,p,p)*delta(i,j)+2.*delta(j,k)*G(p,p,i)); @@ -431,7 +403,6 @@ void linearElasticSecondOrderLaw::constitutive(const STensor33& G, STensor33& Q, }; if (stiff){ - J*= 0.; for (int i=0; i<3; i++) for (int j=0; j<3; j++) for (int k=0; k<3; k++) @@ -467,28 +438,27 @@ void linearElasticMindlinLaw::constitutive(const STensor33& G, STensor33& Q, STe double E = this->getParameter("YOUNG_MODULUS"); double le = this->getParameter("LENGTH"); - J *= 0.; - static STensor63 J1(0.), J2(0.), J3(0.), J4(0.); - J1*=(0.); J2*=(0.); J3*=(0.); J4*=(0.); + + static STensor63 J1, J2, J3, J4; for ( int i=0; i<3; i++){ for (int j=0; j<3; j++){ for (int k=0; k<3; k++){ for (int p=0; p<3; p++){ for (int q=0; q<3; q++){ for (int r=0; r<3; r++){ - J1(i,j,k,p,q,r) +=1./6.*((d(i,p)*d(j,q)+d(i,q)*d(j,p))*d(k,r) + + J1(i,j,k,p,q,r) =1./6.*((d(i,p)*d(j,q)+d(i,q)*d(j,p))*d(k,r) + (d(j,p)*d(k,q)+d(j,q)*d(k,p))*d(i,r) + (d(i,p)*d(k,q)+d(i,q)*d(k,p)*d(j,r))) -1./15.*((d(i,j)*d(k,r)+d(j,k)*d(i,r)+d(k,i)*d(j,r))*d(p,q)) -1./15.*((d(i,j)*d(k,p)+d(j,k)*d(i,p)+d(k,i)*d(j,p))*d(q,r)) -1./15.*((d(i,j)*d(k,q)+d(j,k)*d(i,q)+d(k,i)*d(j,q))*d(r,p)); - J2(i,j,k,p,q,r) += 1./12*(e(i,k,q)*e(j,p,r)+e(j,k,q)*e(i,p,r)+e(i,k,p)*e(j,q,r)+e(j,k,p)*e(i,q,r)) + J2(i,j,k,p,q,r) = 1./12*(e(i,k,q)*e(j,p,r)+e(j,k,q)*e(i,p,r)+e(i,k,p)*e(j,q,r)+e(j,k,p)*e(i,q,r)) + 1./12.*(2.*(d(i,p)*d(j,q)+d(i,q)*d(j,p))*d(k,r) - (d(j,p)*d(k,q)+d(j,q)*d(k,p))*d(i,r) - (d(i,p)*d(k,q)+d(i,q)*d(k,p))*d(j,r)); - J3(i,j,k,p,q,r) += -1./12.*(e(i,k,q)*e(j,p,r)+ e(j,k,q)*e(i,p,r)+e(i,k,p)*e(j,q,r)+e(j,k,p)*e(i,q,r)) + J3(i,j,k,p,q,r) = -1./12.*(e(i,k,q)*e(j,p,r)+ e(j,k,q)*e(i,p,r)+e(i,k,p)*e(j,q,r)+e(j,k,p)*e(i,q,r)) -1./8.*((d(i,p)*d(j,k)+d(j,p)*d(i,k))*d(q,r)+ (d(i,q)*d(k,j)+d(j,q)*d(i,k))*d(p,r)) +1./12*(2.*(d(i,p)*d(j,q)+d(i,q)*d(j,p))*d(q,r) - (d(j,p)*d(k,q)+d(j,q)*d(k,p))*d(i,r) @@ -497,7 +467,7 @@ void linearElasticMindlinLaw::constitutive(const STensor33& G, STensor33& Q, STe +(d(i,j)*d(k,p)+d(j,k)*d(i,p)+d(k,i)*d(j,p))*d(q,r) +(d(i,j)*d(q,k)+d(j,k)*d(i,q)+d(k,i)*d(j,k))*d(r,p)); - J4(i,j,k,p,q,r)+= 1./8.*((d(i,k)*d(j,p)+d(j,k)*d(i,p))*d(q,r)+ (d(i,k)*d(j,q)+d(j,k)*d(i,q))*d(p,r)); + J4(i,j,k,p,q,r)= 1./8.*((d(i,k)*d(j,p)+d(j,k)*d(i,p))*d(q,r)+ (d(i,k)*d(j,q)+d(j,k)*d(i,q))*d(p,r)); } } } @@ -514,15 +484,16 @@ void linearElasticMindlinLaw::constitutive(const STensor33& G, STensor33& Q, STe J3*= k3; J4*= k4; - J+= J1; + J= J1; J+= J2; J+= J3; J+= J4; - Q*= 0.; + for ( int i=0; i<3; i++){ for (int j=0; j<3; j++){ for (int k=0; k<3; k++){ + Q(i,j,k) = 0.; for (int p=0; p<3; p++){ for (int q=0; q<3; q++){ for (int r=0; r<3; r++){ @@ -544,16 +515,16 @@ void linearElasticFirstSecondLaw::constitutive(const STensor3& F, const STensor3 b[2] = this->getParameter("B2"); static STensor3 E; + STensorOperation::diag(E,-1.); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ - E(i,j) = 0.5*(F(i,j)+F(j,i)-2.*delta(i,j)); + E(i,j) += 0.5*(F(i,j)+F(j,i)); } } - P*= 0.; - Q*= 0.; for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ + P(i,j) = 0.; for (int p=0; p<3; p++){ P(i,j) += b[p]*G(p,i,j); Q(p,i,j) = b[p]*E(i,j); @@ -561,9 +532,6 @@ void linearElasticFirstSecondLaw::constitutive(const STensor3& F, const STensor3 } }; if (stiff){ - JFG*= 0.; - JGF*= 0.; - for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ for (int k=0; k<3; k++){ diff --git a/NonLinearSolver/materialLaw/elasticLaw.h b/NonLinearSolver/materialLaw/elasticLaw.h index fb1d654e0d11fb484a7427d51374e16a17f47ff2..051f22b7a5a5d6f24796d3f5a36fa8d0035d5472 100644 --- a/NonLinearSolver/materialLaw/elasticLaw.h +++ b/NonLinearSolver/materialLaw/elasticLaw.h @@ -168,8 +168,6 @@ class NeoHookeanElasticLaw : public elasticLaw{ class biLogarithmicElasticLaw : public elasticLaw{ #ifndef SWIG - //void loga(const STensor3& a, STensor3& loga)const; - int _order; public: biLogarithmicElasticLaw(); biLogarithmicElasticLaw(const double K, const double mu); diff --git a/NonLinearSolver/materialLaw/elasticPotential.cpp b/NonLinearSolver/materialLaw/elasticPotential.cpp index 3680e8ee1e6a591f3b6963331356c82c46e451d3..62fad959e354bb7eb7fd52a84d93808d34050efe 100644 --- a/NonLinearSolver/materialLaw/elasticPotential.cpp +++ b/NonLinearSolver/materialLaw/elasticPotential.cpp @@ -30,9 +30,8 @@ smallStrainLinearElasticPotential::smallStrainLinearElasticPotential(const small double smallStrainLinearElasticPotential::get(const STensor3& F) const{ // small strain value static STensor3 E; - E*=0.; + STensorOperation::diag(E,-1.); for (int i=0; i<3; i++){ - E(i,i) -= 1.; for (int j=0; j<3; j++){ E(i,j) += (F(i,j) + F(j,i))*0.5; } @@ -51,16 +50,16 @@ double smallStrainLinearElasticPotential::get(const STensor3& F) const{ }; void smallStrainLinearElasticPotential::constitutive(const STensor3& F, STensor3& P, const bool stiff, STensor43* L) const{ static STensor3 E; - E*=0.; + STensorOperation::diag(E,-1.); for (int i=0; i<3; i++){ - E(i,i) -= 1.; for (int j=0; j<3; j++){ E(i,j) += (F(i,j) + F(j,i))*0.5; } } - P *= 0.; + for (int i=0; i<3;i++){ for (int j=0; j<3; j++){ + P(i,j) = 0.; for (int k=0; k<3; k++){ for (int l=0; l<3; l++){ P(i,j) += _Cel(i,j,k,l)*E(k,l); @@ -100,9 +99,9 @@ void smallStrainLinearElasticPotential::constitutivePositive(const STensor3& F, this->constitutive(F,P,stiff,L); }; void smallStrainLinearElasticPotential::constitutiveNegative(const STensor3& F, STensor3& P, const bool stiff, STensor43* L) const { - P *= 0.; + STensorOperation::zero(P); if (stiff){ - (*L) *= 0.; + STensorOperation::zero(*L); } }; void smallStrainLinearElasticPotential::getLocalPositiveValForNonLocalEquation(const STensor3& F, double& val, const bool stiff, STensor3* DvalDF) const { @@ -119,8 +118,8 @@ largeStrainAnisotropicPotential::largeStrainAnisotropicPotential(const int num, const double Vzy= Vyz*Ez/Ey ; const double D=( 1-Vxy*Vyx-Vzy*Vyz-Vxz*Vzx-2*Vxy*Vyz*Vzx ) / ( Ex*Ey*Ez ); - static STensor43 ElasticityTensor;(0.); - ElasticityTensor*=(0.); + STensor43 ElasticityTensor(0.); + ElasticityTensor(0,0,0,0)=( 1-Vyz*Vzy ) / (Ey*Ez*D ); ElasticityTensor(1,1,1,1)=( 1-Vxz*Vzx ) / (Ex*Ez*D ); ElasticityTensor(2,2,2,2)=( 1-Vyx*Vxy ) / (Ey*Ex*D ); @@ -142,12 +141,11 @@ largeStrainAnisotropicPotential::largeStrainAnisotropicPotential(const int num, ElasticityTensor(0,2,0,2)=MUxz;ElasticityTensor(0,2,2,0)=MUxz; ElasticityTensor(2,0,2,0)=MUxz;ElasticityTensor(2,0,0,2)=MUxz; - static STensor3 R; - R*=(0.); //3x3 rotation matrix + double c1,c2,c3,s1,s2,s3; double s1c2, c1c2; double pi(3.14159265359); - double fpi = pi/180.; + double fpi = pi/180.; c1 = cos(alpha*fpi); s1 = sin(alpha*fpi); @@ -160,7 +158,8 @@ largeStrainAnisotropicPotential::largeStrainAnisotropicPotential(const int num, s1c2 = s1*c2; c1c2 = c1*c2; - + + STensor3 R; //3x3 rotation matrix R(0,0) = c3*c1 - s1c2*s3; R(0,1) = c3*s1 + c1c2*s3; R(0,2) = s2*s3; @@ -212,9 +211,8 @@ largeStrainAnisotropicPotential::largeStrainAnisotropicPotential(const int num, }; double largeStrainAnisotropicPotential::get(const STensor3& F) const{ - static const STensor3 onehalf(-0.5); static STensor3 E; - E=onehalf; + STensorOperation::diag(E,-0.5); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ E(i,j) += 0.5*(F(0,i)*F(0,j)+F(1,i)*F(1,j)+F(2,i)*F(2,j)); @@ -234,18 +232,18 @@ double largeStrainAnisotropicPotential::get(const STensor3& F) const{ return val; }; // elastic potential void largeStrainAnisotropicPotential::constitutive(const STensor3& F, STensor3& P, const bool stiff, STensor43* L) const{ - static const STensor3 onehalf(-0.5); static STensor3 E; - E=onehalf; + STensorOperation::diag(E,-0.5); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ E(i,j) += 0.5*(F(0,i)*F(0,j)+F(1,i)*F(1,j)+F(2,i)*F(2,j)); } } - STensor3 secondPK(0.); + static STensor3 secondPK; for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ + secondPK(i,j) = 0.; for (int k=0; k<3; k++){ for (int l=0; l<3; l++){ secondPK(i,j) += _Cel(i,j,k,l)*E(k,l); @@ -261,7 +259,7 @@ void largeStrainAnisotropicPotential::constitutive(const STensor3& F, STensor3& } if (stiff){ - (*L) *= 0.; + STensorOperation::zero(*L); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ for (int p=0; p<3; p++){ @@ -307,9 +305,9 @@ void largeStrainAnisotropicPotential::constitutivePositive(const STensor3& F, ST this->constitutive(F,P,stiff,L); }; void largeStrainAnisotropicPotential::constitutiveNegative(const STensor3& F, STensor3& P, const bool stiff, STensor43* L) const{ - P *= 0.; + STensorOperation::zero(P); if (stiff){ - (*L)*= 0.; + STensorOperation::zero(*L); } }; void largeStrainAnisotropicPotential::getLocalPositiveValForNonLocalEquation(const STensor3& F, double& val, const bool stiff, STensor3* DvalDF) const{ @@ -325,7 +323,7 @@ biLogarithmicElasticPotential::biLogarithmicElasticPotential(const int num, cons _K = _E/(3.*(1.-2.*_nu)); _mu = _E/(2.*(1.+_nu)); double lambda = _K- 2.*_mu/3.; - static const STensor3 I(1.); + const STensor3 I(1.); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ for (int k=0; k<3; k++){ @@ -344,7 +342,7 @@ biLogarithmicElasticPotential::biLogarithmicElasticPotential(const biLogarithmic double biLogarithmicElasticPotential::get(const STensor3& F) const{ double J = F.determinant(); static STensor3 C, logC; - C*=0.; logC*=0.; + for (int i=0; i<3; i++) for (int j=0; j<3; j++) C(i,j) = F(0,i)*F(0,j)+F(1,i)*F(1,j)+F(2,i)*F(2,j); @@ -360,10 +358,9 @@ double biLogarithmicElasticPotential::get(const STensor3& F) const{ void biLogarithmicElasticPotential::constitutive(const STensor3& F, STensor3& P, const bool stiff, STensor43* L) const{ if (_ByPerturbation){ double potential = get(F); - P *= 0.; + static STensor3 Fp; for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ - static STensor3 Fp; Fp=(F); Fp(i,j) += _tol; double potentialPlus = get(Fp); @@ -372,9 +369,7 @@ void biLogarithmicElasticPotential::constitutive(const STensor3& F, STensor3& P, } if (stiff){ - (*L) *= 0.; - static STensor3 Pp(0.), Fp(0.); - Pp*=(0.); Fp*=(0.); + static STensor3 Pp; for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ Fp = F; @@ -385,14 +380,13 @@ void biLogarithmicElasticPotential::constitutive(const STensor3& F, STensor3& P, (*L)(p,q,i,j) = (Pp(p,q) - P(p,q))/_tol; } } - } + } } } } else{ double J = F.determinant(); static STensor3 C, logC; - C*=0.; logC*=0.; for (int i=0; i<3; i++) for (int j=0; j<3; j++) C(i,j) = F(0,i)*F(0,j)+F(1,i)*F(1,j)+F(2,i)*F(2,j); @@ -400,17 +394,16 @@ void biLogarithmicElasticPotential::constitutive(const STensor3& F, STensor3& P, STensorOperation::inverseSTensor3(C, invC); static STensor43 dlogCdC; - dlogCdC*=(0.); STensorOperation::logSTensor3(C,_order,logC,&dlogCdC); static STensor3 logCdev; double trlogC; STensorOperation::decomposeDevTr(logC, logCdev, trlogC); - static STensor3 Svol(0.), Sdev(0.); - Svol*=(0.); Sdev*=(0.); + static STensor3 Svol, Sdev; for (int i=0; i<3;i++){ for (int j=0; j<3; j++){ Svol(i,j) = _K*log(J)*invC(i,j); + Sdev(i,j) = 0.; for (int k=0; k<3; k++){ Sdev(i,j) += _mu*invC(i,k)*logCdev(k,j); } @@ -424,14 +417,13 @@ void biLogarithmicElasticPotential::constitutive(const STensor3& F, STensor3& P, } if (stiff){ - static STensor43 dSvoldC(0.), dSdevdC(0.); - dSvoldC*=(0.); dSdevdC*=(0.); + static STensor43 dSvoldC, dSdevdC; for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ for (int k=0; k<3; k++){ for (int l=0; l<3; l++){ dSvoldC(i,j,k,l) = 0.5*_K*invC(i,j)*invC(k,l) - 0.5*_K*log(J)*(invC(i,k)*invC(j,l)+invC(i,l)*invC(j,k)); - + dSdevdC(i,j,k,l) = 0.; for (int p=0; p<3; p++){ dSdevdC(i,j,k,l) += -_mu*0.5*(invC(i,k)*invC(p,l)+invC(i,l)*invC(p,k))*logCdev(p,j) +_mu*invC(i,p)*dlogCdC(p,j,k,l) @@ -443,7 +435,7 @@ void biLogarithmicElasticPotential::constitutive(const STensor3& F, STensor3& P, }; - (*L) *= 0.; + STensorOperation::zero(*L); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ for (int p=0; p<3; p++){ @@ -471,10 +463,10 @@ void biLogarithmicElasticPotential::getLocalValForNonLocalEquation(const STensor if (stiff){ (*DvalDF) *= 0.; if (_ByPerturbation){ + static STensor3 Fp; for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ - static STensor3 Fp; - Fp=(F); + Fp=(F); Fp(i,j) += _tol; double valp; getLocalValForNonLocalEquation(Fp,valp,false,NULL); @@ -499,7 +491,6 @@ void biLogarithmicElasticPotential::getLocalValForNonLocalEquation(const STensor double biLogarithmicElasticPotential::getPositiveValue(const STensor3& F) const { double J = F.determinant(); static STensor3 C, logC; - C*=0.; logC*=0.; for (int i=0; i<3; i++) for (int j=0; j<3; j++) C(i,j) = F(0,i)*F(0,j)+F(1,i)*F(1,j)+F(2,i)*F(2,j); @@ -534,17 +525,18 @@ void biLogarithmicElasticPotential::constitutivePositive(const STensor3& F, STen static STensor3 invC; STensorOperation::inverseSTensor3(C, invC); - STensor43 dlogCdC(0.); + static STensor43 dlogCdC; STensorOperation::logSTensor3(C,_order,logC,&dlogCdC); static STensor3 logCdev; double trlogC; STensorOperation::decomposeDevTr(logC, logCdev, trlogC); static STensor3 Svol, Sdev; - Svol*=(0.); Sdev*=(0.); + for (int i=0; i<3;i++){ for (int j=0; j<3; j++){ Svol(i,j) = _K*log(J)*invC(i,j); + Sdev(i,j) = 0.; for (int k=0; k<3; k++){ Sdev(i,j) += _mu*invC(i,k)*logCdev(k,j); } @@ -559,13 +551,12 @@ void biLogarithmicElasticPotential::constitutivePositive(const STensor3& F, STen if (stiff){ static STensor43 dSvoldC, dSdevdC; - dSvoldC*=(0.); dSdevdC*=(0.); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ for (int k=0; k<3; k++){ for (int l=0; l<3; l++){ dSvoldC(i,j,k,l) = 0.5*_K*invC(i,j)*invC(k,l) - 0.5*_K*log(J)*(invC(i,k)*invC(j,l)+invC(i,l)*invC(j,k)); - + dSdevdC(i,j,k,l) = 0.; for (int p=0; p<3; p++){ dSdevdC(i,j,k,l) += -_mu*0.5*(invC(i,k)*invC(p,l)+invC(i,l)*invC(p,k))*logCdev(p,j) +_mu*invC(i,p)*dlogCdC(p,j,k,l) @@ -577,7 +568,7 @@ void biLogarithmicElasticPotential::constitutivePositive(const STensor3& F, STen }; - (*L) *= 0.; + STensorOperation::zero(*L); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ for (int p=0; p<3; p++){ @@ -598,7 +589,6 @@ void biLogarithmicElasticPotential::constitutiveNegative(const STensor3& F, STen double J = F.determinant(); if (J< 1.){ static STensor3 C; - C*=0.; for (int i=0; i<3; i++) for (int j=0; j<3; j++) C(i,j) = F(0,i)*F(0,j)+F(1,i)*F(1,j)+F(2,i)*F(2,j); @@ -617,7 +607,6 @@ void biLogarithmicElasticPotential::constitutiveNegative(const STensor3& F, STen if (stiff){ static STensor43 dSvoldC; - dSvoldC*=(0.); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ for (int k=0; k<3; k++){ @@ -629,7 +618,7 @@ void biLogarithmicElasticPotential::constitutiveNegative(const STensor3& F, STen }; - (*L) *= 0.; + STensorOperation::zero(*L); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ for (int p=0; p<3; p++){ @@ -648,9 +637,9 @@ void biLogarithmicElasticPotential::constitutiveNegative(const STensor3& F, STen } else{ - P *= 0.; + STensorOperation::zero(P); if (stiff){ - (*L) *= 0.; + STensorOperation::zero(*L); } } }; @@ -662,10 +651,10 @@ void biLogarithmicElasticPotential::getLocalPositiveValForNonLocalEquation(const if (stiff){ (*DvalDF) *= 0.; if (_ByPerturbation){ + static STensor3 Fp; for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ - static STensor3 Fp; - Fp=(F); + Fp=(F); Fp(i,j) += _tol; double valp; getLocalPositiveValForNonLocalEquation(Fp,valp,false,NULL); @@ -711,12 +700,13 @@ double NeoHookeanElasticPotential::get(const STensor3& F) const{ double J = F.determinant(); double J2over3= pow(J,2./3.); static STensor3 C; - C*=(0.); for (int i=0; i<3; i++) - for (int j=0; j<3; j++) + for (int j=0; j<3; j++) { + C(i,j) = 0.; for (int k=0; k<3; k++){ C(i,j) += F(k,i)*F(k,j); } + } C *= (1./J2over3); double val = 0.5*_K*log(J)*log(J) + 0.5*_mu*(C.trace()-3.); @@ -725,11 +715,10 @@ double NeoHookeanElasticPotential::get(const STensor3& F) const{ void NeoHookeanElasticPotential::constitutive(const STensor3& F, STensor3& P, const bool stiff, STensor43* L) const{ if (_ByPerturbation){ double potential = get(F); - P *= 0.; + static STensor3 Fp; for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ - static STensor3 Fp; - Fp=(F); + Fp=(F); Fp(i,j) += _tol; double potentialPlus = get(Fp); P(i,j) = (potentialPlus - potential)/_tol; @@ -737,9 +726,8 @@ void NeoHookeanElasticPotential::constitutive(const STensor3& F, STensor3& P, co } if (stiff){ - (*L) *= 0.; - static STensor3 Pp, Fp; - Pp*=(0.), Fp*=(0.); + + static STensor3 Pp; for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ Fp = F; @@ -762,7 +750,6 @@ void NeoHookeanElasticPotential::constitutive(const STensor3& F, STensor3& P, co STensorOperation::inverseSTensor3(F, Finv); static STensor3 C; - C*=(0.); for (int i=0; i<3; i++) for (int j=0; j<3; j++) C(i,j) = (F(0,i)*F(0,j)+F(1,i)*F(1,j)+F(2,i)*F(2,j)); @@ -772,8 +759,7 @@ void NeoHookeanElasticPotential::constitutive(const STensor3& F, STensor3& P, co STensorOperation::inverseSTensor3(C, invC); static const STensor3 I(1.); - static STensor3 Svol(0.), Sdev(0.); - Svol*=(0.); Sdev*=(0.); + static STensor3 Svol, Sdev; for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ Svol(i,j) = _K*logJ*invC(i,j); @@ -790,10 +776,9 @@ void NeoHookeanElasticPotential::constitutive(const STensor3& F, STensor3& P, co if (stiff){ - static STensor43 dSvoldC(0.), dSdevdC(0.); - dSvoldC*=(0.); dSdevdC*=(0.); + static STensor43 dSvoldC, dSdevdC; for (int i=0; i<3; i++){ - for (int j=0; j<3; j++){ + for (int j=0; j<3; j++){ for (int k=0; k<3; k++){ for (int l=0; l<3; l++){ dSvoldC(i,j,k,l) = 0.5*_K*invC(i,j)*invC(k,l) - 0.5*_K*log(J)*(invC(i,k)*invC(j,l)+invC(i,l)*invC(j,k)); @@ -805,7 +790,7 @@ void NeoHookeanElasticPotential::constitutive(const STensor3& F, STensor3& P, co }; }; - (*L) *= 0.; + STensorOperation::zero(*L); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ for (int p=0; p<3; p++){ @@ -831,10 +816,10 @@ void NeoHookeanElasticPotential::getLocalValForNonLocalEquation(const STensor3& if (stiff){ (*DvalDF) *= 0.; if (_ByPerturbation){ + static STensor3 Fp; for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ - static STensor3 Fp; - Fp=(F); + Fp=(F); Fp(i,j) += _tol; double valp; getLocalValForNonLocalEquation(Fp,valp,false,NULL); @@ -861,7 +846,6 @@ double NeoHookeanElasticPotential::getPositiveValue(const STensor3& F) const { double J = F.determinant(); double J2over3= pow(J,2./3.); static STensor3 C; - C*=(0.); for (int i=0; i<3; i++) for (int j=0; j<3; j++) C(i,j) = (F(0,i)*F(0,j)+F(1,i)*F(1,j)+F(2,i)*F(2,j))/J2over3; @@ -888,7 +872,6 @@ void NeoHookeanElasticPotential::constitutivePositive(const STensor3& F, STensor double J2over3= pow(J,2./3.); double logJ = log(J); static STensor3 C; - C*=(0.); for (int i=0; i<3; i++) for (int j=0; j<3; j++) C(i,j) = (F(0,i)*F(0,j)+F(1,i)*F(1,j)+F(2,i)*F(2,j)); @@ -899,7 +882,6 @@ void NeoHookeanElasticPotential::constitutivePositive(const STensor3& F, STensor static const STensor3 I(1.); static STensor3 Spos, Sdev; - Spos*=(0.); Sdev*=(0.); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ @@ -920,23 +902,23 @@ void NeoHookeanElasticPotential::constitutivePositive(const STensor3& F, STensor if (stiff){ static STensor43 dSposdC; - dSposdC*=(0.); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ for (int k=0; k<3; k++){ for (int l=0; l<3; l++){ + dSposdC(i,j,k,l) = -Sdev(i,j)*invC(k,l)/3. - (_mu/J2over3)*invC(i,j)*I(k,l)/3. + + (_mu*trC/(6.*J2over3))*(invC(i,k)*invC(j,l)+invC(i,l)*invC(j,k)); if (J >=1.){ dSposdC(i,j,k,l) += 0.5*_K*invC(i,j)*invC(k,l) - 0.5*_K*log(J)*(invC(i,k)*invC(j,l)+invC(i,l)*invC(j,k)); } - dSposdC(i,j,k,l) += -Sdev(i,j)*invC(k,l)/3. - (_mu/J2over3)*invC(i,j)*I(k,l)/3. + - (_mu*trC/(6.*J2over3))*(invC(i,k)*invC(j,l)+invC(i,l)*invC(j,k)); + }; }; }; }; - (*L) *= 0.; + STensorOperation::zero(*L); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ for (int p=0; p<3; p++){ @@ -958,7 +940,7 @@ void NeoHookeanElasticPotential::constitutiveNegative(const STensor3& F, STensor if (J < 1.){ double logJ = log(J); static STensor3 C; - C*=(0.); + for (int i=0; i<3; i++) for (int j=0; j<3; j++) C(i,j) = (F(0,i)*F(0,j)+F(1,i)*F(1,j)+F(2,i)*F(2,j)); @@ -978,9 +960,9 @@ void NeoHookeanElasticPotential::constitutiveNegative(const STensor3& F, STensor if (stiff){ static STensor43 dSvoldC; - dSvoldC*=(0.); + for (int i=0; i<3; i++){ - for (int j=0; j<3; j++){ + for (int j=0; j<3; j++){ for (int k=0; k<3; k++){ for (int l=0; l<3; l++){ dSvoldC(i,j,k,l) = 0.5*_K*invC(i,j)*invC(k,l)- 0.5*_K*log(J)*(invC(i,k)*invC(j,l)+invC(i,l)*invC(j,k)); @@ -989,7 +971,7 @@ void NeoHookeanElasticPotential::constitutiveNegative(const STensor3& F, STensor }; }; - (*L) *= 0.; + STensorOperation::zero(*L); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ for (int p=0; p<3; p++){ @@ -1007,9 +989,9 @@ void NeoHookeanElasticPotential::constitutiveNegative(const STensor3& F, STensor } } else{ - P *= 0.; + STensorOperation::zero(P); if (stiff){ - (*L) *= 0.; + STensorOperation::zero(*L); } } }; @@ -1021,10 +1003,10 @@ void NeoHookeanElasticPotential::getLocalPositiveValForNonLocalEquation(const ST if (stiff){ (*DvalDF) *= 0.; if (_ByPerturbation){ + static STensor3 Fp; for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ - static STensor3 Fp; - Fp=(F); + Fp=(F); Fp(i,j) += _tol; double valp; getLocalPositiveValForNonLocalEquation(Fp,valp,false,NULL); diff --git a/NonLinearSolver/materialLaw/j2IsotropicHardening.cpp b/NonLinearSolver/materialLaw/j2IsotropicHardening.cpp index 81fbb1a1ea52d5c639c01b3804672f9f9e78f006..b8b8b3e8f5aa04acc7f3201a25dd2bdbe096cddb 100644 --- a/NonLinearSolver/materialLaw/j2IsotropicHardening.cpp +++ b/NonLinearSolver/materialLaw/j2IsotropicHardening.cpp @@ -313,6 +313,84 @@ J2IsotropicHardening * LinearExponentialJ2IsotropicHardening::clone() const return new LinearExponentialJ2IsotropicHardening(*this); } + + +/* LinearExponentialJ2IsotropicHardening */ +LinearFollowedByExponentialJ2IsotropicHardening::LinearFollowedByExponentialJ2IsotropicHardening(const int num, double yield0, + double h1, double pexp, double h2, double hexp2, bool init) : + J2IsotropicHardening(num,yield0,init), _h1(h1), _pexp(pexp), _h2(h2), _hexp2(hexp2) +{ + if(h1 < 0. or h2 < 0. or hexp2 <= 0. or pexp < 0.) Msg::Error("LinearFollowedByExponentialJ2IsotropicHardening :: negative hardening parameters"); +} + +LinearFollowedByExponentialJ2IsotropicHardening::LinearFollowedByExponentialJ2IsotropicHardening(const LinearFollowedByExponentialJ2IsotropicHardening &source) : + J2IsotropicHardening(source) +{ + _h1 = source._h1; + _pexp = source._pexp; + _h2 = source._h2; + _hexp2 = source._hexp2; +} + +LinearFollowedByExponentialJ2IsotropicHardening& LinearFollowedByExponentialJ2IsotropicHardening::operator=(const J2IsotropicHardening &source) +{ + J2IsotropicHardening::operator=(source); + const LinearFollowedByExponentialJ2IsotropicHardening* src = dynamic_cast<const LinearFollowedByExponentialJ2IsotropicHardening*>(&source); + if(src != NULL) + { + _h1 = src->_h1; + _pexp = src->_pexp; + _h2 = src->_h2; + _hexp2 = src->_hexp2; + } + return *this; +} + +void LinearFollowedByExponentialJ2IsotropicHardening::createIPVariable(IPJ2IsotropicHardening* &ipv) const +{ + if(ipv != NULL) delete ipv; + ipv = new IPLinearFollowedByExponentialJ2IsotropicHardening(); +} + +void LinearFollowedByExponentialJ2IsotropicHardening::hardening(double p, IPJ2IsotropicHardening &ipv) const +{ + double R = getYield0(); + double dR(0.), ddR(0.), intR(0.); + if(p < 1.e-16) // Elastic case + { + dR = _h1; + ddR = 0.; + } + else if (p < _pexp) // Plastic case: linear part + { + R += _h1*p; + dR = _h1; + ddR = 0.; + intR = getYield0()*p + 0.5*_h1*p*p; + } + else // Plastic case: exponentional (saturation) part + { + double tmp = exp(-(p-_pexp)/_hexp2); + R += _h1*_pexp + _h2*(1.-tmp); + dR = _h2 * tmp /_hexp2; + ddR = - dR /_hexp2; + // ddR = _h2*exp(-(p-_pexp)/_hexp) * (p-_pexp)/_hexp * -(p-_pexp)/_hexp + _h2*exp(-(p-_pexp)/_hexp) * p/_hexp; + + intR = getYield0()*p; + intR += 0.5*_h1*_pexp*_pexp + _h1*_pexp*(p-_pexp); + intR += _h2*(p-_pexp) + _h2*(tmp-exp(0.)) *_hexp2; + } + ipv.set(R,dR,ddR,intR); +} + +J2IsotropicHardening* LinearFollowedByExponentialJ2IsotropicHardening::clone() const +{ + return new LinearFollowedByExponentialJ2IsotropicHardening(*this); +} + + + + PolynomialJ2IsotropicHardening::PolynomialJ2IsotropicHardening(const int num, double yield0, int order, bool init): J2IsotropicHardening(num,yield0,init),_order(order){ _coefficients.resize(_order+1); diff --git a/NonLinearSolver/materialLaw/j2IsotropicHardening.h b/NonLinearSolver/materialLaw/j2IsotropicHardening.h index 8b009aad3e84174bf4a5b9a0dcc554126d4122c6..df27ae6da533ac284cb2715dd7febd06863edf5a 100644 --- a/NonLinearSolver/materialLaw/j2IsotropicHardening.h +++ b/NonLinearSolver/materialLaw/j2IsotropicHardening.h @@ -19,7 +19,8 @@ class J2IsotropicHardening{ public : enum hardeningname{perfectlyPlasticJ2IsotropicHardening,powerLawJ2IsotropicHardening, exponentialJ2IsotropicHardening, - swiftJ2IsotropicHardening, linearExponentialJ2IsotropicHardening, polynomialJ2IsotropicHardening, + swiftJ2IsotropicHardening, linearExponentialJ2IsotropicHardening, + linearFollowedByExponentialJ2IsotropicHardening, polynomialJ2IsotropicHardening, twoExpJ2IsotropicHaderning, tanhJ2IsotropicHaderning}; protected : int _num; // number of law (must be unique !) @@ -149,6 +150,32 @@ class LinearExponentialJ2IsotropicHardening : public J2IsotropicHardening #endif }; + +class LinearFollowedByExponentialJ2IsotropicHardening : public J2IsotropicHardening +{ + // R = yield0 + h1 * p + // Then when p > p_exp + // R = yield0 + h1 * pexp + h2* (1- exp(-hexp2*(p-pexp))) + protected : + double _h1, _pexp, _h2, _hexp2; + + public: + // constructor + LinearFollowedByExponentialJ2IsotropicHardening(const int num, double yield0, double h1, double pexp, double h2, double hexp2, bool init=true); +#ifndef SWIG + virtual ~LinearFollowedByExponentialJ2IsotropicHardening(){} + LinearFollowedByExponentialJ2IsotropicHardening(const LinearFollowedByExponentialJ2IsotropicHardening &source); + LinearFollowedByExponentialJ2IsotropicHardening& operator=(const J2IsotropicHardening &source); + virtual int getNum() const{return _num;} + virtual hardeningname getType() const{return J2IsotropicHardening::linearFollowedByExponentialJ2IsotropicHardening; }; + virtual void createIPVariable(IPJ2IsotropicHardening* &ipv) const; + virtual void initLaws(const std::map<int,J2IsotropicHardening*> &maplaw) {}; //nothing now, we will see if we use the mapping + virtual void hardening(double p, IPJ2IsotropicHardening &ipv) const; + virtual J2IsotropicHardening * clone() const; +#endif +}; + + class PolynomialJ2IsotropicHardening : public J2IsotropicHardening{ #ifndef SWIG protected: diff --git a/NonLinearSolver/materialLaw/mlaw.h b/NonLinearSolver/materialLaw/mlaw.h index 6b89fd8ad93ecaaa9537107c1b9422db43432fc5..1712d2641d87424164bd7e0c333a1541debf2439 100644 --- a/NonLinearSolver/materialLaw/mlaw.h +++ b/NonLinearSolver/materialLaw/mlaw.h @@ -26,9 +26,11 @@ class materialLaw{ enum matname{linearElasticPlaneStress,linearElasticPlaneStressWithDamage, linearElasticOrthotropicPlaneStress, cohesiveLaw, fracture, nonLinearShell, j2linear, viscoelastic, EOS, transverseIsotropic, transverseIsoCurvature, transverseIsoYarnB, Anisotropic, AnisotropicStoch, nonLocalDamage, vumat, - FSElastic, FSElastoPlastic, numeric, secondOrderElastic, j2smallstrain,nonLocalDamageGurson,nonLocalDamageJ2Hyper, nonLocalDamageIsotropicElasticity,LinearThermoMechanics,J2ThermoMechanics,SMP,LinearElecTherMech, - AnIsotropicElecTherMech, hyperelastic, quadYieldHyper, powerYieldLaw, powerYieldLawWithFailure, nonLocalDamageQuadYieldHyper,nonLocalDamagePowerYieldHyper, - localDamagePowerYieldHyperWithFailure,nonLocalDamagePowerYieldHyperWithFailure,ElecSMP,ThermalConducter,AnIsotropicTherMech, localDamageJ2Hyper,linearElastic}; + numeric, secondOrderElastic, j2smallstrain,nonLocalDamageGurson,nonLocalDamageJ2Hyper, nonLocalDamageIsotropicElasticity, + LinearThermoMechanics,J2ThermoMechanics,SMP,LinearElecTherMech,AnIsotropicElecTherMech, + hyperelastic, powerYieldLaw, powerYieldLawWithFailure,nonLocalDamagePowerYieldHyper, + localDamagePowerYieldHyperWithFailure,nonLocalDamagePowerYieldHyperWithFailure,ElecSMP, + ThermalConducter,AnIsotropicTherMech, localDamageJ2Hyper,linearElastic}; protected : @@ -40,7 +42,7 @@ class materialLaw{ #ifndef SWIG - const nonLinearMechSolver* _macroSolver; // solver + const nonLinearMechSolver* _macroSolver; // solver that this material belongs to public: // constructor @@ -53,7 +55,7 @@ class materialLaw{ virtual matname getType() const=0; virtual void createIPState(IPStateBase* &ips,const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const=0; virtual void initLaws(const std::map<int,materialLaw*> &maplaw)=0; - virtual const bool isInitialized() {return _initialized;} + virtual bool isInitialized() const {return _initialized;} // for explicit scheme it must return sqrt(E/rho) adapted to your case virtual double soundSpeed() const=0; virtual double density() const{return 0.;} @@ -67,13 +69,12 @@ class materialLaw{ virtual double getInitialExtraDofStoredEnergyPerUnitField() const {return 0.;} virtual double getExtraDofStoredEnergyPerUnitField(double T) const {return 0.;} virtual double getCharacteristicLength() const {return 0.;}; - virtual void setMacroSolver(const nonLinearMechSolver* sv){_macroSolver = sv;}; virtual const nonLinearMechSolver* getMacroSolver() const {return _macroSolver;}; virtual bool withEnergyDissipation() const = 0; - // function to define when one IP is broken - virtual bool brokenCheck(IPVariable* ipv) const { return false;} + // function to define when one IP is broken for block dissipation + virtual bool brokenCheck(const IPVariable* ipv) const { return false;} virtual materialLaw* clone() const = 0; #endif }; @@ -84,8 +85,8 @@ class materialLaw2LawsInitializer{ virtual ~materialLaw2LawsInitializer(){} materialLaw2LawsInitializer(const materialLaw2LawsInitializer &source){} virtual void initialBroken(IPStateBase *ips) const=0; - virtual const int bulkLawNumber() const=0; - virtual const int fractureLawNumber() const=0; + virtual int bulkLawNumber() const=0; + virtual int fractureLawNumber() const=0; virtual bool fullBroken(const IPVariable *ipv) const=0; // has to return true if the fracture process is completed // for a given state so it is a ipvariable and not a IPState // used for crack tracking algorithms @@ -108,8 +109,8 @@ template<class Tbulk, class Tfrac>class fractureBy2Laws : public materialLaw2Law _nfrac(source._nfrac), _mbulk(source._mbulk), _mfrac(source._mfrac){} virtual ~fractureBy2Laws(){}; - virtual const int bulkLawNumber() const{return _nbulk;} - virtual const int fractureLawNumber() const{return _nfrac;} + virtual int bulkLawNumber() const{return _nbulk;} + virtual int fractureLawNumber() const{return _nfrac;} virtual const Tbulk* getBulkLaw() const{return _mbulk;} virtual Tbulk* getBulkLaw(){return _mbulk;} virtual const Tfrac* getFractureLaw() const{return _mfrac;} diff --git a/NonLinearSolver/materialLaw/mlawAnIsotropicElecTherMech.cpp b/NonLinearSolver/materialLaw/mlawAnIsotropicElecTherMech.cpp index 87f819b98f13164f5aa797499113d942837965f8..ce1d8edfd0cb333eef9bfd3634a605ac9edd1a34 100644 --- a/NonLinearSolver/materialLaw/mlawAnIsotropicElecTherMech.cpp +++ b/NonLinearSolver/materialLaw/mlawAnIsotropicElecTherMech.cpp @@ -25,7 +25,7 @@ mlawAnIsotropicElecTherMech::mlawAnIsotropicElecTherMech(const int num,const dou mlawAnIsotropicTherMech(num, E, nu, rho, EA, GA, nu_minor, Ax, Ay, Az, alpharot, betarot, gammarot, t0, kx, ky, kz, cp, alphath), _lx(lx),_ly(ly),_lz(lz),_seebeck(seebeck),_v0(v0) { - STensor3 l; + STensor3 l(0.); // to be unifom in DG3D e= l' gradV with l'=-l instead of e=-l gradV l(0,0) = -_lx; l(1,1) = -_ly; @@ -47,15 +47,14 @@ mlawAnIsotropicElecTherMech::mlawAnIsotropicElecTherMech(const int num,const dou } mlawAnIsotropicElecTherMech::mlawAnIsotropicElecTherMech(const mlawAnIsotropicElecTherMech &source) : mlawAnIsotropicTherMech(source), _lx(source._lx), - _ly(source._ly),_lz(source._lz),_seebeck(source._seebeck), _v0(source._v0) + _ly(source._ly),_lz(source._lz),_seebeck(source._seebeck), _v0(source._v0), _l0(source._l0) { - _l0 =source._l0; } mlawAnIsotropicElecTherMech& mlawAnIsotropicElecTherMech::operator=(const materialLaw &source) { mlawAnIsotropicTherMech::operator=(source); - const mlawAnIsotropicElecTherMech* src =static_cast<const mlawAnIsotropicElecTherMech*>(&source); + const mlawAnIsotropicElecTherMech* src =dynamic_cast<const mlawAnIsotropicElecTherMech*>(&source); if(src!=NULL) { _lx = src->_lx; @@ -154,9 +153,9 @@ void mlawAnIsotropicElecTherMech::constitutive( double dseebeckdT=0.; static STensor3 dLdT,dKdT; - dLdT*=0.; - dKdT*=0.; - + STensorOperation::zero(dLdT); + STensorOperation::zero(dKdT); + /* dseebeckdT*=0.; djedV*=0.; djedT*=0.; @@ -175,8 +174,9 @@ void mlawAnIsotropicElecTherMech::constitutive( //large defo static STensor3 _Lref0,_Kref0; - _Lref0*=0.; - _Kref0*=0; + STensorOperation::zero(_Lref0); + STensorOperation::zero(_Kref0); + for(int K = 0; K< 3; K++) { for(int L = 0; L< 3; L++) @@ -286,7 +286,9 @@ void mlawAnIsotropicElecTherMech::constitutive( } static STensor43 dldF,dkdF; - dldF*=0.;dkdF*=0.; + STensorOperation::zero(dldF); + STensorOperation::zero(dkdF); + for(int K = 0; K< 3; K++) { for(int L = 0; L< 3; L++) diff --git a/NonLinearSolver/materialLaw/mlawAnIsotropicTherMech.cpp b/NonLinearSolver/materialLaw/mlawAnIsotropicTherMech.cpp index e1fe3c817a858d4e4434376824c4315ca0506532..5981bfe61dfd95a43e65c00ee91c341771a46db1 100644 --- a/NonLinearSolver/materialLaw/mlawAnIsotropicTherMech.cpp +++ b/NonLinearSolver/materialLaw/mlawAnIsotropicTherMech.cpp @@ -97,7 +97,7 @@ mlawAnIsotropicTherMech::mlawAnIsotropicTherMech(const mlawAnIsotropicTherMech & mlawAnIsotropicTherMech& mlawAnIsotropicTherMech::operator=(const materialLaw &source) { mlawTransverseIsotropic::operator=(source); - const mlawAnIsotropicTherMech* src =static_cast<const mlawAnIsotropicTherMech*>(&source); + const mlawAnIsotropicTherMech* src =dynamic_cast<const mlawAnIsotropicTherMech*>(&source); if(src !=NULL) { _kx = src->_kx; @@ -159,7 +159,7 @@ void mlawAnIsotropicTherMech::constitutive( A.normalize(); static STensor3 C; - C*=0.; + STensorOperation::zero(C); for(int I=0; I<3; I++) for(int J=0; J<3; J++) for(int k=0; k<3; k++) @@ -172,7 +172,7 @@ void mlawAnIsotropicTherMech::constitutive( Siso*=-3.*_K*_alphath*(T-_t0); static SVector3 CA; - CA*=(0.);//double _alphaDilatationI=0.; + STensorOperation::zero(CA);//double _alphaDilatationI=0.; for(int I=0; I<3; I++) for(int J=0; J<3; J++) CA(I) += C(I,J)*A(J); @@ -190,7 +190,8 @@ void mlawAnIsotropicTherMech::constitutive( q1->_elasticEnergy=deformationEnergy(C,A,T); static STensor43 Kalpha; - Kalpha*=(0.); + STensorOperation::zero(Kalpha); + /* tangents */ if(stiff) { @@ -214,7 +215,8 @@ void mlawAnIsotropicTherMech::constitutive( } } } - dPdT*=0.; + STensorOperation::zero(dPdT); + for(int i=0; i<3; i++) for(int J=0; J<3; J++) for(int k=0; k<3; k++) @@ -228,7 +230,7 @@ void mlawAnIsotropicTherMech::constitutive( double Jac= Fn.determinant(); static STensor3 dKdT; - dKdT*=(0.); + STensorOperation::zero(dKdT); dqdF*=0.; // dependency of flux with deformation gradient dwdt= 0.; @@ -239,7 +241,7 @@ void mlawAnIsotropicTherMech::constitutive( static STensor3 _Kref0; double fz; - _Kref0*=0; + STensorOperation::zero(_Kref0); for(int K = 0; K< 3; K++) { for(int L = 0; L< 3; L++) @@ -324,18 +326,18 @@ double mlawAnIsotropicTherMech::deformationEnergy(const STensor3 &C, const SVect double lnJ = log(Jac)/2.; static SVector3 CA; - CA*=(0.); + STensorOperation::zero(CA); for(int I=0; I<3; I++) for(int J=0; J<3; J++) CA(I) += C(I,J)*A(J); double I4= dot(A,CA); static STensor3 CC; - CC=C; - CC*=C; - + STensorOperation::multSTensor3(C,C,CC); + static SVector3 CCA; - CCA*=(0.); + STensorOperation::zero(CCA); + for(int I=0; I<3; I++) for(int J=0; J<3; J++) CCA(I) += CC(I,J)*A(J); diff --git a/NonLinearSolver/materialLaw/mlawAnisotropic.cpp b/NonLinearSolver/materialLaw/mlawAnisotropic.cpp index 691d6749a5ddf297128d04c766c5678319c9dce3..d12b3dbe1468ca4f7753cd837b8ed0939cc590db 100644 --- a/NonLinearSolver/materialLaw/mlawAnisotropic.cpp +++ b/NonLinearSolver/materialLaw/mlawAnisotropic.cpp @@ -26,7 +26,7 @@ mlawAnisotropic::mlawAnisotropic(const int num,const double rho, const double Vzy= Vyz*Ez/Ey ; const double D=( 1-Vxy*Vyx-Vzy*Vyz-Vxz*Vzx-2*Vxy*Vyz*Vzx ) / ( Ex*Ey*Ez ); - STensor43 ElasticityTensor; + STensor43 ElasticityTensor(0.); ElasticityTensor(0,0,0,0)=( 1-Vyz*Vzy ) / (Ey*Ez*D ); ElasticityTensor(1,1,1,1)=( 1-Vxz*Vzx ) / (Ex*Ez*D ); ElasticityTensor(2,2,2,2)=( 1-Vyx*Vxy ) / (Ey*Ex*D ); @@ -48,7 +48,6 @@ mlawAnisotropic::mlawAnisotropic(const int num,const double rho, ElasticityTensor(0,2,0,2)=MUxz;ElasticityTensor(0,2,2,0)=MUxz; ElasticityTensor(2,0,2,0)=MUxz;ElasticityTensor(2,0,0,2)=MUxz; - STensor3 R; //3x3 rotation matrix double c1,c2,c3,s1,s2,s3; double s1c2, c1c2; @@ -66,7 +65,8 @@ mlawAnisotropic::mlawAnisotropic(const int num,const double rho, s1c2 = s1*c2; c1c2 = c1*c2; - + + STensor3 R; //3x3 rotation matrix R(0,0) = c3*c1 - s1c2*s3; R(0,1) = c3*s1 + c1c2*s3; R(0,2) = s2*s3; @@ -188,7 +188,6 @@ void mlawAnisotropic::constitutive(const STensor3& F0,const STensor3& Fn,STensor static STensor3 FnT; STensorOperation::transposeSTensor3(Fn, FnT); - static STensor3 defo; defo=(FnT); // static defo+=Fn; @@ -197,11 +196,11 @@ void mlawAnisotropic::constitutive(const STensor3& F0,const STensor3& Fn,STensor defo(1,1)-=1.; defo(2,2)-=1.; - P*=0.; for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { + P(i,j) = 0.; for(int k=0;k<3;k++) { for(int l=0;l<3;l++) @@ -213,20 +212,20 @@ void mlawAnisotropic::constitutive(const STensor3& F0,const STensor3& Fn,STensor } q1->_elasticEnergy=deformationEnergy(defo,P); - if(stiff) + if(stiff){ Tangent=_ElasticityTensor; + } } double mlawAnisotropic::deformationEnergy(const STensor3& defo) const // If i need to compute sigma { static STensor3 sigma; - sigma*=0.; - //These 'fors' can be avoided with the surcharged function for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { + sigma(i,j) = 0.; for(int k=0;k<3;k++) { for(int l=0;l<3;l++) diff --git a/NonLinearSolver/materialLaw/mlawAnisotropicStoch.cpp b/NonLinearSolver/materialLaw/mlawAnisotropicStoch.cpp index 4f7ff67c009f6e4d7e37de3801e83a19fdf16640..8ddf768367a8579959bcc66d02e2d58ab952207c 100644 --- a/NonLinearSolver/materialLaw/mlawAnisotropicStoch.cpp +++ b/NonLinearSolver/materialLaw/mlawAnisotropicStoch.cpp @@ -98,32 +98,33 @@ mlawAnisotropicStoch::mlawAnisotropicStoch(const mlawAnisotropicStoch &source) : mlawAnisotropicStoch& mlawAnisotropicStoch::operator=(const materialLaw &source) { materialLaw::operator=(source); - const mlawAnisotropicStoch* src =static_cast<const mlawAnisotropicStoch*>(&source); - _ElasticityTensor = src->_ElasticityTensor; - _rho = src->_rho; - _poissonMax = src->_poissonMax; - _alpha = src->_alpha; - _beta = src->_beta; - _gamma = src->_gamma; - - _ExMat = src->_ExMat; - _EyMat = src->_EyMat; - _EzMat = src->_EzMat; - - _VxyMat = src->_VxyMat; - _VxzMat = src->_VxzMat; - _VyzMat = src->_VyzMat; - - _MUxyMat = src->_MUxyMat; - _MUxzMat = src->_MUxzMat; - _MUyzMat = src->_MUyzMat; - - _dx = src->_dx; - _dy = src->_dy; - _OrigX = src->_OrigX; - _OrigY = src->_OrigY; - _intpl = src->_intpl; - + const mlawAnisotropicStoch* src =dynamic_cast<const mlawAnisotropicStoch*>(&source); + if (src != NULL){ + _ElasticityTensor = src->_ElasticityTensor; + _rho = src->_rho; + _poissonMax = src->_poissonMax; + _alpha = src->_alpha; + _beta = src->_beta; + _gamma = src->_gamma; + + _ExMat = src->_ExMat; + _EyMat = src->_EyMat; + _EzMat = src->_EzMat; + + _VxyMat = src->_VxyMat; + _VxzMat = src->_VxzMat; + _VyzMat = src->_VyzMat; + + _MUxyMat = src->_MUxyMat; + _MUxzMat = src->_MUxzMat; + _MUyzMat = src->_MUyzMat; + + _dx = src->_dx; + _dy = src->_dy; + _OrigX = src->_OrigX; + _OrigY = src->_OrigY; + _intpl = src->_intpl; + } return *this; } @@ -135,7 +136,8 @@ void mlawAnisotropicStoch::AnisoElasticTensor(const double Ex, const double Ey, double Vzy= Vyz*Ez/Ey; double D=( 1.0-Vxy*Vyx-Vzy*Vyz-Vxz*Vzx-2.0*Vxy*Vyz*Vzx ) / ( Ex*Ey*Ez ); - STensor43 ElasticityTensor; + static STensor43 ElasticityTensor; + STensorOperation::zero(ElasticityTensor); ElasticityTensor(0,0,0,0)=( 1-Vyz*Vzy ) / (Ey*Ez*D ); ElasticityTensor(1,1,1,1)=( 1-Vxz*Vzx ) / (Ex*Ez*D ); ElasticityTensor(2,2,2,2)=( 1-Vyx*Vxy ) / (Ey*Ex*D ); @@ -157,7 +159,7 @@ void mlawAnisotropicStoch::AnisoElasticTensor(const double Ex, const double Ey, ElasticityTensor(0,2,0,2)=MUxz; ElasticityTensor(0,2,2,0)=MUxz; ElasticityTensor(2,0,2,0)=MUxz; ElasticityTensor(2,0,0,2)=MUxz; - STensor3 R; //3x3 rotation matrix + double c1,c2,c3,s1,s2,s3; double s1c2, c1c2; double pi(3.14159265359); @@ -174,7 +176,8 @@ void mlawAnisotropicStoch::AnisoElasticTensor(const double Ex, const double Ey, s1c2 = s1*c2; c1c2 = c1*c2; - + + static STensor3 R; //3x3 rotation matrix R(0,0) = c3*c1 - s1c2*s3; R(0,1) = c3*s1 + c1c2*s3; R(0,2) = s2*s3; @@ -213,9 +216,13 @@ void mlawAnisotropicStoch::createIPState(IPStateBase* &ips,const bool* state_,co const MInterfaceElement *iele = dynamic_cast<const MInterfaceElement*>(ele); if(iele==NULL) inter=false; - SPoint3 pt_Global; + static SPoint3 pt_Global; ele->pnt(GP[gpt].pt[0],GP[gpt].pt[1],GP[gpt].pt[2],pt_Global); - SVector3 GaussP(pt_Global); + static SVector3 GaussP; + GaussP[0] = pt_Global[0]; + GaussP[1] = pt_Global[1]; + GaussP[2] = pt_Global[2]; + IPVariable* ipvi = new IPAnisotropicStoch(GaussP, _ExMat, _EyMat, _EzMat, _VxyMat, _VxzMat, _VyzMat, _MUxyMat, _MUxzMat, _MUyzMat, _dx, _dy, _OrigX, _OrigY, _intpl); @@ -268,7 +275,7 @@ void mlawAnisotropicStoch::constitutive(const STensor3& F0,const STensor3& Fn,ST static STensor3 FnT; STensorOperation::transposeSTensor3(Fn,FnT); static STensor43 ElastTensor; - ElastTensor*=0.; + STensorOperation::zero(ElastTensor); this->AnisoElasticTensor(q0->getEx(), q0->getEy(), q0->getEz(), q0->getVxy(), q0->getVxz(), q0->getVyz(), q0->getMUxy(), q0->getMUxz(), q0->getMUyz(), _alpha, _beta, _gamma, ElastTensor); diff --git a/NonLinearSolver/materialLaw/mlawCohesive.cpp b/NonLinearSolver/materialLaw/mlawCohesive.cpp index 8fad1fe526dcc76abb00e14098ddd2e7726843fc..a2baa1899fad43a1b549653952d57393316791ec 100644 --- a/NonLinearSolver/materialLaw/mlawCohesive.cpp +++ b/NonLinearSolver/materialLaw/mlawCohesive.cpp @@ -77,15 +77,14 @@ void generalElasticDamageCohesiveLaw::constitutive(const SVector3& jump, const S double energyPos = _elasticPotential->getPositiveValue(jump,normDir,Kp,beta); double energyNeg = _elasticPotential->getNegativeValue(jump,normDir,Kp,beta); - SVector3 TPos(0.), TNeg(0.); - STensor3 dTPosDjump(0.), dTNegDjump(0.); - + static SVector3 TPos, TNeg; + static STensor3 dTPosDjump, dTNegDjump; _elasticPotential->constitutivePositive(jump,normDir,Kp,beta,TPos,stiff,&dTPosDjump); _elasticPotential->constitutiveNegative(jump,normDir,Kp,beta,TNeg,stiff,&dTNegDjump); double delta(0.); - SVector3 DdeltaDjump(0.); + static SVector3 DdeltaDjump; _elasticPotential->getEffectiveJump(jump,normDir,Kp,beta,delta,stiff,&DdeltaDjump); // compute maximal effective opening @@ -181,8 +180,8 @@ void BiLinearCohesiveLaw::createIPState(IPStateBase* &ips,const bool* state_,con void BiLinearCohesiveLaw::constitutive(const SVector3& jump, const SVector3& normDir, const IPCohesive* q0, IPCohesive* q, SVector3& T, const bool stiff, STensor3& DTDjump) const{ - // take the same internal state as previous - q->operator=(*dynamic_cast<const IPVariable*>(q0)); + // take the same internal state as previous + q->operator=(*dynamic_cast<const IPVariable*>(q0)); // estimation of current kinematic variables // normal part @@ -198,7 +197,7 @@ void BiLinearCohesiveLaw::constitutive(const SVector3& jump, const SVector3& nor } // tangential part - SVector3 deltat(0.); + static SVector3 deltat; for (int i=0; i<3; i++){ deltat(i) = jump(i) - deltan*normDir(i); } @@ -207,7 +206,7 @@ void BiLinearCohesiveLaw::constitutive(const SVector3& jump, const SVector3& nor const double& beta = q->getConstRefToMixedModeParameter(); double betaSq = beta*beta; - // estimation of the effective cohesive opening + // estimation of the effective cohesive opening double delta = sqrt(alp*deltan*deltan + betaSq*deltatSq); // compute maximal effective opening @@ -217,9 +216,9 @@ void BiLinearCohesiveLaw::constitutive(const SVector3& jump, const SVector3& nor // compute damage const double& delta0 = q->getConstRefToEffectiveJumpDamageOnset(); - const double& Kp = q->getConstRefToInitialPenality(); - const double& deltac = q->getConstRefToCriticalEffectiveJump(); - const double& sigmac = q->getConstRefToCriticalEffectiveStress(); + const double& Kp = q->getConstRefToInitialPenality(); + const double& deltac = q->getConstRefToCriticalEffectiveJump(); + const double& sigmac = q->getConstRefToCriticalEffectiveStress(); double& D = q->getRefToCohesiveDamage(); const double& Dprev = q0->getConstRefToCohesiveDamage(); @@ -230,7 +229,7 @@ void BiLinearCohesiveLaw::constitutive(const SVector3& jump, const SVector3& nor _damageLaw->computeDamage(delta0,deltac,deltamaxPrev,deltamax,Dprev,D, stiff, dDDdelta); // parameters need to estimate for current step - double& sigmamax = q->getRefToMaximalEffectiveStress(); + double& sigmamax = q->getRefToMaximalEffectiveStress(); sigmamax = (1-D)*Kp*deltamax; if (D > 0.9999999999){ @@ -265,7 +264,9 @@ void BiLinearCohesiveLaw::constitutive(const SVector3& jump, const SVector3& nor if (stiff){ DTDjump *= 0.; // derivative in respect to jump - STensor3 DdeltatDjump(1.); + static STensor3 DdeltatDjump; + STensorOperation::diag(DdeltatDjump,1.); + for(int i =0; i<3; i++){ for(int j=0; j<3; j++){ DdeltatDjump(i,j) -= normDir(i)*normDir(j); @@ -291,7 +292,9 @@ void BiLinearCohesiveLaw::constitutive(const SVector3& jump, const SVector3& nor // derivative in resepect to damage if (dDDdelta > 0){ - SVector3 dTdD(0.); + static SVector3 dTdD; + STensorOperation::zero(dTdD); + for (int i=0; i<3; i++){ dTdD(i) -= betaSq*Kp*deltat(i); if (q0->ifTension()){ @@ -299,7 +302,8 @@ void BiLinearCohesiveLaw::constitutive(const SVector3& jump, const SVector3& nor } } - SVector3 DdeltaDjump(0.); + static SVector3 DdeltaDjump; + STensorOperation::zero(DdeltaDjump); for (int i=0; i<3; i++){ if (q0->ifTension()){ DdeltaDjump(i) += (deltan/delta)*normDir(i); diff --git a/NonLinearSolver/materialLaw/mlawElecSMP.cpp b/NonLinearSolver/materialLaw/mlawElecSMP.cpp index 551b11a2b1437139ce0e509a55419dd131b4544b..15919749ca440f095978ba43ee4ef394027a1610 100644 --- a/NonLinearSolver/materialLaw/mlawElecSMP.cpp +++ b/NonLinearSolver/materialLaw/mlawElecSMP.cpp @@ -115,17 +115,17 @@ mlawElecSMP::mlawElecSMP(const int num,const double rho, const double alpha, con mlawElecSMP::mlawElecSMP(const mlawElecSMP &source) : mlawSMP(source),_lx(source._lx), - _ly(source._ly),_lz(source._lz),_seebeck(source._seebeck),_v0(source._v0) - + _ly(source._ly),_lz(source._lz),_seebeck(source._seebeck),_v0(source._v0), + _l0(source._l0) { - _l0 =source._l0; + } mlawElecSMP& mlawElecSMP::operator=(const materialLaw &source) { mlawSMP::operator=(source); - const mlawElecSMP* src =static_cast<const mlawElecSMP*>(&source); + const mlawElecSMP* src =dynamic_cast<const mlawElecSMP*>(&source); if(src !=NULL) { _lx = src->_lx; @@ -210,70 +210,71 @@ void mlawElecSMP::constitutive( const bool stiff )const { - mlawSMP::constitutive( F0, Fn,P,(const IPSMP *)q0, (IPSMP *)q1,Tangent, T0, T, gradT, fluxT, dPdT, dqdgradT, dqdT, dqdF, stiff, w, dwdt, dwdf) ; - static STensor3 cauchyDil; - static STensor3 Fninv; - cauchyDil*=0.;Fninv*=0.; - Fninv = Fn.invert(); - double Jac= Fn.determinant(); + mlawSMP::constitutive( F0, Fn,P,(const IPSMP *)q0, (IPSMP *)q1,Tangent, T0, T, gradT, fluxT, dPdT, dqdgradT, dqdT, dqdF, stiff, w, dwdt, dwdf) ; + static STensor3 cauchyDil; + static STensor3 Fninv; + STensorOperation::zero(cauchyDil); STensorOperation::zero(Fninv); + + STensorOperation::inverseSTensor3(Fn, Fninv); + double Jac= Fn.determinant(); double dseebeckdT=0.; static STensor3 dLdT; - - dLdT*=0.; - dseebeckdT*=0.; - djedV*=0.; - djedT*=0.; - dqdV*=0.; - // djedF*=0.; - dPdV*=0.; - dqdgradV*=0.;//dqdgradT=0.; - dwdf*=0.; - djedF*=0.;djydF*=0.; - fluxjy*=0.; - djydgradT*=0.;djydgradV*=0.; djydV*=0.; djydT*=0.; - jy1*=0.;djy1dT*=0.;djy1dV*=0.; djy1dF*=0.; + STensorOperation::zero(dLdT); + STensorOperation::zero(djedV); + STensorOperation::zero(djedT); + STensorOperation::zero(dqdV); + STensorOperation::zero(dPdV); + STensorOperation::zero(dqdgradV); + STensorOperation::zero(dwdf); + STensorOperation::zero(djedF); STensorOperation::zero(djydF); + STensorOperation::zero(fluxjy); + STensorOperation::zero(djydgradT); STensorOperation::zero(djydgradV); STensorOperation::zero(djydV); STensorOperation::zero(djydT); + STensorOperation::zero(jy1); STensorOperation::zero(djy1dT); STensorOperation::zero(djy1dV); STensorOperation::zero(djy1dF); - //modified - l10*=0.;l20*=0.;k10*=0.;k20*=0.;dl10dT*=0.;dl20dT*=0.;dk10dT*=0.;dK20dT*=0.;dl20dv*=0.;dk10dv*=0.;;dl10dF*=0.;dl20dF*=0.;dk10dF*=0.;dk20dF*=0.; + STensorOperation::zero(l10); STensorOperation::zero(l20); STensorOperation::zero(k10); + STensorOperation::zero(k20); STensorOperation::zero(dl10dT); STensorOperation::zero(dl20dT); + STensorOperation::zero(dk10dT); STensorOperation::zero(dK20dT); STensorOperation::zero(dl20dv); + STensorOperation::zero(dk10dv); STensorOperation::zero(dl10dF); STensorOperation::zero(dl20dF); STensorOperation::zero(dk10dF); + STensorOperation::zero(dk20dF); //large defo static STensor3 _Lref0,_Kref0; - _Lref0*=0.;_Kref0*=0.; - for(int K = 0; K< 3; K++) - { - for(int L = 0; L< 3; L++) - { - for(int i = 0; i< 3; i++) - { - for(int j = 0; j< 3; j++) - { - _Lref0(K,L) += Fninv(K,i)*_l0(i,j)*Fninv(L,j); - _Kref0(K,L) += Fninv(K,i)*_k0(i,j)*Fninv(L,j); - } - } - } - } + STensorOperation::zero(_Lref0); STensorOperation::zero(_Kref0); + for(int K = 0; K< 3; K++) + { + for(int L = 0; L< 3; L++) + { + for(int i = 0; i< 3; i++) + { + for(int j = 0; j< 3; j++) + { + _Lref0(K,L) += Fninv(K,i)*_l0(i,j)*Fninv(L,j); + _Kref0(K,L) += Fninv(K,i)*_k0(i,j)*Fninv(L,j); + } + } + } + } - for(int i = 0; i< 3; i++) - { - for(int j = 0; j< 3; j++) - { - l10(i,j) = -_Lref0(i,j)*T*Jac; - l20(i,j) = -_Lref0(i,j)*(V*T+_seebeck*T*T)*Jac; - k10(i,j) = -_Kref0(i,j)*T*T*Jac- _seebeck*_Lref0(i,j)*T*T*V*Jac-pow(_seebeck,2)*_Lref0(i,j)*pow(T,3)*Jac; - k20(i,j) = -_seebeck*T*T*_Lref0(i,j)*Jac ; + for(int i = 0; i< 3; i++) + { + for(int j = 0; j< 3; j++) + { + l10(i,j) = -_Lref0(i,j)*T*Jac; + l20(i,j) = -_Lref0(i,j)*(V*T+_seebeck*T*T)*Jac; + k10(i,j) = -_Kref0(i,j)*T*T*Jac- _seebeck*_Lref0(i,j)*T*T*V*Jac-pow(_seebeck,2)*_Lref0(i,j)*pow(T,3)*Jac; + k20(i,j) = -_seebeck*T*T*_Lref0(i,j)*Jac ; - jy1(i,j) = -_Kref0(i,j)*T*T*Jac-2.*_seebeck*_Lref0(i,j)*T*T*V*Jac-pow(_seebeck,2)*_Lref0(i,j)*pow(T,3)*Jac-_Lref0(i,j)*T*V*V*Jac; - } - } + jy1(i,j) = -_Kref0(i,j)*T*T*Jac-2.*_seebeck*_Lref0(i,j)*T*T*V*Jac-pow(_seebeck,2)*_Lref0(i,j)*pow(T,3)*Jac-_Lref0(i,j)*T*V*V*Jac; + } + } - static SVector3 valpat; - valpat*=0.; - static STensor3 invLref0; - invLref0=_Lref0.invert(); - + static SVector3 valpat; + STensorOperation::zero(valpat); + static STensor3 invLref0; + STensorOperation::inverseSTensor3(_Lref0, invLref0); + for(int i=0;i<3;i++) { fluxV(i)=0.; @@ -286,20 +287,20 @@ void mlawElecSMP::constitutive( // fluxV.print("fluxV"); // gradV.print("gradV"); - for(int i=0;i<3;i++) + for(int i=0;i<3;i++) + { + for(int j=0;j<3;j++) { - for(int j=0;j<3;j++) - { - fluxT(i)+=(_Lref0(i,j)*_seebeck*_seebeck*T)*gradT(j)*Jac+_Lref0(i,j)*_seebeck*T*gradV(j)*Jac;// - //fluxT(i)+=(_Kref0(i,j))*gradT(j)*Jac+fluxV(i)*_seebeck*T;// - //fluxjy(i)+=(_Kref0(i,j)+_Lref0(i,j)*_seebeck*_seebeck*T+_Lref0(i,j)*_seebeck*V)*gradT(j)*Jac+(_Lref0(i,j)*V+_Lref0(i,j)*_seebeck*T)*gradV(j)*Jac; - } + fluxT(i)+=(_Lref0(i,j)*_seebeck*_seebeck*T)*gradT(j)*Jac+_Lref0(i,j)*_seebeck*T*gradV(j)*Jac;// + //fluxT(i)+=(_Kref0(i,j))*gradT(j)*Jac+fluxV(i)*_seebeck*T;// + //fluxjy(i)+=(_Kref0(i,j)+_Lref0(i,j)*_seebeck*_seebeck*T+_Lref0(i,j)*_seebeck*V)*gradT(j)*Jac+(_Lref0(i,j)*V+_Lref0(i,j)*_seebeck*T)*gradV(j)*Jac; } + } - for(int i=0;i<3;i++) - { - fluxjy(i)=fluxT(i)+V*fluxV(i); - } + for(int i=0;i<3;i++) + { + fluxjy(i)=fluxT(i)+V*fluxV(i); + } // fluxT.print("fluxT"); // gradT.print("gradT"); /* for(int i=0;i<3;i++) @@ -309,60 +310,58 @@ void mlawElecSMP::constitutive( if(stiff) { - djedF*=0.;djydF*=0.; - - for(int K = 0; K< 3; K++) - { - for(int m = 0; m< 3; m++) - { - for(int N = 0; N< 3; N++) - { - for(int L = 0; L< 3; L++) - { - djedF(K,m,N) -= Fninv(K,m)*_Lref0(N,L)*gradV(L)*Jac; - djedF(K,m,N) -= _Lref0(K,N)*Fninv(L,m)*gradV(L)*Jac; - djedF(K,m,N) += _Lref0(K,L)*gradV(L)*Fninv(N,m)*Jac; - djedF(K,m,N) -= Fninv(K,m)*_seebeck*_Lref0(N,L)*gradT(L)*Jac; - djedF(K,m,N) -= _Lref0(K,N)*_seebeck*Fninv(L,m)*gradT(L)*Jac; - djedF(K,m,N) += _Lref0(K,L)*_seebeck*gradT(L)*Fninv(N,m)*Jac; - - dqdF(K,m,N) -= Fninv(K,m)*(_Lref0(N,L)*_seebeck*_seebeck*T)*gradT(L)*Jac;// - dqdF(K,m,N) -= (_Lref0(K,N)*_seebeck*_seebeck*T)*Fninv(L,m)*gradT(L)*Jac;// - dqdF(K,m,N) += (_Lref0(K,L)*_seebeck*_seebeck*T)*gradT(L)*Fninv(N,m)*Jac;// - dqdF(K,m,N) -= Fninv(K,m)*(_Lref0(N,L)*_seebeck*T)*gradV(L)*Jac; - dqdF(K,m,N) -= (_Lref0(K,N)*_seebeck*T)*Fninv(L,m)*gradV(L)*Jac; - dqdF(K,m,N) += (_Lref0(K,L)*_seebeck*T)*gradV(L)*Fninv(N,m)*Jac; + for(int K = 0; K< 3; K++) + { + for(int m = 0; m< 3; m++) + { + for(int N = 0; N< 3; N++) + { + for(int L = 0; L< 3; L++) + { + djedF(K,m,N) -= Fninv(K,m)*_Lref0(N,L)*gradV(L)*Jac; + djedF(K,m,N) -= _Lref0(K,N)*Fninv(L,m)*gradV(L)*Jac; + djedF(K,m,N) += _Lref0(K,L)*gradV(L)*Fninv(N,m)*Jac; + djedF(K,m,N) -= Fninv(K,m)*_seebeck*_Lref0(N,L)*gradT(L)*Jac; + djedF(K,m,N) -= _Lref0(K,N)*_seebeck*Fninv(L,m)*gradT(L)*Jac; + djedF(K,m,N) += _Lref0(K,L)*_seebeck*gradT(L)*Fninv(N,m)*Jac; + + dqdF(K,m,N) -= Fninv(K,m)*(_Lref0(N,L)*_seebeck*_seebeck*T)*gradT(L)*Jac;// + dqdF(K,m,N) -= (_Lref0(K,N)*_seebeck*_seebeck*T)*Fninv(L,m)*gradT(L)*Jac;// + dqdF(K,m,N) += (_Lref0(K,L)*_seebeck*_seebeck*T)*gradT(L)*Fninv(N,m)*Jac;// + dqdF(K,m,N) -= Fninv(K,m)*(_Lref0(N,L)*_seebeck*T)*gradV(L)*Jac; + dqdF(K,m,N) -= (_Lref0(K,N)*_seebeck*T)*Fninv(L,m)*gradV(L)*Jac; + dqdF(K,m,N) += (_Lref0(K,L)*_seebeck*T)*gradV(L)*Fninv(N,m)*Jac; - djydF(K,m,N) -= Fninv(K,m)*(_Kref0(N,L)+_Lref0(N,L)*_seebeck*_seebeck*T+_Lref0(N,L)*_seebeck*V)*gradT(L)*Jac; - djydF(K,m,N) -= (_Kref0(K,N)+_Lref0(K,N)*_seebeck*_seebeck*T+_Lref0(K,N)*_seebeck*V)*Fninv(L,m)*gradT(L)*Jac; - djydF(K,m,N) += (_Kref0(K,L)+_Lref0(K,L)*_seebeck*_seebeck*T+_Lref0(K,L)*_seebeck*V)*gradT(L)*Fninv(N,m)*Jac; - djydF(K,m,N) -= Fninv(K,m)*(_Lref0(N,L)*V+_Lref0(N,L)*_seebeck*T)*gradV(L)*Jac; - djydF(K,m,N) -= (_Lref0(K,N)*V+_Lref0(K,N)*_seebeck*T)*Fninv(L,m)*gradV(L)*Jac; - djydF(K,m,N) += (_Lref0(K,L)*V+_Lref0(K,L)*_seebeck*T)*gradV(L)*Fninv(N,m)*Jac; - } - } - } - } + djydF(K,m,N) -= Fninv(K,m)*(_Kref0(N,L)+_Lref0(N,L)*_seebeck*_seebeck*T+_Lref0(N,L)*_seebeck*V)*gradT(L)*Jac; + djydF(K,m,N) -= (_Kref0(K,N)+_Lref0(K,N)*_seebeck*_seebeck*T+_Lref0(K,N)*_seebeck*V)*Fninv(L,m)*gradT(L)*Jac; + djydF(K,m,N) += (_Kref0(K,L)+_Lref0(K,L)*_seebeck*_seebeck*T+_Lref0(K,L)*_seebeck*V)*gradT(L)*Fninv(N,m)*Jac; + djydF(K,m,N) -= Fninv(K,m)*(_Lref0(N,L)*V+_Lref0(N,L)*_seebeck*T)*gradV(L)*Jac; + djydF(K,m,N) -= (_Lref0(K,N)*V+_Lref0(K,N)*_seebeck*T)*Fninv(L,m)*gradV(L)*Jac; + djydF(K,m,N) += (_Lref0(K,L)*V+_Lref0(K,L)*_seebeck*T)*gradV(L)*Fninv(N,m)*Jac; + } + } + } + } // dqdF.print("dqdF"); - for(int i = 0; i< 3; i++) - { - for(int j = 0; j< 3; j++) - { - dl10dT(i,j) = -_Lref0(i,j)*Jac; - dl20dT(i,j) = -_Lref0(i,j)*(V+2*_seebeck*T)*Jac; - dk10dT(i,j) = -2*_Kref0(i,j)*T*Jac- 2*_seebeck*_Lref0(i,j)*T*V*Jac-3*pow(_seebeck,2)*_Lref0(i,j)*pow(T,2)*Jac; - dK20dT(i,j) = -2*_seebeck*T*_Lref0(i,j)*Jac; + for(int i = 0; i< 3; i++) + { + for(int j = 0; j< 3; j++) + { + dl10dT(i,j) = -_Lref0(i,j)*Jac; + dl20dT(i,j) = -_Lref0(i,j)*(V+2*_seebeck*T)*Jac; + dk10dT(i,j) = -2*_Kref0(i,j)*T*Jac- 2*_seebeck*_Lref0(i,j)*T*V*Jac-3*pow(_seebeck,2)*_Lref0(i,j)*pow(T,2)*Jac; + dK20dT(i,j) = -2*_seebeck*T*_Lref0(i,j)*Jac; - dl20dv(i,j)= -_Lref0(i,j)*(T)*Jac; - dk10dv(i,j)= -_seebeck*_Lref0(i,j)*T*T*Jac; + dl20dv(i,j)= -_Lref0(i,j)*(T)*Jac; + dk10dv(i,j)= -_seebeck*_Lref0(i,j)*T*T*Jac; - djy1dT(i,j) = -2.*_Kref0(i,j)*T*Jac- 4.*_seebeck*_Lref0(i,j)*T*V*Jac-3*pow(_seebeck,2)*_Lref0(i,j)*pow(T,2)*Jac-_Lref0(i,j)*V*V*Jac; - djy1dV(i,j) = -2.*_seebeck*_Lref0(i,j)*T*T*Jac-2.*_Lref0(i,j)*T*V*Jac; - } - } + djy1dT(i,j) = -2.*_Kref0(i,j)*T*Jac- 4.*_seebeck*_Lref0(i,j)*T*V*Jac-3*pow(_seebeck,2)*_Lref0(i,j)*pow(T,2)*Jac-_Lref0(i,j)*V*V*Jac; + djy1dV(i,j) = -2.*_seebeck*_Lref0(i,j)*T*T*Jac-2.*_Lref0(i,j)*T*V*Jac; + } + } static STensor43 dldF,dkdF; - dldF*=0.;dkdF*=0.; + STensorOperation::zero(dldF); STensorOperation::zero(dkdF); for(int K = 0; K< 3; K++) { for(int L = 0; L< 3; L++) @@ -383,25 +382,25 @@ void mlawElecSMP::constitutive( } } - for(int i = 0; i< 3; i++) + for(int i = 0; i< 3; i++) + { + for(int j = 0; j< 3; j++) { - for(int j = 0; j< 3; j++) - { - for(int N = 0; N< 3; N++) - { - for(int L = 0; L< 3; L++) - { - dl10dF(i,j,N,L) = -dldF(i,j,N,L)*T; - dl20dF(i,j,N,L) = -dldF(i,j,N,L)*(V*T+_seebeck*T*T); - dk10dF(i,j,N,L) = -dkdF(i,j,N,L)*T*T- _seebeck*dldF(i,j,N,L)*T*T*V-pow(_seebeck,2)*dldF(i,j,N,L)*pow(T,3); - dk20dF(i,j,N,L) = -_seebeck*T*T*dldF(i,j,N,L); + for(int N = 0; N< 3; N++) + { + for(int L = 0; L< 3; L++) + { + dl10dF(i,j,N,L) = -dldF(i,j,N,L)*T; + dl20dF(i,j,N,L) = -dldF(i,j,N,L)*(V*T+_seebeck*T*T); + dk10dF(i,j,N,L) = -dkdF(i,j,N,L)*T*T- _seebeck*dldF(i,j,N,L)*T*T*V-pow(_seebeck,2)*dldF(i,j,N,L)*pow(T,3); + dk20dF(i,j,N,L) = -_seebeck*T*T*dldF(i,j,N,L); - djy1dF(i,j,N,L) = -dkdF(i,j,N,L)*T*T- 2.*_seebeck*dldF(i,j,N,L)*T*T*V-pow(_seebeck,2)*dldF(i,j,N,L)*pow(T,3)-dldF(i,j,N,L)*T*V*V; - } - } - } + djy1dF(i,j,N,L) = -dkdF(i,j,N,L)*T*T- 2.*_seebeck*dldF(i,j,N,L)*T*T*V-pow(_seebeck,2)*dldF(i,j,N,L)*pow(T,3)-dldF(i,j,N,L)*T*V*V; + } + } } - djedT=0.; + } + djedT=0.; for(int i=0;i<3;i++) { djedT(i)=0.; @@ -410,11 +409,14 @@ void mlawElecSMP::constitutive( djedT(i)+=dseebeckdT*_Lref0(i,j)*gradT(j)*Jac+_seebeck*dLdT(i,j)*gradT(j)*Jac+dLdT(i,j)*gradV(j)*Jac; } } - // djedT.print("djedT"); - djedgradT=_seebeck*_Lref0*Jac; - djedgradV =_Lref0*Jac; - // djedgradT.print("djedgradT"); - // djedgradV.print("djedgradV"); + // djedT.print("djedT"); + djedgradT=_Lref0; + djedgradT*=_seebeck*Jac; + djedgradV =_Lref0; + djedgradV*=Jac; + + // djedgradT.print("djedgradT"); + // djedgradV.print("djedgradV"); for(int i=0;i<3;i++) { diff --git a/NonLinearSolver/materialLaw/mlawElecTherMech.cpp b/NonLinearSolver/materialLaw/mlawElecTherMech.cpp index 350d2f98a84d180a7a0ba4a5d9a284098e3a1434..84edcc8424369ea133b2d8bdbce0097c63e7fccf 100644 --- a/NonLinearSolver/materialLaw/mlawElecTherMech.cpp +++ b/NonLinearSolver/materialLaw/mlawElecTherMech.cpp @@ -46,9 +46,10 @@ mlawElecTherMech& mlawElecTherMech::operator=(const materialLaw &source) { mlawTransverseIsotropic::operator=(source); //mlawLinearElecTherMech::operator=(source); + if (_lawLinearETM != NULL) delete _lawLinearETM; _lawLinearETM = new mlawLinearElecTherMech(*(source._lawLinearETM)); // ?? - const mlawElecTherMech* src =static_cast<const mlawElecTherMech*>(&source); + const mlawElecTherMech* src =dynamic_cast<const mlawElecTherMech*>(&source); if(src !=NULL) { @@ -121,28 +122,28 @@ void mlawLinearElecTherMech::constitutive( //large defo static STensor3 Fninv; static STensor3 _Kref10,_Kref20,_Lref10,_Lref20,_Lref0; - Fninv = Fn.invert(); - double J= Fn.determinant(); - _Kref20*=0.; - _Kref10*=0; - for(int K = 0; K< 3; K++) - { - for(int L = 0; L< 3; L++) - { - for(int i = 0; i< 3; i++) - { - for(int j = 0; j< 3; j++) - { - _Kref10(K,L) += Fninv(K,i)*_k10(i,j)*Fninv(L,j)*J; //put in reference configuration - _Kref20(K,L) += Fninv(K,i)*_k20(i,j)*Fninv(L,j)*J; - _Lref10(K,L) += Fninv(K,i)*_l10(i,j)*Fninv(L,j)*J; //put in reference configuration - _Lref20(K,L) += Fninv(K,i)*_l20(i,j)*Fninv(L,j)*J; + STensorOperation::inverseSTensor3(Fn, Fninv); + double J= Fn.determinant(); + _Kref20*=0.; + _Kref10*=0; + for(int K = 0; K< 3; K++) + { + for(int L = 0; L< 3; L++) + { + for(int i = 0; i< 3; i++) + { + for(int j = 0; j< 3; j++) + { + _Kref10(K,L) += Fninv(K,i)*_k10(i,j)*Fninv(L,j)*J; //put in reference configuration + _Kref20(K,L) += Fninv(K,i)*_k20(i,j)*Fninv(L,j)*J; + _Lref10(K,L) += Fninv(K,i)*_l10(i,j)*Fninv(L,j)*J; //put in reference configuration + _Lref20(K,L) += Fninv(K,i)*_l20(i,j)*Fninv(L,j)*J; - _Lref0(K,L) += Fninv(K,i)*_l0(i,j)*Fninv(L,j)*J; - } - } - } - } + _Lref0(K,L) += Fninv(K,i)*_l0(i,j)*Fninv(L,j)*J; + } + } + } + } _l10 = _Lref10; _l20 = _Lref20; @@ -220,10 +221,9 @@ void mlawLinearElecTherMech::constitutive( dedT(i)+=dseebeckdT*_Lref0(i,j)*gradT(j)+_seebeck*dLdT(i,j)*gradT(j)+dLdT(i,j)*gradV(j); } } - dedgradT=_seebeck*_Lref0; - + dedgradT=_Lref0; + dedgradT*=_seebeck; - dedgradV =_Lref0; for(int i=0;i<3;i++) diff --git a/NonLinearSolver/materialLaw/mlawHyperelastic.cpp b/NonLinearSolver/materialLaw/mlawHyperelastic.cpp index 569b78be688bc584252da570a3e7d7b0535ac705..7a627061d20dc54988b54283f4d6114afd700507 100644 --- a/NonLinearSolver/materialLaw/mlawHyperelastic.cpp +++ b/NonLinearSolver/materialLaw/mlawHyperelastic.cpp @@ -1358,7 +1358,8 @@ void mlawPowerYieldHyper::predictorCorrector_associatedFlow(const STensor3& F, c KS(2,2) += p; // first Piola Kirchhoff stress - STensor3 S(0.); + static STensor3 S; + S*=(0.); for(int i=0; i<3; i++) for(int j=0; j<3; j++) for(int k=0; k<3; k++) diff --git a/NonLinearSolver/materialLaw/mlawJ2FullyCoupledThermoMechanics.cpp b/NonLinearSolver/materialLaw/mlawJ2FullyCoupledThermoMechanics.cpp index 475b8844278fea445619ab241b9800418db1512a..f8e96cc5e2297c836f24aadd962b5745559789b3 100644 --- a/NonLinearSolver/materialLaw/mlawJ2FullyCoupledThermoMechanics.cpp +++ b/NonLinearSolver/materialLaw/mlawJ2FullyCoupledThermoMechanics.cpp @@ -135,11 +135,11 @@ void mlawJ2FullyCoupledThermoMechanics::constitutive(const STensor3& F0, STensor43 &Tangent, // tangents (output) const bool stiff // if true compute the tangents ) const{ - SVector3 gradT(0.), temp2(0.); - STensor3 temp3; - STensor33 temp33; - double tempVal; - STensor43 dFpdF(0.); + static SVector3 gradT, temp2; + static STensor3 temp3; + static STensor33 temp33; + static double tempVal; + static STensor43 dFpdF; predictorCorector(F0,F1,P1,q0,q1,Tangent,dFpdF,_Tref,_Tref,gradT,gradT,temp2,temp3,temp3,temp2,temp33,tempVal, tempVal,temp3,tempVal,tempVal,temp3,stiff); @@ -169,7 +169,7 @@ void mlawJ2FullyCoupledThermoMechanics::constitutive(const STensor3& F0, const bool stiff ) const{ if (!_tangentByPerturbation){ - STensor43 dFpdF(0.); + static STensor43 dFpdF; predictorCorector(F0,F,P,q0,q,Tangent,dFpdF,T0,T,gradT0,gradT,fluxT,dPdT,dfluxTdgradT,dfluxTdT,dfluxTdF, thermalSource,dthermalSourcedT,dthermalSourcedF, mechanicalSource,dmechanicalSourcedT,dmechanicalSourceF,stiff); @@ -177,16 +177,16 @@ void mlawJ2FullyCoupledThermoMechanics::constitutive(const STensor3& F0, else{ predictorCorector(F0,F,P,q0,q,T0,T,gradT0,gradT,fluxT,thermalSource, mechanicalSource); - STensor3 Pplus; - SVector3 fluxTPlus; - double thermalSourcePlus; - double mechanicalSourcePlus; - IPJ2ThermoMechanics qPlus(*q0); + static STensor3 Fplus, Pplus; + static SVector3 fluxTPlus, gradTplus; + static double thermalSourcePlus; + static double mechanicalSourcePlus; + static IPJ2ThermoMechanics qPlus(*q0); // perturbe F for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ - STensor3 Fplus(F); + Fplus = (F); Fplus(i,j) += _perturbationfactor; predictorCorector(F0,Fplus,Pplus,q0,&qPlus,T0,T,gradT0,gradT,fluxTPlus,thermalSourcePlus, mechanicalSourcePlus); for (int k=0; k<3; k++){ @@ -203,7 +203,7 @@ void mlawJ2FullyCoupledThermoMechanics::constitutive(const STensor3& F0, double gradTpert = _perturbationfactor*T0/1e-3; for (int i=0; i<3; i++){ - SVector3 gradTplus(gradT); + gradTplus = (gradT); gradTplus(i) += (gradTpert); predictorCorector(F0,F,Pplus,q0,&qPlus,T0,T,gradT0,gradTplus,fluxTPlus,thermalSourcePlus, mechanicalSourcePlus); for (int k=0; k<3; k++){ @@ -236,7 +236,7 @@ void mlawJ2FullyCoupledThermoMechanics::stress(const STensor3& Ee, const double& void mlawJ2FullyCoupledThermoMechanics::HookeTensor(const double KT, const double muT, STensor43& C) const{ - static STensor3 Isecond(1.); + static const STensor3 Isecond(1.); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ for (int k=0; k<3; k++){ @@ -253,7 +253,7 @@ double mlawJ2FullyCoupledThermoMechanics::deformationEnergy(const STensor3& C, c C(0,1) * (C(1,0) * C(2,2) - C(1,2) * C(2,0)) + C(0,2) * (C(1,0) * C(2,1) - C(1,1) * C(2,0)))); double lnJ = log(Jac); - STensor3 logCdev; + static STensor3 logCdev; logSTensor3(C,_order,logCdev); double trace = logCdev.trace(); logCdev(0,0)-=trace/3.; @@ -283,11 +283,11 @@ void mlawJ2FullyCoupledThermoMechanics::predictorCorector(const STensor3& F0, double& mechanicalSource ) const{ // temp variables - STensor43 Tangent, dFpdF; - STensor3 dPdT, dfluxTdgradT, dthermalSourcedF, dmechanicalSourceF; - STensor33 dfluxTdF; - SVector3 dfluxTdT; - double dthermalSourcedT, dmechanicalSourcedT; + static STensor43 Tangent, dFpdF; + static STensor3 dPdT, dfluxTdgradT, dthermalSourcedF, dmechanicalSourceF; + static STensor33 dfluxTdF; + static SVector3 dfluxTdT; + static double dthermalSourcedT, dmechanicalSourcedT; predictorCorector(F0,F,P,q0,q,Tangent,dFpdF,T0,T,gradT0,gradT,fluxT,dPdT,dfluxTdgradT,dfluxTdT,dfluxTdF, thermalSource,dthermalSourcedT,dthermalSourcedF, mechanicalSource,dmechanicalSourcedT,dmechanicalSourceF,false); @@ -325,23 +325,24 @@ void mlawJ2FullyCoupledThermoMechanics::predictorCorector(const STensor3& F0, Fp = q0->getConstRefToFp(); eps = q0->getConstRefToEquivalentPlasticStrain(); - STensor3 Fpinv, Fe, Ce; + static STensor3 Fpinv, Fe, Ce; inverseSTensor3(Fp,Fpinv); multSTensor3(F,Fpinv,Fe); multSTensor3FirstTranspose(Fe,Fe,Ce); // strain - STensor43 Lpr; - STensor63 dLDCe; + static STensor43 Lpr; + static STensor63 dLDCe; /* Compute equivalent stress */ - STensor3 Eepr; + static STensor3 Eepr; logSTensor3(Ce,_order,Eepr,&Lpr,&dLDCe); Eepr *= 0.5; - STensor43 L = Lpr; + static STensor43 L; + L = Lpr; STensor3& Ee = q->getRefToElasticDeformationTensor(); Ee = Eepr; - STensor43 DexpA; // use for compute tangent later + static STensor43 DexpA; // use for compute tangent later // temperature dependent material properties double KT = _K*_temFunc_K->getVal(T); @@ -351,16 +352,18 @@ void mlawJ2FullyCoupledThermoMechanics::predictorCorector(const STensor3& F0, double cpT = _cp*_temFunc_cp->getVal(T0); // predious --> derivatives 0 // compute corotational Kirchhoff stress - double p; - STensor3 corKirDev; + static double p; + static STensor3 corKirDev; this->stress(Ee,KT,muT,alpT,_Tref,T,p,corKirDev); // equivalent stress double Seqpr = sqrt(1.5*corKirDev.dotprod()); // plastic normal-> based on trial value - STensor3 devEepr = Eepr.dev(); + static STensor3 devEepr; + devEepr = Eepr.dev(); double EeprEq = sqrt(devEepr.dotprod()/1.5); - STensor3 N(devEepr); + static STensor3 N; + N = (devEepr); N *= (1./EeprEq); double Deps = 0.; @@ -399,9 +402,10 @@ void mlawJ2FullyCoupledThermoMechanics::predictorCorector(const STensor3& F0, } // update plastic strain Deps = eps-q0->getConstRefToEquivalentPlasticStrain(); - STensor3 DepsN(N); + static STensor3 DepsN; + DepsN = (N); DepsN *= Deps; - STensor3 expDepsN(0.); + static STensor3 expDepsN; expSTensor3(DepsN,_order,expDepsN,&DexpA); multSTensor3(expDepsN,q0->getConstRefToFp(),Fp); @@ -414,23 +418,31 @@ void mlawJ2FullyCoupledThermoMechanics::predictorCorector(const STensor3& F0, }; // estimation of PK stress - STensor3 corKir(p); + static STensor3 corKir; + diag(corKir,p); corKir += corKirDev; - STensor3 S; + static STensor3 S; multSTensor3STensor43(corKir,L,S); - STensor3 tempTensor23; + static STensor3 tempTensor23; multSTensor3(Fe,S,tempTensor23); multSTensor3SecondTranspose(tempTensor23,Fpinv,P); // elastic energy q->getRefToElasticEnergy()= this->deformationEnergy(Ce,_Tref,T); // plastic power (Wp1- Wp0)/dt - q->getRefToPlasticPower() = Deps*Sy/this->getTimeStep(); + if (this->getTimeStep() > 0){ + q->getRefToPlasticPower() = Deps*Sy/this->getTimeStep(); + } + else{ + q->getRefToPlasticPower() = 0.; + #ifdef _DEBUG + Msg::Warning("Time step is zero in mlawJ2FullyCoupledThermoMechanics::predictorCorector"); + #endif //_DEBUG + } // thermal energy q->_thermalEnergy = cpT*T; double J = 1.; - STensor3 Cinv(1.); STensor3 Finv(0.); if (_thermalEstimationPreviousConfig){ inverseSTensor3(F0,Finv); @@ -440,11 +452,17 @@ void mlawJ2FullyCoupledThermoMechanics::predictorCorector(const STensor3& F0, inverseSTensor3(F,Finv); J = determinantSTensor3(F); } + static STensor3 Cinv; multSTensor3SecondTranspose(Finv,Finv,Cinv); multSTensor3SVector3(Cinv,gradT,fluxT); fluxT *= (-conductT*J); - - thermalSource = -cpT*(T-T0)/this->getTimeStep(); + + if (this->getTimeStep() > 0.){ + thermalSource = -cpT*(T-T0)/this->getTimeStep(); + } + else + thermalSource = 0.; + mechanicalSource = 0.; // thermoelastic heat double DKDT = _K*_temFunc_K->getDiff(T); @@ -454,7 +472,8 @@ void mlawJ2FullyCoupledThermoMechanics::predictorCorector(const STensor3& F0, double DcpdT = 0.; double HT = _j2IH->getYield0()*_temFunc_Sy0->getDiff(T) + (q->getConstRefToIPJ2IsotropicHardening().getR() - _j2IH->getYield0())*_temFunc_H->getDiff(T); // - STensor3 DcorKirDT(0.); // derivative in respect to T + static STensor3 DcorKirDT; + zero(DcorKirDT); // derivative in respect to T for (int i=0; i<3; i++){ DcorKirDT(i,i) += p*DKDT/KT - 3*KT*(DalpDT*(T-_Tref) + alpT); for (int j=0; j<3; j++){ @@ -462,35 +481,46 @@ void mlawJ2FullyCoupledThermoMechanics::predictorCorector(const STensor3& F0, } } // previous elastic deformation - STensor3 DEe = Ee; + static STensor3 DEe; + DEe = Ee; DEe -= q0->getConstRefToElasticDeformationTensor(); - mechanicalSource += (doubledot(DcorKirDT,DEe)*T/this->getTimeStep()); + if (this->getTimeStep() > 0){ + mechanicalSource += (doubledot(DcorKirDT,DEe)*T/this->getTimeStep()); + } // thermoplastic heat mechanicalSource += _TaylorQuineyFactor*q->getRefToPlasticPower(); if (stiff){ - STensor43 DcorKirDEepr(0.); + static STensor43 DcorKirDEepr; HookeTensor(KT,muT,DcorKirDEepr); //material properties on temperature - STensor3 dPlasticPowerDEepr(0.); - double dPlasticPowerDT = 0.; - STensor3 dFpDT(0.); - STensor43 dFpDEepr(0.); + static STensor3 dPlasticPowerDEepr; + static double dPlasticPowerDT; + static STensor3 dFpDT; + static STensor43 dFpDEepr; + + zero(dPlasticPowerDEepr); + zero(dPlasticPowerDT); + zero(dFpDT); + zero(dFpDEepr); + if (Deps > 0){ - STensor3 DgammaDEepr(N); + static STensor3 DgammaDEepr; + DgammaDEepr = (N); DgammaDEepr *= (2.*muT/(3.*muT+H)); double DgammaDT = (Seqpr/muT*DmuDT - HT-3.*DmuDT*Deps)/(3.*muT+H); - STensor43 BE(0.); + static STensor43 BE; tensprod(N,N,BE); BE *= (2.*muT/(3.*muT+H)- 2.*Deps/3./EeprEq); double val=Deps/EeprEq; BE.axpy(val,_I4dev); - STensor3 BT(N); + static STensor3 BT; + BT = (N); BT*= DgammaDT; // update with plasticity corKir @@ -498,7 +528,7 @@ void mlawJ2FullyCoupledThermoMechanics::predictorCorector(const STensor3& F0, DcorKirDT.daxpy(BT,-2.*muT); const STensor3& Fp0 = q0->getConstRefToFp(); - STensor43 DexpABE; + static STensor43 DexpABE; multSTensor43(DexpA,BE,DexpABE); // update with plasticity Fp for (int i=0; i<3; i++){ @@ -512,25 +542,34 @@ void mlawJ2FullyCoupledThermoMechanics::predictorCorector(const STensor3& F0, } } } - STensor3 DexpABT; + static STensor3 DexpABT; multSTensor43STensor3(DexpA,BT,DexpABT); multSTensor3Add(DexpABT,Fp0,dFpDT); - - double DPlasticPowerDgamma = (Sy + Deps*H)/this->getTimeStep(); + + double DPlasticPowerDgamma = 0.; + if (this->getTimeStep() > 0.){ + DPlasticPowerDgamma = (Sy + Deps*H)/this->getTimeStep(); + } dPlasticPowerDEepr.daxpy(DgammaDEepr,DPlasticPowerDgamma); - dPlasticPowerDT = (DgammaDT*Sy + Deps*HT)/this->getTimeStep(); + if (this->getTimeStep() > 0.){ + dPlasticPowerDT = (DgammaDT*Sy + Deps*HT)/this->getTimeStep(); + } + else{ + dPlasticPowerDT = 0.; + } } const STensor3& Fp0 = q0->getConstRefToFp(); - STensor3 invFp0; + static STensor3 invFp0; inverseSTensor3(Fp0,invFp0); - STensor3 Fepr(0.); + static STensor3 Fepr; multSTensor3(F,invFp0,Fepr); - STensor43 EprToF(0.); + static STensor43 EprToF; for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ for (int k=0; k<3; k++){ for (int l=0; l<3; l++){ + EprToF(i,j,k,l) = 0.; for (int p=0; p<3; p++){ for (int q=0; q<3; q++){ EprToF(i,j,k,l) += Lpr(i,j,p,q)*Fepr(k,p)*invFp0(l,q); @@ -541,18 +580,24 @@ void mlawJ2FullyCoupledThermoMechanics::predictorCorector(const STensor3& F0, } } - STensor43 DcorKirDF(0.); + static STensor43 DcorKirDF; multSTensor43(DcorKirDEepr,EprToF,DcorKirDF); - STensor3 dPlasticPowerDF(0.); + static STensor3 dPlasticPowerDF; if (Deps>0.){ multSTensor43(dFpDEepr,EprToF,dFpdF); multSTensor3STensor43(dPlasticPowerDEepr,EprToF,dPlasticPowerDF); } + else{ + zero(dFpdF); + zero(dPlasticPowerDF); + } // done DcorKirDF, DcorKirDT, DFpDF, DFpDT - STensor43 DinvFpdF(0.); - STensor3 DinvFpdT(0.); + static STensor43 DinvFpdF; + static STensor3 DinvFpdT; + zero(DinvFpdF); + zero(DinvFpdT); if (Deps >0){ for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ @@ -570,8 +615,10 @@ void mlawJ2FullyCoupledThermoMechanics::predictorCorector(const STensor3& F0, } } - STensor43 dFedF(0.); - STensor3 dFedT(0.); + static STensor43 dFedF; + static STensor3 dFedT; + zero(dFedF); + zero(dFedT); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ for (int k=0; k<3; k++){ @@ -587,8 +634,10 @@ void mlawJ2FullyCoupledThermoMechanics::predictorCorector(const STensor3& F0, } } } - STensor63 DLDF(0.); - STensor43 DLDT(0.); + static STensor63 DLDF; + static STensor43 DLDT; + zero(DLDF); + zero(DLDT); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ for (int k=0; k<3; k++){ @@ -611,8 +660,10 @@ void mlawJ2FullyCoupledThermoMechanics::predictorCorector(const STensor3& F0, } // - STensor43 DSDF(0.); // S = corKir:L - STensor3 DSDT(0.); + static STensor43 DSDF; // S = corKir:L + static STensor3 DSDT; + zero(DSDF); + zero(DSDT); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ for (int r=0; r<3; r++){ @@ -630,8 +681,8 @@ void mlawJ2FullyCoupledThermoMechanics::predictorCorector(const STensor3& F0, // compute mechanical tengent - Tangent *= 0.; - dPdT *= 0.; + zero(Tangent); + zero(dPdT); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ for (int k=0; k<3; k++){ @@ -656,14 +707,15 @@ void mlawJ2FullyCoupledThermoMechanics::predictorCorector(const STensor3& F0, dfluxTdF *= 0.; if (!_thermalEstimationPreviousConfig){ - STensor43 I4(1.,1.); - STensor3 DJDF(0.); - STensor43 DCinvDF(0.); + static const STensor43 I4(1.,1.); + static STensor3 DJDF; + static STensor43 DCinvDF; for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ DJDF(i,j) = J*Finv(j,i); for (int k=0; k<3; k++){ for (int l=0; l<3; l++){ + DCinvDF(i,j,k,l) = 0.; for (int p=0; p<3; p++){ for (int a=0; a<3; a++){ for (int b=0; b<3; b++){ @@ -690,7 +742,12 @@ void mlawJ2FullyCoupledThermoMechanics::predictorCorector(const STensor3& F0, // thermal source - dthermalSourcedT =-cpT/this->getTimeStep()-DcpdT*(T-T0)/this->getTimeStep(); + if (this->getTimeStep() > 0){ + dthermalSourcedT =-cpT/this->getTimeStep()-DcpdT*(T-T0)/this->getTimeStep(); + } + else{ + dthermalSourcedT = 0.; + } dthermalSourcedF *= 0.; // mechanical source diff --git a/NonLinearSolver/materialLaw/mlawJ2VMSmallStrain.cpp b/NonLinearSolver/materialLaw/mlawJ2VMSmallStrain.cpp index adab4b091b4b2d24d1c750ebed0746dd3887e1f6..c4f11d9f0340fc7f4121f985958c310f1a628062 100644 --- a/NonLinearSolver/materialLaw/mlawJ2VMSmallStrain.cpp +++ b/NonLinearSolver/materialLaw/mlawJ2VMSmallStrain.cpp @@ -161,28 +161,32 @@ void mlawJ2VMSmallStrain::constitutive(const STensor3& F0, // previous d Ep = q0->_j2lepsp; // plastic strain tensor (equal I if no plastic occurs) gamma = q0->_j2lepspbarre; // equivalent plastic strain - STensor3 I(1.); // identity tensor + static const STensor3 I(1.); // identity tensor // small strain - STensor3 eps(0); + static STensor3 eps; + STensorOperation::diag(eps,-1.); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ - eps(i,j) += 0.5*(Fn(i,j)+Fn(j,i)) - I(i,j); + eps(i,j) += 0.5*(Fn(i,j)+Fn(j,i)); } } // trial elastic strain Eetr = eps-(Ep-I) - STensor3 Eetr(eps); + static STensor3 Eetr; + Eetr = (eps); Eetr -= Ep; Eetr += I; // trace and dev parts double traceEetr = Eetr.trace(); - STensor3 devEetr = Eetr.dev(); + static STensor3 devEetr; + devEetr = Eetr.dev(); // trial pressure and deviatoric stress double p = _K*traceEetr; // pressure - STensor3 devSigtr(devEetr); // trial deviatoric stress + static STensor3 devSigtr; + devSigtr = (devEetr); // trial deviatoric stress devSigtr *= (2.*_mu); // stress @@ -231,7 +235,8 @@ void mlawJ2VMSmallStrain::constitutive(const STensor3& F0, // previous d gamma += deps; // update plastic strain - STensor3 N(devSigtr); + static STensor3 N; + N = (devSigtr); N*= (1.5/sigVMtr); Ep.daxpy(N,deps); @@ -242,12 +247,12 @@ void mlawJ2VMSmallStrain::constitutive(const STensor3& F0, // previous d q1->_j2ldsy = Sy - Sy0; if (stiff and !_tangentByPerturbation){ - STensor43 dNdSigpr(0.); - for (int i=0; i<3; i++){ - for (int j=0; j<3; j++){ - for (int k=0; k<3; k++){ - for (int l=0; l<3; l++){ - dNdSigpr(i,j,k,l) += (1.5*_I4dev(i,j,k,l) - N(i,j)*N(k,l))/sigVMtr; + static STensor43 dNdSigpr; + for (int i=0; i<3; i++){ + for (int j=0; j<3; j++){ + for (int k=0; k<3; k++){ + for (int l=0; l<3; l++){ + dNdSigpr(i,j,k,l) = (1.5*_I4dev(i,j,k,l) - N(i,j)*N(k,l))/sigVMtr; } } } @@ -279,14 +284,13 @@ void mlawJ2VMSmallStrain::constitutive(const STensor3& F0, // previous d } if (stiff and _tangentByPerturbation){ - Tangent *= 0.; - STensor43 Temp; + static STensor43 Temp; + static STensor3 Fpp, Pp; + static IPJ2linear q11(*q1); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ - STensor3 Fpp(Fn); - IPJ2linear q11(*q1); + Fpp = (Fn); Fpp(i,j)+=_perturbationfactor; - STensor3 Pp(0.0); this->constitutive(F0,Fpp,Pp,q0,&q11,Temp,false); for (int k=0; k<3; k++){ for (int l=0; l<3; l++){ diff --git a/NonLinearSolver/materialLaw/mlawSMP.cpp b/NonLinearSolver/materialLaw/mlawSMP.cpp index 3ed2ec589573cbec4a0917c01c7bb7c172c9af32..b3d5dbfa5acf1a945e77b97e7f27b162bdb3533d 100644 --- a/NonLinearSolver/materialLaw/mlawSMP.cpp +++ b/NonLinearSolver/materialLaw/mlawSMP.cpp @@ -33,116 +33,117 @@ mlawSMP::mlawSMP(const int num,const double rho,const double alpha, const double _epsilonr(epsilonr),_n(n), _epsilonp02( epsilonp02),_alphar1(alphar1),_alphagl1(alphagl1),_Ggl1(Ggl1),_Gr1(Gr1), _Mgl1(Mgl1),_Mr1(Mr1), _Mugl1(Mugl1),_Mur1(Mur1),_epsilon01( epsilon01), _QglOnKb1(QglOnKb1/Kb), _QrOnKb1(QrOnKb1/Kb), _epsygl1(epsygl1) , _d1(d1),_m1(m1),_VOnKb1(VOnKb1/Kb), _alphap(alphap), _Sa0(Sa0),_ha1(ha1),_b1(b1),_g1(g1),_phia01(phia01),_Z1(Z1), - _r1(r1),_s1(s1),_Sb01(Sb01),_Hgl1(Hgl1),_Lgl1(Lgl1),_Hr1(Hr1),_Lr1(Lr1),_l1(l1),_Kb(Kb),_be1(be1),_c0(c0),_wp(wp),_c1(c1),_t0(t0),_order(3) + _r1(r1),_s1(s1),_Sb01(Sb01),_Hgl1(Hgl1),_Lgl1(Lgl1),_Hr1(Hr1),_Lr1(Lr1),_l1(l1),_Kb(Kb),_be1(be1),_c0(c0),_wp(wp),_c1(c1),_t0(t0),_order(-1), + I4(1.,1.), I2(1.), _mechanism2(false) + - { - _k0=_k; - STensor3 R; //3x3 rotation matrix +{ + _k0=_k; + STensor3 R; //3x3 rotation matrix - double co1,co2,co3,si1,si2,si3; - double s1c2, c1c2; - double _pi(3.14159265359); - double fpi = _pi/180.; + double co1,co2,co3,si1,si2,si3; + double s1c2, c1c2; + double _pi(3.14159265359); + double fpi = _pi/180.; - co1 = cos(_alpha*fpi); - si1 = sin(_alpha*fpi); + co1 = cos(_alpha*fpi); + si1 = sin(_alpha*fpi); - co2 = cos(_beta*fpi); - si2 = sin(_beta*fpi); + co2 = cos(_beta*fpi); + si2 = sin(_beta*fpi); - co3 = cos(_gamma*fpi); - si3 = sin(_gamma*fpi); + co3 = cos(_gamma*fpi); + si3 = sin(_gamma*fpi); - s1c2 = si1*co2; - c1c2 = co1*co2; + s1c2 = si1*co2; + c1c2 = co1*co2; - R(0,0) = co3*co1 - s1c2*si3; - R(0,1) = co3*si1 + c1c2*si3; - R(0,2) = si2*si3; + R(0,0) = co3*co1 - s1c2*si3; + R(0,1) = co3*si1 + c1c2*si3; + R(0,2) = si2*si3; - R(1,0) = -si3*co1 - s1c2*co3; - R(1,1) = -si3*si1 + c1c2*co3; - R(1,2) = si2*co3; + R(1,0) = -si3*co1 - s1c2*co3; + R(1,1) = -si3*si1 + c1c2*co3; + R(1,2) = si2*co3; - R(2,0) = si1*si2; - R(2,1) = -co1*si2; - R(2,2) = co2; - - STensor3 alphaDilatation; - alphaDilatation(0,0)= _alphagl1; - alphaDilatation(1,1)= _alphagl1; - alphaDilatation(2,2)= _alphagl1; - for(int i=0;i<3;i++) - { - for(int j=0;j<3;j++) - { - _alphaDilatation(i,j)=0.; - for(int m=0;m<3;m++) - { - for(int n=0;n<3;n++) - { - _alphaDilatation(i,j)+=R(m,i)*R(n,j)*alphaDilatation(m,n); - } - } - } - } - - double nu = Mr1; - double mu = Gr1; - double E = 2.*mu*(1.+nu); - //double mu = 0.5*E/(1.+nu); - double lambda = (E*nu)/(1.+nu)/(1.-2.*nu); - double twicemu = mu+mu; - - STensor43 K_; - K_*=0.; - K_(0,0,0,0) = lambda + twicemu; - K_(1,1,0,0) = lambda; - K_(2,2,0,0) = lambda; - K_(0,0,1,1) = lambda; - K_(1,1,1,1) = lambda + twicemu; - K_(2,2,1,1) = lambda; - K_(0,0,2,2) = lambda; - K_(1,1,2,2) = lambda; - K_(2,2,2,2) = lambda + twicemu; - - if(lambda>=1000.*mu) + R(2,0) = si1*si2; + R(2,1) = -co1*si2; + R(2,2) = co2; + + STensor3 alphaDilatation; + alphaDilatation(0,0)= _alphagl1; + alphaDilatation(1,1)= _alphagl1; + alphaDilatation(2,2)= _alphagl1; + for(int i=0;i<3;i++) + { + for(int j=0;j<3;j++) { - mu = lambda + mu; + _alphaDilatation(i,j)=0.; + for(int m=0;m<3;m++) + { + for(int n=0;n<3;n++) + { + _alphaDilatation(i,j)+=R(m,i)*R(n,j)*alphaDilatation(m,n); + } + } } + } + + double nu = Mr1; + double mu = Gr1; + double E = 2.*mu*(1.+nu); + //double mu = 0.5*E/(1.+nu); + double lambda = (E*nu)/(1.+nu)/(1.-2.*nu); + double twicemu = mu+mu; + + STensor43 K_; + K_*=0.; + K_(0,0,0,0) = lambda + twicemu; + K_(1,1,0,0) = lambda; + K_(2,2,0,0) = lambda; + K_(0,0,1,1) = lambda; + K_(1,1,1,1) = lambda + twicemu; + K_(2,2,1,1) = lambda; + K_(0,0,2,2) = lambda; + K_(1,1,2,2) = lambda; + K_(2,2,2,2) = lambda + twicemu; + + if(lambda>=1000.*mu) + { + mu = lambda + mu; + } - K_(1,0,1,0) = mu; - K_(2,0,2,0) = mu; - K_(0,1,0,1) = mu; - K_(2,1,2,1) = mu; - K_(0,2,0,2) = mu; - K_(1,2,1,2) = mu; - - K_(0,1,1,0) = mu; - K_(0,2,2,0) = mu; - K_(1,0,0,1) = mu; - K_(1,2,2,1) = mu; - K_(2,0,0,2) = mu; - K_(2,1,1,2) = mu; - - - for(int i=0;i<3;i++) + K_(1,0,1,0) = mu; + K_(2,0,2,0) = mu; + K_(0,1,0,1) = mu; + K_(2,1,2,1) = mu; + K_(0,2,0,2) = mu; + K_(1,2,1,2) = mu; + + K_(0,1,1,0) = mu; + K_(0,2,2,0) = mu; + K_(1,0,0,1) = mu; + K_(1,2,2,1) = mu; + K_(2,0,0,2) = mu; + K_(2,1,1,2) = mu; + + + for(int i=0;i<3;i++) + { + for(int j=0;j<3;j++) { - for(int j=0;j<3;j++) + _Stiff_alphaDilatation(i,j)=0.; + for(int k=0;k<3;k++) { - _Stiff_alphaDilatation(i,j)=0.; - for(int k=0;k<3;k++) + for(int l=0;l<3;l++) { - for(int l=0;l<3;l++) - { - _Stiff_alphaDilatation(i,j)+=K_(i,j,k,l)*_alphaDilatation(k,l); - } + _Stiff_alphaDilatation(i,j)+=K_(i,j,k,l)*_alphaDilatation(k,l); } } } - // _Stiff_alphaDilatation*=0.; - -} + } +} + mlawSMP::mlawSMP(const mlawSMP &source) : mlawThermalConducter(source),_mu_groundState3(source._mu_groundState3),_Im3(source._Im3), _pi(source._pi), _k0(source._k0) ,_Tr(source._Tr),_Nmu_groundState2(source._Nmu_groundState2),_Im2(source._Im2),_mu_groundState2(source._mu_groundState2), @@ -152,7 +153,7 @@ _Mur1(source._Mur1),_epsilon01( source._epsilon01), _QglOnKb1(source._QglOnKb1), _m1(source._m1),_VOnKb1(source._VOnKb1), _alphap( source._alphap), _Sa0( source._Sa0),_ha1( source._ha1),_b1( source._b1),_g1( source._g1), _phia01( source._phia01),_Z1(source._Z1),_r1(source._r1),_s1(source._s1),_Sb01(source._Sb01),_Hgl1(source._Hgl1),_Lgl1(source._Lgl1),_Hr1(source._Hr1) ,_Lr1(source._Lr1),_l1(source._l1),_Kb(source._Kb),_be1(source._be1),_wp(source._wp),_c0(source._c0),_c1(source._c1),_t0(source._t0) -,_Stiff_alphaDilatation(source._Stiff_alphaDilatation),_alphaDilatation(source._alphaDilatation), _order(source._order) +,_Stiff_alphaDilatation(source._Stiff_alphaDilatation),_alphaDilatation(source._alphaDilatation), _order(source._order), _mechanism2(source._mechanism2), I4(1.,1.), I2(1.) { @@ -162,63 +163,63 @@ _phia01( source._phia01),_Z1(source._Z1),_r1(source._r1),_s1(source._s1),_Sb01(s //mlawSMP& mlawSMP::operator=(const mlawLinearThermoMechanics &source) mlawSMP& mlawSMP::operator=(const materialLaw &source) { - mlawThermalConducter::operator=(source); - const mlawSMP* src =static_cast<const mlawSMP*>(&source); - _mu_groundState3=src->_mu_groundState3; - _Im3=src->_Im3; - _pi=src->_pi; - _k0=src->_k0; - _Nmu_groundState2=src->_Nmu_groundState2; - _mu_groundState2=src->_mu_groundState2; - _Im2=src->_Im2; - _Tr=src->_Tr; - _Sgl2=src->_Sgl2; - _Sr2=src->_Sr2; - _Delta=src->_Delta; - _m2=src->_m2; - _epsilonr=src->_epsilonr; - _n=src->_n; - _epsilonp02=src->_epsilonp02; - _alphar1=src->_alphar1; - _alphagl1=src->_alphagl1; - _Ggl1=src->_Ggl1; - _Gr1 =src->_Gr1; - _Mgl1=src->_Mgl1; - _Mr1=src->_Mr1; - _Mugl1=src->_Mugl1; - _Mur1=src->_Mur1; - _epsilon01=src->_epsilon01; - _QglOnKb1=src->_QglOnKb1; - _QrOnKb1=src->_QrOnKb1; - _epsygl1=src->_epsygl1 ; - _d1=src->_d1 ; - _m1=src->_m1; - _VOnKb1=src->_VOnKb1; - _alphap=src->_alphap; - _Sa0=src->_Sa0; - _ha1=src->_ha1; - _b1=src->_b1; - _g1=src->_g1; - _phia01=src->_phia01; - _Z1=src->_Z1; - _r1=src->_r1; - _s1=src->_s1; - _Sb01=src->_Sb01; - _Hgl1=src->_Hgl1; - _Lgl1=src->_Lgl1; - _Hr1=src->_Hr1; - _Lr1=src->_Lr1; - _l1=src->_l1; - _Kb=src->_Kb; - _be1=src->_be1; - _wp=src->_wp; - _c0=src->_c0; - _c1=src->_c1; - _t0=src->_t0; - _Stiff_alphaDilatation=src->_Stiff_alphaDilatation; - _alphaDilatation=src->_alphaDilatation; - _order =src->_order; - + mlawThermalConducter::operator=(source); + const mlawSMP* src =static_cast<const mlawSMP*>(&source); + _mu_groundState3=src->_mu_groundState3; + _Im3=src->_Im3; + _pi=src->_pi; + _k0=src->_k0; + _Nmu_groundState2=src->_Nmu_groundState2; + _mu_groundState2=src->_mu_groundState2; + _Im2=src->_Im2; + _Tr=src->_Tr; + _Sgl2=src->_Sgl2; + _Sr2=src->_Sr2; + _Delta=src->_Delta; + _m2=src->_m2; + _epsilonr=src->_epsilonr; + _n=src->_n; + _epsilonp02=src->_epsilonp02; + _alphar1=src->_alphar1; + _alphagl1=src->_alphagl1; + _Ggl1=src->_Ggl1; + _Gr1 =src->_Gr1; + _Mgl1=src->_Mgl1; + _Mr1=src->_Mr1; + _Mugl1=src->_Mugl1; + _Mur1=src->_Mur1; + _epsilon01=src->_epsilon01; + _QglOnKb1=src->_QglOnKb1; + _QrOnKb1=src->_QrOnKb1; + _epsygl1=src->_epsygl1 ; + _d1=src->_d1 ; + _m1=src->_m1; + _VOnKb1=src->_VOnKb1; + _alphap=src->_alphap; + _Sa0=src->_Sa0; + _ha1=src->_ha1; + _b1=src->_b1; + _g1=src->_g1; + _phia01=src->_phia01; + _Z1=src->_Z1; + _r1=src->_r1; + _s1=src->_s1; + _Sb01=src->_Sb01; + _Hgl1=src->_Hgl1; + _Lgl1=src->_Lgl1; + _Hr1=src->_Hr1; + _Lr1=src->_Lr1; + _l1=src->_l1; + _Kb=src->_Kb; + _be1=src->_be1; + _wp=src->_wp; + _c0=src->_c0; + _c1=src->_c1; + _t0=src->_t0; + _Stiff_alphaDilatation=src->_Stiff_alphaDilatation; + _alphaDilatation=src->_alphaDilatation; + _order =src->_order; + _mechanism2 =src->_mechanism2; } double mlawSMP::getExtraDofStoredEnergyPerUnitField(double T) const @@ -228,7 +229,7 @@ double mlawSMP::getExtraDofStoredEnergyPerUnitField(double T) const double specificheat=_c0; if(T<Tg) { - specificheat=_c0-_c1*(T-Tg); + specificheat=_c0-_c1*(T-Tg); } return specificheat; } @@ -253,90 +254,44 @@ void mlawSMP::constitutive(const STensor3& F0,const STensor3& Fn,STensor3 &P, } -/*void mlawSMP::rightcauchydis(const STensor3& Fn, STensor3 &Cedis) -{ - STensor3 FnT=Fn.transpose(); - STensor3 C(FnT); // static - C*=Fn; - double J= Fn.determinant(); - double invJ2third = pow(J,-2./3.); - C*=invJ2third; - Cedis=C; - -}*/ - void mlawSMP::glassTrans(const STensor3& F0,const STensor3& Fn, const double T, double &Tg,STensor3& dTgdF)const { - double dh= _timeStep; - // doule dh=getTimeStep(); + //double dh= _timeStep; + double dh=getTimeStep(); static STensor3 F0T; - F0T=F0.transpose(); + STensorOperation::transposeSTensor3(F0, F0T); static STensor3 FnT; - FnT=Fn.transpose(); + STensorOperation::transposeSTensor3(Fn, FnT); static STensor3 F0inv; - F0inv =F0.invert(); + STensorOperation::inverseSTensor3(F0, F0inv); static STensor3 F0invT; - F0invT=F0inv.transpose(); + STensorOperation::transposeSTensor3(F0inv, F0invT); static STensor3 Fninv; - Fninv=Fn.invert(); + STensorOperation::inverseSTensor3(Fn, Fninv); static STensor3 L2; - L2=Fn; - L2*=F0inv; + STensorOperation::multSTensor3(Fn, F0inv, L2); static STensor3 LT2; - LT2=F0invT; - LT2*=FnT; - // static STensor3 logL2,logLT2; + STensorOperation::multSTensor3(F0invT, FnT, LT2); static STensor43 dlogaL; - // logSTensor3(L2, logL2, &dlogaL2); - //logSTensor3(LT2, logLT2, &dlogaLT2); - // logL2*=1./dh; + STensorOperation::zero(dlogaL); static STensor3 L,logL,Dsym,devDsym; - double normdevDsym,epsi; - Dsym*=0.; + STensorOperation::zero(L); STensorOperation::zero(logL); STensorOperation::zero(Dsym); STensorOperation::zero(devDsym); + double normdevDsym=0.,epsi=0; if(dh>0.) { - - /* for(int i = 0; i< 3; i++){ - for(int x = 0; x< 3; x++){ - //L(i,x)=0.; - for(int A = 0; A< 3; A++){ - L(i,x)+=1./2.*(Fn(i,A)*F0inv(A,x)+F0inv(A,i)*Fn(x,A));//give the same result of previous eq - } - } - }*/ - - for(int i = 0; i< 3; i++){ - for(int x = 0; x< 3; x++){ - L(i,x)=0.; - for(int A = 0; A< 3; A++){ - L(i,x)+=(Fn(i,A)*F0inv(A,x)); - } - } - } - for(int i = 0; i< 3; i++){ - for(int x = 0; x< 3; x++){ - for(int B = 0; B< 3; B++){ - L(i,x)+=(F0inv(B,i)*Fn(x,B)); - } - } - } - //L=L2+LT2; - STensorOperation::logSTensor3(L, _order, logL, &dlogaL); - for(int i = 0; i< 3; i++){ - for(int x = 0; x< 3; x++){ - Dsym(i,x)=1./(2.*dh)*logL(i,x); - } - } - // D=1./dh; - // D*=logL; - divatoric(Dsym,devDsym); - normdevDsym=devDsym.norm2(); + L = L2; + L += LT2; + STensorOperation::logSTensor3(L, _order, logL, &dlogaL); + Dsym=logL; + Dsym*=1./(2.*dh); } + double trD; + STensorOperation::decomposeDevTr(Dsym,devDsym, trD); + normdevDsym=devDsym.norm2(); epsi=normdevDsym*sqrt(2.); Tg=_Tr; - dTgdF*=0.; - -/* + STensorOperation::zero(dTgdF); +#if 0 if(epsi>_epsilonr and _epsilonr!=0.) { Tg=_Tr+_n*log(epsi/_epsilonr); @@ -352,7 +307,12 @@ void mlawSMP::glassTrans(const STensor3& F0,const STensor3& Fn, const double T, for(int y = 0; y< 3; y++){ for(int z = 0; z< 3; z++){ dDdF(i,x,j,C)+=1./(2.*dh)*dlogaL(i,x,z,y)*(I2(z,j)*F0inv(C,y)+I2(y,j)*F0inv(C,z) ) ; - }}}}}} + } + } + } + } + } + } for(int j = 0; j< 3; j++){ for(int C = 0; C< 3; C++){ @@ -363,16 +323,22 @@ void mlawSMP::glassTrans(const STensor3& F0,const STensor3& Fn, const double T, for(int y = 0; y< 3; y++){ for(int z = 0; z< 3; z++){ depsidF(j,C)-=sqrt(2.)/3.*devDsym(i,X)/ normdevDsym*I2(y,z)*dDdF(y,z,j,C)*I2(i,X) ; - }}}}}} - dTgdF=_n/epsi*depsidF; + } + } + } + } + } + } + dTgdF=depsidF; + dTgdF*=_n/epsi; } - }*/ + } +#endif } -void mlawSMP::constitutive( - const STensor3& F0, // initial deformation gradient (input @ time n) +void mlawSMP::constitutive( const STensor3& F0, // initial deformation gradient (input @ time n) const STensor3& Fn, // updated deformation gradient (input @ time n+1) // updated 1st Piola-Kirchhoff stress tensor (output) STensor3 &P, // contains the initial values on input @@ -389,33 +355,37 @@ void mlawSMP::constitutive( STensor33 &dqdF, const bool stiff,// if true compute the tangents double &w, - double &dwdt, - STensor3 &dwdf + double &dwdT, + STensor3 &dwdF ) const { + w=0.;dwdT=0.; STensorOperation::zero(dwdF); STensorOperation::zero(dqdF); STensorOperation::zero(dqdT); STensorOperation::zero(dqdgradT); STensorOperation::zero(dPdT); STensorOperation::zero(fluxT); // _k0=_k; - double Tg=0.;; - // const double pi=3.14159; + double Tg=0.;; + // const double pi=3.14159; static STensor3 P1,P2,P3; + STensorOperation::zero(P1); STensorOperation::zero(P2); STensorOperation::zero(P3); static STensor43 Tangent1,Tangent2,Tangent3; + STensorOperation::zero(Tangent1); STensorOperation::zero(Tangent2); STensorOperation::zero(Tangent3); static STensor3 Cedis3; + STensorOperation::zero(Cedis3); static STensor3 dPdT1,dPdT2,dPdT3; + STensorOperation::zero(dPdT1); STensorOperation::zero(dPdT2); STensorOperation::zero(dPdT3); static STensor3 Fninv; + STensorOperation::zero(Fninv); static STensor3 _Kref,dtauepsilon2dF,dtauepsilon1dF,dTgdF,dcpdF; - double specificheat,depsitau1,depsitau2,dtauepsilon1dt,dtauepsilon2dt; - w=0.;dwdt=0.; dwdf*=0.; dqdF*=0;dTgdF*=0.;dqdT*=0.; dPdT*=0.;dcpdF*=0.; + STensorOperation::zero(_Kref); STensorOperation::zero(dtauepsilon2dF); STensorOperation::zero(dtauepsilon1dF); STensorOperation::zero(dTgdF); STensorOperation::zero(dcpdF); + double specificheat=0.,depsitau1=0.,depsitau2=0.,dtauepsilon1dt=0.,dtauepsilon2dt=0.; + //Msg::Error(" temp: %f",T); - glassTrans(F0,Fn,T,Tg, dTgdF); - - constitutive1(F0,Fn,P1, q0, q1, Tangent1,T0, T,dPdT1, stiff,Tg,dTgdF,depsitau1,dtauepsilon1dF,dtauepsilon1dt); - P2*=0.; - Tangent2*=0.; - dPdT2*=0.; - //constitutive2(F0,Fn,P2, q0, q1, Tangent2, T,dPdT2, stiff,Tg, dTgdF,depsitau2,dtauepsilon2dF,dtauepsilon2dt); - constitutive3(F0,Fn,P3, q0, q1, Tangent3, T,dPdT3, stiff) ; + glassTrans(F0,Fn,T,Tg, dTgdF); + constitutive1(F0,Fn,P1, q0, q1, Tangent1,T0, T,dPdT1, stiff,Tg,dTgdF,depsitau1,dtauepsilon1dF,dtauepsilon1dt); + if(_mechanism2) + constitutive2(F0,Fn,P2, q0, q1, Tangent2, T,dPdT2, stiff,Tg, dTgdF,depsitau2,dtauepsilon2dF,dtauepsilon2dt); + constitutive3(F0,Fn,P3, q0, q1, Tangent3, T,dPdT3, stiff) ; - double dh; + double dh; double dcpdt=0.; dh = getTimeStep(); //cp is not constant @@ -427,62 +397,57 @@ void mlawSMP::constitutive( else specificheat=_c0; - if(dh>0) + if(dh>0.) { w=-specificheat*(T-T0)/dh;// the - sign become from the term of thermal source w+=(depsitau1)*_wp/dh; - // w+=(depsitau2)*_wp/dh; + w+=(depsitau2)*_wp/dh; } else w=0.; // q1->_thermalEnergy = specificheat*T; //(T-_t0); - if (T<Tg) - { - dcpdt=-_c1; - dcpdF=dTgdF*_c1; - } + if (T<Tg) + { + dcpdt=-_c1; + dcpdF=dTgdF; + dcpdF*=_c1; + } else { dcpdt=0.; - dcpdF*=0.; + STensorOperation::zero(dcpdF); } - //cp is constant - /*specificheat=_c0; - dcpdt=0.;*/ - if(dh>0) + if(dh>0.) { - dwdt=-dcpdt*(T-T0)/dh-specificheat/dh; - dwdt+=(dtauepsilon1dt)*_wp/dh; - //dwdt+=(dtauepsilon2dt)*_wp/dh; + dwdT=-dcpdt*(T-T0)/dh-specificheat/dh; + dwdT+=(dtauepsilon1dt)*_wp/dh; + dwdT+=(dtauepsilon2dt)*_wp/dh; for(int K = 0; K< 3; K++){ for(int i = 0; i< 3; i++){ - dwdf(K,i)=-dcpdF(K,i)*(T-T0)/dh; - dwdf(K,i)+=(dtauepsilon1dF(K,i))*_wp/dh; - // dwdf(K,i)+=(dtauepsilon2dF(K,i))*_wp/dh; + dwdF(K,i)=-dcpdF(K,i)*(T-T0)/dh; + dwdF(K,i)+=(dtauepsilon1dF(K,i))*_wp/dh; + dwdF(K,i)+=(dtauepsilon2dF(K,i))*_wp/dh; } } } else { - dwdt=0.; - dwdf*=0.; + dwdT=0.; + STensorOperation::zero(dwdF); } - P*=0.; - P =P3; - //P+=P2; - P+=P1; + P =P3; + P+=P2; + P+=P1; //P.print("p"); //put flux in reference configuration - Fninv = Fn.invert(); + STensorOperation::inverseSTensor3(Fn, Fninv); double J= Fn.determinant(); - fluxT *=0.; - _Kref*=0; for(int K = 0; K< 3; K++) { for(int L = 0; L< 3; L++) @@ -494,32 +459,27 @@ void mlawSMP::constitutive( _Kref(K,L) += Fninv(K,i)*_k(i,j)*Fninv(L,j);//*J; //put in reference configuration } } - fluxT(K) += _Kref(K,L)*gradT(L)*J; } } - static STensor3 dkdt; - dkdt*=0.; + STensorOperation::multSTensor3SVector3(_Kref, gradT, fluxT); + fluxT*=J; + + static STensor3 dkdT; + STensorOperation::zero(dkdT); if(stiff) { dPdT=dPdT3; - // dPdT+=dPdT2; + dPdT+=dPdT2; dPdT+=dPdT1; - Tangent*=0; - Tangent=Tangent3; - // Tangent+=Tangent2; - Tangent+=Tangent1; - - for(int K = 0; K< 3; K++) - {dqdT(K)=0.; - for(int m = 0; m< 3; m++) - { - dqdT(K)+=dkdt(K,m)*gradT(m)*J; - } - } - //if _k depends on T this should be here + Tangent=Tangent3; + Tangent+=Tangent2; + Tangent+=Tangent1; + STensorOperation::multSTensor3SVector3(dkdT, gradT, dqdT); + dqdT*=J; - dqdgradT = _Kref*J; + dqdgradT = _Kref; + dqdgradT*=J; for(int K = 0; K< 3; K++) @@ -542,333 +502,78 @@ void mlawSMP::constitutive( } - void mlawSMP::constitutive3(const STensor3& F0, const STensor3& Fn, STensor3 &P3, const IPSMP *q0, IPSMP *q1, STensor43 &Tangent3, double T, +void mlawSMP::constitutive3(const STensor3& F0, const STensor3& Fn, STensor3 &P3, const IPSMP *q0, IPSMP *q1, STensor43 &Tangent3, double T, STensor3 &dPdT, const bool stiff) const - { - // rightcauchydis(Fn,Cedis); - static STensor3 FnT,Fninv,FnTinv,Cedis,invCedis,Fndis,S3,Fndisinv,c,cinv; - FnT*=0.;Fninv*=0.;FnTinv*=0.;Cedis*=0.;invCedis*=0.;Fndis*=0.;S3*=0.;Fndisinv*=0.; - double J,invJ2third,invJ1third,traceCedis,traceC; +{ + // rightcauchydis(Fn,Cedis); + STensorOperation::zero(P3); STensorOperation::zero(Tangent3); STensorOperation::zero(dPdT); + static STensor3 FnT,Fninv,FnTinv,Cedis,invCedis,Fndis,S3,Fndisinv,c,cinv; + STensorOperation::zero(FnT); STensorOperation::zero(Fninv); STensorOperation::zero(FnTinv); STensorOperation::zero(Cedis); STensorOperation::zero(invCedis); + STensorOperation::zero(Fndis); STensorOperation::zero(S3); STensorOperation::zero(Fndisinv); STensorOperation::zero(c); STensorOperation::zero(cinv); + double J=0.,invJ2third=0.,invJ1third=0.,traceCedis=0.,traceC=0.; - FnT=Fn.transpose(); - Fninv=Fn.invert(); - FnTinv=FnT.invert(); - - J=Fn.determinant(); - invJ2third =1./ pow(J,2./3.); - - Cedis=FnT; - Cedis*=Fn; - Cedis*=invJ2third; - - c=FnT; - c*=Fn; - traceC=c.trace(); - cinv=c.invert(); - traceCedis=Cedis.trace(); - invCedis=Cedis.invert(); - - invJ1third =1./ pow(J,1./3.); - Fndis=invJ1third*Fn; - Fndisinv=Fndis.invert(); - STensor3 cbar; - cbar*=0.; - for(int A=0;A<3;A++) - { - for(int B=0;B<3;B++) - { - for(int k=0;k<3;k++) - { - cbar(A,B)+=invJ2third*Fn(k,A)*Fn(k,B); - } - } - } - double x,y,z; - // x=(traceC*invJ2third-3.)/_Im3; //b - x=(traceC*invJ2third-3.)/_Im3; - y=(1.-(x)); - z=0.; - if(y>0.) - z=1./y; - - if (traceCedis<3.+_Im3) - { - for(int A=0;A<3;A++) - { - for(int B=0;B<3;B++) - { - // S3(A,B)=invJ2third*_mu_groundState3*(1./(1.-((traceC*invJ2third-3.)/_Im3)))*(I2(A,B)-traceC*invJ2third*cinv(A,B)/(invJ2third*3.)); // the same of the old one and it is working - - S3(A,B)= invJ2third*_mu_groundState3*(1./(1.-((traceCedis-3.)/_Im3)))*(I2(A,B)-((traceCedis/3.)*invCedis(A,B))); - - // S3(A,B)=invJ2third*_mu_groundState3*(z)*(I2(A,B)-traceC*invJ2third*cinv(A,B)/(invJ2third*3.)); // the same of the old one and it is workin - } - } - } - - else - { - S3*=0.; - } - - //q1->_SMPEnergy=-1./2.*_Im3*_mu_groundState3*log10(y); //energ // if without calling the deformationEnergy function + STensorOperation::transposeSTensor3(Fn, FnT); + STensorOperation::inverseSTensor3(Fn, Fninv); + STensorOperation::transposeSTensor3(Fninv, FnTinv); - // q1->_SMPEnergy=deformationEnergy(y);//right - P3= Fn; - P3*=S3; - if(stiff) - { - //dPdF - Tangent3=0.; - // STensor43 _ElasticityTensor; - if (traceCedis<3.+_Im3) - { - for(int i=0;i<3;i++) - { - for(int B=0;B<3;B++) - { - for(int j=0;j<3;j++) - { - for(int C=0;C<3;C++) - { - Tangent3(i,B,j,C)= I2(i,j)*S3(C,B); - } - } - } - } + J=Fn.determinant(); + invJ2third =1./ pow(J,2./3.); - - for(int i=0;i<3;i++) - { - for(int B=0;B<3;B++) - { - for(int j=0;j<3;j++) - { - for(int C=0;C<3;C++) - { - Tangent3(i,B,j,C)+=2./(_Im3)* invJ2third*_mu_groundState3*(1./(1.-((traceCedis-3.)/_Im3)))*(1./(1.-((traceCedis-3.)/_Im3)))*(Fndis(i,B)*Fndis(j,C) - -1./3.*traceCedis*Fndisinv(B,i)*Fndis(j,C)); - } - } - } - } - - for(int i=0;i<3;i++) - { - for(int B=0;B<3;B++) - { - for(int j=0;j<3;j++) - { - for(int C=0;C<3;C++) - { - Tangent3(i,B,j,C)-=2./(3.)* invJ2third*_mu_groundState3*(1./(1.-((traceCedis-3.)/_Im3)))*Fndisinv(B,i)*Fndis(j,C); - } - } - } - } - for(int i=0;i<3;i++) - { - for(int B=0;B<3;B++) - { - for(int j=0;j<3;j++) - { - for(int C=0;C<3;C++) - { - Tangent3(i,B,j,C)+=1./(3.)* invJ2third*_mu_groundState3*(1./(1.-((traceCedis-3.)/_Im3)))*traceCedis*(I2(i,j)*invCedis(B,C)+ - Fndisinv(C,i)*Fndisinv(B,j)); - } - } - } - } - for(int i=0;i<3;i++) - { - for(int B=0;B<3;B++) - { - for(int j=0;j<3;j++) - { - for(int C=0;C<3;C++) - { - for(int A=0;A<3;A++) - { - Tangent3(i,B,j,C)-=2./3.* Fn(i,A)*S3(A,B)*Fninv(C,j); - } - } - } - } - } - /* for(int i=0;i<3;i++) - { - for(int B=0;B<3;B++) - { - for(int j=0;j<3;j++) - { - for(int C=0;C<3;C++) - { - for(int A=0;A<3;A++) - { - Tangent3(i,B,j,C)-=2.*traceCedis/(3.*_Im3)* Fn(i,A)*Fninv(C,j)*S3(A,B)*(z); // check again if /J ( j is inside S) here and in the previous relation - // Tangent3(i,B,j,C)-=2.*traceCedis/(3.*_Im3)* Fn(i,A)*Fninv(C,j)*S3(A,B)*(z); - } - } - } - } - } - //new - for(int i=0;i<3;i++) - { - for(int B=0;B<3;B++) - { - for(int j=0;j<3;j++) - { - for(int C=0;C<3;C++) - { - for(int A=0;A<3;A++) - { - Tangent3(i,B,j,C)-=2./(3.)* invJ2third*_mu_groundState3*(z)*(-1./3.*traceCedis*invCedis(A,B))* Fn(i,A)*Fninv(C,j); - } - } - } - } - } - for(int i=0;i<3;i++) - { - for(int B=0;B<3;B++) - { - for(int j=0;j<3;j++) - { - for(int C=0;C<3;C++) - { - for(int A=0;A<3;A++) - { - Tangent3(i,B,j,C)+=2./3.*_mu_groundState3*(z)*(-1./3.*traceCedis*cinv(A,B))* Fn(i,A)*Fninv(C,j); - } - } - } - } - }*/ - } - } - - if(stiff) - { - dPdT*=0.; - /* for(int i=0;i<3;i++) - { - for(int j=0;j<3;j++) - { - for(int k=0;k<3;k++) - { - for(int l=0;l<3;l++) - { - dPdT(i,j)-=_ElasticityTensor(i,j,k,l)*_alphaDilatation(k,l); - } - } - } - }*/ - } - } + STensorOperation::multSTensor3(FnT,Fn,c); + traceC=c.trace(); + STensorOperation::multSTensor3(Fninv,FnTinv,cinv); - - void mlawSMP::divatoric(const STensor3 &a, STensor3 &diva) const -{ - double tra=(a.trace())/3; - diva=a; - diva(0,0)-=tra; - diva(1,1)-=tra; - diva(2,2)-=tra; -} + Cedis=c; + Cedis*=invJ2third; + traceCedis=Cedis.trace(); -/* -void mlawSMP::logSTensor3(const STensor3& a, STensor3 &loga, STensor43 *dloga, STensor63 *ddloga) const -{ - /* linear approximation for now */ - // static const STensor3 I(-1.); - /* loga= a; - loga-= I2; - - if(dloga !=NULL) - { - (*dloga) = I4; - } - if(ddloga !=NULL) + invCedis=cinv; + invCedis*=1./invJ2third; + + invJ1third =1./ pow(J,1./3.); + Fndis=Fn; + Fndis*=invJ1third; + Fndisinv=Fninv; + Fndisinv*=1./invJ1third; + + + if (traceCedis<3.+_Im3) { - (*ddloga) *= 0.; + S3= invCedis; + S3*=-(traceCedis/3.); + S3+=I2; + S3*=invJ2third*_mu_groundState3*(1./(1.-((traceCedis-3.)/_Im3))); } - - STensor3 ami(a); - ami-=I2; - loga=ami; - if(_order>1) + else { - for( int x=0; x<3; x++){ - for( int y=0; y<3; y++){ - for( int k=0; k<3; k++){ - loga(x,y)-=0.5*ami(x,k)*ami(k,y); - if(_order>2) - { - for( int m=0; m<3; m++) - { - loga(x,y)+=(ami(x,k)*ami(k,m)*ami(m,y))/3.; - } - } - } - } - } + S3*=0.; } - if(dloga !=NULL) + + //q1->_SMPEnergy=-1./2.*_Im3*_mu_groundState3*log10(y); //energ // if without calling the deformationEnergy function + + // q1->_SMPEnergy=deformationEnergy(y);//right + STensorOperation::multSTensor3(Fn,S3,P3); + if(stiff) { - for( int x=0; x<3; x++){ - for( int y=0; y<3; y++){ - for( int z=0; z<3; z++){ - for( int l=0; l<3; l++){ - (*dloga)(x,y,z,l)=I4(x,y,z,l); - if(_order>1) + if (traceCedis<3.+_Im3) + { + for(int i=0;i<3;i++) + { + for(int B=0;B<3;B++) + { + for(int j=0;j<3;j++) + { + for(int C=0;C<3;C++) { - for( int k=0; k<3; k++){ - (*dloga)(x,y,z,l)-=(0.5*I4(x,k,z,l)*ami(k,y)+0.5*ami(x,k)*I4(k,y,z,l)) ; - if(_order>2) - { - for( int p=0; p<3; p++){ - (*dloga)(x,y,z,l)+=(I4(x,k,z,l)*ami(k,p)*ami(p,y)+ - ami(x,k)*I4(k,p,z,l)*ami(p,y)+ami(x,k)*ami(k,p)*I4(p,y,z,l))/3. ; - } - - } - } - - } - } - } - } - } - } - if(ddloga !=NULL) - { - for( int x=0; x<3; x++){ - for( int y=0; y<3; y++){ - for( int z=0; z<3; z++){ - for( int l=0; l<3; l++){ - for( int m=0; m<3; m++){ - for( int n=0; n<3; n++){ - (*ddloga)(x,y,z,l,m,n)=0.; - if(_order>1) - { - for( int k=0; k<3; k++){ - (*ddloga)(x,y,z,l,m,n)-=(0.5*I4(x,k,z,l)*I4(k,y,m,n)+0.5*I4(k,y,z,l)*I4(x,k,m,n)); - if(_order>2) - { - for( int p=0; p<3; p++){ - (*ddloga)(x,y,z,l,m,n)+=(I4(x,k,z,l)*I4(k,p,m,n)*ami(p,y)+ - I4(x,k,z,l)*ami(k,p)*I4(p,y,m,n)+ - I4(x,k,m,n)*I4(k,p,z,l)*ami(p,y)+ - ami(x,k)*I4(k,p,z,l)*I4(p,y,m,n)+ - I4(x,k,m,n)*ami(k,p)*I4(p,y,z,l)+ - ami(x,k)*I4(k,p,m,n)*I4(p,y,z,l))/3. ; //to check - } - } - } - - } + Tangent3(i,B,j,C)= I2(i,j)*S3(C,B); + Tangent3(i,B,j,C)+=2./(_Im3)* invJ2third*_mu_groundState3*(1./(1.-((traceCedis-3.)/_Im3)))*(1./(1.-((traceCedis-3.)/_Im3)))*(Fndis(i,B)*Fndis(j,C) + -1./3.*traceCedis*Fndisinv(B,i)*Fndis(j,C)); + Tangent3(i,B,j,C)-=2./(3.)* invJ2third*_mu_groundState3*(1./(1.-((traceCedis-3.)/_Im3)))*Fndisinv(B,i)*Fndis(j,C); + Tangent3(i,B,j,C)+=1./(3.)* invJ2third*_mu_groundState3*(1./(1.-((traceCedis-3.)/_Im3)))*traceCedis*(I2(i,j)*invCedis(B,C)+ + Fndisinv(C,i)*Fndisinv(B,j)); + for(int A=0;A<3;A++) + { + Tangent3(i,B,j,C)-=2./3.* Fn(i,A)*S3(A,B)*Fninv(C,j); } } } @@ -876,291 +581,137 @@ void mlawSMP::logSTensor3(const STensor3& a, STensor3 &loga, STensor43 *dloga, S } } } - } -*/ -/* -void mlawSMP::expSTensor3(const STensor3 &a,STensor3 &expa,STensor43 *dexpa, STensor63 *ddexpa) const -{ - //linear approximation for now - static const STensor3 I(1.); - static const STensor43 I4(1.,1.); - - if (_order == 1){ - expa = I; - expa += a; - } - else if (_order == 2){ - STensor3 a2(a); - a2*=a; - expa = I; - expa += a; - a2 *= 0.5; - expa += a2; - } - else if (_order >= 3){ - STensor3 a2(a); - a2*=a; - STensor3 a3(a2); - a3*=a; - expa = I; - expa += a; - a2 *= 0.5; - expa += a2; - a3 *=0.16666667; - expa += a3; - } - - - if(dexpa!=NULL) - { - if (_order == 1){ - (*dexpa) = I4; - } - else if (_order == 2){ - (*dexpa) = I4; - for (int i=0; i<3; i++){ - for (int j=0; j<3; j++){ - for (int k=0; k<3; k++){ - for (int l=0; l<3; l++){ - for (int s=0; s<3; s++){ - dexpa->operator()(i,j,k,l) += 0.5*I4(i,s,k,l)*a(s,j); - dexpa->operator()(i,j,k,l) += 0.5*a(i,s)*I4(s,j,k,l); - } - } - } - } - } - } - else if (_order >= 3){ - (*dexpa) = I4; - for (int i=0; i<3; i++){ - for (int j=0; j<3; j++){ - for (int k=0; k<3; k++){ - for (int l=0; l<3; l++){ - for (int s=0; s<3; s++){ - dexpa->operator()(i,j,k,l) += 0.5*I4(i,s,k,l)*a(s,j); - dexpa->operator()(i,j,k,l) += 0.5*a(i,s)*I4(s,j,k,l); - - for (int q=0; q<3; q++){ - dexpa->operator()(i,j,k,l) += 0.16666667*I4(i,s,k,l)*a(s,q)*a(q,j); - dexpa->operator()(i,j,k,l) += 0.16666667*a(i,s)*I4(s,q,k,l)*a(q,j); - dexpa->operator()(i,j,k,l) += 0.16666667*a(i,s)*a(s,q)*I4(q,j,k,l); - } - } - } - } - } - } - } - } - if(ddexpa!=NULL) - { - (*ddexpa) *= 0.; - if (_order == 2){ - for (int i=0; i<3; i++){ - for (int j=0; j<3; j++){ - for (int k=0; k<3; k++){ - for (int l=0; l<3; l++){ - for (int m=0; m<3; m++){ - for (int n=0; n<3; n++){ - for (int s=0; s<3; s++){ - ddexpa->operator()(i,j,k,l,m,n) += 0.5*I4(i,s,k,l)*I4(s,j,m,n); - ddexpa->operator()(i,j,k,l,m,n) += 0.5*I4(i,s,m,n)*I4(s,j,k,l); - } - } - } - } - } - } - } - } - else if (_order >= 3){ - for (int i=0; i<3; i++){ - for (int j=0; j<3; j++){ - for (int k=0; k<3; k++){ - for (int l=0; l<3; l++){ - for (int m=0; m<3; m++){ - for (int n=0; n<3; n++){ - for (int s=0; s<3; s++){ - ddexpa->operator()(i,j,k,l,m,n) += 0.5*I4(i,s,k,l)*I4(s,j,m,n); - ddexpa->operator()(i,j,k,l,m,n) += 0.5*I4(i,s,m,n)*I4(s,j,k,l); - - for (int q=0; q<3; q++){ - ddexpa->operator()(i,j,k,l,m,n) += 0.16666667*I4(i,s,k,l)*I4(s,q,m,n)*a(q,j); - ddexpa->operator()(i,j,k,l,m,n) += 0.16666667*I4(i,s,k,l)*a(s,q)*I4(q,j,m,n); - ddexpa->operator()(i,j,k,l,m,n) += 0.16666667*I4(i,s,m,n)*I4(s,q,k,l)*a(q,j); - ddexpa->operator()(i,j,k,l,m,n) += 0.16666667*a(i,s)*I4(s,q,k,l)*I4(q,j,m,n); - ddexpa->operator()(i,j,k,l,m,n) += 0.16666667*I4(i,s,m,n)*a(s,q)*I4(q,j,k,l); - ddexpa->operator()(i,j,k,l,m,n) += 0.16666667*a(i,s)*I4(s,q,m,n)*I4(q,j,k,l); - } - } - } - } - } - } - } - } - } - - - - } -}*/ - - - - - + -void mlawSMP::todistrotionalj(const STensor3 &Fn, double &inv2t) const +void mlawSMP:: constitutive2(const STensor3& F0, const STensor3& Fn, STensor3 &P2, const IPSMP *q0, IPSMP *q1, STensor43 &Tangent2, double T, + STensor3 &dPdT2, const bool stiff,const double Tg, + const STensor3 &dTgdF, double &depsitau2,STensor3 &dtauepsilon2dF,double &dtauepsilon2dT) const { - double j=Fn.determinant(); - inv2t=1./ pow(j,2./3.); -} - - - - - void mlawSMP:: constitutive2(const STensor3& F0, const STensor3& Fn, STensor3 &P2, const IPSMP *q0, IPSMP *q1, STensor43 &Tangent2, double T, - STensor3 &dPdT2, const bool stiff,const double Tg, - const STensor3 &dTgdF, double &depsitau2,STensor3 &dtauepsilon2dF,double &dtauepsilon2dt) const - { - + STensorOperation::zero(P2); + STensorOperation::zero(Tangent2); + STensorOperation::zero(dPdT2); + STensorOperation::zero(dtauepsilon2dF); + depsitau2=0.; dtauepsilon2dT=0.; - // static fullMatrix<double> domega2dM2(6,6); static fullVector<double> Omega2(6); - static fullMatrix<double> domega2dM2inv(6,6); + Omega2.setAll(0.); + static fullMatrix<double> domega2dM2inv(6,6); + domega2dM2inv.setAll(0.); - // const STensor3 I2(1.); - static STensor3 M2,dDp2,SP2,Fe2,Cebar2,Cebarpr2,dSt2dF;//,expdDp2; - double invJ2third,depsilon2,Ta2,Gmu_groundState2,St2,dSt2dT; - static STensor43 dFp2dF,dSP2dF;//,dFp2invdF;//,dexpdDp2; - // static STensor63 dLe; - double dh; + static STensor3 M2,dDp2,SP2,Fe2,Cebar2,Cebarpr2,dSt2dF; + STensorOperation::zero(M2); STensorOperation::zero(dDp2); STensorOperation::zero(SP2); STensorOperation::zero(Fe2); + STensorOperation::zero(Cebar2); STensorOperation::zero(Cebarpr2); STensorOperation::zero(dSt2dF); + static STensor43 dFp2dF,dSP2dF; + STensorOperation::zero(dFp2dF); STensorOperation::zero(dSP2dF); + + double invJ2third=0.,depsilon2=0.,Ta2=0.,Gmu_groundState2=0.,St2=0.,dSt2dT=0.; + + double dh = getTimeStep(); STensor3 &Fp2= q1->getRefToFp2(); const STensor3 &Fp0= q0->getConstRefToFp2(); - dh = getTimeStep(); - // Fp2.print("Fp2"); - depsitau2=0.; - fSt2( T,Tg, St2,dSt2dT,dSt2dF, dTgdF); + + fSt2( T,Tg, St2,dSt2dT,dSt2dF, dTgdF); predictorCorrector2( Omega2, domega2dM2inv, M2, SP2, Ta2, depsilon2, dDp2, invJ2third, F0, Fn, P2, q0, q1, - T, Tg, Gmu_groundState2 , stiff,Fe2,Cebar2,Cebarpr2,dh,Fp2,St2/*,expdDp2, &dexpdDp2 /* ,STensor43 &Le*/ ) ; + T, Tg, Gmu_groundState2 , stiff,Fe2,Cebar2,Cebarpr2,dh,Fp2,St2) ; - depsitau2=depsilon2*Ta2; //for cp - - - if(stiff) + depsitau2=depsilon2*Ta2; //for cp + + if(stiff) { - computintvardfpdf2(dFp2dF,domega2dM2inv, Fn/*,const STensor3 &Fp0*/, Fp0, SP2, Gmu_groundState2, M2, dDp2 ,Cebar2, invJ2third, Cebarpr2, dh, St2, - Ta2,depsilon2, dtauepsilon2dF,dTgdF,T,Tg,dSt2dF, dSP2dF) ; + computeInternalVariabledfpdf2(dFp2dF,domega2dM2inv, Fn, Fp0, SP2, Gmu_groundState2, M2, dDp2 ,Cebar2, invJ2third, Cebarpr2, dh, St2, + Ta2,depsilon2, dtauepsilon2dF,dTgdF,T,Tg,dSt2dF, dSP2dF) ; - tangent2(Tangent2, Fn,Fp2,SP2, Gmu_groundState2,dFp2dF, Fe2, Cebar2, invJ2third ,T,Tg,dSP2dF) ; + tangent2(Tangent2, Fn,Fp2,SP2, Gmu_groundState2,dFp2dF, Fe2, Cebar2, invJ2third ,T,Tg,dSP2dF) ; - computdpdt2 (dPdT2,domega2dM2inv, Fn,Fp2 ,Fp0,SP2, Gmu_groundState2,M2,dDp2 , Cebar2,Cebarpr2,dh, St2, T, Tg, invJ2third,dtauepsilon2dt, Ta2, depsilon2,dSt2dT); + computedPdT2(dPdT2,domega2dM2inv, Fn,Fp2 ,Fp0,SP2, Gmu_groundState2,M2,dDp2 , Cebar2,Cebarpr2,dh, St2, T, Tg, invJ2third,dtauepsilon2dT, Ta2, depsilon2,dSt2dT); - } - } + +} - void mlawSMP::Gmu_2(const double T,const double Tg, double &Gmu_groundState2_) const - { - Gmu_groundState2_= _mu_groundState2*exp(-_Nmu_groundState2 *(T-Tg)); - } +void mlawSMP::Gmu_2(const double T,const double Tg, double &Gmu_groundState2_) const +{ + Gmu_groundState2_= _mu_groundState2*exp(-_Nmu_groundState2 *(T-Tg)); +} - void mlawSMP:: fSt2(const double T,const double Tg, double &St2_,double &dSt2dT,STensor3 &dSt2dF, const STensor3 &dTgdF)const +void mlawSMP:: fSt2(const double T,const double Tg, double &St2_,double &dSt2dT,STensor3 &dSt2dF, const STensor3 &dTgdF)const +{ + St2_=0.; dSt2dT=0.; + STensorOperation::zero(dSt2dF); + double dSt2dTg=0.; + if(_Delta==0) Msg::Error("mlawSMP: _Delta =0"); + St2_=1./2.*(_Sgl2+_Sr2)-1./2.*(_Sgl2-_Sr2)*tanh(20./_Delta*(T-Tg)); + dSt2dT=-20./(2.*_Delta)*(_Sgl2-_Sr2)*(1.-pow(tanh(20./_Delta*(T-Tg)),2.)); + dSt2dTg=20./(2.*_Delta)*(_Sgl2-_Sr2)*(1.-pow(tanh(20./_Delta*(T-Tg)),2.)); + dSt2dF=dTgdF; + dSt2dF*=dSt2dTg; +} + +void mlawSMP::Secpiola2(const STensor3 &Cebar2,const double Gmu_groundState2,const double invJ2third, STensor3 &SP2) const +{ + STensorOperation::zero(SP2); + double traceCe=Cebar2.trace(); + static STensor3 invCe; + STensorOperation::inverseSTensor3(Cebar2, invCe); + if(_Im2==0) Msg::Error("mlawSMP: _Im2 =0"); + if (traceCe<3.+_Im2) + { + double X=1./(1.-((traceCe-3.)/_Im2)); + for(int i = 0; i < 3; i++) { - double dSt2dtg; - if(_Delta==0) Msg::Error("mlawSMP: _Delta =0"); - St2_=1./2.*(_Sgl2+_Sr2)-1./2.*(_Sgl2-_Sr2)*tanh(20./_Delta*(T-Tg)); - /* if (St2_>0.) - { - } - else + for(int j = 0; j < 3; j++) { - St2_=_Sr2; - }*/ - dSt2dT=-20./(2.*_Delta)*(_Sgl2-_Sr2)*(1.-pow(tanh(20./_Delta*(T-Tg)),2.)); - dSt2dtg=20./(2.*_Delta)*(_Sgl2-_Sr2)*(1.-pow(tanh(20./_Delta*(T-Tg)),2.)); - dSt2dF=dTgdF; - dSt2dF*=dSt2dtg; + SP2(i,j)= invJ2third*Gmu_groundState2*X*(I2(i,j)-1./3.*traceCe*invCe(i,j)); + } } - - void mlawSMP::Secpiola2(const STensor3 &Cebar2,const double Gmu_groundState2,const double invJ2third, STensor3 &SP2) const - { - //const STensor3 I(1.); - double traceCe=Cebar2.trace(); - STensor3 invCe=Cebar2.invert(); - if(_Im2==0) Msg::Error("mlawSMP: _Im2 =0"); - double X=1./(1.-((traceCe-3.)/_Im2)); - - // SP2= invJ2third*Gmu_groundState2*(1./(1.-((traceCe-3.)/_Im2)))*(I2+invCe*(-1./3.*traceCe)); - if (traceCe<3.+_Im2) - { - for(int i = 0; i < 3; i++) - { - for(int j = 0; j < 3; j++) - { - SP2(i,j)= invJ2third*Gmu_groundState2*X*(I2(i,j)-1./3.*traceCe*invCe(i,j)); - // SP2(i,j)= invJ2third*Gmu_groundState2*(1./(1.-((traceCe-3.)/_Im2)))*(I2+-1./3.*traceCe*invCe(i,j)); - } - } - } - - + } } - void mlawSMP::Mandel2(const STensor3 &Ce_,const STensor3 &SP_, STensor3 &M2_) const - { - M2_=Ce_; - M2_*=SP_; - } - - void mlawSMP::Kirco(const STensor3 &Fn_,const STensor3 &SP_, STensor3 &Kir2_) const - { - Kir2_=Fn_; - Kir2_*=SP_; - } - - void mlawSMP::Tau2(const STensor3 &M2_,double &Ta2_) const - { - Ta2_=1./sqrt(2.)*M2_.norm2(); - } +void mlawSMP::Mandel2(const STensor3 &Ce_,const STensor3 &SP_, STensor3 &M2_) const +{ + STensorOperation::multSTensor3(Ce_,SP_,M2_); +} +void mlawSMP::Kirco(const STensor3 &Fn_,const STensor3 &SP_, STensor3 &Kir2_) const +{ + STensorOperation::multSTensor3(Fn_,SP_,Kir2_); +} + +void mlawSMP::Tau2(const STensor3 &M2_,double &Ta2_) const +{ + Ta2_=1./sqrt(2.)*M2_.norm2(); +} - void mlawSMP::delta_epsilonp2( const double &Ta2_,double dh_,double St2_,double &depsilon2_) const - { - if(_m2==0) Msg::Error("mlawSMP: _m2 =0"); - if(St2_==0) Msg::Error("mlawSMP: St2_ =0"); - - depsilon2_=_epsilonp02*pow(Ta2_/St2_,1./_m2)*dh_; - } - void mlawSMP::delta_DP2(const STensor3 &M2_,const double &Ta2_,const double &depsilon2_,STensor3 &dDp2_) const - { - // double dh = getTimeStep(); - // Tau2(M2,Ta2); - // delta_epsilonp2(Ta2, _epsilonp02, dh, m2, St2,depsilon2); - // depsilon2=_epsilonp02*pow(Ta2/St2,1/_m2)*dh; - dDp2_*=0.; - if(Ta2_>0.) - { - dDp2_=1./2.*(depsilon2_*M2_); - dDp2_*=1./Ta2_; - } - } +void mlawSMP::delta_epsilonp2( const double &Ta2_,double dh_,double St2_,double &depsilon2_) const +{ + if(_m2==0) Msg::Error("mlawSMP: _m2 =0"); + if(St2_==0) Msg::Error("mlawSMP: St2_ =0"); + + depsilon2_=_epsilonp02*pow(Ta2_/St2_,1./_m2)*dh_; +} +void mlawSMP::delta_DP2(const STensor3 &M2_,const double &Ta2_,const double &depsilon2_,STensor3 &dDp2_) const +{ + STensorOperation::zero(dDp2_); + if(Ta2_>0.) + { + dDp2_=M2_; + dDp2_*=depsilon2_/2./Ta2_; + } +} void mlawSMP::matricetovectoromega(const STensor3 &om, fullVector<double> &Omega) const { @@ -1172,211 +723,199 @@ void mlawSMP::matricetovectoromega(const STensor3 &om, fullVector<double> &Omega Omega(3) = om(1,2); Omega(4) = om(0,2); Omega(5) = om(0,1); - // for(int i = 0; i < 3; i++) { - // for(int j = i; j < 3; j++) { - // Omega2.push_back(om[i][j]); - } +} - void mlawSMP:: matricetovectordomega(const STensor43 &domega2dM24ord,fullMatrix<double> &domega2dM2)const +void mlawSMP::matricetovectordomega(const STensor43 &domega2dM24ord,fullMatrix<double> &domega2dM2)const { - // XXXX,YYYY,ZZZZ,YZYZ,XZXZ,XYXY 0000,1111,2222,1212,0202,0101; - domega2dM2(0,0)=domega2dM24ord(0,0,0,0); - domega2dM2(1,1)=domega2dM24ord(1,1,1,1); - domega2dM2(2,2)=domega2dM24ord(2,2,2,2); - domega2dM2(3,3)=domega2dM24ord(1,2,1,2)+domega2dM24ord(1,2,2,1); - domega2dM2(4,4)=domega2dM24ord(0,2,0,2)+domega2dM24ord(0,2,2,0); - domega2dM2(5,5)=domega2dM24ord(0,1,0,1)+domega2dM24ord(1,0,1,0); - domega2dM2(0,1)=domega2dM24ord(0,0,1,1); - domega2dM2(0,2)=domega2dM24ord(0,0,2,2); - domega2dM2(0,3)=domega2dM24ord(0,0,1,2)+domega2dM24ord(0,0,2,1); - domega2dM2(0,4)=domega2dM24ord(0,0,0,2)+domega2dM24ord(0,0,2,0); - domega2dM2(0,5)=domega2dM24ord(0,0,0,1)+domega2dM24ord(0,0,1,0); - domega2dM2(1,0)=domega2dM24ord(1,1,0,0); - domega2dM2(1,2)=domega2dM24ord(1,1,2,2); - domega2dM2(1,3)=domega2dM24ord(1,1,1,2)+domega2dM24ord(1,1,2,1); - domega2dM2(1,4)=domega2dM24ord(1,1,0,2)+domega2dM24ord(1,1,2,0); - domega2dM2(1,5)=domega2dM24ord(1,1,0,1)+domega2dM24ord(1,1,1,0); - domega2dM2(2,0)=domega2dM24ord(2,2,0,0); - domega2dM2(2,1)=domega2dM24ord(2,2,1,1); - domega2dM2(2,3)=domega2dM24ord(2,2,1,2)+domega2dM24ord(2,2,2,1); - domega2dM2(2,4)=domega2dM24ord(2,2,0,2)+domega2dM24ord(2,2,2,0); - domega2dM2(2,5)=domega2dM24ord(2,2,0,1)+domega2dM24ord(2,2,1,0); - domega2dM2(3,0)=domega2dM24ord(1,2,0,0); - domega2dM2(3,1)=domega2dM24ord(1,2,1,1); - domega2dM2(3,2)=domega2dM24ord(1,2,2,2); - domega2dM2(3,4)=domega2dM24ord(1,2,0,2)+domega2dM24ord(1,2,2,0); - domega2dM2(3,5)=domega2dM24ord(1,2,0,1)+domega2dM24ord(1,2,1,0); - domega2dM2(4,0)=domega2dM24ord(0,2,0,0); - domega2dM2(4,1)=domega2dM24ord(0,2,1,1); - domega2dM2(4,2)=domega2dM24ord(0,2,2,2); - domega2dM2(4,3)=domega2dM24ord(0,2,1,2)+domega2dM24ord(0,2,2,1); - domega2dM2(4,5)=domega2dM24ord(0,2,0,1)+domega2dM24ord(0,2,1,0); - domega2dM2(5,0)=domega2dM24ord(0,1,0,0); - domega2dM2(5,1)=domega2dM24ord(0,1,1,1); - domega2dM2(5,2)=domega2dM24ord(0,1,2,2); - domega2dM2(5,3)=domega2dM24ord(0,1,1,2)+domega2dM24ord(0,1,2,1); - domega2dM2(5,4)=domega2dM24ord(0,1,0,2)+domega2dM24ord(0,1,2,0); - // Omega2.push_back(dom[i][j][k][l]); + // XXXX,YYYY,ZZZZ,YZYZ,XZXZ,XYXY 0000,1111,2222,1212,0202,0101; + domega2dM2(0,0)=domega2dM24ord(0,0,0,0); + domega2dM2(1,1)=domega2dM24ord(1,1,1,1); + domega2dM2(2,2)=domega2dM24ord(2,2,2,2); + domega2dM2(3,3)=domega2dM24ord(1,2,1,2)+domega2dM24ord(1,2,2,1); + domega2dM2(4,4)=domega2dM24ord(0,2,0,2)+domega2dM24ord(0,2,2,0); + domega2dM2(5,5)=domega2dM24ord(0,1,0,1)+domega2dM24ord(1,0,1,0); + domega2dM2(0,1)=domega2dM24ord(0,0,1,1); + domega2dM2(0,2)=domega2dM24ord(0,0,2,2); + domega2dM2(0,3)=domega2dM24ord(0,0,1,2)+domega2dM24ord(0,0,2,1); + domega2dM2(0,4)=domega2dM24ord(0,0,0,2)+domega2dM24ord(0,0,2,0); + domega2dM2(0,5)=domega2dM24ord(0,0,0,1)+domega2dM24ord(0,0,1,0); + domega2dM2(1,0)=domega2dM24ord(1,1,0,0); + domega2dM2(1,2)=domega2dM24ord(1,1,2,2); + domega2dM2(1,3)=domega2dM24ord(1,1,1,2)+domega2dM24ord(1,1,2,1); + domega2dM2(1,4)=domega2dM24ord(1,1,0,2)+domega2dM24ord(1,1,2,0); + domega2dM2(1,5)=domega2dM24ord(1,1,0,1)+domega2dM24ord(1,1,1,0); + domega2dM2(2,0)=domega2dM24ord(2,2,0,0); + domega2dM2(2,1)=domega2dM24ord(2,2,1,1); + domega2dM2(2,3)=domega2dM24ord(2,2,1,2)+domega2dM24ord(2,2,2,1); + domega2dM2(2,4)=domega2dM24ord(2,2,0,2)+domega2dM24ord(2,2,2,0); + domega2dM2(2,5)=domega2dM24ord(2,2,0,1)+domega2dM24ord(2,2,1,0); + domega2dM2(3,0)=domega2dM24ord(1,2,0,0); + domega2dM2(3,1)=domega2dM24ord(1,2,1,1); + domega2dM2(3,2)=domega2dM24ord(1,2,2,2); + domega2dM2(3,4)=domega2dM24ord(1,2,0,2)+domega2dM24ord(1,2,2,0); + domega2dM2(3,5)=domega2dM24ord(1,2,0,1)+domega2dM24ord(1,2,1,0); + domega2dM2(4,0)=domega2dM24ord(0,2,0,0); + domega2dM2(4,1)=domega2dM24ord(0,2,1,1); + domega2dM2(4,2)=domega2dM24ord(0,2,2,2); + domega2dM2(4,3)=domega2dM24ord(0,2,1,2)+domega2dM24ord(0,2,2,1); + domega2dM2(4,5)=domega2dM24ord(0,2,0,1)+domega2dM24ord(0,2,1,0); + domega2dM2(5,0)=domega2dM24ord(0,1,0,0); + domega2dM2(5,1)=domega2dM24ord(0,1,1,1); + domega2dM2(5,2)=domega2dM24ord(0,1,2,2); + domega2dM2(5,3)=domega2dM24ord(0,1,1,2)+domega2dM24ord(0,1,2,1); + domega2dM2(5,4)=domega2dM24ord(0,1,0,2)+domega2dM24ord(0,1,2,0); } void mlawSMP::vectortomatriceomega(STensor3 &o, const fullVector<double> &Omega2) const {//xx yy zz yz xz XY - o(0,0)=Omega2(0); - o(0,1)=Omega2(5); - o(0,2)=Omega2(4); + o(0,0)=Omega2(0); + o(0,1)=Omega2(5); + o(0,2)=Omega2(4); - o(1,0)=Omega2(5); - o(1,1)=Omega2(1); - o(1,2)=Omega2(3); + o(1,0)=Omega2(5); + o(1,1)=Omega2(1); + o(1,2)=Omega2(3); - o(2,0)=Omega2(4); - o(2,1)=Omega2(3); - o(2,2)=Omega2(2); + o(2,0)=Omega2(4); + o(2,1)=Omega2(3); + o(2,2)=Omega2(2); } - void mlawSMP:: vectortomatricedomega( STensor43 &domega2dM24ord,const fullMatrix<double> &domega2dM2)const - { // XXXX,YYYY,ZZZZ,YZYZ,XZXZ,XYXY 0000,1111,2222,1212,0202,0101; +void mlawSMP:: vectortomatricedomega( STensor43 &domega2dM24ord,const fullMatrix<double> &domega2dM2)const +{ // XXXX,YYYY,ZZZZ,YZYZ,XZXZ,XYXY 0000,1111,2222,1212,0202,0101; - domega2dM24ord(0,0,0,0)=domega2dM2(0,0); - domega2dM24ord(0,0,1,1)=domega2dM2(0,1); - domega2dM24ord(0,0,2,2)=domega2dM2(0,2); - domega2dM24ord(0,0,1,2)=domega2dM2(0,3)/2.; - domega2dM24ord(0,0,2,1)=domega2dM2(0,3)/2.; - domega2dM24ord(0,0,0,2)=domega2dM2(0,4)/2.; - domega2dM24ord(0,0,2,0)=domega2dM2(0,4)/2.; - domega2dM24ord(0,0,0,1)=domega2dM2(0,5)/2.; - domega2dM24ord(0,0,1,0)=domega2dM2(0,5)/2.; + domega2dM24ord(0,0,0,0)=domega2dM2(0,0); + domega2dM24ord(0,0,1,1)=domega2dM2(0,1); + domega2dM24ord(0,0,2,2)=domega2dM2(0,2); + domega2dM24ord(0,0,1,2)=domega2dM2(0,3)/2.; + domega2dM24ord(0,0,2,1)=domega2dM2(0,3)/2.; + domega2dM24ord(0,0,0,2)=domega2dM2(0,4)/2.; + domega2dM24ord(0,0,2,0)=domega2dM2(0,4)/2.; + domega2dM24ord(0,0,0,1)=domega2dM2(0,5)/2.; + domega2dM24ord(0,0,1,0)=domega2dM2(0,5)/2.; - domega2dM24ord(1,1,0,0)=domega2dM2(1,0); - domega2dM24ord(1,1,1,1)=domega2dM2(1,1); - domega2dM24ord(1,1,2,2)=domega2dM2(1,2); - domega2dM24ord(1,1,1,2)=domega2dM2(1,3)/2.; - domega2dM24ord(1,1,0,2)=domega2dM2(1,4)/2.; - domega2dM24ord(1,1,0,1)=domega2dM2(1,5)/2.; - domega2dM24ord(1,1,2,1)=domega2dM2(1,3)/2.; - domega2dM24ord(1,1,2,0)=domega2dM2(1,4)/2.; - domega2dM24ord(1,1,1,0)=domega2dM2(1,5)/2.; + domega2dM24ord(1,1,0,0)=domega2dM2(1,0); + domega2dM24ord(1,1,1,1)=domega2dM2(1,1); + domega2dM24ord(1,1,2,2)=domega2dM2(1,2); + domega2dM24ord(1,1,1,2)=domega2dM2(1,3)/2.; + domega2dM24ord(1,1,0,2)=domega2dM2(1,4)/2.; + domega2dM24ord(1,1,0,1)=domega2dM2(1,5)/2.; + domega2dM24ord(1,1,2,1)=domega2dM2(1,3)/2.; + domega2dM24ord(1,1,2,0)=domega2dM2(1,4)/2.; + domega2dM24ord(1,1,1,0)=domega2dM2(1,5)/2.; - domega2dM24ord(2,2,0,0)=domega2dM2(2,0); - domega2dM24ord(2,2,1,1)=domega2dM2(2,1); - domega2dM24ord(2,2,2,2)=domega2dM2(2,2); - domega2dM24ord(2,2,1,2)=domega2dM2(2,3)/2.; - domega2dM24ord(2,2,0,2)=domega2dM2(2,4)/2.; - domega2dM24ord(2,2,0,1)=domega2dM2(2,5)/2.; - domega2dM24ord(2,2,2,1)=domega2dM2(2,3)/2.; - domega2dM24ord(2,2,2,0)=domega2dM2(2,4)/2.; - domega2dM24ord(2,2,1,0)=domega2dM2(2,5)/2.; + domega2dM24ord(2,2,0,0)=domega2dM2(2,0); + domega2dM24ord(2,2,1,1)=domega2dM2(2,1); + domega2dM24ord(2,2,2,2)=domega2dM2(2,2); + domega2dM24ord(2,2,1,2)=domega2dM2(2,3)/2.; + domega2dM24ord(2,2,0,2)=domega2dM2(2,4)/2.; + domega2dM24ord(2,2,0,1)=domega2dM2(2,5)/2.; + domega2dM24ord(2,2,2,1)=domega2dM2(2,3)/2.; + domega2dM24ord(2,2,2,0)=domega2dM2(2,4)/2.; + domega2dM24ord(2,2,1,0)=domega2dM2(2,5)/2.; - domega2dM24ord(1,2,0,0)=domega2dM2(3,0); - domega2dM24ord(1,2,1,1)=domega2dM2(3,1); - domega2dM24ord(1,2,2,2)=domega2dM2(3,2); - domega2dM24ord(1,2,1,2)=domega2dM2(3,3)/2.; - domega2dM24ord(1,2,0,2)=domega2dM2(3,4)/2.; - domega2dM24ord(1,2,0,1)=domega2dM2(3,5)/2.; - domega2dM24ord(1,2,2,0)=domega2dM2(3,4)/2.; - domega2dM24ord(1,2,2,1)=domega2dM2(3,3)/2.; - domega2dM24ord(1,2,1,0)=domega2dM2(3,5)/2.; - - domega2dM24ord(0,2,0,0)=domega2dM2(4,0); - domega2dM24ord(0,2,1,1)=domega2dM2(4,1); - domega2dM24ord(0,2,1,2)=domega2dM2(4,2); - domega2dM24ord(0,2,1,2)=domega2dM2(4,3)/2.; - domega2dM24ord(0,2,0,2)=domega2dM2(4,4)/2.; - domega2dM24ord(0,2,0,1)=domega2dM2(4,5)/2.; - domega2dM24ord(0,2,2,1)=domega2dM2(4,3)/2.; - domega2dM24ord(0,2,2,0)=domega2dM2(4,4)/2.; - domega2dM24ord(0,2,1,0)=domega2dM2(4,5)/2.; + domega2dM24ord(1,2,0,0)=domega2dM2(3,0); + domega2dM24ord(1,2,1,1)=domega2dM2(3,1); + domega2dM24ord(1,2,2,2)=domega2dM2(3,2); + domega2dM24ord(1,2,1,2)=domega2dM2(3,3)/2.; + domega2dM24ord(1,2,0,2)=domega2dM2(3,4)/2.; + domega2dM24ord(1,2,0,1)=domega2dM2(3,5)/2.; + domega2dM24ord(1,2,2,0)=domega2dM2(3,4)/2.; + domega2dM24ord(1,2,2,1)=domega2dM2(3,3)/2.; + domega2dM24ord(1,2,1,0)=domega2dM2(3,5)/2.; + + domega2dM24ord(0,2,0,0)=domega2dM2(4,0); + domega2dM24ord(0,2,1,1)=domega2dM2(4,1); + domega2dM24ord(0,2,1,2)=domega2dM2(4,2); + domega2dM24ord(0,2,1,2)=domega2dM2(4,3)/2.; + domega2dM24ord(0,2,0,2)=domega2dM2(4,4)/2.; + domega2dM24ord(0,2,0,1)=domega2dM2(4,5)/2.; + domega2dM24ord(0,2,2,1)=domega2dM2(4,3)/2.; + domega2dM24ord(0,2,2,0)=domega2dM2(4,4)/2.; + domega2dM24ord(0,2,1,0)=domega2dM2(4,5)/2.; - domega2dM24ord(0,1,0,0)=domega2dM2(5,0); - domega2dM24ord(0,1,1,1)=domega2dM2(5,1); - domega2dM24ord(0,1,2,2)=domega2dM2(5,2); - domega2dM24ord(0,1,1,2)=domega2dM2(5,3)/2.; - domega2dM24ord(0,1,0,2)=domega2dM2(5,4)/2.; - domega2dM24ord(0,1,0,1)=domega2dM2(5,5)/2.; - domega2dM24ord(0,1,2,1)=domega2dM2(5,3)/2.; - domega2dM24ord(0,1,2,0)=domega2dM2(5,4)/2.; - domega2dM24ord(0,1,1,0)=domega2dM2(5,5)/2.; + domega2dM24ord(0,1,0,0)=domega2dM2(5,0); + domega2dM24ord(0,1,1,1)=domega2dM2(5,1); + domega2dM24ord(0,1,2,2)=domega2dM2(5,2); + domega2dM24ord(0,1,1,2)=domega2dM2(5,3)/2.; + domega2dM24ord(0,1,0,2)=domega2dM2(5,4)/2.; + domega2dM24ord(0,1,0,1)=domega2dM2(5,5)/2.; + domega2dM24ord(0,1,2,1)=domega2dM2(5,3)/2.; + domega2dM24ord(0,1,2,0)=domega2dM2(5,4)/2.; + domega2dM24ord(0,1,1,0)=domega2dM2(5,5)/2.; - domega2dM24ord(2,1,0,0)=domega2dM2(3,0); - domega2dM24ord(2,1,1,1)=domega2dM2(3,1); - domega2dM24ord(2,1,2,2)=domega2dM2(3,2); - domega2dM24ord(2,1,1,2)=domega2dM2(3,3)/2.; - domega2dM24ord(2,1,0,2)=domega2dM2(3,4)/2.; - domega2dM24ord(2,1,0,1)=domega2dM2(3,5)/2.; - domega2dM24ord(2,1,2,1)=domega2dM2(3,3)/2.; - domega2dM24ord(2,1,2,0)=domega2dM2(3,4)/2.; - domega2dM24ord(2,1,1,0)=domega2dM2(3,5)/2.; + domega2dM24ord(2,1,0,0)=domega2dM2(3,0); + domega2dM24ord(2,1,1,1)=domega2dM2(3,1); + domega2dM24ord(2,1,2,2)=domega2dM2(3,2); + domega2dM24ord(2,1,1,2)=domega2dM2(3,3)/2.; + domega2dM24ord(2,1,0,2)=domega2dM2(3,4)/2.; + domega2dM24ord(2,1,0,1)=domega2dM2(3,5)/2.; + domega2dM24ord(2,1,2,1)=domega2dM2(3,3)/2.; + domega2dM24ord(2,1,2,0)=domega2dM2(3,4)/2.; + domega2dM24ord(2,1,1,0)=domega2dM2(3,5)/2.; - domega2dM24ord(2,0,0,0)=domega2dM2(4,0); - domega2dM24ord(2,0,1,1)=domega2dM2(4,1); - domega2dM24ord(2,0,2,2)=domega2dM2(4,2); - domega2dM24ord(2,0,1,2)=domega2dM2(4,3)/2.; - domega2dM24ord(2,0,0,2)=domega2dM2(4,4)/2.; - domega2dM24ord(2,0,0,1)=domega2dM2(4,5)/2.; - domega2dM24ord(2,0,2,1)=domega2dM2(4,3)/2.; - domega2dM24ord(2,0,2,0)=domega2dM2(4,4)/2.; - domega2dM24ord(2,0,1,0)=domega2dM2(4,5)/2.; + domega2dM24ord(2,0,0,0)=domega2dM2(4,0); + domega2dM24ord(2,0,1,1)=domega2dM2(4,1); + domega2dM24ord(2,0,2,2)=domega2dM2(4,2); + domega2dM24ord(2,0,1,2)=domega2dM2(4,3)/2.; + domega2dM24ord(2,0,0,2)=domega2dM2(4,4)/2.; + domega2dM24ord(2,0,0,1)=domega2dM2(4,5)/2.; + domega2dM24ord(2,0,2,1)=domega2dM2(4,3)/2.; + domega2dM24ord(2,0,2,0)=domega2dM2(4,4)/2.; + domega2dM24ord(2,0,1,0)=domega2dM2(4,5)/2.; - domega2dM24ord(1,0,0,0)=domega2dM2(5,0); - domega2dM24ord(1,0,1,1)=domega2dM2(5,1); - domega2dM24ord(1,0,2,2)=domega2dM2(5,2); - domega2dM24ord(1,0,1,2)=domega2dM2(5,3)/2.; - domega2dM24ord(1,0,0,2)=domega2dM2(5,4)/2.; - domega2dM24ord(1,0,0,1)=domega2dM2(5,5)/2.; - domega2dM24ord(1,0,2,1)=domega2dM2(5,3)/2.; - domega2dM24ord(1,0,2,0)=domega2dM2(5,4)/2.; - domega2dM24ord(1,0,1,0)=domega2dM2(5,5)/2.; - } + domega2dM24ord(1,0,0,0)=domega2dM2(5,0); + domega2dM24ord(1,0,1,1)=domega2dM2(5,1); + domega2dM24ord(1,0,2,2)=domega2dM2(5,2); + domega2dM24ord(1,0,1,2)=domega2dM2(5,3)/2.; + domega2dM24ord(1,0,0,2)=domega2dM2(5,4)/2.; + domega2dM24ord(1,0,0,1)=domega2dM2(5,5)/2.; + domega2dM24ord(1,0,2,1)=domega2dM2(5,3)/2.; + domega2dM24ord(1,0,2,0)=domega2dM2(5,4)/2.; + domega2dM24ord(1,0,1,0)=domega2dM2(5,5)/2.; +} - void mlawSMP::predictorCorrector2( fullVector<double> &Omega2, fullMatrix<double> &domega2dM2inv, STensor3 &M2,STensor3 &SP2,double &Ta2,double &depsilon2, - STensor3 &dDp2,double &invJ2third, const STensor3& F0, const STensor3& Fn, STensor3 &P2, const IPSMP *q0, IPSMP *q1, - double T,const double Tg,double &Gmu_groundState2,bool stiff /* ,STensor43 &Le */ ,STensor3 &Fe2 - ,STensor3 &Cebar2,STensor3 &Cebarpr2,const double dh, STensor3 &Fp2,const double St2 /*,STensor3 &expdDp2,STensor43 *dexpdDp2*/) const +void mlawSMP::predictorCorrector2(fullVector<double> &Omega2, fullMatrix<double> &domega2dM2inv, STensor3 &M2, STensor3 &SP2, double &Ta2, double &depsilon2, + STensor3 &dDp2, double &invJ2third, const STensor3& F0, const STensor3& Fn, STensor3 &P2, const IPSMP *q0, IPSMP *q1, + double T, const double Tg, double &Gmu_groundState2, bool stiff, STensor3 &Fe2, + STensor3 &Cebar2, STensor3 &Cebarpr2, const double dh, STensor3 &Fp2, const double St2) const { - /* initialize terms */ - Ta2=0.;invJ2third=0.; - SP2*=0.;M2*=0.;dDp2=0;depsilon2=0.; + Omega2.setAll(0.); domega2dM2inv.setAll(0.); + STensorOperation::zero(M2); STensorOperation::zero(SP2); STensorOperation::zero(dDp2); STensorOperation::zero(P2); + STensorOperation::zero(Fe2); STensorOperation::zero(Cebar2); STensorOperation::zero(Cebarpr2); STensorOperation::zero(Fp2); + Ta2=0.; depsilon2=0.; invJ2third=0.; Gmu_groundState2=0.; /* compute elastic predictor */ double J= Fn.determinant(); - STensor3 Fp0(q0->getConstRefToFp2()); + static STensor3 Fp0; + Fp0=q0->getConstRefToFp2(); Fp2=Fp0; - // Fp0.print("Fp0"); - - //static fullMatrix<double> domega2dM2inv(6,6); static fullMatrix<double> domega2dM2(6,6); - Omega2.setAll(0.); domega2dM2.setAll(0.); - domega2dM2inv.setAll(0.); //evaluate A from previous plastic strain - STensor3 Fp2inv; - Fp2inv = Fp2.invert(); + static STensor3 Fp2inv; + STensorOperation::inverseSTensor3(Fp2,Fp2inv); static STensor3 Fe2pr; - Fe2pr = Fn; - Fe2pr *= Fp2inv; + STensorOperation::multSTensor3(Fn,Fp2inv,Fe2pr); static STensor3 Cepr2; - Cepr2 =Fe2pr.transpose(); - Cepr2 *= Fe2pr; - todistrotionalj(Fn, invJ2third); - // static STensor3 Cebarpr2; + STensorOperation::multSTensor3FirstTranspose(Fe2pr,Fe2pr,Cepr2); + double j=Fn.determinant(); + invJ2third=1./ pow(j,2./3.); Cebarpr2=Cepr2; Cebarpr2*= invJ2third; - Fe2*=0.; + Fe2=Fe2pr; static STensor3 Ce2; - Ce2*=0.; Ce2=Cepr2; Cebar2=Cebarpr2; - // Tg=0.; - - // glasstrans(F0,Fn, T,Tg); + Gmu_2(T, Tg, Gmu_groundState2) ; Secpiola2(Cebar2, Gmu_groundState2, invJ2third, SP2); Mandel2(Ce2,SP2,M2); @@ -1385,607 +924,456 @@ void mlawSMP::vectortomatriceomega(STensor3 &o, const fullVector<double> &Omega2 //fSt2(T,Tg,St2); delta_epsilonp2( Ta2,dh,St2, depsilon2); delta_DP2(M2,Ta2,depsilon2,dDp2) ; - static STensor3 expdDp2; - expdDp2*=0.; - static STensor43 dexpdDp2; static STensor3 ome2; - ome2*=0.; + STensorOperation::zero(ome2); - /* Plastic correction */ - #if 0 - printf("plasticity\n"); - #endif int ite = 0, maxite = 1000; - computeResidual2(ome2, Cebar2, M2, dDp2, Cebarpr2, Gmu_groundState2/*,expdDp2*/); + computeResidual2(ome2, Cebar2, M2, dDp2, Cebarpr2, Gmu_groundState2); -// double tolNR=1.e-6; - double tolNR=1.e-4; + double tolNR=1.e-6; double refnorm=M2.norm2(); if(refnorm==0.) refnorm=1.; double f=ome2.norm2(); static STensor43 domega2dM24ord; - domega2dM24ord*=0.; + STensorOperation::zero(domega2dM24ord); static fullVector<double> deltaM2vec(6); deltaM2vec.setAll(0.); static STensor3 deltaM2; - deltaM2*=0.; + STensorOperation::zero(deltaM2); + while(fabs(f)/refnorm > tolNR or ite <1) - { - - computeJacobian2 (domega2dM24ord, Cebar2, M2, dDp2, Cebarpr2,Gmu_groundState2, St2, dh, invJ2third/*,expdDp2, dexpdDp2*/) ; - matricetovectordomega( domega2dM24ord,domega2dM2); - + { + computeJacobian2 (domega2dM24ord, Cebar2, M2, dDp2, Cebarpr2,Gmu_groundState2, St2, dh, invJ2third) ; + matricetovectordomega( domega2dM24ord,domega2dM2); matricetovectoromega( ome2, Omega2 ); - // if(ite>10) Msg::Info("SMP itereration %d, residual %f, norm %f,time step %f ", ite, f, refnorm ,dh); + // if(ite>10) Msg::Info("SMP itereration %d, residual %f, norm %f,time step %f ", ite, f, refnorm ,dh); bool solvelu = domega2dM2.luSolve(Omega2, deltaM2vec); if(!solvelu) Msg::Fatal("No inversion of J in plastic correction in mech 2 "); - // bool solve = domega2dM2.invert(domega2dM2inv); - //if(!solve) Msg::Fatal("No inversion of J in plastic correction in gurson "); - //for(int i=0; i<6; i++) - //{ - //deltaM2vec(i)=0; - //for(int j=0; j<6; j++) - //{ - // deltaM2vec(i) += domega2dM2inv(i,j)*Omega2(j); - //} - //} - vectortomatriceomega(deltaM2,deltaM2vec); - M2-=deltaM2; - Tau2( M2,Ta2) ; - delta_epsilonp2( Ta2, dh,St2, depsilon2); - delta_DP2(M2,Ta2,depsilon2,dDp2) ; - - computeResidual2(ome2, Cebar2, M2, dDp2, Cebarpr2, Gmu_groundState2/*,expdDp2*/); - //f = ome2.norm0(); + vectortomatriceomega(deltaM2,deltaM2vec); + M2-=deltaM2; + Tau2( M2,Ta2) ; + delta_epsilonp2( Ta2, dh,St2, depsilon2); + delta_DP2(M2,Ta2,depsilon2,dDp2) ; + + computeResidual2(ome2, Cebar2, M2, dDp2, Cebarpr2, Gmu_groundState2); f = ome2.norm2(); if(fabs(f)/refnorm < tolNR) { //recompute Jacobian for stiffness - computeJacobian2(domega2dM24ord, Cebar2, M2,dDp2,Cebarpr2, Gmu_groundState2, St2, dh,invJ2third/*,expdDp2, dexpdDp2*/); - + computeJacobian2(domega2dM24ord, Cebar2, M2,dDp2,Cebarpr2, Gmu_groundState2, St2, dh,invJ2third); matricetovectordomega( domega2dM24ord,domega2dM2); - bool solve =domega2dM2.invert(domega2dM2inv); + bool solve = domega2dM2.invert(domega2dM2inv); + } + ite++; + if(ite > maxite) + { + Msg::Error("SMP itereration %d, residual %f, norm %f,time step %f ", ite, f, refnorm ,dh); + break; } - ite++; + } + // final state + static STensor3 expdDp2; + STensorOperation::zero(expdDp2); + static STensor43 dexpdDp2; + STensorOperation::zero(dexpdDp2); + STensorOperation::expSTensor3(dDp2,_order,expdDp2,&dexpdDp2); + STensorOperation::multSTensor3(expdDp2,Fp0,Fp2); + static STensor3 Fp2invT; + STensorOperation::inverseSTensor3(Fp2,Fp2invT); + STensorOperation::multSTensor3(Fn,Fp2inv,Fe2); + STensorOperation::multSTensor3FirstTranspose(Fe2,Fe2,Ce2); + Cebar2=Ce2 ; + Cebar2*=invJ2third; + Secpiola2(Cebar2, Gmu_groundState2, invJ2third, SP2); + Mandel2(Ce2,SP2,M2); -// #ifdef _DEBUG - if(ite > maxite) - { - - //Msg::Fatal("No convergence for plastic correction in mech2 !!"); - Msg::Error("SMP itereration %d, residual %f, norm %f,time step %f ", ite, f, refnorm ,dh); - break; + for( int I=0; I<3; I++){ + for( int A=0; A<3; A++){ + P2(I,A)= 0.; + for( int W=0; W<3; W++){ + for( int D=0; D<3; D++){ + for( int B=0; B<3; B++){ + P2(I,A)+=Fn(I,W)* Fp2inv(W,D)*SP2(D,B)*Fp2inv(A,B); + } + } } -// #endif // _DEBUG } - // final state - STensor3 Fp2invT; - // expdDp2*=0.; - Fp2invT*=0.; - STensorOperation::expSTensor3(dDp2,_order,expdDp2,&dexpdDp2); - Fp2 = expdDp2; - Fp2 *=Fp0; - Fp2inv = Fp2.invert(); - - Fe2 = Fn; - Fe2 *= Fp2inv; - - Ce2 =Fe2.transpose(); - Ce2 *= Fe2; - Cebar2=Ce2 ; - Cebar2*=invJ2third; - Secpiola2(Cebar2, Gmu_groundState2, invJ2third, SP2); - Mandel2(Ce2,SP2,M2); - // static STensor43 dFp2dF; - // dFp2dF*=0.; - // if (stiff) - //{ - //computintvardfpdf(dFp2dF,domega2dM2inv, Fn/*,const STensor3 &Fp0*/, Fp2, SP2, Gmu_groundState2, M2, dDp2 ,Cebar2, invJ2third, Cebarpr2, dh, St2 ) ; - - //} - - for( int I=0; I<3; I++){ - for( int A=0; A<3; A++){ - P2(I,A)= 0.; - for( int W=0; W<3; W++){ - for( int D=0; D<3; D++){ - for( int B=0; B<3; B++){ - P2(I,A)+=Fn(I,W)* Fp2inv(W,D)*SP2(D,B)*Fp2inv(A,B); - }}}}} - /* double traCebar2=Cebar2.trace(); - double XX=1./(1.-((traCebar2-3.)/_Im2)); - q1->_SMPEnergy+=-1./2.*_Im2*_mu_groundState2*log10(XX);*/ //if without calling the deformationEnergy function - - // q1->_SMPEnergy+=deformationEnergy(Cebar2); //right + } + /* double traCebar2=Cebar2.trace(); + double XX=1./(1.-((traCebar2-3.)/_Im2)); + q1->_SMPEnergy+=-1./2.*_Im2*_mu_groundState2*log10(XX);*/ //if without calling the deformationEnergy function + // q1->_SMPEnergy+=deformationEnergy(Cebar2); //right } - + - void mlawSMP::computeResidual2( STensor3 &ome2,const STensor3 &Cebar2,const STensor3 &M2, - const STensor3 &dDp2,const STensor3 &Cepr2,const double Gmu_groundState2/*,const STensor3 expdDp2*/) const +void mlawSMP::computeResidual2( STensor3 &ome2,const STensor3 &Cebar2,const STensor3 &M2, + const STensor3 &dDp2,const STensor3 &Cepr2,const double Gmu_groundState2) const { + STensorOperation::zero(ome2); + double trCebar2=Cebar2.trace(); + static STensor3 expdDp2; + STensorOperation::zero(expdDp2); + static STensor43 dexpdDp2; + STensorOperation::zero(dexpdDp2); + STensorOperation::expSTensor3(dDp2,_order, expdDp2,&dexpdDp2); - // STensor3 dDp2inv(dDp2.invert()); - double trCebar2=Cebar2.trace(); - STensor3 expdDp2; STensor43 dexpdDp2; - STensorOperation::expSTensor3(dDp2,_order, expdDp2,&dexpdDp2); - STensor3 expdDp2inv(expdDp2.invert()); - // STensor3 expdDp2invT(expdDp2inv.transpose()); - - for( int C=0; C<3; C++){ - for( int D=0; D<3; D++){ - ome2(C,D)=M2(C,D); - }} - - if (trCebar2<3.+_Im2) - { - for( int C=0; C<3; C++){ - for( int D=0; D<3; D++){ - ome2(C,D)-=Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2) ))*(-1./3.*trCebar2*I2(C,D)); - for( int R=0; R<3; R++){ - for( int Q=0; Q<3; Q++){ - ome2(C,D)-=Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))*(expdDp2inv(R,C)*Cepr2(R,Q)*expdDp2inv(Q,D)); - } - } - } - } - } - - else - { - - ome2*=0.; - } - // ome2.print("fff"); - //matricetovectortomega( ome, Omega2) ; - } - - + static STensor3 expdDp2inv; + STensorOperation::inverseSTensor3(expdDp2, expdDp2inv); + if (trCebar2<3.+_Im2) + { + ome2=M2; + for( int C=0; C<3; C++){ + for( int D=0; D<3; D++){ + ome2(C,D)-=Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2) ))*(-1./3.*trCebar2*I2(C,D)); + for( int R=0; R<3; R++){ + for( int Q=0; Q<3; Q++){ + ome2(C,D)-=Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))*(expdDp2inv(R,C)*Cepr2(R,Q)*expdDp2inv(Q,D)); + } + } + } + } + } + else + { + // ???????? check ome2*=0.; + } +} void mlawSMP::computeJacobian2(STensor43 &domega2dM24ord, const STensor3 &Cebar2,const STensor3 &M2, const STensor3 &dDp2,const STensor3 &Cebarpr2,const double Gmu_groundState2,const double St2, - const double dh,const double invJ2third/*,const STensor3 expdDp2,const STensor43 &dexpdDp2*/) const - { - double trCebar2=Cebar2.trace(); - // STensor3 dDp2inv(1); - // if(dDp2.determinant()!=0) dDp2inv=dDp2.invert(); - // STensor3 ome=M2-Gmu_groundState2*(1/(1-((trCe2-3)/_Im2)))*(-1/3*trCe2*I(1.)+dDp2inv.transpose()*Cepr2*dDp2inv); - - static STensor43 dexpdDp2; - static STensor3 dtrce2dM2,expdDp2; - STensorOperation::expSTensor3(dDp2,_order,expdDp2, &dexpdDp2); - double W=_epsilonp02*dh/(pow(St2,1./_m2)*pow(sqrt(2.),_m2+1./_m2)); - domega2dM24ord*=0.; - static STensor3 expdDp2inv; - expdDp2inv=expdDp2.invert(); - double M2norm=M2.norm2(); - for( int C=0; C<3; C++){ - for( int D=0; D<3; D++){ - dtrce2dM2(C,D)=0.; - for( int Z=0; Z<3; Z++){ - for( int A=0; A<3; A++){ - for( int B=0; B<3; B++){ - for( int K=0; K<3; K++){ - for( int L=0; L<3; L++){ - for( int I=0; I<3; I++){ - for( int J=0; J<3;J++){ - dtrce2dM2(C,D)-=W*expdDp2inv(B,Z)*expdDp2inv(I,A)*dexpdDp2(A,B,K,L)*((1.-_m2)/_m2*pow(M2norm,(1.-3.*_m2)/(_m2))*M2(C,D)*M2(K,L)+ - pow(M2norm,(1.-_m2)/(_m2))*I4(K,L,C,D))*Cebarpr2(I,J)*expdDp2inv(J,Z); - dtrce2dM2(C,D)-=W*expdDp2inv(I,Z)*Cebarpr2(I,J)*expdDp2inv(J,A)*expdDp2inv(B,Z)*dexpdDp2(A,B,K,L)*((1.-_m2)/_m2*pow(M2norm,(1.-3.*_m2)/(_m2)) - *M2(C,D)*M2(K,L)+pow(M2norm,(1.-_m2)/(_m2))*I4(K,L,C,D)); - }}}}}}}}} - - for( int U=0; U<3; U++){ - for( int S=0; S<3; S++){ - for( int C=0; C<3; C++){ - for( int D=0; D<3; D++){ - domega2dM24ord(U,S,C,D)=I4(U,S,C,D); - }}}} - - + const double dh,const double invJ2third) const +{ + STensorOperation::zero(domega2dM24ord); - if (trCebar2<3.+_Im2) - { - for( int U=0; U<3; U++){ - for( int S=0; S<3; S++){ - for( int C=0; C<3; C++){ - for( int D=0; D<3; D++){ - domega2dM24ord(U,S,C,D)-=Gmu_groundState2/_Im2*(1./(1.-((trCebar2-3)/_Im2)))*(1./(1.-((trCebar2-3.)/_Im2)))*dtrce2dM2(C,D)*(-1./3.*trCebar2*I2(U,S)); - for( int R=0; R<3; R++){ - for( int Q=0; Q<3; Q++){ - domega2dM24ord(U,S,C,D)-=Gmu_groundState2/_Im2*(1./(1.-((trCebar2-3)/_Im2)))*(1./(1.-((trCebar2-3.)/_Im2)))* - dtrce2dM2(C,D)*(expdDp2inv(R,U)*Cebarpr2(R,Q)*expdDp2inv(Q,S)); - }}}}}} - - - - for( int U=0; U<3; U++){ - for( int S=0; S<3; S++){ - for( int C=0; C<3; C++){ - for( int D=0; D<3; D++){ - domega2dM24ord(U,S,C,D)-=Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))*(-1./3.*dtrce2dM2(C,D)*I2(U,S)); - for( int R=0; R<3; R++){ - for( int Q=0; Q<3; Q++){ - for( int A=0; A<3; A++){ - for( int B=0; B<3; B++){ - for( int K=0; K<3; K++){ - for( int L=0; L<3; L++){ - domega2dM24ord(U,S,C,D)-=Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))*(-W*expdDp2inv(B,U)* - expdDp2inv(R,A)*dexpdDp2(A,B,K,L)*((1.-_m2)/_m2*pow(M2norm,(1.-3.*_m2)/(_m2))*M2(C,D)*M2(K,L)+pow(M2norm,(1.-_m2)/(_m2)) - *I4(K,L,C,D)) *Cebarpr2(R,Q)*expdDp2inv(Q,S)); - domega2dM24ord(U,S,C,D)-=Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))*(-W*expdDp2inv(R,U)*Cebarpr2(R,Q)*expdDp2inv(Q,A)* - expdDp2inv(B,S)*dexpdDp2(A,B,K,L)*((1.-_m2)/_m2*pow(M2norm,(1.-3.*_m2)/(_m2))*M2(C,D)*M2(K,L)+pow(M2norm,(1.-_m2)/(_m2)) - *I4(K,L,C,D))); - }}}}}}}}}} - } - - else - { - - } - //domega2dM24ord.print("4ord"); - // matricetovectordomega( domega2dM24ord,domega2dM2); + double trCebar2=Cebar2.trace(); + + static STensor43 dexpdDp2; + STensorOperation::zero(dexpdDp2); + static STensor3 dtrce2dM2, expdDp2; + STensorOperation::zero(dtrce2dM2); STensorOperation::zero(expdDp2); + STensorOperation::expSTensor3(dDp2,_order,expdDp2, &dexpdDp2); + + double W=_epsilonp02*dh/(pow(St2,1./_m2)*pow(sqrt(2.),_m2+1./_m2)); + + static STensor3 expdDp2inv; + STensorOperation::inverseSTensor3(expdDp2,expdDp2inv); + + double M2norm=M2.norm2(); + for( int C=0; C<3; C++){ + for( int D=0; D<3; D++){ + dtrce2dM2(C,D)=0.; + for( int Z=0; Z<3; Z++){ + for( int A=0; A<3; A++){ + for( int B=0; B<3; B++){ + for( int K=0; K<3; K++){ + for( int L=0; L<3; L++){ + for( int I=0; I<3; I++){ + for( int J=0; J<3;J++){ + dtrce2dM2(C,D)-=W*expdDp2inv(B,Z)*expdDp2inv(I,A)*dexpdDp2(A,B,K,L)*((1.-_m2)/_m2*pow(M2norm,(1.-3.*_m2)/(_m2))*M2(C,D)*M2(K,L)+ + pow(M2norm,(1.-_m2)/(_m2))*I4(K,L,C,D))*Cebarpr2(I,J)*expdDp2inv(J,Z); + dtrce2dM2(C,D)-=W*expdDp2inv(I,Z)*Cebarpr2(I,J)*expdDp2inv(J,A)*expdDp2inv(B,Z)*dexpdDp2(A,B,K,L)*((1.-_m2)/_m2*pow(M2norm,(1.-3.*_m2)/(_m2)) + *M2(C,D)*M2(K,L)+pow(M2norm,(1.-_m2)/(_m2))*I4(K,L,C,D)); + } + } + } + } + } + } + } + } + } + if (trCebar2<3.+_Im2) + { + domega2dM24ord=I4; + for( int U=0; U<3; U++){ + for( int S=0; S<3; S++){ + for( int C=0; C<3; C++){ + for( int D=0; D<3; D++){ + domega2dM24ord(U,S,C,D)-=Gmu_groundState2/_Im2*(1./(1.-((trCebar2-3)/_Im2)))*(1./(1.-((trCebar2-3.)/_Im2)))*dtrce2dM2(C,D)*(-1./3.*trCebar2*I2(U,S)); + domega2dM24ord(U,S,C,D)-=Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))*(-1./3.*dtrce2dM2(C,D)*I2(U,S)); + for( int R=0; R<3; R++){ + for( int Q=0; Q<3; Q++){ + domega2dM24ord(U,S,C,D)-=Gmu_groundState2/_Im2*(1./(1.-((trCebar2-3)/_Im2)))*(1./(1.-((trCebar2-3.)/_Im2)))* + dtrce2dM2(C,D)*(expdDp2inv(R,U)*Cebarpr2(R,Q)*expdDp2inv(Q,S)); + for( int A=0; A<3; A++){ + for( int B=0; B<3; B++){ + for( int K=0; K<3; K++){ + for( int L=0; L<3; L++){ + domega2dM24ord(U,S,C,D)-=Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))*(-W*expdDp2inv(B,U)* + expdDp2inv(R,A)*dexpdDp2(A,B,K,L)*((1.-_m2)/_m2*pow(M2norm,(1.-3.*_m2)/(_m2))*M2(C,D)*M2(K,L)+pow(M2norm,(1.-_m2)/(_m2)) + *I4(K,L,C,D)) *Cebarpr2(R,Q)*expdDp2inv(Q,S)); + domega2dM24ord(U,S,C,D)-=Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))*(-W*expdDp2inv(R,U)*Cebarpr2(R,Q)*expdDp2inv(Q,A)* + expdDp2inv(B,S)*dexpdDp2(A,B,K,L)*((1.-_m2)/_m2*pow(M2norm,(1.-3.*_m2)/(_m2))*M2(C,D)*M2(K,L)+pow(M2norm,(1.-_m2)/(_m2))*I4(K,L,C,D))); + } + } + } + } + } + } + } + } + } + } + } } +void mlawSMP::computeInternalVariabledfpdf2(STensor43 &dFp2dF, const fullMatrix<double> &domega2dM2inv, const STensor3 &Fn, const STensor3 &Fppr2, + const STensor3 &SP2, const double Gmu_groundState2, const STensor3 &M2,const STensor3 &dDp2, const STensor3 &Cebar2, + const double invJ2third, const STensor3 &Cebarpr2, const double dh, const double St2, const double Ta2, const double depsilon2, + STensor3 &dtauepsilon2dF, const STensor3 &dTgdF,const double T, const double Tg, const STensor3 &dSt2dF, STensor43 &dSP2dF) const +{ + STensorOperation::zero(dFp2dF); STensorOperation::zero(dtauepsilon2dF); STensorOperation::zero(dSP2dF); + + static STensor3 dTau2dF, dtraCebardF; + STensorOperation::zero(dTau2dF); STensorOperation::zero(dtraCebardF); + static STensor43 domega2dM24ordinv2, dM2dF; + vectortomatricedomega(domega2dM24ordinv2, domega2dM2inv); + STensorOperation::zero(dM2dF); + + double tracCebar2=Cebar2.trace(); + static STensor3 Fppr2inv; + STensorOperation::inverseSTensor3(Fppr2,Fppr2inv); + + static STensor3 invCebar2; + STensorOperation::inverseSTensor3(Cebar2, invCebar2); + + static STensor43 dM2dcbar2, dexpdDp2, domegadF, dCebardF; + STensorOperation::zero(dM2dcbar2); STensorOperation::zero(dexpdDp2); STensorOperation::zero(domegadF); STensorOperation::zero(dCebardF); + + static STensor3 expdDp2, expdDp2inv; + STensorOperation::expSTensor3(dDp2,_order,expdDp2, &dexpdDp2); + STensorOperation::inverseSTensor3(expdDp2,expdDp2inv); + + double dSt2dtg=0.; + static STensor3 Z; + STensorOperation::zero(Z); + double normM2=M2.norm2(); + if(normM2!=0.) + { + Z=M2; + Z*=_epsilonp02*dh*pow(normM2/sqrt(2.),1./_m2)/(sqrt(2.)*normM2); + } + for( int D=0; D<3; D++){ + for( int B=0; B<3; B++){ + for( int j=0; j<3; j++){ + for( int C=0; C<3; C++){ + dCebardF(D,B,j,C)=0.; + for( int N=0; N<3; N++){ + for( int O=0; O<3; O++){ + for( int R=0; R<3; R++){ + for( int K=0; K<3; K++){ + for( int L=0; L<3; L++){ + for( int Q=0; Q<3; Q++){ + dCebardF(D,B,j,C)+=1./_m2*expdDp2inv(O,D)*expdDp2inv(R,N)* dexpdDp2(N,O,K,L)*Z(K,L)*pow(St2,(-1.-_m2)/_m2)*dSt2dF(j,C)*Cebarpr2(R,Q)*expdDp2inv(Q,B); + dCebardF(D,B,j,C)+=1./_m2*expdDp2inv(R,D)*Cebarpr2(R,Q)*expdDp2inv(Q,N)*expdDp2inv(O,B) *dexpdDp2(N,O,K,L)*Z(K,L)*pow(St2,(-1.-_m2)/_m2)*dSt2dF(j,C); + } + } + } + } + } + } + } + } + } + } + for( int j=0; j<3; j++){ + for( int C=0; C<3; C++){ + dtraCebardF(j,C)=0.; + for( int D=0; D<3; D++){ + for( int B=0; B<3; B++){ + dtraCebardF(j,C)+=dCebardF(D,B,j,C)*I2(D,B); + } + } + } + } -void mlawSMP::computintvardfpdf2(STensor43 &dFp2dF,const fullMatrix<double> &domega2dM2inv, const STensor3 &Fn/*,const STensor3 &Fp0*/, const STensor3 &Fppr2, - const STensor3 &SP2,const double Gmu_groundState2, const STensor3 &M2,const STensor3 &dDp2 , const STensor3 &Cebar2, - const double invJ2third,const STensor3 &Cebarpr2, const double dh,const double St2,const double Ta2,const double depsilon2,STensor3 &dtauepsilon2dF, - const STensor3 &dTgdF,const double T, const double Tg,const STensor3 &dSt2dF,STensor43 &dSP2dF) const - { - STensor3 dTau2dF; - // dh = getTimeStep(); - // double J=Fn.determinant(); - // invJ2third =1./ pow(J,2./3.); - static STensor43 domega2dM24ordinv2, dM2dF; - vectortomatricedomega( domega2dM24ordinv2, domega2dM2inv); - double tracCebar2=Cebar2.trace(); - static STensor3 expdDp2,expdDp2inv;//,expdDp2invT; - static STensor3 Fppr2inv;//,Fp2invT; - Fppr2inv= Fppr2.invert(); - static STensor3 invCebar2 ,dtraCebardF; - invCebar2=Cebar2.invert(); - // Fp2invT=Fp2inv.transpose(); - static STensor43 dM2dcbar2,dexpdDp2,domegadF,dCebardF; - STensorOperation::expSTensor3(dDp2,_order,expdDp2, &dexpdDp2); - expdDp2inv=expdDp2.invert(); - //expdDp2invT=expdDp2invT.transpose(); - - double dSt2dtg; - static STensor3 Z; - double normM2; - normM2=M2.norm2(); - if(normM2==0.) - Z*=0.; - else{ - for( int U=0; U<3; U++){ - for( int S=0; S<3; S++){ - Z(U,S)=_epsilonp02*dh*pow(normM2/sqrt(2.),1./_m2)*M2(U,S)/(sqrt(2.)*normM2); - }} - } - - for( int D=0; D<3; D++){ - for( int B=0; B<3; B++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - dCebardF(D,B,j,C)=0.; - for( int N=0; N<3; N++){ - for( int O=0; O<3; O++){ - for( int R=0; R<3; R++){ - for( int K=0; K<3; K++){ - for( int L=0; L<3; L++){ - for( int Q=0; Q<3; Q++){ - dCebardF(D,B,j,C)+=1./_m2*expdDp2inv(O,D)*expdDp2inv(R,N)* dexpdDp2(N,O,K,L)*Z(K,L)*pow(St2,(-1.-_m2)/_m2)*dSt2dF(j,C)*Cebarpr2(R,Q)*expdDp2inv(Q,B); - }}}}}}}}}} - - for( int D=0; D<3; D++){ - for( int B=0; B<3; B++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - for( int N=0; N<3; N++){ - for( int O=0; O<3; O++){ - for( int R=0; R<3; R++){ - for( int K=0; K<3; K++){ - for( int L=0; L<3; L++){ - for( int Q=0; Q<3; Q++){ - dCebardF(D,B,j,C)+=1./_m2*expdDp2inv(R,D)*Cebarpr2(R,Q)*expdDp2inv(Q,N)*expdDp2inv(O,B) *dexpdDp2(N,O,K,L)*Z(K,L)*pow(St2,(-1.-_m2)/_m2)*dSt2dF(j,C); - }}}}}}}}}} - - - - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - dtraCebardF(j,C)=0.; - for( int D=0; D<3; D++){ - for( int B=0; B<3; B++){ - dtraCebardF(j,C)+=dCebardF(D,B,j,C)*I2(D,B); - }}}} - - if (tracCebar2<3.+_Im2) - { - for( int U=0; U<3; U++){ - for( int S=0; S<3; S++){ - for( int j=0; j<3; j++){ - for( int X=0; X<3; X++){ - domegadF(U,S,j,X)=0.; - for( int A=0; A<3; A++){ - for( int B=0; B<3; B++){ - for( int H=0; H<3; H++){ - for( int M=0; M<3; M++){ - for( int K=0; K<3; K++){ - for( int L=0; L<3; L++){ - for( int T=0; T<3; T++){ - for( int W=0; W<3; W++){ - for( int V=0;V<3; V++){ - domegadF(U,S,j,X)-=Fppr2inv(A,H)*(Gmu_groundState2*1./_Im2*(1./(1.-((tracCebar2-3.)/_Im2)))*(1./(1.-((tracCebar2-3.)/_Im2))) - *expdDp2inv(K,M)*I4(K,L,H,T)*expdDp2inv(L,M)* (-1./3.*tracCebar2*I2(U,S)))*Fppr2inv(B,T)*invJ2third*I4(A,B,W,V)*(Fn(j,V)*I2(W,X)+Fn(j,W)*I2(V,X)); - for( int R=0; R<3; R++){ - for( int Q=0; Q<3; Q++){ - domegadF(U,S,j,X)-=Fppr2inv(A,H)*(Gmu_groundState2*1./_Im2*(1./(1.-((tracCebar2-3.)/_Im2)))*(1./(1.-((tracCebar2-3.)/_Im2))) - *expdDp2inv(K,M)*I4(K,L,H,T)*expdDp2inv(L,M)*(expdDp2inv(R,U)*Cebarpr2(R,Q)*expdDp2inv(Q,S)))*Fppr2inv(B,T)*invJ2third*I4(A,B,W,V) - *(Fn(j,V)*I2(W,X)+Fn(j,W)*I2(V,X)); - }}}}}}}}}}}}}}} - - for( int U=0; U<3; U++){ - for( int S=0; S<3; S++){ - for( int j=0; j<3; j++){ - for( int X=0; X<3; X++){ - for( int A=0; A<3; A++){ - for( int B=0; B<3; B++){ - for( int H=0; H<3; H++){ - for( int M=0; M<3; M++){ - for( int K=0; K<3; K++){ - for( int L=0; L<3; L++){ - for( int T=0; T<3; T++){ - for( int W=0; W<3; W++){ - for( int V=0;V<3; V++){ - domegadF(U,S,j,X)-=Fppr2inv(A,H)*Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(-1./3.*expdDp2inv(K,M)*I4(K,L,H,T) - *expdDp2inv(L,M)*I2(U,S))*Fppr2inv(B,T)*invJ2third*I4(A,B,W,V)*(Fn(j,V)*I2(W,X)+Fn(j,W)*I2(V,X)); - }}}}}}}}}}}}} - - for( int U=0; U<3; U++){ - for( int S=0; S<3; S++){ - for( int j=0; j<3; j++){ - for( int X=0; X<3; X++){ - for( int A=0; A<3; A++){ - for( int B=0; B<3; B++){ - for( int H=0; H<3; H++){ - for( int T=0; T<3; T++){ - for( int W=0; W<3; W++){ - for( int V=0;V<3; V++){ - for( int R=0; R<3; R++){ - for( int Q=0; Q<3; Q++){ - domegadF(U,S,j,X)-=Fppr2inv(A,H)*(Gmu_groundState2*1./_Im2*(1./(1.-((tracCebar2-3.)/_Im2)))*(1./(1.-((tracCebar2-3.)/_Im2))) - *(expdDp2inv(R,U)*Cebarpr2(R,Q)*expdDp2inv(Q,S)))*Fppr2inv(B,T)*invJ2third*I4(A,B,W,V)*(Fn(j,V)*I2(W,X)+Fn(j,W)*I2(V,X)); - }}}}}}}}}}}} - - for( int U=0; U<3; U++){ - for( int S=0; S<3; S++){ - for( int j=0; j<3; j++){ - for( int X=0; X<3; X++){ - domegadF(U,S,j,X)-=(Gmu_groundState2*1./_Im2*(1./(1.-((tracCebar2-3.)/_Im2)))*(1./(1.-((tracCebar2-3.)/_Im2)))*dtraCebardF(j,X) - * (-1./3.*tracCebar2*I2(U,S))); - for( int R=0; R<3; R++){ - for( int Q=0; Q<3; Q++){ - domegadF(U,S,j,X)-=(Gmu_groundState2*1./_Im2*(1./(1.-((tracCebar2-3.)/_Im2)))*(1./(1.-((tracCebar2-3.)/_Im2)))*dtraCebardF(j,X) - *(expdDp2inv(R,U)*Cebarpr2(R,Q)*expdDp2inv(Q,S))); - }}}}}} - - for( int U=0; U<3; U++){ - for(int S=0; S<3; S++){ - for( int j=0; j<3; j++){ - for( int X=0; X<3; X++){ - domegadF(U,S,j,X)-=Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(-1./3.*dtraCebardF(j,X)*I2(U,S)); - for( int R=0; R<3; R++){ - for( int Q=0; Q<3; Q++){ - for( int A=0; A<3; A++){ - for( int B=0; B<3; B++){ - for( int K=0; K<3; K++){ - for( int L=0; L<3; L++){ - domegadF(U,S,j,X)-=1./_m2*Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(Z(K,L)*expdDp2inv(B,U)*expdDp2inv(R,A)* - dexpdDp2(A,B,K,L)*pow(St2,(-1.-_m2)/_m2)*dSt2dF(j,X)* Cebarpr2(R,Q)*expdDp2inv(Q,S)); - }}}}}}}}}} - - for( int U=0; U<3; U++){ - for(int S=0; S<3; S++){ - for( int j=0; j<3; j++){ - for( int X=0; X<3; X++){ - for( int R=0; R<3; R++){ - for( int Q=0; Q<3; Q++){ - for( int A=0; A<3; A++){ - for( int B=0; B<3; B++){ - for( int K=0; K<3; K++){ - for( int L=0; L<3; L++){ - domegadF(U,S,j,X)-=1./_m2*Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(Z(K,L)*expdDp2inv(R,U)*Cebarpr2(R,Q)*expdDp2inv(Q,A) - *expdDp2inv(B,S)* dexpdDp2(A,B,K,L)*pow(St2,(-1.-_m2)/_m2)*dSt2dF(j,X)); - }}}}}}}}}} - - for( int U=0; U<3; U++){ - for(int S=0; S<3; S++){ - for( int j=0; j<3; j++){ - for( int X=0; X<3; X++){ - domegadF(U,S,j,X)-=_Nmu_groundState2*Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(-1./3.*tracCebar2*I2(U,S))*dTgdF(j,X); - for( int R=0; R<3; R++){ - for( int Q=0; Q<3; Q++){ - domegadF(U,S,j,X)-=_Nmu_groundState2*Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(expdDp2inv(R,U) - *Cebarpr2(R,Q)*expdDp2inv(Q,S))*dTgdF(j,X); - }}}}}} - - } - else - { - domegadF*=0.; - } - - - for( int C=0; C<3; C++){ - for( int D=0; D<3; D++){ - for( int j=0; j<3; j++){ - for( int X=0; X<3; X++){ - dM2dF(C,D,j,X)=0.; - for( int U=0; U<3; U++){ - for( int S=0; S<3; S++){ - dM2dF(C,D,j,X)-=domega2dM24ordinv2(C,D,U,S)*domegadF(U,S,j,X); - }}}}}} - - - // dM2dcbar2.print("dM2dcbar2"); - - static STensor43 dN2dF; - static STensor3 ddelatepsilon2dF; - dN2dF*=0.;ddelatepsilon2dF*=0.; - double M2norm=M2.norm2(); - - for( int j=0; j<3; j++){ - for( int X=0; X<3; X++){ - ddelatepsilon2dF(j,X)=-_epsilonp02*dh/_m2*pow(M2norm/sqrt(2.),1./_m2)*pow(St2,-1-_m2/_m2)*dSt2dF(j,X); - for( int C=0; C<3; C++){ - for( int D=0; D<3; D++){ - ddelatepsilon2dF(j,X)+=1./_m2*(_epsilonp02*dh/(pow(sqrt(2.)*St2,1./_m2))*pow(M2norm,(1.-2.*_m2)/_m2)* dM2dF(C,D,j,X)*M2(C,D)); - }}}} - - if (M2norm==0.) - { - dFp2dF*=0.; - //ddelatepsilon2dF*=0.; - dN2dF*=0.; - } - else{ - for( int O=0; O<3; O++){ - for( int P=0; P<3; P++){ - for( int j=0; j<3; j++){ - for( int X=0; X<3; X++){ - dN2dF(O,P,j,X)=1./sqrt(2.)*dM2dF(O,P,j,X)/M2norm; - for( int C=0; C<3; C++){ - for( int D=0; D<3; D++){ - dN2dF(O,P,j,X)-=1./sqrt(2.)* pow(M2norm,-3.)*M2(O,P)*dM2dF(C,D,j,X)*M2(C,D); - }}}}}} - - - for( int E=0; E<3; E++){ - for( int Z=0; Z<3; Z++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - dFp2dF(E,Z,j,C)=0.; - for( int I=0; I<3; I++){ - for( int O=0; O<3; O++){ - for( int P=0; P<3; P++){ - dFp2dF(E,Z,j,C)+=dexpdDp2(I,E,O,P)*(M2(O,P)/(sqrt(2.)*M2norm)*ddelatepsilon2dF(j,C))*Fppr2(I,Z); - }}}}}}} - - for( int E=0; E<3; E++){ - for( int Z=0; Z<3; Z++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - for( int I=0; I<3; I++){ - for( int O=0; O<3; O++){ - for( int P=0; P<3; P++){ - dFp2dF(E,Z,j,C)+=dexpdDp2(I,E,O,P)*(depsilon2)*dN2dF(O,P,j,C)*Fppr2(I,Z); - }}}}}}} - } - - - // static STensor43 dSP2dF; - dSP2dF*=0.; - - if (tracCebar2<3.+_Im2) - { - for( int D=0; D<3; D++){ - for( int B=0; B<3; B++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - dSP2dF(D,B,j,C)+=invJ2third*_Nmu_groundState2*Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(I2(D,B))*dTgdF(j,C); - }}}} - - for( int D=0; D<3; D++){ - for( int B=0; B<3; B++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - dSP2dF(D,B,j,C)+=invJ2third*_Nmu_groundState2*Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(-1./3.*tracCebar2*invCebar2(D,B))*dTgdF(j,C); - }}}} - - for( int D=0; D<3; D++){ - for( int B=0; B<3; B++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - dSP2dF(D,B,j,C)+=1./_Im2*invJ2third*Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(1./(1.-((tracCebar2-3.)/_Im2)))*dtraCebardF(j,C)*(I2(D,B)); - }}}} - - for( int D=0; D<3; D++){ - for( int B=0; B<3; B++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - dSP2dF(D,B,j,C)+=1./_Im2*invJ2third*Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(1./(1.-((tracCebar2-3.)/_Im2)))*dtraCebardF(j,C)*(-1./3. - *tracCebar2*invCebar2(D,B)); - }}}} - - for( int D=0; D<3; D++){ - for( int B=0; B<3; B++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - for( int F=0; F<3; F++){ - for( int G=0; G<3; G++){ - dSP2dF(D,B,j,C)-=1./3.*invJ2third*Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(dtraCebardF(j,C)*invCebar2(D,B)); - }}}}}} - - for( int D=0; D<3; D++){ - for( int B=0; B<3; B++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - for( int F=0; F<3; F++){ - for( int G=0; G<3; G++){ - dSP2dF(D,B,j,C)-=1./3.*invJ2third*Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(-tracCebar2*invCebar2(D,F)*invCebar2(G,B)*dCebardF(F,G,j,C)); - }}}}}} - } - - //dFp2dF.print("dFp2dF"); - //for cp - dtauepsilon2dF*=0.;dTau2dF*=0.; - if (M2norm==0.) - { - dTau2dF*=0.; - dtauepsilon2dF*=0.; - } - - else{ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - dTau2dF(j,C)=0.; - for( int E=0; E<3; E++){ - for( int D=0; D<3; D++){ - dTau2dF(j,C)+=1./sqrt(2.)*M2(E,D)*dM2dF(E,D,j,C)/M2norm; - }}}} - - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - dtauepsilon2dF(j,C)=ddelatepsilon2dF(j,C)*Ta2+depsilon2*dTau2dF(j,C); - }} - } - - } - - -void mlawSMP::tangent2(STensor43 &Tangent2,/*STensor43 &dFp2invdF,*/ const STensor3 &Fn, const STensor3 &Fp2,const STensor3 &SP2,const double Gmu_groundState2 -, const STensor43 &dFp2dF, const STensor3 &Fe2, const STensor3 &Cebar2, const double invJ2third ,const double T,const double Tg,const STensor43 &dSP2dF) const + if (tracCebar2<3.+_Im2) + { + for( int U=0; U<3; U++){ + for( int S=0; S<3; S++){ + for( int j=0; j<3; j++){ + for( int X=0; X<3; X++){ + domegadF(U,S,j,X)=-((Gmu_groundState2*1./_Im2*(1./(1.-((tracCebar2-3.)/_Im2)))*(1./(1.-((tracCebar2-3.)/_Im2)))*dtraCebardF(j,X) + * (-1./3.*tracCebar2*I2(U,S)))); + domegadF(U,S,j,X)-=Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(-1./3.*dtraCebardF(j,X)*I2(U,S)); + domegadF(U,S,j,X)-=_Nmu_groundState2*Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(-1./3.*tracCebar2*I2(U,S))*dTgdF(j,X); + for( int A=0; A<3; A++){ + for( int B=0; B<3; B++){ + domegadF(U,S,j,X)-=(Gmu_groundState2*1./_Im2*(1./(1.-((tracCebar2-3.)/_Im2)))*(1./(1.-((tracCebar2-3.)/_Im2)))*dtraCebardF(j,X) + *(expdDp2inv(A,U)*Cebarpr2(A,B)*expdDp2inv(B,S))); + domegadF(U,S,j,X)-=_Nmu_groundState2*Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(expdDp2inv(A,U) + *Cebarpr2(A,B)*expdDp2inv(B,S))*dTgdF(j,X); + for( int H=0; H<3; H++){ + for( int M=0; M<3; M++){ + for( int K=0; K<3; K++){ + for( int L=0; L<3; L++){ + domegadF(U,S,j,X)-=1./_m2*Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(Z(K,L)*expdDp2inv(B,U)*expdDp2inv(H,A)* + dexpdDp2(A,B,K,L)*pow(St2,(-1.-_m2)/_m2)*dSt2dF(j,X)* Cebarpr2(H,M)*expdDp2inv(M,S)); + domegadF(U,S,j,X)-=1./_m2*Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(Z(K,L)*expdDp2inv(H,U)*Cebarpr2(H,M)*expdDp2inv(M,A) + *expdDp2inv(B,S)* dexpdDp2(A,B,K,L)*pow(St2,(-1.-_m2)/_m2)*dSt2dF(j,X)); + for( int T=0; T<3; T++){ + for( int W=0; W<3; W++){ + domegadF(U,S,j,X)-=Fppr2inv(A,H)*(Gmu_groundState2*1./_Im2*(1./(1.-((tracCebar2-3.)/_Im2)))*(1./(1.-((tracCebar2-3.)/_Im2))) + *(expdDp2inv(K,U)*Cebarpr2(K,L)*expdDp2inv(L,S)))*Fppr2inv(B,T)*invJ2third*I4(A,B,W,M)*(Fn(j,M)*I2(W,X)+Fn(j,W)*I2(M,X)); + for( int V=0;V<3; V++){ + domegadF(U,S,j,X)-=Fppr2inv(A,H)*(Gmu_groundState2*1./_Im2*(1./(1.-((tracCebar2-3.)/_Im2)))*(1./(1.-((tracCebar2-3.)/_Im2))) + *expdDp2inv(K,M)*I4(K,L,H,T)*expdDp2inv(L,M)* (-1./3.*tracCebar2*I2(U,S)))*Fppr2inv(B,T)*invJ2third*I4(A,B,W,V)*(Fn(j,V)*I2(W,X)+Fn(j,W)*I2(V,X)); + domegadF(U,S,j,X)-=Fppr2inv(A,H)*Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(-1./3.*expdDp2inv(K,M)*I4(K,L,H,T) + *expdDp2inv(L,M)*I2(U,S))*Fppr2inv(B,T)*invJ2third*I4(A,B,W,V)*(Fn(j,V)*I2(W,X)+Fn(j,W)*I2(V,X)); + for( int R=0; R<3; R++){ + for( int Q=0; Q<3; Q++){ + domegadF(U,S,j,X)-=Fppr2inv(A,H)*(Gmu_groundState2*1./_Im2*(1./(1.-((tracCebar2-3.)/_Im2)))*(1./(1.-((tracCebar2-3.)/_Im2))) + *expdDp2inv(K,M)*I4(K,L,H,T)*expdDp2inv(L,M)*(expdDp2inv(R,U)*Cebarpr2(R,Q)*expdDp2inv(Q,S)))*Fppr2inv(B,T)*invJ2third*I4(A,B,W,V) + *(Fn(j,V)*I2(W,X)+Fn(j,W)*I2(V,X)); + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + for( int C=0; C<3; C++){ + for( int D=0; D<3; D++){ + for( int j=0; j<3; j++){ + for( int X=0; X<3; X++){ + dM2dF(C,D,j,X)=0.; + for( int U=0; U<3; U++){ + for( int S=0; S<3; S++){ + dM2dF(C,D,j,X)-=domega2dM24ordinv2(C,D,U,S)*domegadF(U,S,j,X); + } + } + } + } + } + } + + static STensor43 dN2dF; + static STensor3 ddelatepsilon2dF; + STensorOperation::zero(dN2dF); STensorOperation::zero(ddelatepsilon2dF); + double M2norm=M2.norm2(); + + for( int j=0; j<3; j++){ + for( int X=0; X<3; X++){ + ddelatepsilon2dF(j,X)=-_epsilonp02*dh/_m2*pow(M2norm/sqrt(2.),1./_m2)*pow(St2,-1-_m2/_m2)*dSt2dF(j,X); + for( int C=0; C<3; C++){ + for( int D=0; D<3; D++){ + ddelatepsilon2dF(j,X)+=1./_m2*(_epsilonp02*dh/(pow(sqrt(2.)*St2,1./_m2))*pow(M2norm,(1.-2.*_m2)/_m2)* dM2dF(C,D,j,X)*M2(C,D)); + } + } + } + } + + if (M2norm!=0.) + { + dN2dF=dM2dF; + dN2dF*=1./sqrt(2.)/M2norm; + for( int O=0; O<3; O++){ + for( int P=0; P<3; P++){ + for( int j=0; j<3; j++){ + for( int X=0; X<3; X++){ + for( int C=0; C<3; C++){ + for( int D=0; D<3; D++){ + dN2dF(O,P,j,X)-=1./sqrt(2.)* pow(M2norm,-3.)*M2(O,P)*dM2dF(C,D,j,X)*M2(C,D); + } + } + } + } + } + } + for( int E=0; E<3; E++){ + for( int Z=0; Z<3; Z++){ + for( int j=0; j<3; j++){ + for( int C=0; C<3; C++){ + for( int I=0; I<3; I++){ + for( int O=0; O<3; O++){ + for( int P=0; P<3; P++){ + dFp2dF(E,Z,j,C)+=dexpdDp2(I,E,O,P)*(M2(O,P)/(sqrt(2.)*M2norm)*ddelatepsilon2dF(j,C))*Fppr2(I,Z); + dFp2dF(E,Z,j,C)+=dexpdDp2(I,E,O,P)*(depsilon2)*dN2dF(O,P,j,C)*Fppr2(I,Z); + } + } + } + } + } + } + } + } + if (tracCebar2<3.+_Im2) + { + for( int D=0; D<3; D++){ + for( int B=0; B<3; B++){ + for( int j=0; j<3; j++){ + for( int C=0; C<3; C++){ + dSP2dF(D,B,j,C)+=invJ2third*_Nmu_groundState2*Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(I2(D,B))*dTgdF(j,C); + dSP2dF(D,B,j,C)+=invJ2third*_Nmu_groundState2*Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(-1./3.*tracCebar2*invCebar2(D,B))*dTgdF(j,C); + dSP2dF(D,B,j,C)+=1./_Im2*invJ2third*Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(1./(1.-((tracCebar2-3.)/_Im2)))*dtraCebardF(j,C)*(I2(D,B)); + dSP2dF(D,B,j,C)+=1./_Im2*invJ2third*Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(1./(1.-((tracCebar2-3.)/_Im2)))*dtraCebardF(j,C)*(-1./3. + *tracCebar2*invCebar2(D,B)); + for( int F=0; F<3; F++){ + for( int G=0; G<3; G++){ + dSP2dF(D,B,j,C)-=1./3.*invJ2third*Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(dtraCebardF(j,C)*invCebar2(D,B)); + dSP2dF(D,B,j,C)-=1./3.*invJ2third*Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(-tracCebar2*invCebar2(D,F)*invCebar2(G,B)*dCebardF(F,G,j,C)); + } + } + } + } + } + } + } + if (M2norm!=0.) + { + for( int j=0; j<3; j++){ + for( int C=0; C<3; C++){ + for( int E=0; E<3; E++){ + for( int D=0; D<3; D++){ + dTau2dF(j,C)+=1./sqrt(2.)*M2(E,D)*dM2dF(E,D,j,C)/M2norm; + } + } + } + } + for( int j=0; j<3; j++){ + for( int C=0; C<3; C++){ + dtauepsilon2dF(j,C)=ddelatepsilon2dF(j,C)*Ta2+depsilon2*dTau2dF(j,C); + } + } + } +} + + +void mlawSMP::tangent2(STensor43 &Tangent2, const STensor3 &Fn, const STensor3 &Fp2,const STensor3 &SP2,const double Gmu_groundState2, + const STensor43 &dFp2dF, const STensor3 &Fe2, const STensor3 &Cebar2, const double invJ2third ,const double T,const double Tg,const STensor43 &dSP2dF) const { + STensorOperation::zero(Tangent2); // d Fp-1 / d static STensor3 Fp2inv; - Fp2inv = Fp2.invert(); - //Fp2invT=Fp2inv.transpose(); - double J= Fn.determinant(); - double invJ1third =1./ pow(J,1./3.); - static STensor43 dFe2dF,dFp2invdF;//,dFebar2dF; - dFe2dF*=0.;dFp2invdF*=0.; - + STensorOperation::inverseSTensor3(Fp2,Fp2inv); + double J1= Fn.determinant(); + static STensor3 Fninv; + STensorOperation::inverseSTensor3(Fn,Fninv); + double invJ1third =1./ pow(J1,1./3.); + static STensor43 dFe2dF,dFp2invdF; + STensorOperation::zero(dFe2dF); STensorOperation::zero(dFp2invdF); + // dFpinv / d for( int i=0; i<3; i++) + { for( int j=0; j<3; j++) + { for( int k=0; k<3; k++) + { for( int l=0; l<3; l++) { - dFp2invdF(i,j,k,l) = 0.; for( int m=0; m<3; m++) { for( int n=0; n<3; n++) @@ -1994,7 +1382,10 @@ void mlawSMP::tangent2(STensor43 &Tangent2,/*STensor43 &dFp2invdF,*/ const STens } } } - // dFe / d + } + } + } + // dFe / d for( int q=0; q<3; q++){ for( int M=0; M<3; M++){ for( int j=0; j<3; j++){ @@ -2003,517 +1394,288 @@ void mlawSMP::tangent2(STensor43 &Tangent2,/*STensor43 &dFp2invdF,*/ const STens dFe2dF(q,M,j,C) = I2(q,j)*Fp2inv(C,M); for( int G=0; G<3; G++){ dFe2dF(q,M,j,C) += Fn(q,G)*dFp2invdF(G,M,j,C); - }}}}} + } + } + } + } + } - // double invJ2third =1./ pow(J,2./3.); - double tracCebar2=Cebar2.trace(); - static STensor3 invCebar2; - invCebar2=Cebar2.invert(); - // STensor3 invFe2=Fe2.invert(); - static STensor3 Fninv; - Fninv=Fn.invert(); - static STensor3 Fnbar; - Fnbar=Fn; - Fnbar*=invJ1third; - static STensor3 Fe2bar; - Fe2bar= Fe2; - Fe2bar*=invJ1third; - static STensor3 Fe2barinv; - Fe2barinv=Fe2bar.invert(); - double J1=Fn.determinant(); - - - if (tracCebar2<3.+_Im2) - { - for( int i=0; i<3; i++){ - for( int A=0; A<3; A++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - Tangent2(i,A,j,C) = 0.; - for( int B=0; B<3; B++){ - for( int D=0; D<3; D++){ - Tangent2(i,A,j,C)+=I2(i,j)*Fp2inv(C,D)*SP2(D,B)*Fp2inv(A,B); - }}}}}} - - - for( int i=0; i<3; i++){ - for( int A=0; A<3; A++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - for( int W=0; W<3; W++){ - for( int B=0; B<3; B++){ - for( int D=0; D<3; D++){ - Tangent2(i,A,j,C)+=Fn(i,W)*dFp2invdF(W,D,j,C)*SP2(D,B)*Fp2inv(A,B); - }}}}}}} - - for( int i=0; i<3; i++){ - for( int A=0; A<3; A++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - for( int W=0; W<3; W++){ - for( int B=0; B<3; B++){ - for( int D=0; D<3; D++){ - Tangent2(i,A,j,C)+=Fn(i,W)*Fp2inv(W,D)*SP2(D,B)*dFp2invdF(A,B,j,C); - for( int q=0; q<3; q++){ - for( int M=0; M<3; M++){ - Tangent2(i,A,j,C)+= Fn(i,W)*Fp2inv(W,D)*(2./(_Im2* J1 )*Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(1./(1.-((tracCebar2-3.)/_Im2))) - *Fe2bar(q,M)*I2(D,B))*dFe2dF(q,M,j,C)*Fp2inv(A,B); - }}}}}}}}} - - for( int i=0; i<3; i++){ - for( int A=0; A<3; A++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - for( int W=0; W<3; W++){ - for( int B=0; B<3; B++){ - for( int D=0; D<3; D++){ - for( int q=0; q<3; q++){ - for( int M=0; M<3; M++){ - Tangent2(i,A,j,C)+= Fn(i,W)*Fp2inv(W,D)*(2./(_Im2* J1 )*Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(1./(1.-((tracCebar2-3.)/_Im2))) - *Fe2bar(q,M)*( -1./3.)*tracCebar2*invCebar2(D,B))*dFe2dF(q,M,j,C)*Fp2inv(A,B); - }}}}}}}}} - - - for( int i=0; i<3; i++){ - for( int A=0; A<3; A++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - for( int W=0; W<3; W++){ - for( int B=0; B<3; B++){ - for( int D=0; D<3; D++){ - for( int q=0; q<3; q++){ - for( int M=0; M<3; M++){ - Tangent2(i,A,j,C)-= Fn(i,W)*Fp2inv(W,D)*(1./(3.* J1) *Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2))) - *2.*Fe2bar(q,M)*invCebar2(D,B))*dFe2dF(q,M,j,C)*Fp2inv(A,B); - for( int K=0; K<3; K++){ - Tangent2(i,A,j,C)-= Fn(i,W)*Fp2inv(W,D)*(1./(3.* J1) *Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2))) - *(-tracCebar2*(Fe2barinv(D,q)*Fe2barinv(M,K)*Fe2barinv(B,K)+Fe2barinv(D,K)*Fe2barinv(B,q)*Fe2barinv(M,K)))) - *dFe2dF(q,M,j,C)*Fp2inv(A,B); - }}}}}}}}}} - - //dsdfe.dfedj.djdf - for( int i=0; i<3; i++){ - for( int A=0; A<3; A++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - for( int W=0; W<3; W++){ - for( int B=0; B<3; B++){ - for( int D=0; D<3; D++){ - for( int q=0; q<3; q++){ - for( int M=0; M<3; M++){ - Tangent2(i,A,j,C)-= Fn(i,W)*Fp2inv(W,D)*(2./(3.*_Im2)* invJ2third *Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(1./(1.-((tracCebar2-3.)/_Im2))) - *Fe2bar(q,M)*I2(D,B))*Fe2bar(q,M)*Fninv(C,j)*Fp2inv(A,B); - }}}}}}}}} - - for( int i=0; i<3; i++){ - for( int A=0; A<3; A++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - for( int W=0; W<3; W++){ - for( int B=0; B<3; B++){ - for( int D=0; D<3; D++){ - for( int q=0; q<3; q++){ - for( int M=0; M<3; M++){ - Tangent2(i,A,j,C)-= Fn(i,W)*Fp2inv(W,D)*(2./(3.*_Im2)* invJ2third *Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(1./(1.-((tracCebar2-3.)/_Im2))) - *Fe2bar(q,M)*(-1./3.)*tracCebar2*invCebar2(D,B))*Fe2bar(q,M)*Fninv(C,j)*Fp2inv(A,B); - }}}}}}}}} - - for( int i=0; i<3; i++){ - for( int A=0; A<3; A++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - for( int W=0; W<3; W++){ - for( int B=0; B<3; B++){ - for( int D=0; D<3; D++){ - for( int q=0; q<3; q++){ - for( int M=0; M<3; M++){ - Tangent2(i,A,j,C)+=Fn(i,W)*Fp2inv(W,D)*1./9.* invJ2third *Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2))) - *(2.*Fe2bar(q,M)*invCebar2(D,B))*Fe2bar(q,M)*Fninv(C,j)*Fp2inv(A,B); - for( int K=0; K<3; K++){ - Tangent2(i,A,j,C)+=Fn(i,W)*Fp2inv(W,D)*1./9.* invJ2third *Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2))) - *(-tracCebar2*(Fe2barinv(D,q)*Fe2barinv(M,K)*Fe2barinv(B,K)+Fe2barinv(D,K)*Fe2barinv(B,q)*Fe2barinv(M,K)))* - Fe2bar(q,M)*Fninv(C,j)*Fp2inv(A,B); - }}}}}}}}}} - - for( int i=0; i<3; i++){ - for( int A=0; A<3; A++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - for( int W=0; W<3; W++){ - for( int B=0; B<3; B++){ - for( int D=0; D<3; D++){ - Tangent2(i,A,j,C)+= Fn(i,W)*Fp2inv(W,D)*(dSP2dF(D,B,j,C))*Fp2inv(A,B); - }}}}}}} - - - for( int i=0; i<3; i++){ - for( int A=0; A<3; A++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - for( int W=0; W<3; W++){ - for( int B=0; B<3; B++){ - for( int D=0; D<3; D++){ - Tangent2(i,A,j,C)-=Fn(i,W)*Fp2inv(W,D)*2./3.* SP2(D,B)*Fninv(C,j)*Fp2inv(A,B); - }}}}}}} - - //for( int i=0; i<3; i++){ - //for( int A=0; A<3; A++){ - // for( int j=0; j<3; j++){ - // for( int C=0; C<3; C++){ - // for( int W=0; W<3; W++){ - // for( int B=0; B<3; B++){ - // for( int D=0; D<3; D++){ - // Tangent2(i,A,j,C)-=Fn(i,W)*Fp2inv(W,D)*2.*tracCebar2/(3.*_Im2)* (1./(1.-((tracCebar2-3.)/_Im2))) - // *SP2(D,B)*Fninv(C,j)*Fp2inv(A,B); - // }}}}}}} - - } - else - { - Tangent2*=0.; - } - // Tangent2.print("forth order"); - + double tracCebar2=Cebar2.trace(); + static STensor3 invCebar2; + STensorOperation::inverseSTensor3(Cebar2,invCebar2); + static STensor3 Fe2bar; + Fe2bar= Fe2; + Fe2bar*=invJ1third; + static STensor3 Fe2barinv; + STensorOperation::inverseSTensor3(Fe2bar,Fe2barinv); + + if (tracCebar2<3.+_Im2) + { + for( int i=0; i<3; i++){ + for( int A=0; A<3; A++){ + for( int j=0; j<3; j++){ + for( int C=0; C<3; C++){ + for( int B=0; B<3; B++){ + for( int D=0; D<3; D++){ + Tangent2(i,A,j,C)+=I2(i,j)*Fp2inv(C,D)*SP2(D,B)*Fp2inv(A,B); + for( int W=0; W<3; W++){ + Tangent2(i,A,j,C)+=Fn(i,W)*dFp2invdF(W,D,j,C)*SP2(D,B)*Fp2inv(A,B); + Tangent2(i,A,j,C)+=Fn(i,W)*Fp2inv(W,D)*SP2(D,B)*dFp2invdF(A,B,j,C); + Tangent2(i,A,j,C)+=Fn(i,W)*Fp2inv(W,D)*(dSP2dF(D,B,j,C))*Fp2inv(A,B); + Tangent2(i,A,j,C)-=Fn(i,W)*Fp2inv(W,D)*2./3.* SP2(D,B)*Fninv(C,j)*Fp2inv(A,B); + for( int q=0; q<3; q++){ + for( int M=0; M<3; M++){ + Tangent2(i,A,j,C)+= Fn(i,W)*Fp2inv(W,D)*(2./(_Im2* J1 )*Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(1./(1.-((tracCebar2-3.)/_Im2))) + *Fe2bar(q,M)*I2(D,B))*dFe2dF(q,M,j,C)*Fp2inv(A,B); + Tangent2(i,A,j,C)+= Fn(i,W)*Fp2inv(W,D)*(2./(_Im2* J1 )*Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(1./(1.-((tracCebar2-3.)/_Im2))) + *Fe2bar(q,M)*( -1./3.)*tracCebar2*invCebar2(D,B))*dFe2dF(q,M,j,C)*Fp2inv(A,B); + Tangent2(i,A,j,C)-= Fn(i,W)*Fp2inv(W,D)*(1./(3.* J1) *Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2))) + *2.*Fe2bar(q,M)*invCebar2(D,B))*dFe2dF(q,M,j,C)*Fp2inv(A,B); + Tangent2(i,A,j,C)-= Fn(i,W)*Fp2inv(W,D)*(2./(3.*_Im2)* invJ2third *Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(1./(1.-((tracCebar2-3.)/_Im2))) + *Fe2bar(q,M)*I2(D,B))*Fe2bar(q,M)*Fninv(C,j)*Fp2inv(A,B); + Tangent2(i,A,j,C)-= Fn(i,W)*Fp2inv(W,D)*(2./(3.*_Im2)* invJ2third *Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2)))*(1./(1.-((tracCebar2-3.)/_Im2))) + *Fe2bar(q,M)*(-1./3.)*tracCebar2*invCebar2(D,B))*Fe2bar(q,M)*Fninv(C,j)*Fp2inv(A,B); + Tangent2(i,A,j,C)+=Fn(i,W)*Fp2inv(W,D)*1./9.* invJ2third *Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2))) + *(2.*Fe2bar(q,M)*invCebar2(D,B))*Fe2bar(q,M)*Fninv(C,j)*Fp2inv(A,B); + for( int K=0; K<3; K++){ + Tangent2(i,A,j,C)-= Fn(i,W)*Fp2inv(W,D)*(1./(3.* J1) *Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2))) + *(-tracCebar2*(Fe2barinv(D,q)*Fe2barinv(M,K)*Fe2barinv(B,K)+Fe2barinv(D,K)*Fe2barinv(B,q)*Fe2barinv(M,K)))) + *dFe2dF(q,M,j,C)*Fp2inv(A,B); + Tangent2(i,A,j,C)+=Fn(i,W)*Fp2inv(W,D)*1./9.* invJ2third *Gmu_groundState2*(1./(1.-((tracCebar2-3.)/_Im2))) + *(-tracCebar2*(Fe2barinv(D,q)*Fe2barinv(M,K)*Fe2barinv(B,K)+Fe2barinv(D,K)*Fe2barinv(B,q)*Fe2barinv(M,K)))* + Fe2bar(q,M)*Fninv(C,j)*Fp2inv(A,B); + } + } + } + } + } + } + } + } + } + } } +} - - - void mlawSMP:: computdpdt2(STensor3 &dp2dt,const fullMatrix<double> &domega2dM2inv, const STensor3 &Fn,/*,const STensor3 &Fp0,*/ const STensor3 &Fp2 - ,const STensor3 &Fp0,const STensor3 &SP2, const double Gmu_groundState2, const STensor3 &M2,const STensor3 &dDp2 , const STensor3 &Cebar2, - const STensor3 &Ceprbar2,const double dh,const double St2,const double T,const double Tg,const double invJ2third - ,double &dtauepsilon2dt,const double Ta2,const double depsilon2 ,const double dSt2dT) const - { - - STensor3 Fp2inv(Fp2.invert()); - static STensor3 expdDp2,dFp2invdt ,dFp2dt,dSP2dt,domegadt ; - double dTau2dt=0.;domegadt*=0.;dSP2dt*=0.;dFp2dt*=0.;dFp2invdt*=0.;expdDp2*=0.; - double trCebar2(Cebar2.trace()); - double dtrCebar2dt=0.; - static STensor43 dexpdDp2; - STensorOperation::expSTensor3(dDp2,_order,expdDp2, &dexpdDp2); - STensor3 expdDp2inv(expdDp2.invert()); - double normM2(M2.norm2()); - static STensor43 domega2dM24ordinv2; - vectortomatricedomega(domega2dM24ordinv2, domega2dM2inv); - static STensor3 W; - - - if(normM2==0.) - W*=0.; - else{ - for( int U=0; U<3; U++){ - for( int S=0; S<3; S++){ - W(U,S)=_epsilonp02*dh*pow(normM2/sqrt(2.),1./_m2)*M2(U,S)/(sqrt(2.)*normM2); - }} - } - - for( int K=0; K<3; K++){ - for( int L=0; L<3; L++){ - for( int Z=0; Z<3; Z++){ - for( int B=0; B<3; B++){ - for( int A=0; A<3; A++){ - for( int I=0; I<3; I++){ - for( int J=0; J<3; J++){ - dtrCebar2dt+=1./_m2*W(K,L)*expdDp2inv(B,Z)*expdDp2inv(I,A)*dexpdDp2(A,B,K,L)*pow(St2,(-1.-_m2)/_m2)*dSt2dT*Ceprbar2(I,J)*expdDp2inv(Z,J); - }}}}}}} - - for( int K=0; K<3; K++){ - for( int L=0; L<3; L++){ - for( int Z=0; Z<3; Z++){ - for( int B=0; B<3; B++){ - for( int A=0; A<3; A++){ - for( int I=0; I<3; I++){ - for( int J=0; J<3; J++){ - dtrCebar2dt+=1./_m2*W(K,L)*expdDp2inv(I,Z)* Ceprbar2(I,J)*expdDp2inv(J,A)*expdDp2inv(B,Z)* dexpdDp2(A,B,K,L)* - pow(St2,(-1.-_m2)/_m2) *dSt2dT; - - - }}}}}}} - - - - if (trCebar2<3.+_Im2) - { - for( int U=0; U<3; U++){ - for( int S=0; S<3; S++){ - domegadt(U,S)=+_Nmu_groundState2*Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))*(-1./3.*trCebar2*I2(U,S)); - for( int R=0; R<3; R++){ - for( int Q=0; Q<3; Q++){ - domegadt(U,S)+=_Nmu_groundState2*Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))*(expdDp2inv(R,U)*Ceprbar2(R,Q)*expdDp2inv(Q,S)); - }}}} - - for( int U=0; U<3; U++){ - for( int S=0; S<3; S++){ - domegadt(U,S)-=Gmu_groundState2/_Im2*(1./(1.-((trCebar2-3.)/_Im2)))*(1./(1.-((trCebar2-3.)/_Im2)))*dtrCebar2dt*(-1./3.*trCebar2*I2(U,S)); - }} - - for( int U=0; U<3; U++){ - for( int S=0; S<3; S++){ - for( int R=0; R<3; R++){ - for( int Q=0; Q<3; Q++){ - domegadt(U,S)-=Gmu_groundState2/_Im2*(1./(1.-((trCebar2-3.)/_Im2)))*(1./(1.-((trCebar2-3.)/_Im2)))*dtrCebar2dt*(expdDp2inv(R,U)* - Ceprbar2(R,Q)*expdDp2inv(Q,S)); - }}}} - - for( int U=0; U<3; U++){ - for(int S=0; S<3; S++){ - domegadt(U,S)-=Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))* (-1./3.*dtrCebar2dt*I2(U,S)); - for( int R=0; R<3; R++){ - for( int Q=0; Q<3; Q++){ - for( int A=0; A<3; A++){ - for( int B=0; B<3; B++){ - for( int K=0; K<3; K++){ - for( int L=0; L<3; L++){ - domegadt(U,S)-=1./_m2*Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))*(W(K,L)*expdDp2inv(B,U)*expdDp2inv(R,A)* - dexpdDp2(A,B,K,L)*pow(St2,(-1.-_m2)/_m2)*dSt2dT* Ceprbar2(R,Q)*expdDp2inv(Q,S)); - }}}}}}}} - - for( int U=0; U<3; U++){ - for(int S=0; S<3; S++){ - for( int R=0; R<3; R++){ - for( int Q=0; Q<3; Q++){ - for( int A=0; A<3; A++){ - for( int B=0; B<3; B++){ - for( int K=0; K<3; K++){ - for( int L=0; L<3; L++){ - domegadt(U,S)-=1./_m2*Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))*(W(K,L))*expdDp2inv(R,U)*Ceprbar2(R,Q)*expdDp2inv(Q,A) - *expdDp2inv(B,S)* dexpdDp2(A,B,K,L)*pow(St2,(-1.-_m2)/_m2)*dSt2dT; - }}}}}}}} +void mlawSMP:: computedPdT2(STensor3 &dP2dT,const fullMatrix<double> &domega2dM2inv, const STensor3 &Fn, const STensor3 &Fp2, + const STensor3 &Fp0,const STensor3 &SP2, const double Gmu_groundState2, const STensor3 &M2,const STensor3 &dDp2, const STensor3 &Cebar2, + const STensor3 &Ceprbar2,const double dh,const double St2,const double T,const double Tg,const double invJ2third, + double &dtauepsilon2dT,const double Ta2,const double depsilon2 ,const double dSt2dT) const +{ + STensorOperation::zero(dP2dT); + dtauepsilon2dT=0.; + static STensor3 Fp2inv; + STensorOperation::inverseSTensor3(Fp2, Fp2inv); + static STensor3 expdDP2, dFp2invdT, dFp2dT, dSP2dT, domegadT; + STensorOperation::zero(expdDP2); STensorOperation::zero(dFp2invdT); STensorOperation::zero(dFp2dT); STensorOperation::zero(dSP2dT); STensorOperation::zero(domegadT); + double dTau2dT=0.; + double trCebar2=Cebar2.trace(); + static STensor3 invCebar2; + STensorOperation::inverseSTensor3(Cebar2, invCebar2); + double dtrCebar2dT=0.; + static STensor43 dexpdDP2; + STensorOperation::expSTensor3(dDp2,_order,expdDP2, &dexpdDP2); + static STensor3 expdDP2inv; + STensorOperation::inverseSTensor3(expdDP2, expdDP2inv); + double normM2(M2.norm2()); + static STensor43 domega2dM24ordinv2; + vectortomatricedomega(domega2dM24ordinv2, domega2dM2inv); + static STensor3 W; + STensorOperation::zero(W); + + if(normM2!=0.) + { + W=M2; + W*=_epsilonp02*dh*pow(normM2/sqrt(2.),1./_m2)/(sqrt(2.)*normM2); + } + for( int K=0; K<3; K++){ + for( int L=0; L<3; L++){ + for( int Z=0; Z<3; Z++){ + for( int B=0; B<3; B++){ + for( int A=0; A<3; A++){ + for( int I=0; I<3; I++){ + for( int J=0; J<3; J++){ + dtrCebar2dT+=1./_m2*W(K,L)*expdDP2inv(B,Z)*expdDP2inv(I,A)*dexpdDP2(A,B,K,L)*pow(St2,(-1.-_m2)/_m2)*dSt2dT*Ceprbar2(I,J)*expdDP2inv(Z,J); + dtrCebar2dT+=1./_m2*W(K,L)*expdDP2inv(I,Z)* Ceprbar2(I,J)*expdDP2inv(J,A)*expdDP2inv(B,Z)* dexpdDP2(A,B,K,L)* + pow(St2,(-1.-_m2)/_m2) *dSt2dT; + } + } + } + } + } + } + } - } - - - static STensor3 dM2dT; - for( int C=0; C<3; C++){ - for( int D=0; D<3; D++){ - dM2dT(C,D)=0.; - for( int U=0; U<3; U++){ - for( int S=0; S<3; S++){ - dM2dT(C,D)-=domega2dM24ordinv2(C,D,U,S)*domegadt(U,S); - }}}} - - - //domegadt.print("tensor"); - //dfp2dt - double depsilon2dt=0.; - - - depsilon2dt=-1./_m2*_epsilonp02*dh*pow(normM2/sqrt(2.),1./_m2)*pow(St2,(-1.-_m2)/_m2)*dSt2dT; - - for( int C=0; C<3; C++){ - for( int D=0; D<3; D++){ - depsilon2dt+=1./_m2*(_epsilonp02*dh/(pow(St2*sqrt(2.),1./_m2)))*pow(normM2,(1.-2.*_m2)/_m2)* - dM2dT(C,D)*M2(C,D); - }} - if(normM2==0.) - { - dFp2dt*=0.; - } - - else{ - for( int E=0; E<3; E++){ - for( int Z=0; Z<3; Z++){ - dFp2dt(E,Z)=0.; - for( int I=0; I<3; I++){ - for( int O=0; O<3; O++){ - for( int P=0; P<3; P++){ - dFp2dt(E,Z)+=dexpdDp2(E,I,O,P)*(M2(O,P)/(sqrt(2.)*normM2)*( depsilon2dt) )*Fp0(I,Z); - }}}}} - - for( int E=0; E<3; E++){ - for( int Z=0; Z<3; Z++){ - for( int I=0; I<3; I++){ - for( int O=0; O<3; O++){ - for( int P=0; P<3; P++){ - dFp2dt(E,Z)+=dexpdDp2(E,I,O,P)*depsilon2*(dM2dT(O,P))*Fp0(I,Z); - for( int C=0; C<3; C++){ - for( int D=0; D<3; D++){ - dFp2dt(E,Z)-=dexpdDp2(E,I,O,P)*depsilon2*(pow(normM2,-3.)*M2(O,P)*dM2dT(C,D)*M2(C,D))*Fp0(I,Z); - }}}}}}} - } - - for( int X=0; X<3; X++){ - for( int Y=0; Y<3; Y++){ - dFp2invdt(X,Y)=0.; - for( int E=0; E<3; E++){ - for( int Z=0; Z<3; Z++){ - dFp2invdt(X,Y)-= Fp2inv(X,E)*dFp2dt(E,Z)*Fp2inv(Z,Y); - }}}} - - static STensor3 dCebar2Sdt; - double dtrCebar2Sdt=0.; - STensor3 invCebar2(Cebar2.invert()); - double v=_epsilonp02*dh/pow(sqrt(2.),(1.+_m2)/_m2); - // dtrace ce bar s dt - - for( int D=0; D<3; D++){ - for( int B=0; B<3; B++){ - dCebar2Sdt(D,B)=0.; - for( int N=0; N<3; N++){ - for( int O=0; O<3; O++){ - for( int R=0; R<3; R++){ - for( int K=0; K<3; K++){ - for( int L=0; L<3; L++){ - for( int Q=0; Q<3; Q++){ - dCebar2Sdt(D,B)-=expdDp2inv(O,D)*expdDp2inv(R,N)* dexpdDp2(N,O,K,L)*v*pow(normM2,(1.-_m2)/_m2)*dM2dT(K,L)*pow(St2,-1./_m2)*Ceprbar2(R,Q)*expdDp2inv(Q,B); - for( int A=0; A<3; A++){ - for( int P=0; P<3; P++){ - dCebar2Sdt(D,B)-=expdDp2inv(O,D)*expdDp2inv(R,N)* dexpdDp2(N,O,K,L)*v*((1.-_m2)/_m2*pow(normM2,(1.-3.*_m2)/_m2) - *dM2dT(A,P)*M2(A,P)*M2(K,L))*pow(St2,-1./_m2)*Ceprbar2(R,Q)*expdDp2inv(Q,B); - }}}}}}}}}} - - for( int D=0; D<3; D++){ - for( int B=0; B<3; B++){ - for( int N=0; N<3; N++){ - for( int O=0; O<3; O++){ - for( int R=0; R<3; R++){ - for( int K=0; K<3; K++){ - for( int L=0; L<3; L++){ - for( int Q=0; Q<3; Q++){ - dCebar2Sdt(D,B)+=1./_m2*expdDp2inv(O,D)*expdDp2inv(R,N)* dexpdDp2(N,O,K,L)*v*(pow(normM2,(1.-_m2)/_m2)*M2(K,L)* - pow(St2,(-1.-_m2)/_m2)*dSt2dT)*Ceprbar2(R,Q)*expdDp2inv(Q,B); - }}}}}}}} - - - for( int D=0; D<3; D++){ - for( int B=0; B<3; B++){ - for( int N=0; N<3; N++){ - for( int O=0; O<3; O++){ - for( int R=0; R<3; R++){ - for( int K=0; K<3; K++){ - for( int L=0; L<3; L++){ - for( int Q=0; Q<3; Q++){ - dCebar2Sdt(D,B)-=expdDp2inv(R,D)*Ceprbar2(R,Q)*expdDp2inv(Q,N)*expdDp2inv(O,B) *dexpdDp2(N,O,K,L)*v* - (pow(normM2,(1.-_m2)/_m2)*dM2dT(K,L))*pow(St2,-1./_m2); - for( int A=0; A<3; A++){ - for( int P=0; P<3; P++){ - dCebar2Sdt(D,B)-=expdDp2inv(R,D)*Ceprbar2(R,Q)*expdDp2inv(Q,N)*expdDp2inv(O,B) *dexpdDp2(N,O,K,L)*v* - ((1.-_m2)/_m2*pow(normM2,(1.-3.*_m2)/_m2)*dM2dT(A,P)*M2(A,P)*M2(K,L))*pow(St2,-1./_m2); - }}}}}}}}}} - - for( int D=0; D<3; D++){ - for( int B=0; B<3; B++){ - for( int N=0; N<3; N++){ - for( int O=0; O<3; O++){ - for( int R=0; R<3; R++){ - for( int K=0; K<3; K++){ - for( int L=0; L<3; L++){ - for( int Q=0; Q<3; Q++){ - dCebar2Sdt(D,B)+=1./_m2*expdDp2inv(R,D)*Ceprbar2(R,Q)*expdDp2inv(Q,N)*expdDp2inv(O,B) *dexpdDp2(N,O,K,L)*v* - (pow(normM2,(1.-_m2)/_m2)*M2(K,L)*pow(St2,(-1.-_m2)/_m2)*dSt2dT); - }}}}}}}} - - - - - for( int D=0; D<3; D++){ - for( int B=0; B<3; B++){ - dtrCebar2Sdt+=dCebar2Sdt(D,B)*I2(D,B); - }} - - - // dspdt - dSP2dt*=0.; - - if (trCebar2<3.+_Im2) - { - for( int D=0; D<3; D++){ - for( int B=0; B<3; B++){ - dSP2dt(D,B)-=invJ2third*_Nmu_groundState2*Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))*(I2(D,B)); - } - } - for( int D=0; D<3; D++){ - for( int B=0; B<3; B++){ - dSP2dt(D,B)-=invJ2third*_Nmu_groundState2*Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))*(-1./3.*trCebar2*invCebar2(D,B)); - } - } - for( int D=0; D<3; D++){ - for( int B=0; B<3; B++){ - dSP2dt(D,B)+=1./_Im2*invJ2third*Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))*(1./(1.-((trCebar2-3.)/_Im2)))*dtrCebar2Sdt*(I2(D,B)); - }} - - for( int D=0; D<3; D++){ - for( int B=0; B<3; B++){ - dSP2dt(D,B)+=1./_Im2*invJ2third*Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))*(1./(1.-((trCebar2-3.)/_Im2)))*dtrCebar2Sdt*(-1./3. - *trCebar2*invCebar2(D,B)); - }} - - for( int D=0; D<3; D++){ - for( int B=0; B<3; B++){ - dSP2dt(D,B)-=1./3.*invJ2third*Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))*(dtrCebar2Sdt*invCebar2(D,B)); - for( int F=0; F<3; F++){ - for( int G=0; G<3; G++){ - dSP2dt(D,B)-=1./3.*invJ2third*Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))*(-trCebar2*invCebar2(D,F)*invCebar2(G,B)*dCebar2Sdt(F,G)); - }}}} - } - - - for( int i=0; i<3; i++){ - for( int A=0; A<3; A++){ - dp2dt(i,A)=0.; - for( int W=0; W<3; W++){ - for( int D=0; D<3; D++){ - for( int B=0; B<3; B++){ - dp2dt(i,A)+=Fn(i,W)*dFp2invdt(W,D)*SP2(D,B)*Fp2inv(A,B); - }}}}} - - for( int i=0; i<3; i++){ - for( int A=0; A<3; A++){ - for( int W=0; W<3; W++){ - for( int D=0; D<3; D++){ - for( int B=0; B<3; B++){ - dp2dt(i,A)+=Fn(i,W)*Fp2inv(W,D)*dSP2dt(D,B)*Fp2inv(A,B); - }}}}} - - for( int i=0; i<3; i++){ - for( int A=0; A<3; A++){ - for( int W=0; W<3; W++){ - for( int D=0; D<3; D++){ - for( int B=0; B<3; B++){ - dp2dt(i,A)+=Fn(i,W)*Fp2inv(W,D)*SP2(D,B)*dFp2invdt(A,B); - }}}}} - - //for cp - dtauepsilon2dt=0.; - dTau2dt=0.; - if(normM2==0.) - { - dTau2dt=0.; - //dtauepsilon2dt=0.; - } - else{ - for( int C=0; C<3; C++){ - for( int D=0; D<3; D++){ - dTau2dt+=1./sqrt(2.)*M2(C,D)/normM2*dM2dT(C,D); - }} - } - - dtauepsilon2dt=dTau2dt*depsilon2+Ta2*depsilon2dt ; - - - } + if (trCebar2<3.+_Im2) + { + for( int U=0; U<3; U++){ + for( int S=0; S<3; S++){ + domegadT(U,S)=+_Nmu_groundState2*Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))*(-1./3.*trCebar2*I2(U,S)); + domegadT(U,S)-=Gmu_groundState2/_Im2*(1./(1.-((trCebar2-3.)/_Im2)))*(1./(1.-((trCebar2-3.)/_Im2)))*dtrCebar2dT*(-1./3.*trCebar2*I2(U,S)); + domegadT(U,S)-=Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))* (-1./3.*dtrCebar2dT*I2(U,S)); + for( int R=0; R<3; R++){ + for( int Q=0; Q<3; Q++){ + domegadT(U,S)+=_Nmu_groundState2*Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))*(expdDP2inv(R,U)*Ceprbar2(R,Q)*expdDP2inv(Q,S)); + domegadT(U,S)-=Gmu_groundState2/_Im2*(1./(1.-((trCebar2-3.)/_Im2)))*(1./(1.-((trCebar2-3.)/_Im2)))*dtrCebar2dT*(expdDP2inv(R,U)* + Ceprbar2(R,Q)*expdDP2inv(Q,S)); + for( int A=0; A<3; A++){ + for( int B=0; B<3; B++){ + for( int K=0; K<3; K++){ + for( int L=0; L<3; L++){ + domegadT(U,S)-=1./_m2*Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))*(W(K,L)*expdDP2inv(B,U)*expdDP2inv(R,A)* + dexpdDP2(A,B,K,L)*pow(St2,(-1.-_m2)/_m2)*dSt2dT* Ceprbar2(R,Q)*expdDP2inv(Q,S)); + domegadT(U,S)-=1./_m2*Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))*(W(K,L))*expdDP2inv(R,U)*Ceprbar2(R,Q)*expdDP2inv(Q,A) + *expdDP2inv(B,S)* dexpdDP2(A,B,K,L)*pow(St2,(-1.-_m2)/_m2)*dSt2dT; + } + } + } + } + } + } + } + } + } + + static STensor3 dM2dT; + STensorOperation::zero(dM2dT); + for( int C=0; C<3; C++){ + for( int D=0; D<3; D++){ + for( int U=0; U<3; U++){ + for( int S=0; S<3; S++){ + dM2dT(C,D)-=domega2dM24ordinv2(C,D,U,S)*domegadT(U,S); + } + } + } + } + double depsilon2dT=-1./_m2*_epsilonp02*dh*pow(normM2/sqrt(2.),1./_m2)*pow(St2,(-1.-_m2)/_m2)*dSt2dT; + depsilon2dT+=1./_m2*(_epsilonp02*dh/(pow(St2*sqrt(2.),1./_m2)))*pow(normM2,(1.-2.*_m2)/_m2)*dot(dM2dT,M2); + if(normM2!=0.) + { + for( int E=0; E<3; E++){ + for( int Z=0; Z<3; Z++){ + for( int I=0; I<3; I++){ + for( int O=0; O<3; O++){ + for( int P=0; P<3; P++){ + dFp2dT(E,Z)+=dexpdDP2(E,I,O,P)*(M2(O,P)/(sqrt(2.)*normM2)*( depsilon2dT) )*Fp0(I,Z); + dFp2dT(E,Z)+=dexpdDP2(E,I,O,P)*depsilon2*(dM2dT(O,P))*Fp0(I,Z); + for( int C=0; C<3; C++){ + for( int D=0; D<3; D++){ + dFp2dT(E,Z)-=dexpdDP2(E,I,O,P)*depsilon2*(pow(normM2,-3.)*M2(O,P)*dM2dT(C,D)*M2(C,D))*Fp0(I,Z); + } + } + } + } + } + } + } + } + for(int X=0; X<3; X++){ + for(int Y=0; Y<3; Y++){ + for( int E=0; E<3; E++){ + for( int Z=0; Z<3; Z++){ + dFp2invdT(X,Y)-= Fp2inv(X,E)*dFp2dT(E,Z)*Fp2inv(Z,Y); + } + } + } + } + static STensor3 dCebar2SdT; + STensorOperation::zero(dCebar2SdT); + double dtrCebar2SdT=0.; + double v=_epsilonp02*dh/pow(sqrt(2.),(1.+_m2)/_m2); + // dtrace ce bar s dt + + for( int D=0; D<3; D++){ + for( int B=0; B<3; B++){ + for( int N=0; N<3; N++){ + for( int O=0; O<3; O++){ + for( int R=0; R<3; R++){ + for( int K=0; K<3; K++){ + for( int L=0; L<3; L++){ + for( int Q=0; Q<3; Q++){ + dCebar2SdT(D,B)-=expdDP2inv(O,D)*expdDP2inv(R,N)* dexpdDP2(N,O,K,L)*v*pow(normM2,(1.-_m2)/_m2)*dM2dT(K,L)*pow(St2,-1./_m2)*Ceprbar2(R,Q)*expdDP2inv(Q,B); + dCebar2SdT(D,B)+=1./_m2*expdDP2inv(O,D)*expdDP2inv(R,N)* dexpdDP2(N,O,K,L)*v*(pow(normM2,(1.-_m2)/_m2)*M2(K,L)* + pow(St2,(-1.-_m2)/_m2)*dSt2dT)*Ceprbar2(R,Q)*expdDP2inv(Q,B); + dCebar2SdT(D,B)-=expdDP2inv(R,D)*Ceprbar2(R,Q)*expdDP2inv(Q,N)*expdDP2inv(O,B) *dexpdDP2(N,O,K,L)*v* + (pow(normM2,(1.-_m2)/_m2)*dM2dT(K,L))*pow(St2,-1./_m2); + dCebar2SdT(D,B)+=1./_m2*expdDP2inv(R,D)*Ceprbar2(R,Q)*expdDP2inv(Q,N)*expdDP2inv(O,B) *dexpdDP2(N,O,K,L)*v* + (pow(normM2,(1.-_m2)/_m2)*M2(K,L)*pow(St2,(-1.-_m2)/_m2)*dSt2dT); + for( int A=0; A<3; A++){ + for( int P=0; P<3; P++){ + dCebar2SdT(D,B)-=expdDP2inv(O,D)*expdDP2inv(R,N)* dexpdDP2(N,O,K,L)*v*((1.-_m2)/_m2*pow(normM2,(1.-3.*_m2)/_m2) + *dM2dT(A,P)*M2(A,P)*M2(K,L))*pow(St2,-1./_m2)*Ceprbar2(R,Q)*expdDP2inv(Q,B); + dCebar2SdT(D,B)-=expdDP2inv(R,D)*Ceprbar2(R,Q)*expdDP2inv(Q,N)*expdDP2inv(O,B) *dexpdDP2(N,O,K,L)*v* + ((1.-_m2)/_m2*pow(normM2,(1.-3.*_m2)/_m2)*dM2dT(A,P)*M2(A,P)*M2(K,L))*pow(St2,-1./_m2); + } + } + } + } + } + } + } + } + } + } + dtrCebar2SdT+=dCebar2SdT.trace(); + + if (trCebar2<3.+_Im2) + { + dSP2dT=I2; + dSP2dT*=1./_Im2*invJ2third*Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))*(1./(1.-((trCebar2-3.)/_Im2)))*dtrCebar2SdT - + invJ2third*_Nmu_groundState2*Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2))); + for( int D=0; D<3; D++){ + for( int B=0; B<3; B++){ + dSP2dT(D,B)-=invJ2third*_Nmu_groundState2*Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))*(-1./3.*trCebar2*invCebar2(D,B)); + dSP2dT(D,B)+=1./_Im2*invJ2third*Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))*(1./(1.-((trCebar2-3.)/_Im2)))*dtrCebar2SdT + *(-1./3.*trCebar2*invCebar2(D,B)); + dSP2dT(D,B)-=1./3.*invJ2third*Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))*(dtrCebar2SdT*invCebar2(D,B)); + for( int F=0; F<3; F++){ + for( int G=0; G<3; G++){ + dSP2dT(D,B)-=1./3.*invJ2third*Gmu_groundState2*(1./(1.-((trCebar2-3.)/_Im2)))*(-trCebar2*invCebar2(D,F)*invCebar2(G,B)*dCebar2SdT(F,G)); + } + } + } + } + } + for( int i=0; i<3; i++){ + for( int A=0; A<3; A++){ + for( int W=0; W<3; W++){ + for( int D=0; D<3; D++){ + for( int B=0; B<3; B++){ + dP2dT(i,A)+=Fn(i,W)*dFp2invdT(W,D)*SP2(D,B)*Fp2inv(A,B); + dP2dT(i,A)+=Fn(i,W)*Fp2inv(W,D)*dSP2dT(D,B)*Fp2inv(A,B); + dP2dT(i,A)+=Fn(i,W)*Fp2inv(W,D)*SP2(D,B)*dFp2invdT(A,B); + } + } + } + } + } + //for cp + if(normM2!=0.) + { + dTau2dT=1./sqrt(2.)/normM2*dot(M2,dM2dT); + } + dtauepsilon2dT=dTau2dT*depsilon2+Ta2*depsilon2dT ; +} void mlawSMP:: constitutive1(const STensor3& F0, const STensor3& Fn, STensor3 &P1, const IPSMP *q0, IPSMP *q1, STensor43 &Tangent1, double T0, double T, STensor3 &dPdT1, const bool stiff, const double Tg, - const STensor3 &dTgdF, double &depsitau1,STensor3 &dtauepsilon1dF,double &dtauepsilon1dt) const - { - - // static fullMatrix<double> domega2dM2(6,6); - //static fullVector<double> Omega2(6); - // static fullMatrix<double> domega2dM2inv(6,6); - // const STensor3 I2(1.); + const STensor3 &dTgdF, double &depsitau1,STensor3 &dtauepsilon1dF,double &dtauepsilon1dT) const +{ + STensorOperation::zero(P1); STensorOperation::zero(Tangent1); STensorOperation::zero(dPdT1); STensorOperation::zero(dtauepsilon1dF); + depsitau1=0.; dtauepsilon1dT=0.; + static STensor3 dDp1,Fe1,Ce1,Cepr1,Dp1,C1,N1,Me1; + STensorOperation::zero(dDp1); STensorOperation::zero(Fe1); STensorOperation::zero(Ce1); STensorOperation::zero(Cepr1); STensorOperation::zero(Dp1); + STensorOperation::zero(C1); STensorOperation::zero(N1); STensorOperation::zero(Me1); static STensor3 dG1dF,dMu1dF,dK1dF,dQ1dF,dHbdF, dthermalphaddF,dL1dF; - double dG1dt=0.,dMu1dt=0.,dK1dt=0.,dHbdt=0.,thermalpha=0.,dthermalphadt=0.,dthermalphadtg=0.,dQ1dt=0.,L1=0.,dL1dt=0.; + STensorOperation::zero(dG1dF); STensorOperation::zero(dMu1dF); STensorOperation::zero(dK1dF); STensorOperation::zero(dQ1dF); + STensorOperation::zero(dHbdF); STensorOperation::zero( dthermalphaddF); STensorOperation::zero(dL1dF); + double dG1dT=0.,dMu1dT=0.,dK1dT=0.,dHbdT=0.,thermalpha=0.,dthermalphadT=0.,dthermalphadTg=0.,dQ1dT=0.,L1=0.,dL1dT=0.; double dSa1dTg=0.,dSa1dT=0.; - double depsilon1,TauE1, K1,Mue1,G1,j1,Sb1,Hb,tau1,Q1; + double depsilon1=0.,TauE1=0., K1=0.,Mue1=0.,G1=0.,j1=0.,Sb1=0.,Hb=0.,tau1=0.,Q1=0.; static STensor43 dFp1dF,dexpdDp1,dMe1dF; - dDp1=0.;Fe1=0.;Ce1=0.;Cepr1=0.;Dp1=0.;C1=0.;N1=0.;Me1=0.; - dG1dF=0.;dMu1dF=0.;dK1dF=0.;dQ1dF=0.;dHbdF=0.; dthermalphaddF=0.;dL1dF=0.; - depsilon1=0.; - TauE1=0.; K1=0.;Mue1=0.;G1=0.;j1=0.;Sb1=0.;Hb=0.;tau1=0.;Q1=0.; - dFp1dF=0.; dexpdDp1=0.; dMe1dF=0.; - // static STensor63 dLe; + STensorOperation::zero(dFp1dF); STensorOperation::zero(dexpdDp1); STensorOperation::zero(dMe1dF); + double dh=0.; STensor3 &Fp1= q1->getRefToFp1(); @@ -2523,33 +1685,30 @@ void mlawSMP:: constitutive1(const STensor3& F0, const STensor3& Fn, STensor3 &P double &phiastar1=q1->getRefToPhiastar1(); double &Sastar1=q1->getRefToSastar1(); - // double &depsilon1= q1->getRefToEquivalentPlasticDefo1();//before - - dh = getTimeStep(); - // Fp2.print("Fp2"); - //std::cout<<"Sa1="<<Sa1<<std::endl; + dh = getTimeStep(); + //std::cout<<"Sa1="<<Sa1<<std::endl; - computthermalalpha( T , Tg, thermalpha,dthermalphadt,dthermalphadtg); - computparameter1( T , Tg, dTgdF, stiff,G1,Mue1,K1,Hb,Q1,dG1dF,dMu1dF,dK1dF,dQ1dF,dHbdF,dG1dt,dMu1dt,dK1dt,dHbdt,dthermalphadtg,dthermalphaddF,dQ1dt,L1,dL1dt,dL1dF,dh); - predictorCorrector1 ( j1, TauE1,depsilon1,dDp1,Sa1,Sb1,phia1,phiastar1,Sastar1,G1,K1 ,Mue1, F0,Fn, P1, q0,q1, T0,T, Tg, stiff,Fe1,Ce1,Cepr1, + computeThermalAlpha( T , Tg, thermalpha,dthermalphadT,dthermalphadTg); + computeParameter1( T , Tg, dTgdF, stiff,G1,Mue1,K1,Hb,Q1,dG1dF,dMu1dF,dK1dF,dQ1dF,dHbdF,dG1dT,dMu1dT,dK1dT,dHbdT,dthermalphadTg,dthermalphaddF,dQ1dT,L1,dL1dT,dL1dF,dh); + predictorCorrector1 ( j1, TauE1,depsilon1,dDp1,Sa1,Sb1,phia1,phiastar1,Sastar1,G1,K1 ,Mue1, F0,Fn, P1, q0,q1, T0,T, Tg, stiff,Fe1,Ce1,Cepr1, dh, Fp1,C1,Hb,dexpdDp1,N1,tau1 ,Me1,Q1,L1/*,dFp1dF,dMe1dF*/,thermalpha,dSa1dTg,dSa1dT); // depsitau1=0.; - depsitau1=tau1*depsilon1; - q1->getRefToEquivalentPlasticDefo1() = q0->getConstRefToEquivalentPlasticDefo1()+depsilon1 ; + depsitau1=tau1*depsilon1; + q1->getRefToEquivalentPlasticDefo1() = q0->getConstRefToEquivalentPlasticDefo1()+depsilon1 ; - if(stiff) + if(stiff) { - computintvardfpdf1(dFp1dF,dMe1dF, j1, Fn, Fp0, Cepr1 ,N1, dh, depsilon1,dexpdDp1, T, Tg, G1, K1,C1,Hb,dtauepsilon1dF,tau1,F0,thermalpha,Q1 - ,TauE1,dTgdF,dG1dF,dMu1dF,dK1dF,dQ1dF,dHbdF,dthermalphaddF,L1,dL1dF,Me1,dSa1dTg); + computeInternalVariabledfpdf1(dFp1dF,dMe1dF, j1, Fn, Fp0, Cepr1 ,N1, dh, depsilon1,dexpdDp1, T, Tg, G1, K1,C1,Hb,dtauepsilon1dF,tau1,F0,thermalpha,Q1, + TauE1,dTgdF,dG1dF,dMu1dF,dK1dF,dQ1dF,dHbdF,dthermalphaddF,L1,dL1dF,Me1,dSa1dTg); tangent1(Tangent1,dMe1dF,Fn, Fp1,Me1,dFp1dF, Fe1, Ce1); - computdpdt1(dPdT1, j1, Fn,Fp1,Fp0,Me1, dDp1 , Ce1,Cepr1, dh, T, Tg,depsilon1,dexpdDp1, G1, K1, Mue1, C1, Hb , Q1, N1,thermalpha,dtauepsilon1dt, - tau1,dG1dt,dMu1dt,dK1dt,dHbdt,dthermalphadt,L1,dQ1dt,dL1dt,Fe1,dSa1dT) ; + computedPdT1(dPdT1, j1, Fn,Fp1,Fp0,Me1, dDp1 , Ce1,Cepr1, dh, T, Tg, depsilon1, dexpdDp1, G1, K1, Mue1, C1, Hb , Q1, N1,thermalpha,dtauepsilon1dT, + tau1,dG1dT,dMu1dT,dK1dT,dHbdT,dthermalphadT,L1,dQ1dT,dL1dT,Fe1,dSa1dT) ; } } - void mlawSMP::deltaepsilon1(const double TauE1,const double Q1,const double T,const double Tg,const double dh,double &depsilon1)const - { +void mlawSMP::deltaepsilon1(const double TauE1,const double Q1,const double T,const double Tg,const double dh,double &depsilon1)const +{ if (TauE1>0.) { if(T<=Tg) @@ -2557,32 +1716,33 @@ void mlawSMP:: constitutive1(const STensor3& F0, const STensor3& Fn, STensor3 &P else depsilon1=_epsilon01*dh*exp(-1./(_epsygl1+_d1*(T-Tg)))*exp(-Q1/(T))*pow(sinh(TauE1*_VOnKb1/(2.*T)),1./_m1); } - else + else depsilon1=0.; - } +} - void mlawSMP::computTauE(const STensor3 &Me1,const STensor3 &devlnCepr1,const STensor3 &lnCepr1,const double depsilon1,const double G1,const double K1,const double Sa1, +void mlawSMP::computeTauE(const STensor3 &Me1,const STensor3 &devlnCepr1,const STensor3 &lnCepr1,const double depsilon1,const double G1,const double K1,const double Sa1, const double Sb1,const double T ,const double Tg, double &TauE1,double &Tau1,const double alalphath)const - { - double P1;//,Tau11; - double normdevlnCepr1=devlnCepr1.norm2(); - double trlnCepr1(lnCepr1.trace()); - STensor3 devMe1; - divatoric(Me1,devMe1); - double normdevMe1(devMe1.norm2()); - if (depsilon1==0.) - Tau1=G1/sqrt(2)*normdevlnCepr1; - else - Tau1=G1/sqrt(2)*normdevlnCepr1-G1*depsilon1; +{ + double P1;//,Tau11; + double normdevlnCepr1=devlnCepr1.norm2(); + double trlnCepr1=lnCepr1.trace(); + static STensor3 devMe1; + double trMe1; + STensorOperation::decomposeDevTr(Me1, devMe1, trMe1); + double normdevMe1=devMe1.norm2(); + if (depsilon1==0.) + Tau1=G1/sqrt(2)*normdevlnCepr1; + else + Tau1=G1/sqrt(2)*normdevlnCepr1-G1*depsilon1; - P1=-1./2.*K1*trlnCepr1+3.*K1*alalphath; - P1*=_alphap; - TauE1=Tau1-(Sa1+Sb1+P1); - } + P1=-1./2.*K1*trlnCepr1+3.*K1*alalphath; + P1*=_alphap; + TauE1=Tau1-(Sa1+Sb1+P1); +} - void mlawSMP::computthermalalpha(const double T ,const double Tg, double &thermalpha,double &dthermalphadt, double &dthermalphadtg)const - { +void mlawSMP::computeThermalAlpha(const double T ,const double Tg, double &thermalpha,double &dthermalphadT, double &dthermalphadTg)const +{ //to compare the result with AnisotropicETM!! /* for( int C=0; C<3; C++){ @@ -2593,239 +1753,246 @@ void mlawSMP:: constitutive1(const STensor3& F0, const STensor3& Fn, STensor3 &P /* thermalpha= _alphax*(T-_t0); dthermalphadt=_alphax; dthermalphadtg=0.;*/ - if(_t0<=Tg ) + if(_t0<=Tg ) + { + if(T<=Tg ) { - if(T<=Tg ) - { - thermalpha=_alphagl1*(T-_t0); - - - dthermalphadt=_alphagl1; - dthermalphadtg=0.; - } - else - { - thermalpha=(_alphagl1*(T-_t0)+(_alphar1-_alphagl1)*(T-Tg)); - - dthermalphadt=_alphar1; - dthermalphadtg=-_alphar1+_alphagl1; - } - + thermalpha=_alphagl1*(T-_t0); + dthermalphadT=_alphagl1; + dthermalphadTg=0.; } else - { - if(T<=Tg ) - { - thermalpha=(_alphar1*(T-_t0)+(_alphagl1-_alphar1)*(T-Tg)); - dthermalphadt=_alphagl1; - dthermalphadtg=_alphar1-_alphagl1; - } - else - { - thermalpha=_alphar1*(T-_t0); - dthermalphadt=_alphar1; - dthermalphadtg=0.; - } - } + { + thermalpha=(_alphagl1*(T-_t0)+(_alphar1-_alphagl1)*(T-Tg)); + dthermalphadT=_alphar1; + dthermalphadTg=-_alphar1+_alphagl1; + } + } + else + { + if(T<=Tg ) + { + thermalpha=(_alphar1*(T-_t0)+(_alphagl1-_alphar1)*(T-Tg)); + dthermalphadT=_alphagl1; + dthermalphadTg=_alphar1-_alphagl1; + } + else + { + thermalpha=_alphar1*(T-_t0); + dthermalphadT=_alphar1; + dthermalphadTg=0.; + } + } //Msg::Info("alpha DT %f",_t0); - } +} - void mlawSMP:: computSaphi(const double depsilon1 ,const double Sa0,const double phia0,const double T,const double Tg, - const double dh,double &phiastar0,double &Sastar0,double &Sa1,double &Sastar1,double &phia1,double &phiastar1, - double &dSa1depsilon, double &dSa1dTg, double &dSa1dT)const - { - /* if(T<=Tg && depsilon1>0.) - { - phiastar1=_Z1*pow(1.-T/Tg,_r1)*pow(depsilon1/(dh*_epsilonr),_s1); - } - /*else if (T>Tg && depsilon1>0.)//check in the serevern ....old and not making difference - { - phiastar1=_Z1*pow(T/Tg-1,_r1)*pow(depsilon1/(dh*_epsilonr),_s1); - }*/ - /*else - { - phiastar1=0.; - } */ - - double _htg =1.e-9;//pow(0.001,_r1); - if(T<=Tg && depsilon1>0.) - { - phiastar1=_Z1*(pow(1.-T/Tg,_r1)+_htg)*pow(depsilon1/(dh*_epsilonr),_s1); - } - else if (T>Tg && depsilon1>0.)//check in the serever - { - phiastar1=_Z1*_htg*pow(depsilon1/(dh*_epsilonr),_s1); - } - else - { - phiastar1=0.; - } - - - phia1=(phia0 +_g1*_be1* phiastar1*depsilon1+_g1*(1.-_be1)*(phiastar0-phia0)*depsilon1)/(1.+_be1*_g1*depsilon1); +void mlawSMP:: computeSaphi(const double depsilon1 ,const double Sa0,const double phia0,const double T,const double Tg, + const double dh,double &phiastar0,double &Sastar0,double &Sa1,double &Sastar1,double &phia1,double &phiastar1, + double &dSa1depsilon, double &dSa1dTg, double &dSa1dT)const +{ - Sastar1=_b1*(phiastar1-phia1); - Sa1=(Sa0 +_ha1*_be1* Sastar1*depsilon1+_ha1*(1.-_be1)*(Sastar0-Sa0)*depsilon1)/(1.+_be1*_ha1*depsilon1); + double _htg =1.e-9;//pow(0.001,_r1); +#if 0 + if(T<=Tg && depsilon1>0.) + { + phiastar1=_Z1*(pow(1.-T/Tg,_r1)+_htg)*pow(depsilon1/(dh*_epsilonr),_s1); + } + else if (T>Tg && depsilon1>0.)//check in the serever + { + phiastar1=_Z1*_htg*pow(depsilon1/(dh*_epsilonr),_s1); + } + else + { + phiastar1=0.; + } +#endif +#if 1 + double tmp=(pow(1.+depsilon1/(dh*_epsilonr),_s1)-1.+tanh(depsilon1/(dh*_epsilonr))); + double Dtmp=1./(dh*_epsilonr)*(_s1*pow(1.+depsilon1/(dh*_epsilonr),_s1-1.)+1./cosh(depsilon1/(dh*_epsilonr))/cosh(depsilon1/(dh*_epsilonr))); + bool oldlaw=true; + if(oldlaw) + { + tmp=pow(depsilon1/(dh*_epsilonr),_s1); + Dtmp=_s1/(dh*_epsilonr)*pow(depsilon1/(dh*_epsilonr),_s1-1.); + } + + if(T<=Tg && depsilon1>0.) + { + phiastar1=_Z1*(pow(1.-T/Tg,_r1)+_htg)*tmp; + } + else if (T>Tg && depsilon1>0.)//check in the serever + { + phiastar1=_Z1*_htg*tmp; + } + else + { + phiastar1=0.; + } +#endif + + phia1=(phia0 +_g1*_be1* phiastar1*depsilon1+_g1*(1.-_be1)*(phiastar0-phia0)*depsilon1)/(1.+_be1*_g1*depsilon1); + Sastar1=_b1*(phiastar1-phia1); + Sa1=(Sa0 +_ha1*_be1* Sastar1*depsilon1+_ha1*(1.-_be1)*(Sastar0-Sa0)*depsilon1)/(1.+_be1*_ha1*depsilon1); - dSa1depsilon=0.;dSa1dTg=0.;dSa1dT=0.; + dSa1depsilon=0.;dSa1dTg=0.;dSa1dT=0.; - dSa1depsilon=_ha1*(1.-_be1)*(Sastar0-Sa0)/(1.+_be1*_ha1*depsilon1); - dSa1depsilon-=_be1*_ha1*(Sa0+_ha1*(1.-_be1)*(Sastar0-Sa0)*depsilon1)/pow((1.+_be1*_ha1*depsilon1),2.); - dSa1depsilon-=_be1*_ha1*_b1*(phia0+_g1*(1.-_be1)*(phiastar0-phia0)*depsilon1)/((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); - dSa1depsilon-=_be1*_ha1*_b1*(_g1*(1.-_be1)*(phiastar0-phia0)*depsilon1)/((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); - dSa1depsilon+=(pow(_be1,2.)*_ha1*(1.+_be1*_g1*depsilon1)+pow(_be1,2.)*_g1*(1.+_be1*_ha1*depsilon1))*_ha1*_b1*phia0*depsilon1/(pow((1.+_be1*_ha1*depsilon1),2.)*pow((1.+_be1*_g1*depsilon1),2.)); - dSa1depsilon+=(pow(_be1,2.)*_ha1*(1.+_be1*_g1*depsilon1)+pow(_be1,2.)*_g1*(1.+_be1*_ha1*depsilon1))*_ha1*_b1*(_g1*(1.-_be1)*(phiastar0-phia0)*depsilon1)*depsilon1/(pow((1.+_be1*_ha1*depsilon1),2.)*pow((1.+_be1*_g1*depsilon1),2.)); + dSa1depsilon=_ha1*(1.-_be1)*(Sastar0-Sa0)/(1.+_be1*_ha1*depsilon1); + dSa1depsilon-=_be1*_ha1*(Sa0+_ha1*(1.-_be1)*(Sastar0-Sa0)*depsilon1)/pow((1.+_be1*_ha1*depsilon1),2.); + dSa1depsilon-=_be1*_ha1*_b1*(phia0+_g1*(1.-_be1)*(phiastar0-phia0)*depsilon1)/((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); + dSa1depsilon-=_be1*_ha1*_b1*(_g1*(1.-_be1)*(phiastar0-phia0)*depsilon1)/((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); + dSa1depsilon+=(pow(_be1,2.)*_ha1*(1.+_be1*_g1*depsilon1)+pow(_be1,2.)*_g1*(1.+_be1*_ha1*depsilon1))*_ha1*_b1*phia0*depsilon1/(pow((1.+_be1*_ha1*depsilon1),2.)*pow((1.+_be1*_g1*depsilon1),2.)); + dSa1depsilon+=(pow(_be1,2.)*_ha1*(1.+_be1*_g1*depsilon1)+pow(_be1,2.)*_g1*(1.+_be1*_ha1*depsilon1))*_ha1*_b1*(_g1*(1.-_be1)*(phiastar0-phia0)*depsilon1)*depsilon1/(pow((1.+_be1*_ha1*depsilon1),2.)*pow((1.+_be1*_g1*depsilon1),2.)); - /* if(T<=Tg && depsilon1>0.) - { - dSa1depsilon+=(_be1*_ha1*_b1*_Z1*(pow(1.-T/Tg,_r1)+_htg)*pow(depsilon1/(dh*_epsilonr),_s1))/((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); - dSa1depsilon-=(pow(_be1,2.)*_ha1*(1.+_be1*_g1*depsilon1)+pow(_be1,2.)*_g1*(1.+_be1*_ha1*depsilon1))*_ha1*_b1*_Z1*(pow(1.-T/Tg,_r1)+_htg)*pow(depsilon1/(dh*_epsilonr),_s1)*depsilon1/(pow((1.+_be1*_ha1*depsilon1),2.)*pow((1.+_be1*_g1*depsilon1),2.)); - - dSa1depsilon+=_s1*_be1*_ha1*_b1*_Z1/(dh*_epsilonr)*pow(1.-T/Tg,_r1)*pow(depsilon1/(dh*_epsilonr),_s1-1.)*depsilon1/((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); - - dSa1dTg=(_r1*_be1*_ha1*_b1*_Z1*T/(Tg*Tg)*pow(1.-T/Tg,_r1-1.)*pow(depsilon1/(dh*_epsilonr),_s1)*depsilon1)/((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); - dSa1dT=-_r1*_be1*_ha1*_b1*_Z1/Tg*pow(1.-T/Tg,_r1-1.)*pow(depsilon1/(dh*_epsilonr),_s1)*depsilon1/((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); - } */ - - //new - if(T<=Tg && depsilon1>0.) - { - dSa1depsilon+=(_be1*_ha1*_b1*_Z1*(pow(1.-T/Tg,_r1)+_htg)*pow(depsilon1/(dh*_epsilonr),_s1))/((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); - dSa1depsilon-=(pow(_be1,2.)*_ha1*(1.+_be1*_g1*depsilon1)+pow(_be1,2.)*_g1*(1.+_be1*_ha1*depsilon1))*_ha1*_b1*_Z1*(pow(1.-T/Tg,_r1)+_htg)*pow(depsilon1/(dh*_epsilonr),_s1)*depsilon1/(pow((1.+_be1*_ha1*depsilon1),2.)*pow((1.+_be1*_g1*depsilon1),2.)); - - dSa1depsilon+=_s1*_be1*_ha1*_b1*_Z1/(dh*_epsilonr)*(pow(1.-T/Tg,_r1)+_htg)*pow(depsilon1/(dh*_epsilonr),_s1-1.)*depsilon1/((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); - - dSa1dTg=(_r1*_be1*_ha1*_b1*_Z1*T/(Tg*Tg)*(pow(1.-T/Tg,_r1-1.)+_htg)*pow(depsilon1/(dh*_epsilonr),_s1)*depsilon1)/((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); - dSa1dT=-_r1*_be1*_ha1*_b1*_Z1/Tg*(pow(1.-T/Tg,_r1-1.)+_htg)*pow(depsilon1/(dh*_epsilonr),_s1)*depsilon1/((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); - } - else if (T>Tg && depsilon1>0.) - { - dSa1depsilon+=(_be1*_ha1*_b1*_Z1*(_htg)*pow(depsilon1/(dh*_epsilonr),_s1))/((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); - dSa1depsilon-=(pow(_be1,2.)*_ha1*(1.+_be1*_g1*depsilon1)+pow(_be1,2.)*_g1*(1.+_be1*_ha1*depsilon1))*_ha1*_b1*_Z1*(_htg)*pow(depsilon1/(dh*_epsilonr),_s1)*depsilon1/(pow((1.+_be1*_ha1*depsilon1),2.)*pow((1.+_be1*_g1*depsilon1),2.)); +#if 0 + if(T<=Tg && depsilon1>0.) + { + dSa1depsilon+=(_be1*_ha1*_b1*_Z1*(pow(1.-T/Tg,_r1)+_htg)*pow(depsilon1/(dh*_epsilonr),_s1))/((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); + dSa1depsilon-=(pow(_be1,2.)*_ha1*(1.+_be1*_g1*depsilon1)+pow(_be1,2.)*_g1*(1.+_be1*_ha1*depsilon1))*_ha1*_b1*_Z1*(pow(1.-T/Tg,_r1)+_htg)*pow(depsilon1/(dh*_epsilonr),_s1)*depsilon1/(pow((1.+_be1*_ha1*depsilon1),2.)*pow((1.+_be1*_g1*depsilon1),2.)); - dSa1depsilon+=_s1*_be1*_ha1*_b1*_Z1/(dh*_epsilonr)*(_htg)*pow(depsilon1/(dh*_epsilonr),_s1-1.)*depsilon1/((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); + dSa1depsilon+=_s1*_be1*_ha1*_b1*_Z1/(dh*_epsilonr)*(pow(1.-T/Tg,_r1)+_htg)*pow(depsilon1/(dh*_epsilonr),_s1-1.)*depsilon1/((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); - dSa1dTg=0.; - dSa1dT =0.; + dSa1dTg=(_r1*_be1*_ha1*_b1*_Z1*T/(Tg*Tg)*(pow(1.-T/Tg,_r1-1.)+_htg)*pow(depsilon1/(dh*_epsilonr),_s1)*depsilon1)/((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); + dSa1dT=-_r1*_be1*_ha1*_b1*_Z1/Tg*(pow(1.-T/Tg,_r1-1.)+_htg)*pow(depsilon1/(dh*_epsilonr),_s1)*depsilon1/((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); + } + else if (T>Tg && depsilon1>0.) + { + dSa1depsilon+=(_be1*_ha1*_b1*_Z1*(_htg)*pow(depsilon1/(dh*_epsilonr),_s1))/((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); + dSa1depsilon-=(pow(_be1,2.)*_ha1*(1.+_be1*_g1*depsilon1)+pow(_be1,2.)*_g1*(1.+_be1*_ha1*depsilon1))*_ha1*_b1*_Z1*(_htg)*pow(depsilon1/(dh*_epsilonr),_s1)*depsilon1/(pow((1.+_be1*_ha1*depsilon1),2.)*pow((1.+_be1*_g1*depsilon1),2.)); + dSa1depsilon+=_s1*_be1*_ha1*_b1*_Z1/(dh*_epsilonr)*(_htg)*pow(depsilon1/(dh*_epsilonr),_s1-1.)*depsilon1/((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); + dSa1dTg=0.; + dSa1dT =0.; - } - - /*else if (T>Tg && depsilon1>0.) //check in the serever...old and not making difference - { - dSa1depsilon+=1./100*(_be1*_ha1*_b1*_Z1*pow(T/Tg-1.,_r1)*pow(depsilon1/(dh*_epsilonr),_s1))/ ((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); - dSa1depsilon-=1./100*(pow(_be1,2.)*_ha1*(1.+_be1*_g1*depsilon1)+pow(_be1,2.)*_g1*(1.+_be1*_ha1*depsilon1))*_ha1*_b1*_Z1*pow(T/Tg-1.,_r1)*pow(depsilon1/(dh*_epsilonr),_s1)*depsilon1/(pow((1.+_be1*_ha1*depsilon1),2.)*pow((1.+_be1*_g1*depsilon1),2.)); + } + else + { + + } +#endif +#if 1 + if(T<=Tg && depsilon1>0.) + { + dSa1depsilon+=(_be1*_ha1*_b1*_Z1*(pow(1.-T/Tg,_r1)+_htg)*tmp)/((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); + dSa1depsilon-=(pow(_be1,2.)*_ha1*(1.+_be1*_g1*depsilon1)+pow(_be1,2.)*_g1*(1.+_be1*_ha1*depsilon1))*_ha1*_b1*_Z1*(pow(1.-T/Tg,_r1)+_htg)*tmp*depsilon1/(pow((1.+_be1*_ha1*depsilon1),2.)*pow((1.+_be1*_g1*depsilon1),2.)); - dSa1depsilon+=1./100*_s1*_be1*_ha1*_b1*_Z1/(dh*_epsilonr)*pow(T/Tg-1.,_r1)*pow(depsilon1/(dh*_epsilonr),_s1-1.)*depsilon1/ - ((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); + dSa1depsilon+=_be1*_ha1*_b1*_Z1*(pow(1.-T/Tg,_r1)+_htg)*Dtmp*depsilon1/((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); - dSa1dTg=-1./100*(_r1*_be1*_ha1*_b1*_Z1*T/(Tg*Tg)*pow(T/Tg-1,_r1-1.)*pow(depsilon1/(dh*_epsilonr),_s1)*depsilon1)/((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); - dSa1dT=1./100*_r1*_be1*_ha1*_b1*_Z1/Tg*pow(T/Tg-1,_r1-1.)*pow(depsilon1/(dh*_epsilonr),_s1)*depsilon1/((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); - }*/ - else - { + dSa1dTg=(_r1*_be1*_ha1*_b1*_Z1*T/(Tg*Tg)*(pow(1.-T/Tg,_r1-1.)+_htg)*tmp*depsilon1)/((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); + dSa1dT=-_r1*_be1*_ha1*_b1*_Z1/Tg*(pow(1.-T/Tg,_r1-1.)+_htg)*tmp*depsilon1/((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); + } + else if (T>Tg && depsilon1>0.) + { + dSa1depsilon+=(_be1*_ha1*_b1*_Z1*(_htg)*tmp)/((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); + dSa1depsilon-=(pow(_be1,2.)*_ha1*(1.+_be1*_g1*depsilon1)+pow(_be1,2.)*_g1*(1.+_be1*_ha1*depsilon1))*_ha1*_b1*_Z1*(_htg)*tmp*depsilon1/(pow((1.+_be1*_ha1*depsilon1),2.)*pow((1.+_be1*_g1*depsilon1),2.)); + dSa1depsilon+=_be1*_ha1*_b1*_Z1*(_htg)*Dtmp*depsilon1/((1.+_be1*_ha1*depsilon1)*(1.+_be1*_g1*depsilon1)); + dSa1dTg=0.; + dSa1dT =0.; - } - - } + } + else + { + + } +#endif + + +} - void mlawSMP::computparameter1(const double T ,const double Tg,const STensor3 &dTgdF,bool stiff,double &G1,double &Mue1, double &K1,double &Hb,double &Q1,STensor3 &dG1dF,STensor3 &dMu1dF, - STensor3 &dK1dF,STensor3 &dQ1dF,STensor3 &dHbdF,double &dG1dt,double &dMu1dt,double &dK1dt,double &dHbdt,const double dthermalalphadtg - ,STensor3 &dthermalalphaddF,double &dQ1dt,double &L1,double &dL1dt,STensor3 &dL1dF,const double dh)const +void mlawSMP::computeParameter1(const double T ,const double Tg,const STensor3 &dTgdF,bool stiff,double &G1,double &Mue1, double &K1,double &Hb,double &Q1,STensor3 &dG1dF,STensor3 &dMu1dF, + STensor3 &dK1dF,STensor3 &dQ1dF,STensor3 &dHbdF,double &dG1dT,double &dMu1dT,double &dK1dT,double &dHbdT,const double dthermalalphadTg, + STensor3 &dthermalalphaddF,double &dQ1dT,double &L1,double &dL1dT,STensor3 &dL1dF,const double dh)const { - double dG1dtg,dMu1dtg,dHbdtg,dK1dtg,dQ1dtg,dL1dtg;//,dK1dtg; - dthermalalphaddF=dthermalalphadtg*dTgdF; - Q1=0.5*(_QglOnKb1+_QrOnKb1)-0.5*(_QglOnKb1-_QrOnKb1)*tanh(1./_Delta*(T-Tg)); - Mue1=0.5*(_Mugl1+_Mur1)-0.5*(_Mugl1-_Mur1)*tanh(1./_Delta*(T-Tg)); + STensorOperation::zero(dG1dF); STensorOperation::zero(dMu1dF); STensorOperation::zero(dK1dF); STensorOperation::zero(dQ1dF), STensorOperation::zero(dHbdF); STensorOperation::zero(dthermalalphaddF); + G1=0.; Mue1=0.; K1=0; Hb=0.; Q1=0.; + + double dG1dTg=0.,dMu1dTg=0.,dHbdTg=0.,dK1dTg=0.,dQ1dTg=0.,dL1dTg=0.; + + + dthermalalphaddF=dTgdF; + dthermalalphaddF*=dthermalalphadTg; + + Q1=0.5*(_QglOnKb1+_QrOnKb1)-0.5*(_QglOnKb1-_QrOnKb1)*tanh(1./_Delta*(T-Tg)); + Mue1=0.5*(_Mugl1+_Mur1)-0.5*(_Mugl1-_Mur1)*tanh(1./_Delta*(T-Tg)); - dQ1dtg =0.5/_Delta*(_QglOnKb1-_QrOnKb1)*(1.-pow(tanh(1./_Delta*(T-Tg)),2.)); - dMu1dtg=0.5/_Delta*(_Mugl1-_Mur1)*(1.-pow(tanh(1./_Delta*(T-Tg)),2.)); - dMu1dt =-0.5/_Delta*(_Mugl1-_Mur1)*(1.-pow(tanh(1./_Delta*(T-Tg)),2.)); - dQ1dt =-0.5/_Delta*(_QglOnKb1-_QrOnKb1)*(1.-pow(tanh(1./_Delta*(T-Tg)),2.)); - dQ1dF =dQ1dtg*dTgdF; + dQ1dTg =0.5/_Delta*(_QglOnKb1-_QrOnKb1)*(1.-pow(tanh(1./_Delta*(T-Tg)),2.)); + dMu1dTg=0.5/_Delta*(_Mugl1-_Mur1)*(1.-pow(tanh(1./_Delta*(T-Tg)),2.)); + dMu1dT =-0.5/_Delta*(_Mugl1-_Mur1)*(1.-pow(tanh(1./_Delta*(T-Tg)),2.)); + dQ1dT =-0.5/_Delta*(_QglOnKb1-_QrOnKb1)*(1.-pow(tanh(1./_Delta*(T-Tg)),2.)); + + dQ1dF = dTgdF; + dQ1dF *=dQ1dTg; + dMu1dF=dTgdF; + dMu1dF*=dMu1dTg; - if(T<=Tg) - { - // *_pi/180. - G1=0.5*(_Ggl1+_Gr1)-0.5*(_Ggl1-_Gr1)*tanh(1./_Delta*(T-Tg))-_Mgl1*(T-Tg); - K1=G1*(2.*(1.+Mue1))/(3.*(1.-2.*Mue1)); - Hb=0.5*(_Hgl1+_Hr1)-0.5*(_Hgl1-_Hr1)*tanh(1./_Delta*(T-Tg))-_Lgl1*(T-Tg); - L1=_epsilon01*dh*exp(-1./_epsygl1)*exp(-Q1/(T)); + if(T<=Tg) + { + // *_pi/180. + G1=0.5*(_Ggl1+_Gr1)-0.5*(_Ggl1-_Gr1)*tanh(1./_Delta*(T-Tg))-_Mgl1*(T-Tg); + K1=G1*(2.*(1.+Mue1))/(3.*(1.-2.*Mue1)); + Hb=0.5*(_Hgl1+_Hr1)-0.5*(_Hgl1-_Hr1)*tanh(1./_Delta*(T-Tg))-_Lgl1*(T-Tg); + L1=_epsilon01*dh*exp(-1./_epsygl1)*exp(-Q1/(T)); - //if (stiff) - { - dG1dtg=0.5/_Delta*(_Ggl1-_Gr1)*(1.-pow(tanh(1./_Delta*(T-Tg)),2.))+_Mgl1; - dHbdtg=0.5/_Delta*(_Hgl1-_Hr1)*(1.-pow(tanh(1./_Delta*(T-Tg)),2.))+_Lgl1; - dG1dF=dG1dtg*dTgdF; - //dQ1dF=dQ1dtg*dTgdF; - dMu1dF=dMu1dtg*dTgdF; - dHbdF=dHbdtg*dTgdF; - dK1dtg=dG1dtg*(2.*(1.+Mue1))/(3.*(1.-2.*Mue1))+G1*(2.*dMu1dtg*(1.-2.*Mue1)+4.*dMu1dtg*(1.+Mue1))/(3.*pow(1.-2.*Mue1,2.)); - dK1dF=dK1dtg*dTgdF; - dL1dtg=-_epsilon01*dh/T*exp(-1./_epsygl1)*exp(-Q1/(T))*(dQ1dtg); - dL1dF=dL1dtg*dTgdF; - //dL1dF=-_epsilon01*dh/(T)*exp(-1./_epsygl1)*exp(-Q1/(T))*(dQ1dF); - /* for(int j = 0; j< 3; j++){ - for(int C = 0; C< 3; C++){ - dK1dF(j,C)=dGdF(j,C)*(2.*(1.+Mu1))/(3.*(1.-2.*Mu1))+G1*(2.*dMudF(j,C)*(1.-2.*Mu1)+4.*dMudF(j,C)*(1.+Mu1))/(3.*pow(1.-2.*Mu1,2.)); - }}*/ + dG1dTg=0.5/_Delta*(_Ggl1-_Gr1)*(1.-pow(tanh(1./_Delta*(T-Tg)),2.))+_Mgl1; + dHbdTg=0.5/_Delta*(_Hgl1-_Hr1)*(1.-pow(tanh(1./_Delta*(T-Tg)),2.))+_Lgl1; + dK1dTg=dG1dTg*(2.*(1.+Mue1))/(3.*(1.-2.*Mue1))+G1*(2.*dMu1dTg*(1.-2.*Mue1)+4.*dMu1dTg*(1.+Mue1))/(3.*pow(1.-2.*Mue1,2.)); + dL1dTg=-_epsilon01*dh/T*exp(-1./_epsygl1)*exp(-Q1/(T))*(dQ1dTg); + + dG1dF=dTgdF; + dG1dF*=dG1dTg; + dHbdF=dTgdF; + dHbdF*=dHbdTg*dTgdF; + dK1dF=dTgdF; + dK1dF*=dK1dTg; + dL1dF=dTgdF; + dL1dF*=dL1dTg; - dG1dt=-0.5/_Delta*(_Ggl1-_Gr1)*(1.-pow(tanh(1./_Delta*(T-Tg)),2.))-_Mgl1; - dK1dt=dG1dt*(2.*(1.+Mue1))/(3.*(1.-2.*Mue1))+G1*(2.*dMu1dt*(1.-2.*Mue1)+4.*dMu1dt*(1.+Mue1))/(3.*pow(1.-2.*Mue1,2.)); - dHbdt=-0.5/_Delta*(_Hgl1-_Hr1)*(1.-pow(tanh(1./_Delta*(T-Tg)),2.))-_Lgl1; - dL1dt=_epsilon01*dh*exp(-1./_epsygl1)*exp(-Q1/(T))*(-dQ1dt*T+Q1)/(T*T); - } - } - - else - { - G1=0.5*(_Ggl1+_Gr1)-0.5*(_Ggl1-_Gr1)*tanh(1./_Delta*(T-Tg))-_Mr1*(T-Tg); - K1=G1*(2.*(1.+ Mue1))/(3.*(1.-2.* Mue1)); - Hb=0.5*(_Hgl1+_Hr1)-0.5*(_Hgl1-_Hr1)*tanh(1./_Delta*(T-Tg))-_Lr1*(T-Tg); - L1=(_epsilon01*dh*exp(-1./(_epsygl1+_d1*(T-Tg)))*exp(-Q1/(T))); - //if (stiff) - { - dG1dtg=0.5/_Delta*(_Ggl1-_Gr1)*(1.-pow(tanh(1./_Delta*(T-Tg)),2.))+_Mr1; - dHbdtg=0.5/_Delta*(_Hgl1-_Hr1)*(1.-pow(tanh(1./_Delta*(T-Tg)),2.))+_Lr1; - dG1dF=dG1dtg*dTgdF; - dQ1dF=dQ1dtg*dTgdF; - dMu1dF=dMu1dtg*dTgdF; - dHbdF=dHbdtg*dTgdF; - dK1dtg=dG1dtg*(2.*(1.+Mue1))/(3.*(1.-2.*Mue1))+G1*(2.*dMu1dtg*(1.-2.*Mue1)+4.*dMu1dtg*(1.+Mue1))/(3.*pow(1.-2.*Mue1,2.)); - dK1dF=dK1dtg*dTgdF; - dL1dtg=-_epsilon01*dh/T*exp(-1./(_epsygl1+_d1*(T-Tg)))*exp(-Q1/(T))*(dQ1dtg) - -_epsilon01*dh*exp(-1./(_epsygl1+_d1*(T-Tg)))*exp(-Q1/(T))*_d1/(pow(_epsygl1+_d1*(T-Tg),2.)); - dL1dF=dL1dtg*dTgdF; - /* dL1dF(j,C)=-_epsilon01*dh/(T)*exp(-1./(_epsygl1+_d1*(T-Tg)))*exp(-Q1/(T))*(dQ1dF(j,C)) - -_epsilon01*dh*exp(-1./(_epsygl1+_d1*(T-Tg)))*exp(-Q1/(T))*_d1*dTgdF(j,C)/(pow(_epsygl1+_d1*(T-Tg),2.));*/ - /* for(int j = 0; j< 3; j++){ - for(int C = 0; C< 3; C++){ - dKdF(j,C)=dGdF(j,C)*(2.*(1.+Mu1))/(3.*(1.-2.*Mu1))+G1*(2.*dMudF(j,C)*(1.-2.*Mu1)+4.*dMudF(j,C)*(1.+Mu1))/(3.*pow(1.-2.*Mu1,2.)); - }}*/ - dG1dt=-0.5/_Delta*(_Ggl1-_Gr1)*(1.-pow(tanh(1./_Delta*(T-Tg)),2.))-_Mr1; - dK1dt=dG1dt*(2.*(1.+Mue1))/(3.*(1.-2.*Mue1))+G1*(2.*dMu1dt*(1.-2.*Mue1)+4.*dMu1dt*(1.+Mue1))/(3.*pow(1.-2.*Mue1,2.)); - dHbdt=-0.5/_Delta*(_Hgl1-_Hr1)*(1.-pow(tanh(1./_Delta*(T-Tg)),2.))-_Lr1; - dL1dt= _epsilon01*dh*exp(-1./(_epsygl1+_d1*(T-Tg)))*exp(-Q1/(T))*_d1/(pow(_epsygl1+_d1*(T-Tg),2.)) - +_epsilon01*dh*exp(-1./(_epsygl1+_d1*(T-Tg)))*exp(-Q1/(T))*(-dQ1dt*T+Q1)/(T*T); - } - } - - + dG1dT=-0.5/_Delta*(_Ggl1-_Gr1)*(1.-pow(tanh(1./_Delta*(T-Tg)),2.))-_Mgl1; + dK1dT=dG1dT*(2.*(1.+Mue1))/(3.*(1.-2.*Mue1))+G1*(2.*dMu1dT*(1.-2.*Mue1)+4.*dMu1dT*(1.+Mue1))/(3.*pow(1.-2.*Mue1,2.)); + dHbdT=-0.5/_Delta*(_Hgl1-_Hr1)*(1.-pow(tanh(1./_Delta*(T-Tg)),2.))-_Lgl1; + dL1dT=_epsilon01*dh*exp(-1./_epsygl1)*exp(-Q1/(T))*(-dQ1dT*T+Q1)/(T*T); + } + else + { + G1=0.5*(_Ggl1+_Gr1)-0.5*(_Ggl1-_Gr1)*tanh(1./_Delta*(T-Tg))-_Mr1*(T-Tg); + K1=G1*(2.*(1.+ Mue1))/(3.*(1.-2.* Mue1)); + Hb=0.5*(_Hgl1+_Hr1)-0.5*(_Hgl1-_Hr1)*tanh(1./_Delta*(T-Tg))-_Lr1*(T-Tg); + L1=(_epsilon01*dh*exp(-1./(_epsygl1+_d1*(T-Tg)))*exp(-Q1/(T))); + + dG1dTg=0.5/_Delta*(_Ggl1-_Gr1)*(1.-pow(tanh(1./_Delta*(T-Tg)),2.))+_Mr1; + dHbdTg=0.5/_Delta*(_Hgl1-_Hr1)*(1.-pow(tanh(1./_Delta*(T-Tg)),2.))+_Lr1; + dK1dTg=dG1dTg*(2.*(1.+Mue1))/(3.*(1.-2.*Mue1))+G1*(2.*dMu1dTg*(1.-2.*Mue1)+4.*dMu1dTg*(1.+Mue1))/(3.*pow(1.-2.*Mue1,2.)); + dL1dTg=-_epsilon01*dh/T*exp(-1./(_epsygl1+_d1*(T-Tg)))*exp(-Q1/(T))*(dQ1dTg) + -_epsilon01*dh*exp(-1./(_epsygl1+_d1*(T-Tg)))*exp(-Q1/(T))*_d1/(pow(_epsygl1+_d1*(T-Tg),2.)); + dG1dF=dTgdF; + dG1dF*=dG1dTg; + dHbdF=dTgdF; + dHbdF*=dHbdTg; + dK1dF=dTgdF; + dK1dF*=dK1dTg; + dL1dF=dTgdF; + dL1dF*=dL1dTg; + + dG1dT=-0.5/_Delta*(_Ggl1-_Gr1)*(1.-pow(tanh(1./_Delta*(T-Tg)),2.))-_Mr1; + dK1dT=dG1dT*(2.*(1.+Mue1))/(3.*(1.-2.*Mue1))+G1*(2.*dMu1dT*(1.-2.*Mue1)+4.*dMu1dT*(1.+Mue1))/(3.*pow(1.-2.*Mue1,2.)); + dHbdT=-0.5/_Delta*(_Hgl1-_Hr1)*(1.-pow(tanh(1./_Delta*(T-Tg)),2.))-_Lr1; + dL1dT= _epsilon01*dh*exp(-1./(_epsygl1+_d1*(T-Tg)))*exp(-Q1/(T))*_d1/(pow(_epsygl1+_d1*(T-Tg),2.)) + +_epsilon01*dh*exp(-1./(_epsygl1+_d1*(T-Tg)))*exp(-Q1/(T))*(-dQ1dT*T+Q1)/(T*T); + } } -void mlawSMP::computM1(const STensor3& devlnCepr1,const STensor3& lnCepr1,const double depsilon1, const STensor3 &N1,const double T ,const double Tg, + +void mlawSMP::computeM1(const STensor3& devlnCepr1,const STensor3& lnCepr1,const double depsilon1, const STensor3 &N1,const double T ,const double Tg, const double G1,const double Mu1, const double K1,STensor3 &Me1,const double dh,const double alalphath)const { - double trlnCepr1=lnCepr1.trace(); - for( int A=0; A<3; A++){ - for( int B=0; B<3; B++){ - Me1(A,B)=G1*devlnCepr1(A,B) -2.*G1*N1(A,B)*depsilon1+1./2.*K1*trlnCepr1*I2(A,B)-3.*K1*alalphath*I2(A,B); - } - } - + double trlnCepr1=lnCepr1.trace(); + for( int A=0; A<3; A++){ + for( int B=0; B<3; B++){ + Me1(A,B)=G1*devlnCepr1(A,B) -2.*G1*N1(A,B)*depsilon1+1./2.*K1*trlnCepr1*I2(A,B)-3.*K1*alalphath*I2(A,B); + } + } } void mlawSMP::predictorCorrector1( double &j1, double &TauE1,double &depsilon1,STensor3 &dDp1, double &Sa1,double &Sb1, double &phia1, double &phiastar1, @@ -2836,64 +2003,52 @@ void mlawSMP::predictorCorrector1( double &j1, double &TauE1,double &depsilon1, { /* initialize terms */ // double J= Fn.determinant(); - Tau1=0.;Me1*=0.;N1=0.;dexpdDp1*=0.;/*dMe1dF*=0.;dFp1dF*=0.;*/Ce1*=0.;Fe1*=0.;C1*=0.; + STensorOperation::zero(dDp1); STensorOperation::zero(P1); STensorOperation::zero(Fe1); STensorOperation::zero(Ce1); STensorOperation::zero(Cepr1); + STensorOperation::zero(Fp1); STensorOperation::zero(C1); STensorOperation::zero(dexpdDp1); STensorOperation::zero(N1); STensorOperation::zero(Me1); + Sa1=0.; Sb1=0.; phia1=0.; phiastar1-=0.; Sastar1=0.; Tau1=0.; dSa1dTg=0.; dSa1dT=0.; + static STensor3 devM1; - devM1*=0.; + STensorOperation::zero(devM1); double epsilon1=0.,trM1=0.,trC1=0.; - double lambda=0.,lambd=0.; + double lambda=0.; double dSa1depsilon=0.; - double Sa0 (q0->getSa1()); + double Sa0=q0->getSa1(); Sa1=Sa0; - double phia0(q0->getPhia1()); + double phia0=q0->getPhia1(); phia1=phia0; - double phiastar0(q0->getPhiastar1()); + double phiastar0=q0->getPhiastar1(); phiastar1=phiastar0; - double Sastar0(q0->getSastar1()); + double Sastar0=q0->getSastar1(); Sastar1=Sastar0; /* compute elastic predictor */ - STensor3 Fp0(q0->getConstRefToFp1()); + const STensor3 &Fp0=q0->getConstRefToFp1(); Fp1=Fp0; - //Fp0.print("Fp0"); -// std::cout<< "Sa0="<<Sa0<<std::endl; - - //evaluate A from previous plastic strain - C1=Fn.transpose(); - C1*=Fn; + STensorOperation::multSTensor3FirstTranspose(Fn, Fn, C1); trC1=C1.trace(); - STensor3 Fp1inv; - Fp1inv = Fp1.invert(); + + static STensor3 Fp1inv; + STensorOperation::inverseSTensor3(Fp1, Fp1inv); static STensor3 Fe1pr; - Fe1pr = Fn; - Fe1pr *= Fp1inv; + STensorOperation::multSTensor3(Fn, Fp1inv, Fe1pr); static STensor3 lnCepr1,devlnCepr1,Bp1; - Cepr1 =Fe1pr.transpose(); - Cepr1 *= Fe1pr; - - Bp1=Fp1; - Bp1*=Fp1.transpose(); - /* STensor3 nTrc1; - double nnTrc1; - nTrc1=Cepr1; - nTrc1*=Bp1; - nnTrc1=nTrc1.trace();*/ + STensorOperation::multSTensor3FirstTranspose(Fe1pr, Fe1pr, Cepr1); + STensorOperation::multSTensor3SecondTranspose(Fp1, Fp1, Bp1); Fe1=Fe1pr; - //Ce1=Cepr1; static STensor43 dlnCepr1; - dlnCepr1*=0.; STensorOperation::logSTensor3(Cepr1,_order,lnCepr1,&dlnCepr1); - divatoric(lnCepr1, devlnCepr1); - + double trlnCepr1; + STensorOperation::decomposeDevTr(lnCepr1, devlnCepr1, trlnCepr1); double normdevlnCepr1; normdevlnCepr1=devlnCepr1.norm2(); if (normdevlnCepr1==0.) - N1=I2; + N1=I2; else { N1= devlnCepr1; @@ -2901,804 +2056,559 @@ void mlawSMP::predictorCorrector1( double &j1, double &TauE1,double &depsilon1, } - static STensor3 expdDp1; - expdDp1=0.; - depsilon1 =0.; - j1=0.; - computM1(devlnCepr1,lnCepr1,depsilon1,N1,T ,Tg,G1, Mu1, K1,Me1,dh,alalphath); - lambd=sqrt(trC1/3.); - if(lambd<1.0) lambd=1.; - Sb1=_Sb01+Hb*pow(lambd-1.,_l1); + static STensor3 expdDp1; + STensorOperation::zero(expdDp1); + depsilon1 =0.; + j1=0.; + computeM1(devlnCepr1,lnCepr1,depsilon1,N1,T ,Tg,G1, Mu1, K1,Me1,dh,alalphath); + lambda=sqrt(trC1/3.); + if(lambda<1.0) lambda=1.; + Sb1=_Sb01+Hb*pow(lambda-1.,_l1); - computTauE( Me1,devlnCepr1,lnCepr1,depsilon1, G1, K1, Sa1,Sb1, T ,Tg, TauE1,Tau1,alalphath); + computeTauE( Me1,devlnCepr1,lnCepr1,depsilon1, G1, K1, Sa1,Sb1, T ,Tg, TauE1,Tau1,alalphath); // if(TauE1/(_Ggl1+_Gr1)>1.e-3) - if(TauE1>0.) - { - int ite = 0, maxite = 10000; - double ome1; - // ome1*=0.; + if(TauE1>0.) + { + int ite = 0, maxite = 10000; + double ome1=0.; - deltaepsilon1(TauE1,Q1,T,Tg,dh,depsilon1); //derivatives do not exist for 0 - computSaphi(depsilon1 ,Sa0,phia0, T, Tg,dh,phiastar0,Sastar0,Sa1,Sastar1,phia1,phiastar1,dSa1depsilon,dSa1dTg,dSa1dT); - computeResidual1(ome1, lnCepr1,L1,Sa1,Sb1,depsilon1,T,Tg,K1,G1,Q1,dh,alalphath); - // deltaepsilon1( TauE1 ,Q1, T, Tg,depsilon1); + deltaepsilon1(TauE1,Q1,T,Tg,dh,depsilon1); //derivatives do not exist for 0 + computeSaphi(depsilon1 ,Sa0,phia0, T, Tg,dh,phiastar0,Sastar0,Sa1,Sastar1,phia1,phiastar1,dSa1depsilon,dSa1dTg,dSa1dT); + computeResidual1(ome1, lnCepr1,L1,Sa1,Sb1,depsilon1,T,Tg,K1,G1,Q1,dh,alalphath); + // deltaepsilon1( TauE1 ,Q1, T, Tg,depsilon1); - double tolNR=1.e-6; - //Msg::Info("SMP itereration %d, residual %f, j %f,depsilin %e ,temp %f,time step %f", ite, ome1/(_Ggl1+_Gr1),j1,depsilon1,T,dh); - double deltadeltadepsilon1 =0.; - /* if (fabs(ome1)>1) //new - ome1/=(0.5*_Ggl1+0.5*_Gr1);//new - else - {}*/ - - // while(fabs(ome1) > tolNR or ite <1) - while(fabs(ome1/(0.5*_Ggl1+0.5*_Gr1)) > tolNR or ite <1) - // while(fabs(ome1) > tolNR or ite <1) - { - computeJacobian1(j1, depsilon1,T, Tg,G1,L1,dSa1depsilon); - //if(ite>0) - // Msg::Info("SMP itereration %d, residual %f, j %f,depsilin %e ,temp %f,time step %f", ite, ome1/(_Ggl1+_Gr1),j1,depsilon1,T,dh); - // if(ite>10) Msg::Info("time step %f ,temperature %f", dh,T); + double tolNR=1.e-7; + //Msg::Info("SMP itereration %d, residual %f, j %f,depsilin %e ,temp %f,time step %f", ite, ome1/(_Ggl1+_Gr1),j1,depsilon1,T,dh); + double deltadeltadepsilon1 =0.; + + while(fabs(ome1/(0.5*_Ggl1+0.5*_Gr1)) > tolNR or ite <1) + { + computeJacobian1(j1, depsilon1,T, Tg,G1,L1,dSa1depsilon); + //if(ite>0) + // Msg::Info("SMP itereration %d, residual %f, j %f,depsilin %e ,temp %f,time step %f", ite, ome1/(_Ggl1+_Gr1),j1,depsilon1,T,dh); + //if(ite>10) Msg::Info("time step %f ,temperature %f", dh,T); - if (j1==0.) - deltadeltadepsilon1==0.; - else - deltadeltadepsilon1=ome1/j1; - if(depsilon1-deltadeltadepsilon1 > 0.) - depsilon1-= deltadeltadepsilon1; - else - depsilon1/=2.; + if (j1==0.) + deltadeltadepsilon1==0.; + else + deltadeltadepsilon1=ome1/j1; + if(depsilon1-deltadeltadepsilon1 > 0.) + depsilon1-= deltadeltadepsilon1; + else + depsilon1/=2.; - computSaphi(depsilon1 ,Sa0,phia0, T, Tg,dh,phiastar0,Sastar0,Sa1,Sastar1,phia1,phiastar1,dSa1depsilon,dSa1dTg,dSa1dT); - computeResidual1(ome1, lnCepr1,L1,Sa1,Sb1,depsilon1,T,Tg,K1,G1,Q1,dh,alalphath); + computeSaphi(depsilon1 ,Sa0,phia0, T, Tg,dh,phiastar0,Sastar0,Sa1,Sastar1,phia1,phiastar1,dSa1depsilon,dSa1dTg,dSa1dT); + computeResidual1(ome1, lnCepr1,L1,Sa1,Sb1,depsilon1,T,Tg,K1,G1,Q1,dh,alalphath); - ite++; - /* if (depsilon1<1.e-10) - break;*/ + ite++; + //if (depsilon1<1.e-10) break; // #ifdef _DEBUG - if(ite > maxite) - { - Msg::Error("SMP itereration %d, residual %f, j %f,depsilin %e ,temp %f,time step %f,TG%f", ite, ome1/(_Ggl1+_Gr1),j1,depsilon1,T,dh,Tg); - //Msg::Fatal("No convergence mech1 !!"); - break; - } + if(ite > maxite) + { + Msg::Error("SMP itereration %d, residual %f, j %f,depsilin %e ,temp %f,time step %f,TG%f", ite, ome1/(_Ggl1+_Gr1),j1,depsilon1,T,dh,Tg); + break; + } // #endif // _DEBUG - } - - // outwhile: - computeJacobian1(j1, depsilon1,T, Tg,G1,L1,dSa1depsilon); - } + } + computeJacobian1(j1, depsilon1,T, Tg,G1,L1,dSa1depsilon); + } // final state - computSaphi(depsilon1 ,Sa0,phia0, T, Tg,dh,phiastar0,Sastar0,Sa1,Sastar1,phia1,phiastar1,dSa1depsilon,dSa1dTg,dSa1dT); - computM1(devlnCepr1,lnCepr1,depsilon1,N1,T ,Tg,G1, Mu1, K1,Me1,dh,alalphath); - computTauE(Me1,devlnCepr1,lnCepr1, depsilon1, G1,K1,Sa1, Sb1, T,Tg, TauE1,Tau1,alalphath); - divatoric(Me1, devM1); - // Me1.print("Me1="); - double normdevlnMe1; - normdevlnMe1=devM1.norm2(); - if(normdevlnMe1==0.) - N1=I2; - else{ - N1=devM1; - N1*=1./(sqrt(2.)*normdevlnMe1); - } - // Tau1=1./sqrt(2.)*devM1.norm2(); - dDp1*=0.; - if(Tau1!=0.) - { - dDp1=1./2.*(depsilon1*devM1); - dDp1*=1./Tau1; - } + computeSaphi(depsilon1 ,Sa0,phia0, T, Tg,dh,phiastar0,Sastar0,Sa1,Sastar1,phia1,phiastar1,dSa1depsilon,dSa1dTg,dSa1dT); + computeM1(devlnCepr1,lnCepr1,depsilon1,N1,T ,Tg,G1, Mu1, K1,Me1,dh,alalphath); + computeTauE(Me1,devlnCepr1,lnCepr1, depsilon1, G1,K1,Sa1, Sb1, T,Tg, TauE1,Tau1,alalphath); + double trMe1; + STensorOperation::decomposeDevTr(Me1, devM1, trMe1); + //Me1.print("Me1="); + double normdevlnMe1; + normdevlnMe1=devM1.norm2(); + if(normdevlnMe1==0.) + N1=I2; + else + { + N1=devM1; + N1*=1./(sqrt(2.)*normdevlnMe1); + } + STensorOperation::zero(dDp1); + if(Tau1!=0.) + { + dDp1=devM1; + dDp1*=1./2.*(depsilon1)/Tau1; + } - STensorOperation::expSTensor3(dDp1,_order,expdDp1,&dexpdDp1); - Fp1 = expdDp1; - Fp1 *=Fp0; - Fp1inv = Fp1.invert(); - - Fe1 = Fn; - Fe1 *= Fp1inv; - - Ce1 =Fe1.transpose(); - Ce1 *= Fe1; + STensorOperation::expSTensor3(dDp1,_order,expdDp1,&dexpdDp1); + STensorOperation::multSTensor3( expdDp1, Fp0, Fp1); + STensorOperation::inverseSTensor3(Fp1,Fp1inv); + STensorOperation::multSTensor3(Fn, Fp1inv, Fe1); + STensorOperation::multSTensor3FirstTranspose(Fe1,Fe1,Ce1); - static STensor3 lnCe1; - lnCe1*=0.; - static STensor43 dlnCe1; - dlnCe1*=0.; - STensorOperation::logSTensor3(Ce1,_order,lnCe1,&dlnCe1); + static STensor3 lnCe1; + static STensor43 dlnCe1; + STensorOperation::logSTensor3(Ce1,_order,lnCe1,&dlnCe1); /* if(stiff) { // computintvardfpdf1(dFp1dF,dMe1dF, j1, Fn, Fp0, Cepr1 ,N1, dh, depsilon1,dexpdDp1, T, Tg, G1, K1,C1,Hb,dtauepsilondF,tau1); - // Msg::Info("SMPd dFp1dF %f,dMe1dF %f ,dFp1dF,dMe1dF); -// dFp1dF.print("dFp1dF"); + // Msg::Info("SMPd dFp1dF %f,dMe1dF %f ,dFp1dF,dMe1dF); + // dFp1dF.print("dFp1dF"); }*/ - for( int I=0; I<3; I++){ - for( int A=0; A<3; A++){ - P1(I,A)= 0.; - for( int M=0; M<3; M++){ - for( int K=0; K<3; K++){ - for( int L=0; L<3; L++){ - for( int S=0; S<3; S++){ - P1(I,A)+=Fe1(I,M)*dlnCe1(K,L,M,S)* Me1(K,L)*Fp1inv(A,S); - }}}}}} - /* double trlnCepr1=lnCepr1.trace(); - double normlnCepr1=lnCepr1.norm2(); - q1->_SMPEnergy+= G1*normlnCepr1*normlnCepr1 +1./2.*K1*trlnCepr1*trlnCepr1-3.*K1*alalphath*trlnCepr1*(T-T0); */ //energy if without calling the deformationEnergy function + for( int I=0; I<3; I++){ + for( int A=0; A<3; A++){ + P1(I,A)= 0.; + for( int M=0; M<3; M++){ + for( int K=0; K<3; K++){ + for( int L=0; L<3; L++){ + for( int S=0; S<3; S++){ + P1(I,A)+=Fe1(I,M)*dlnCe1(K,L,M,S)* Me1(K,L)*Fp1inv(A,S); + } + } + } + } + } + } + /* double trlnCepr1=lnCepr1.trace(); + double normlnCepr1=lnCepr1.norm2(); + q1->_SMPEnergy+= G1*normlnCepr1*normlnCepr1 +1./2.*K1*trlnCepr1*trlnCepr1-3.*K1*alalphath*trlnCepr1*(T-T0); */ //energy if without calling the deformationEnergy function - // q1->_SMPEnergy+=deformationEnergy(lnCepr1,G1,K1,alalphath,T,T0); //right + // q1->_SMPEnergy+=deformationEnergy(lnCepr1,G1,K1,alalphath,T,T0); //right } - void mlawSMP::computeResidual1( double &ome1,const STensor3 &lnCepr1,const double L1,const double Sa1,const double Sb1,const double depsilon1,const double T, +void mlawSMP::computeResidual1( double &ome1,const STensor3 &lnCepr1,const double L1,const double Sa1,const double Sb1,const double depsilon1,const double T, const double Tg,const double K1,const double G1,const double Q1,const double dh,const double alalphath) const { - double trlnCepr1,normdevlnCepr1; - static STensor3 devlnCepr1; - devlnCepr1*=0.; - divatoric(lnCepr1, devlnCepr1); - trlnCepr1=lnCepr1.trace(); - normdevlnCepr1=devlnCepr1.norm2(); - ome1=0.; -//if (depsilon1>0.||depsilon1==0.) - ome1=2.*T/_VOnKb1*(asinh(pow(depsilon1/L1,_m1)))-G1/sqrt(2.)*normdevlnCepr1+G1*depsilon1-1./2.*_alphap*K1*trlnCepr1 + double trlnCepr1,normdevlnCepr1; + static STensor3 devlnCepr1; + STensorOperation::decomposeDevTr(lnCepr1, devlnCepr1, trlnCepr1); + + normdevlnCepr1=devlnCepr1.norm2(); + ome1=2.*T/_VOnKb1*(asinh(pow(depsilon1/L1,_m1)))-G1/sqrt(2.)*normdevlnCepr1+G1*depsilon1-1./2.*_alphap*K1*trlnCepr1 +3.*_alphap*K1*alalphath+Sa1+Sb1; -/* if (depsilon1>0.) - ome1+=2.*T/_VOnKb1*(asinh(pow(depsilon1/L1,_m1)));*/ - } +} - - void mlawSMP::computeJacobian1(double &j1 , const double depsilon1,const double T, const double Tg, +void mlawSMP::computeJacobian1(double &j1 , const double depsilon1,const double T, const double Tg, const double G1,const double L1, const double dSa1depsilon) const { j1=G1; j1+=dSa1depsilon; - -// if (depsilon1==0.||depsilon1<0.) - if (depsilon1==0.) - { - - } - - else - { - j1+=2.*T*_m1/(_VOnKb1*L1)*1./sqrt(pow(depsilon1/(L1),2.*_m1)+1.)*pow(depsilon1/(L1),(_m1-1.)); - } + j1+=2.*T*_m1/(_VOnKb1*L1)*1./sqrt(pow(depsilon1/(L1),2.*_m1)+1.)*pow(depsilon1/(L1),(_m1-1.)); } - void mlawSMP::computintvardfpdf1(STensor43 &dFp1dF,STensor43 &dMe1dF,const double j1, const STensor3 &Fn, const STensor3 &Fppr1, const STensor3 &Cepr1 ,const STensor3 &N1, - const double dh,const double depsilon1,const STensor43 &dexpdDp1,const double T, const double Tg,const double G1,const double K1,const - STensor3 &C1,const double Hb,STensor3 &dtauepsilondF,const double Tau1,const STensor3& F0,const double alalphath,const double Q1, - const double TauE1,const STensor3 &dTgdF,const STensor3 &dG1dF,const STensor3 &dMu1dF,const STensor3 &dK1dF,const STensor3 &dQ1dF - ,const STensor3 &dHbdF,const STensor3 &dthermalalphadF,const double L1,const STensor3 &dL1dF,const STensor3 &Me1, const double dSa1dTg) const +void mlawSMP::computeInternalVariabledfpdf1(STensor43 &dFp1dF,STensor43 &dMe1dF,const double j1, const STensor3 &Fn, const STensor3 &Fppr1, const STensor3 &Cepr1 ,const STensor3 &N1, + const double dh,const double depsilon1,const STensor43 &dexpdDp1,const double T, const double Tg,const double G1,const double K1, + const STensor3 &C1,const double Hb,STensor3 &dtauepsilondF,const double Tau1,const STensor3& F0,const double alalphath,const double Q1, + const double TauE1,const STensor3 &dTgdF,const STensor3 &dG1dF,const STensor3 &dMu1dF,const STensor3 &dK1dF,const STensor3 &dQ1dF, + const STensor3 &dHbdF,const STensor3 &dthermalalphadF,const double L1,const STensor3 &dL1dF,const STensor3 &Me1, const double dSa1dTg) const { - double trC1=0., normdevlnCepr1=0.,trlnCepr1=0.,normM1=0.,normdevMe1=0.; - static STensor3 devlnCepr1 ,lnCepr1,/*dnormlnCepr1dF,*/depsilon1dF,devMe1, dTaudF; - devlnCepr1=0.; lnCepr1 =0.; /*dnormlnCepr1dF=0.*/; depsilon1dF=0.; devMe1=0.; dTaudF=0.; + STensorOperation::zero(dFp1dF); STensorOperation::zero(dMe1dF); STensorOperation::zero(dtauepsilondF); + + double trC1=0., normdevlnCepr1=0.,trlnCepr1=0.,trMe1=0.,normM1=0.,normdevMe1=0.; + static STensor3 devlnCepr1 ,lnCepr1, depsilon1dF, devMe1, dTaudF, Fppr1inv; + STensorOperation::zero(devlnCepr1); STensorOperation::zero(lnCepr1); STensorOperation::zero(depsilon1dF); STensorOperation::zero(devMe1); + STensorOperation::zero(dTaudF); STensorOperation::zero(Fppr1inv); static STensor43 dlnCepr1,dN1dC; - dlnCepr1=0.; dN1dC=0.; - divatoric(Me1,devMe1); + STensorOperation::zero(dlnCepr1); STensorOperation::zero(dN1dC); + + STensorOperation::decomposeDevTr(Me1, devMe1, trMe1); normdevMe1=devMe1.norm2(); STensorOperation::logSTensor3(Cepr1,_order,lnCepr1,&dlnCepr1); - static STensor3 Fppr1inv; - divatoric(lnCepr1,devlnCepr1); + STensorOperation::decomposeDevTr(lnCepr1, devlnCepr1, trlnCepr1); normdevlnCepr1=devlnCepr1.norm2(); - Fppr1inv= Fppr1.invert(); - trlnCepr1=lnCepr1.trace(); + STensorOperation::inverseSTensor3(Fppr1,Fppr1inv); + trC1=C1.trace(); - dtauepsilondF=0.; normM1=Me1.norm2(); - if(normdevlnCepr1==0.) - {dN1dC*=0.;} - - else{ - for( int O=0; O<3; O++){ - for( int P=0; P<3; P++){ - for( int W=0; W<3; W++){ - for( int V=0; V<3; V++){ - dN1dC(O,P,W,V)=0.; - for( int H=0; H<3; H++){ - for( int X=0; X<3; X++){ - dN1dC(O,P,W,V)+=1./sqrt(2.)*(dlnCepr1(O,P,H,X))/normdevlnCepr1*Fppr1inv(W,H)*Fppr1inv(V,X); - for( int Y=0; Y<3; Y++){ - for( int Z=0; Z<3; Z++){ - dN1dC(O,P,W,V)-=1./sqrt(2.)*1./3.*I2(Y,Z)*dlnCepr1(Y,Z,H,X)*I2(O,P)/normdevlnCepr1*Fppr1inv(W,H)*Fppr1inv(V,X); - } - } - } - } - } - } - } - } - - for( int O=0; O<3; O++){ - for( int P=0; P<3; P++){ - for( int W=0; W<3; W++){ - for( int V=0; V<3; V++){ - for( int H=0; H<3; H++){ - for( int X=0; X<3; X++){ - for( int Q=0; Q<3; Q++){ - for( int M=0; M<3; M++){ - // dN1dC(O,P,W,V)-=N1(O,P)/(pow(normdevlnCepr1,2))*dlnCepr1(Q,M,H,X)*devlnCepr1(Q,M)*Fppr1inv(W,H)*Fppr1inv(V,X); - dN1dC(O,P,W,V)-=N1(Q,M)/(pow(normdevlnCepr1,2))*dlnCepr1(Q,M,H,X)*devlnCepr1(O,P) - *Fppr1inv(W,H)*Fppr1inv(V,X); - /* for( int U=0; U<3; U++){ - for( int S=0; S<3; S++){ - // dN1dC(O,P,W,V)+=1./3.*N1(O,P)/(pow(normdevlnCepr1,2))*I2(U,S)*dlnCepr1(U,S,H,X)*devlnCepr1(Q,M)*I2(Q,M)*Fppr1inv(W,H)*Fppr1inv(V,X); - dN1dC(O,P,W,V)+=1./3.*N1(Q,M)/(pow(normdevlnCepr1,2))*I2(U,S)*dlnCepr1(U,S,H,X)*devlnCepr1(O,P)*I2(Q,M) - *Fppr1inv(W,H)*Fppr1inv(V,X); - } - }*/ - } - } - } - } - } - } - } - } - - } + if(normdevlnCepr1!=0.) + { + for( int O=0; O<3; O++){ + for( int P=0; P<3; P++){ + for( int W=0; W<3; W++){ + for( int V=0; V<3; V++){ + dN1dC(O,P,W,V)=0.; + for( int H=0; H<3; H++){ + for( int X=0; X<3; X++){ + dN1dC(O,P,W,V)+=1./sqrt(2.)*(dlnCepr1(O,P,H,X))/normdevlnCepr1*Fppr1inv(W,H)*Fppr1inv(V,X); + for( int Y=0; Y<3; Y++){ + for( int Z=0; Z<3; Z++){ + dN1dC(O,P,W,V)-=1./sqrt(2.)*1./3.*I2(Y,Z)*dlnCepr1(Y,Z,H,X)*I2(O,P)/normdevlnCepr1*Fppr1inv(W,H)*Fppr1inv(V,X); + } + } + for( int Q=0; Q<3; Q++){ + for( int M=0; M<3; M++){ + dN1dC(O,P,W,V)-=N1(Q,M)/(pow(normdevlnCepr1,2))*dlnCepr1(Q,M,H,X)*devlnCepr1(O,P)*Fppr1inv(W,H)*Fppr1inv(V,X); + } + } + } + } + } + } + } + } + } - static STensor3 dSa1dF; - dSa1dF=0.; - dSa1dF=dTgdF; - dSa1dF*=dSa1dTg; + static STensor3 dSa1dF; + dSa1dF=dTgdF; + dSa1dF*=dSa1dTg; - if( j1==0.) - { - depsilon1dF*=0.; - } - - else - { - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - depsilon1dF(j,C)=(dG1dF(j,C)/sqrt(2.)*normdevlnCepr1-dG1dF(j,C)*depsilon1+1./2.*_alphap*dK1dF(j,C)*trlnCepr1 -3.*_alphap*dK1dF(j,C)*alalphath + if( j1==0.) + { + depsilon1dF*=0.; + } + else + { + for( int j=0; j<3; j++){ + for( int C=0; C<3; C++){ + depsilon1dF(j,C)=(dG1dF(j,C)/sqrt(2.)*normdevlnCepr1-dG1dF(j,C)*depsilon1+1./2.*_alphap*dK1dF(j,C)*trlnCepr1 -3.*_alphap*dK1dF(j,C)*alalphath -3.*_alphap*K1*dthermalalphadF(j,C)-dSa1dF(j,C))/j1; - } - } - if( depsilon1==0.) - { - - } - else - { - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - depsilon1dF(j,C)+= (2.*T*_m1/_VOnKb1*1./sqrt(pow(depsilon1/L1,2.*_m1)+1.)*pow(L1,-_m1-1.)*pow(depsilon1,_m1)*dL1dF(j,C))/j1; - - } - } - } - - if(trC1>3. ) - { - double tmpvar=sqrt(trC1/3.)-1.; - if(tmpvar>0.) - { - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - depsilon1dF(j,C)-=dHbdF(j,C)*pow(tmpvar,_l1)/j1; - for( int W=0; W<3; W++){ - for( int V=0; V<3; V++){ - depsilon1dF(j,C)-=_l1/2.*Hb*pow(tmpvar,_l1-1.)*I2(W,V)/(sqrt(3.*trC1))*(Fn(j,V)*I2(W,C)+Fn(j,W)*I2(V,C))/j1; - } - } - } + } + } + if( depsilon1!=0.) + { + for( int j=0; j<3; j++){ + for( int C=0; C<3; C++){ + depsilon1dF(j,C)+= (2.*T*_m1/_VOnKb1*1./sqrt(pow(depsilon1/L1,2.*_m1)+1.)*pow(L1,-_m1-1.)*pow(depsilon1,_m1)*dL1dF(j,C))/j1; + } + } + } + + double tmpvar=sqrt(trC1/3.)-1.; + if(tmpvar>0.) + { + for( int j=0; j<3; j++){ + for( int C=0; C<3; C++){ + depsilon1dF(j,C)-=dHbdF(j,C)*pow(tmpvar,_l1)/j1; + for( int W=0; W<3; W++){ + for( int V=0; V<3; V++){ + depsilon1dF(j,C)-=_l1/2.*Hb*pow(tmpvar,_l1-1.)*I2(W,V)/(sqrt(3.*trC1))*(Fn(j,V)*I2(W,C)+Fn(j,W)*I2(V,C))/j1; + } + } + } + } + } + for( int j=0; j<3; j++){ + for( int C=0; C<3; C++){ + for( int W=0; W<3; W++){ + for( int V=0; V<3; V++){ + for( int Y=0; Y<3; Y++){ + for( int Z=0; Z<3; Z++){ + for( int H=0; H<3; H++){ + for( int X=0; X<3; X++){ + depsilon1dF(j,C)+=1./2.*_alphap*K1*I2(Y,Z)*dlnCepr1(Y,Z,H,X)*Fppr1inv(W,H)*Fppr1inv(V,X)*(Fn(j,V)*I2(W,C)+Fn(j,W)*I2(V,C))/j1; + } + } } - } - } - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - for( int W=0; W<3; W++){ - for( int V=0; V<3; V++){ - for( int Y=0; Y<3; Y++){ - for( int Z=0; Z<3; Z++){ - for( int H=0; H<3; H++){ - for( int X=0; X<3; X++){ - depsilon1dF(j,C)+=1./2.*_alphap*K1*I2(Y,Z)*dlnCepr1(Y,Z,H,X)*Fppr1inv(W,H)*Fppr1inv(V,X)*(Fn(j,V)*I2(W,C)+Fn(j,W)*I2(V,C))/j1; - } - } - } - } - } - } - } - } - - if(normdevlnCepr1==0.||normdevMe1==0.) - { - - } - - else{ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - for( int W=0; W<3; W++){ - for( int V=0; V<3; V++){ - for( int O=0; O<3; O++){ - for( int M=0; M<3; M++){ - for( int H=0; H<3; H++){ - for( int X=0; X<3; X++){ - depsilon1dF(j,C)+=G1*dlnCepr1(O,M,H,X)*N1(O,M)*Fppr1inv(W,H)*Fppr1inv(V,X)*(Fn(j,V)*I2(W,C)+Fn(j,W)*I2(V,C))/j1; - /* for( int U=0; U<3; U++){ - for( int S=0; S<3; S++){ - depsilon1dF(j,C)-=1./3.*G1*I2(U,S)*dlnCepr1(U,S,H,X)*N1(O,M)*I2(O,M)*Fppr1inv(W,H)*Fppr1inv(V,X)*(Fn(j,V)*I2(W,C)+Fn(j,W)*I2(V,C))/j1; - } - }*/ - } - } - } - } - } - } - } - } - } - } - - - dMe1dF*=0.; - for( int K=0; K<3; K++){ - for( int L=0; L<3; L++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - dMe1dF(K,L,j,C)+=dG1dF(j,C)*devlnCepr1(K,L) -2.*dG1dF(j,C)*depsilon1*N1(K,L) +1./2.*dK1dF(j,C)*trlnCepr1*I2(K,L); + } + } + } + } + } + + if(normdevlnCepr1!=0. && normdevMe1!=0.) + { + for( int j=0; j<3; j++){ + for( int C=0; C<3; C++){ + for( int W=0; W<3; W++){ + for( int V=0; V<3; V++){ + for( int O=0; O<3; O++){ + for( int M=0; M<3; M++){ + for( int H=0; H<3; H++){ + for( int X=0; X<3; X++){ + depsilon1dF(j,C)+=G1*dlnCepr1(O,M,H,X)*N1(O,M)*Fppr1inv(W,H)*Fppr1inv(V,X)*(Fn(j,V)*I2(W,C)+Fn(j,W)*I2(V,C))/j1; + } + } + } + } + } + } + } + } + } + } + for( int K=0; K<3; K++){ + for( int L=0; L<3; L++){ + for( int j=0; j<3; j++){ + for( int C=0; C<3; C++){ + dMe1dF(K,L,j,C)+=dG1dF(j,C)*devlnCepr1(K,L) -2.*dG1dF(j,C)*depsilon1*N1(K,L) +1./2.*dK1dF(j,C)*trlnCepr1*I2(K,L); -3.*dK1dF(j,C)*alalphath*I2(K,L)-3.*K1*dthermalalphadF(j,C)*I2(K,L); - } - } - } - } + dMe1dF(K,L,j,C)-= 2.*G1*N1(K,L)*depsilon1dF(j,C); + for( int W=0; W<3; W++){ + for( int V=0; V<3; V++){ + dMe1dF(K,L,j,C)-= 2*G1*depsilon1*dN1dC(K,L,W,V)*(Fn(j,V)*I2(W,C)+Fn(j,W)*I2(V,C)); + for( int H=0; H<3; H++){ + for( int X=0; X<3; X++){ + dMe1dF(K,L,j,C)+= G1*(dlnCepr1(K,L,H,X))*Fppr1inv(W,H)*Fppr1inv(V,X)*(Fn(j,V)*I2(W,C)+Fn(j,W)*I2(V,C)); + for( int Y=0; Y<3; Y++){ + for( int Z=0; Z<3; Z++){ + dMe1dF(K,L,j,C)-= G1*(1./3.*I2(Y,Z)*dlnCepr1(Y,Z,H,X)*I2(K,L))*Fppr1inv(W,H)*Fppr1inv(V,X)*(Fn(j,V)*I2(W,C)+Fn(j,W)*I2(V,C)); + dMe1dF(K,L,j,C)+= 1./2.*K1*I2(Y,Z)*dlnCepr1(Y,Z,H,X)*I2(K,L) + *Fppr1inv(W,H)*Fppr1inv(V,X)*(Fn(j,V)*I2(W,C)+Fn(j,W)*I2(V,C)); + } + } + } + } + } + } + } + } + } + } - for( int K=0; K<3; K++){ - for( int L=0; L<3; L++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - dMe1dF(K,L,j,C)-= 2.*G1*N1(K,L)*depsilon1dF(j,C); - for( int W=0; W<3; W++){ - for( int V=0; V<3; V++){ - // dMe1dF(K,L,j,C)-= 2*G1*depsilon1*dN1dF(K,L,j,C); - dMe1dF(K,L,j,C)-= 2*G1*depsilon1*dN1dC(K,L,W,V)*(Fn(j,V)*I2(W,C)+Fn(j,W)*I2(V,C)); - } - } - } - } - } - } - - for( int K=0; K<3; K++){ - for( int L=0; L<3; L++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - for( int W=0; W<3; W++){ - for( int V=0; V<3; V++){ - for( int H=0; H<3; H++){ - for( int X=0; X<3; X++){ - dMe1dF(K,L,j,C)+= G1*(dlnCepr1(K,L,H,X))*Fppr1inv(W,H)*Fppr1inv(V,X)*(Fn(j,V)*I2(W,C)+Fn(j,W)*I2(V,C)); - for( int Y=0; Y<3; Y++){ - for( int Z=0; Z<3; Z++){ - dMe1dF(K,L,j,C)-= G1*(1./3.*I2(Y,Z)*dlnCepr1(Y,Z,H,X)*I2(K,L))*Fppr1inv(W,H)*Fppr1inv(V,X)*(Fn(j,V)*I2(W,C)+Fn(j,W)*I2(V,C)); - } - } - } - } - } - } - } - } - } - } - - for( int K=0; K<3; K++){ - for( int L=0; L<3; L++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - for( int Y=0; Y<3; Y++){ - for( int Z=0; Z<3; Z++){ - for( int H=0; H<3; H++){ - for( int X=0; X<3; X++){ - for( int W=0; W<3; W++){ - for( int V=0; V<3; V++){ - dMe1dF(K,L,j,C)+= 1./2.*K1*I2(Y,Z)*dlnCepr1(Y,Z,H,X)*I2(K,L) - *Fppr1inv(W,H)*Fppr1inv(V,X)*(Fn(j,V)*I2(W,C)+Fn(j,W)*I2(V,C)); - } - } - } - } - } - } - } - } - } - } - //} - /*dN1dF*=0.; - static STensor43 dMe01dF; - for( int C=0; C<3; C++){ - for( int D=0; D<3; D++){ - for( int j=0; j<3; j++){ - for( int X=0; X<3; X++){ - dMe01dF(C,D,j,X)=dMe1dF(C,D,j,X); - for( int Y=0; Y<3; Y++){ - for( int Z=0; Z<3; Z++){ - dMe01dF(C,D,j,X)-=1./3.*I2(C,D)*dMe1dF(Y,Z,j,X)*I2(Y,Z); - }}}}}} - - if(normdevMe1==0.) - {dN1dF*=0.;} - - else{ - for( int C=0; C<3; C++){ - for( int D=0; D<3; D++){ - for( int j=0; j<3; j++){ - for( int X=0; X<3; X++){ - dN1dF(C,D,j,X)+=1./(sqrt(2.)*normdevMe1)*devMe1(C,D)*(dMe01dF(C,D,j,X)); - for( int Y=0; Y<3; Y++){ - for( int Z=0; Z<3; Z++){ - dN1dF(C,D,j,X)-=1./sqrt(2.)*1./3.*devMe1(C,D)*I2(Y,Z)*dMe01dF(Y,Z,j,X)*I2(C,D)/pow(normdevMe1,3); - } - } - } - } - } - } - for( int C=0; C<3; C++){ - for( int D=0; D<3; D++){ - for( int j=0; j<3; j++){ - for( int X=0; X<3; X++){ - dN1dF(C,D,j,X)+=1./(sqrt(2.)*normdevMe1)*devMe1(C,D)*(dMe1dF(C,D,j,X)); - for( int Y=0; Y<3; Y++){ - for( int Z=0; Z<3; Z++){ - dN1dF(C,D,j,X)-=1./sqrt(2.)*1./3.*devMe1(C,D)*I2(Y,Z)*dMe1dF(Y,Z,j,X)*I2(C,D)/pow(normdevMe1,3); - } - } - } - } - } - } - - } */ - - dFp1dF*=0.; - // depsilon1dC.print("depsilon1dC"); - if(depsilon1==0.) - { - dFp1dF*=0.; - } - else{ - for( int E=0; E<3; E++){ - for( int Z=0; Z<3; Z++){ - for( int W=0; W<3; W++){ - for( int V=0; V<3; V++){ - dFp1dF(E,Z,W,V)=0.; - for( int I=0; I<3; I++){ - for( int O=0; O<3; O++){ - for( int P=0; P<3; P++){ - dFp1dF(E,Z,W,V)+=dexpdDp1(E,I,O,P)*(N1(O,P)*depsilon1dF(W,V))*Fppr1(I,Z); - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - dFp1dF(E,Z,W,V)+=dexpdDp1(E,I,O,P)*depsilon1*dN1dC(O,P,W,V)*(Fn(j,V)*I2(W,C)+Fn(j,W)*I2(V,C))*Fppr1(I,Z); - } - } - } - } - } - } - } - } - } - - } - //for cp0 - /* if(normdevlnCepr1==0.||normdevMe1==0.) - { - dnormlnCepr1dF*=0.; - dTaudF*=0.; - } - - else{ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - dnormlnCepr1dF(j,C)=0.; - for( int W=0; W<3; W++){ - for( int V=0; V<3; V++){ - for( int O=0; O<3; O++){ - for( int M=0; M<3; M++){ - for( int H=0; H<3; H++){ - for( int X=0; X<3; X++){ - dnormlnCepr1dF(j,C)+=sqrt(2.)*N1(O,M)*dlnCepr1(O,M,H,X)*Fppr1inv(W,H)*Fppr1inv(V,X)*(Fn(j,V)*I2(W,C)+Fn(j,W)*I2(V,C)); - for( int U=0; U<3; U++){ - for( int S=0; S<3; S++){ - dnormlnCepr1dF(j,C)-=sqrt(2.)/3.*dlnCepr1(U,S,H,X)*N1(O,M)*(I2(U,S)*I2(O,M))* - Fppr1inv(W,H)*Fppr1inv(V,X)*(Fn(j,V)*I2(W,C)+Fn(j,W)*I2(V,C)); - } - } - } - } - } - } - } - } - } - } - - }*/ + if(depsilon1!=0.) + { + for( int E=0; E<3; E++){ + for( int Z=0; Z<3; Z++){ + for( int W=0; W<3; W++){ + for( int V=0; V<3; V++){ + dFp1dF(E,Z,W,V)=0.; + for( int I=0; I<3; I++){ + for( int O=0; O<3; O++){ + for( int P=0; P<3; P++){ + dFp1dF(E,Z,W,V)+=dexpdDp1(E,I,O,P)*(N1(O,P)*depsilon1dF(W,V))*Fppr1(I,Z); + for( int j=0; j<3; j++){ + for( int C=0; C<3; C++){ + dFp1dF(E,Z,W,V)+=dexpdDp1(E,I,O,P)*depsilon1*dN1dC(O,P,W,V)*(Fn(j,V)*I2(W,C)+Fn(j,W)*I2(V,C))*Fppr1(I,Z); + } + } + } + } + } + } + } + } + } + } - dtauepsilondF*=0.; - if(normdevMe1==0.) - { - dTaudF*=0.; - } - else{ - - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - dTaudF(j,C)=0.; - for( int A=0; A<3; A++){ - for( int B=0; B<3; B++){ - dTaudF(j,C)+=1./sqrt(2.)*dMe1dF(A,B,j,C)*devMe1(A,B)/normdevMe1 ; - for( int E=0; E<3; E++){ - for( int D=0; D<3; D++){ - dTaudF(j,C)-=1./(3.*sqrt(2.))*devMe1(A,B)/normdevMe1*I2(E,D)*dMe1dF(E,D,j,C)*I2(A,B) ; - }}}}}} - } - - /*if(normdevlnCepr1==0.) - { - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - dTaudF(j,C)=+dG1dF(j,C)*normdevlnCepr1/sqrt(2.) -dG1dF(j,C)*depsilon1; - } - } - } - else{ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - dTaudF(j,C)=G1*dnormlnCepr1dF(j,C)/sqrt(2.)+dG1dF(j,C)*normdevlnCepr1/sqrt(2.)-G1*depsilon1dF(j,C) -dG1dF(j,C)*depsilon1; - } - } - }*/ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - dtauepsilondF(j,C)=dTaudF(j,C)*depsilon1+Tau1*depsilon1dF(j,C); - } - } - + if(normdevMe1!=0.) + { + for( int j=0; j<3; j++){ + for( int C=0; C<3; C++){ + dTaudF(j,C)=0.; + for( int A=0; A<3; A++){ + for( int B=0; B<3; B++){ + dTaudF(j,C)+=1./sqrt(2.)*dMe1dF(A,B,j,C)*devMe1(A,B)/normdevMe1 ; + for( int E=0; E<3; E++){ + for( int D=0; D<3; D++){ + dTaudF(j,C)-=1./(3.*sqrt(2.))*devMe1(A,B)/normdevMe1*I2(E,D)*dMe1dF(E,D,j,C)*I2(A,B) ; + + } + } + } + } + } + } + for( int j=0; j<3; j++){ + for( int C=0; C<3; C++){ + dtauepsilondF(j,C)=dTaudF(j,C)*depsilon1+Tau1*depsilon1dF(j,C); + } + } + } } - - void mlawSMP::tangent1(STensor43 &Tangent1,const STensor43 &dMe1dF,const STensor3 &Fn, const STensor3 &Fp1,const STensor3 &Me1, +void mlawSMP::tangent1(STensor43 &Tangent1,const STensor43 &dMe1dF,const STensor3 &Fn, const STensor3 &Fp1,const STensor3 &Me1, const STensor43 &dFp1dF, const STensor3 &Fe1, const STensor3 &Ce1) const { + STensorOperation::zero(Tangent1); + // d Fp-1 / d static STensor3 Fp1inv,lnCe1; - lnCe1*=0.; - Fp1inv = Fp1.invert(); + STensorOperation::zero(Fp1inv); STensorOperation::zero(lnCe1); + STensorOperation::inverseSTensor3(Fp1,Fp1inv); static STensor43 dFe1dF,dFp1invdF,dlnCe1; - dFe1dF=0.;dFp1invdF=0.;dlnCe1=0.; + STensorOperation::zero(dFe1dF); STensorOperation::zero(dFp1invdF); STensorOperation::zero(dlnCe1); static STensor63 ddlnCe1; - ddlnCe1=0.; + STensorOperation::zero(ddlnCe1); STensorOperation::logSTensor3(Ce1,_order,lnCe1,&dlnCe1,&ddlnCe1); - for( int X=0; X<3; X++){ - for( int Y=0; Y<3; Y++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - dFp1invdF(X,Y,j,C) = 0.; - for( int E=0; E<3; E++){ - for( int Z=0; Z<3; Z++){ - dFp1invdF(X,Y,j,C)-= Fp1inv(X,E)*dFp1dF(E,Z,j,C)*Fp1inv(Z,Y); - }}}}}} + for( int X=0; X<3; X++){ + for( int Y=0; Y<3; Y++){ + for( int j=0; j<3; j++){ + for( int C=0; C<3; C++){ + dFp1invdF(X,Y,j,C) = 0.; + for( int E=0; E<3; E++){ + for( int Z=0; Z<3; Z++){ + dFp1invdF(X,Y,j,C)-= Fp1inv(X,E)*dFp1dF(E,Z,j,C)*Fp1inv(Z,Y); + } + } + } + } + } + } - // dFe / d - for( int i=0; i<3; i++){ - for( int M=0; M<3; M++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - dFe1dF(i,M,j,C) = I2(i,j)*Fp1inv(C,M); - for( int G=0; G<3; G++){ - dFe1dF(i,M,j,C) += Fn(i,G)*dFp1invdF(G,M,j,C); - }}}}} + // dFe / d + for( int i=0; i<3; i++){ + for( int M=0; M<3; M++){ + for( int j=0; j<3; j++){ + for( int C=0; C<3; C++){ + dFe1dF(i,M,j,C) = I2(i,j)*Fp1inv(C,M); + for( int G=0; G<3; G++){ + dFe1dF(i,M,j,C) += Fn(i,G)*dFp1invdF(G,M,j,C); + } + } + } + } + } - for( int i=0; i<3; i++){ - for( int A=0; A<3; A++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - Tangent1(i,A,j,C) = 0.; - for( int M=0; M<3; M++){ - for( int K=0; K<3; K++){ - for( int L=0; L<3; L++){ - for( int S=0; S<3; S++){ - Tangent1(i,A,j,C)+=dFe1dF(i,M,j,C)*dlnCe1(K,L,M,S)*Me1(K,L)*Fp1inv(A,S); - for( int Q=0; Q<3; Q++){ - for( int V=0; V<3; V++){ - for( int E=0; E<3; E++){ - for( int U=0; U<3; U++){ - Tangent1(i,A,j,C)+=Fe1(i,M)*ddlnCe1(K,L,M,S,Q,V)*(I2(Q,U)*Fe1(E,V)+Fe1(E,Q)*I2(V,U)) + for( int i=0; i<3; i++){ + for( int A=0; A<3; A++){ + for( int j=0; j<3; j++){ + for( int C=0; C<3; C++){ + Tangent1(i,A,j,C) = 0.; + for( int M=0; M<3; M++){ + for( int K=0; K<3; K++){ + for( int L=0; L<3; L++){ + for( int S=0; S<3; S++){ + Tangent1(i,A,j,C)+=dFe1dF(i,M,j,C)*dlnCe1(K,L,M,S)*Me1(K,L)*Fp1inv(A,S); + Tangent1(i,A,j,C)+=Fe1(i,M)*dlnCe1(K,L,M,S)*dMe1dF(K,L,j,C)*Fp1inv(A,S); + Tangent1(i,A,j,C)+=Fe1(i,M)*dlnCe1(K,L,M,S)*Me1(K,L)*dFp1invdF(A,S,j,C); + for( int Q=0; Q<3; Q++){ + for( int V=0; V<3; V++){ + for( int E=0; E<3; E++){ + for( int U=0; U<3; U++){ + Tangent1(i,A,j,C)+=Fe1(i,M)*ddlnCe1(K,L,M,S,Q,V)*(I2(Q,U)*Fe1(E,V)+Fe1(E,Q)*I2(V,U)) *dFe1dF(E,U,j,C)*Me1(K,L)*Fp1inv(A,S); - }}}}}}}}}}}} - - for( int i=0; i<3; i++){ - for( int A=0; A<3; A++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - for( int M=0; M<3; M++){ - for( int K=0; K<3; K++){ - for( int L=0; L<3; L++){ - for( int S=0; S<3; S++){ - Tangent1(i,A,j,C)+=Fe1(i,M)*dlnCe1(K,L,M,S)*dMe1dF(K,L,j,C)*Fp1inv(A,S); - }}}}}}}} - - - for( int i=0; i<3; i++){ - for( int A=0; A<3; A++){ - for( int j=0; j<3; j++){ - for( int C=0; C<3; C++){ - for( int M=0; M<3; M++){ - for( int K=0; K<3; K++){ - for( int L=0; L<3; L++){ - for( int S=0; S<3; S++){ - Tangent1(i,A,j,C)+=Fe1(i,M)*dlnCe1(K,L,M,S)*Me1(K,L)*dFp1invdF(A,S,j,C); - }}}}}}}} - - + } + } + } + } + } + } + } + } + } + } + } + } } -void mlawSMP:: computdpdt1(STensor3 &dp1dt,const double j1, const STensor3 &Fn,const STensor3 &Fp1,const STensor3 &Fppr1,const STensor3 &Me1, const STensor3 &dDp1 , +void mlawSMP:: computedPdT1(STensor3 &dP1dT,const double j1, const STensor3 &Fn,const STensor3 &Fp1,const STensor3 &Fppr1,const STensor3 &Me1, const STensor3 &dDp1 , const STensor3 &Ce1,const STensor3 &Cepr1,const double dh,const double T,const double Tg,const double depsilon1,const STensor43 &dexpdDp1, const double G1,const double K1,const double Mu1,const STensor3 C1,const double Hb ,const double Q1, - const STensor3 &N1,const double alalphath,double &dtauepsilon1dt,const double Tau1,const double dG1dt,const double dMu1dt,const double dK1dt,const double dHbdt, - const double dalphadt,const double L1,const double dQ1dt,const double dL1dt,const STensor3 &Fe1, const double dSa1dT) const + const STensor3 &N1,const double alalphath,double &dtauepsilon1dT,const double Tau1,const double dG1dT,const double dMu1dT,const double dK1dT,const double dHbdT, + const double dalphadT,const double L1,const double dQ1dT,const double dL1dT,const STensor3 &Fe1, const double dSa1dT) const - { - double ddepsilon1dt,domega1dt,trlnCepr1,normM1,normdevMe1; - double trC1, normdevlnCepr1; - static STensor3 devlnCepr1 ,lnCe1,dMe1dt,dFp1invdt ,dFp1dt,lnCepr1,devMe1; - static STensor43 dlnCe1,dlnCepr1; - static STensor63 ddlnCe1dce; - double dTau1dt=0.; - - STensorOperation::logSTensor3(Ce1,_order,lnCe1,&dlnCe1,&ddlnCe1dce); - STensorOperation::logSTensor3(Cepr1,_order,lnCepr1,&dlnCepr1); - divatoric(lnCepr1,devlnCepr1); - divatoric(Me1,devMe1); - normdevMe1=devMe1.norm2(); - normdevlnCepr1=devlnCepr1.norm2(); - trlnCepr1=lnCepr1.trace(); - trC1=C1.trace(); - static STensor3 Fp1inv; - Fp1inv=Fp1.invert(); - normM1=Me1.norm2(); - dtauepsilon1dt=0.; dMe1dt*=0.; - - - domega1dt=2./_VOnKb1*(asinh(pow(depsilon1/L1,_m1)))-dG1dt/sqrt(2.)*normdevlnCepr1+dG1dt*depsilon1-1./2.*_alphap*dK1dt*trlnCepr1 - +3.*_alphap*dK1dt*alalphath +3.*_alphap*K1*dalphadt+dSa1dT; - - if (trC1>3.) - { - domega1dt+=dHbdt*pow(sqrt(trC1/3.)-1.,_l1); - } - else - { - - } - - /*if(depsilon1==0.) - { - - } - else*/ - if(depsilon1>0.) - { - domega1dt+=- 2.*T*_m1/_VOnKb1*1./sqrt(pow(depsilon1/L1,2.*_m1)+1.)*pow(L1,-_m1-1.)*pow(depsilon1,_m1)*dL1dt; - } - - if( j1!=0.) - ddepsilon1dt=-domega1dt/j1; - else - ddepsilon1dt=0.; - - - for( int A=0; A<3; A++){ - for( int B=0; B<3; B++){ - dMe1dt(A,B)=dG1dt*devlnCepr1(A,B)-2.*dG1dt*depsilon1*N1(A,B) -2.*G1*N1(A,B)*ddepsilon1dt+1./2.*dK1dt*trlnCepr1*I2(A,B) - -3.*dK1dt*alalphath*I2(A,B)-3.*K1*dalphadt*I2(A,B); - }} - - dtauepsilon1dt=0.; - // dTau1dt=1./sqrt(2.)*normdevlnCepr1*dG1dt-ddepsilon1dt*G1-dG1dt*depsilon1; - if(normM1==0.||normdevMe1==0.) - { - dTau1dt=0.; - } - else{ - for( int A=0; A<3; A++){ - for( int B=0; B<3; B++){ - dTau1dt=1./sqrt(2.)*dMe1dt(A,B)*devMe1(A,B)/normdevMe1 ; - for( int E=0; E<3; E++){ - for( int D=0; D<3; D++){ - dTau1dt-=1./(3.*sqrt(2.))*devMe1(A,B)/normdevMe1*I2(E,D)*dMe1dt(E,D)*I2(A,B) ; - }}}} - - } - dtauepsilon1dt= ddepsilon1dt*Tau1+depsilon1*dTau1dt; - - for( int E=0; E<3; E++){ - for( int Z=0; Z<3; Z++){ - dFp1dt(E,Z)=0.; - for( int I=0; I<3; I++){ - for( int O=0; O<3; O++){ - for( int P=0; P<3; P++){ - dFp1dt(E,Z)+=dexpdDp1(E,I,O,P)*N1(O,P)*ddepsilon1dt*Fppr1(I,Z); - }}}}} - - for( int X=0; X<3; X++){ - for( int Y=0; Y<3; Y++){ - dFp1invdt(X,Y)=0.; - for( int E=0; E<3; E++){ - for( int Z=0; Z<3; Z++){ - dFp1invdt(X,Y)-= Fp1inv(X,E)*dFp1dt(E,Z)*Fp1inv(Z,Y); - }}}} +{ + STensorOperation::zero(dP1dT); + dtauepsilon1dT=0.; + double ddepsilon1dT=0.,domega1dT=0.,trlnCepr1=0.,normM1=0.,trMe1=0.,normdevMe1=0.; + double trC1=0., normdevlnCepr1=0., dTau1dT=0.; + static STensor3 devlnCepr1 ,lnCe1,dMe1dT,dFp1invdT, dFp1dT,lnCepr1,devMe1; + STensorOperation::zero(devlnCepr1); STensorOperation::zero(lnCe1); STensorOperation::zero(dMe1dT); STensorOperation::zero(dFp1invdT); STensorOperation::zero(dFp1dT); + STensorOperation::zero(lnCepr1); STensorOperation::zero(devMe1); + static STensor43 dlnCe1, dlnCepr1; + STensorOperation::zero(dlnCe1); STensorOperation::zero(dlnCepr1); + static STensor63 ddlnCe1dce; + STensorOperation::zero(ddlnCe1dce); + + + STensorOperation::logSTensor3(Ce1,_order,lnCe1,&dlnCe1,&ddlnCe1dce); + STensorOperation::logSTensor3(Cepr1,_order,lnCepr1,&dlnCepr1); + STensorOperation::decomposeDevTr(lnCepr1, devlnCepr1, trlnCepr1); + STensorOperation::decomposeDevTr(Me1, devMe1, trMe1); + normdevMe1=devMe1.norm2(); + normdevlnCepr1=devlnCepr1.norm2(); + trC1=C1.trace(); + static STensor3 Fp1inv; + STensorOperation::inverseSTensor3(Fp1,Fp1inv); + + normM1=Me1.norm2(); + + domega1dT=2./_VOnKb1*(asinh(pow(depsilon1/L1,_m1)))-dG1dT/sqrt(2.)*normdevlnCepr1+dG1dT*depsilon1-1./2.*_alphap*dK1dT*trlnCepr1 + +3.*_alphap*dK1dT*alalphath +3.*_alphap*K1*dalphadT+dSa1dT; + + if (trC1>3.) + { + domega1dT+=dHbdT*pow(sqrt(trC1/3.)-1.,_l1); + } + if(depsilon1>0.) + { + domega1dT+=- 2.*T*_m1/_VOnKb1*1./sqrt(pow(depsilon1/L1,2.*_m1)+1.)*pow(L1,-_m1-1.)*pow(depsilon1,_m1)*dL1dT; + } + + if( j1!=0.) + ddepsilon1dT=-domega1dT/j1; + + for( int A=0; A<3; A++){ + for( int B=0; B<3; B++){ + dMe1dT(A,B)=dG1dT*devlnCepr1(A,B)-2.*dG1dT*depsilon1*N1(A,B) -2.*G1*N1(A,B)*ddepsilon1dT+1./2.*dK1dT*trlnCepr1*I2(A,B) + -3.*dK1dT*alalphath*I2(A,B)-3.*K1*dalphadT*I2(A,B); + } + } + + if(normM1!=0.&&normdevMe1!=0.) + { + dTau1dT=dot(dMe1dT,devMe1)/sqrt(2.)/normdevMe1 ; + dTau1dT-=1./(3.*sqrt(2.))*trMe1/normdevMe1*dMe1dT.trace(); + } + dtauepsilon1dT= ddepsilon1dT*Tau1+depsilon1*dTau1dT; + + for( int E=0; E<3; E++){ + for( int Z=0; Z<3; Z++){ + dFp1dT(E,Z)=0.; + for( int I=0; I<3; I++){ + for( int O=0; O<3; O++){ + for( int P=0; P<3; P++){ + dFp1dT(E,Z)+=dexpdDp1(E,I,O,P)*N1(O,P)*ddepsilon1dT*Fppr1(I,Z); + } + } + } + } + } - dp1dt*=0.; - for( int i=0; i<3; i++){ - for( int A=0; A<3; A++){ - dp1dt(i,A)=0.; - for( int N=0; N<3; N++){ - for( int M=0; M<3; M++){ - for( int K=0; K<3; K++){ - for( int L=0; L<3; L++){ - for( int S=0; S<3; S++){ - dp1dt(i,A)+=Fn(i,N)*dFp1invdt(N,M)*dlnCe1(K,L,M,S)*Me1(K,L)*Fp1inv(A,S); - }}}}}}} - - for( int i=0; i<3; i++){ - for( int A=0; A<3; A++){ - for( int N=0; N<3; N++){ - for( int M=0; M<3; M++){ - for( int K=0; K<3; K++){ - for( int L=0; L<3; L++){ - for( int S=0; S<3; S++){ - dp1dt(i,A)+=Fn(i,N)*Fp1inv(N,M)*dlnCe1(K,L,M,S)*dMe1dt(K,L)*Fp1inv(A,S); - }}}}}}} - - for( int i=0; i<3; i++){ - for( int A=0; A<3; A++){ - for( int N=0; N<3; N++){ - for( int M=0; M<3; M++){ - for( int K=0; K<3; K++){ - for( int L=0; L<3; L++){ - for( int S=0; S<3; S++){ - dp1dt(i,A)+=Fn(i,N)*Fp1inv(N,M)*dlnCe1(K,L,M,S)*Me1(K,L)*dFp1invdt(A,S); - for( int Q=0; Q<3; Q++){ - for( int V=0; V<3; V++){ - for( int E=0; E<3; E++){ - for( int U=0; U<3; U++){ - for( int W=0; W<3; W++){ - dp1dt(i,A)+=Fn(i,N)*Fp1inv(N,M)*ddlnCe1dce(K,L,M,S,Q,V)*(I2(Q,U)*Fe1(E,V)+Fe1(E,Q)*I2(V,U)) - *Fn(E,W)*dFp1invdt(W,V)*Me1(K,L)*Fp1inv(A,S); - }}}}}}}}}}}} - - // Msg("dp1dt",dp1dt); - - } + for( int X=0; X<3; X++){ + for( int Y=0; Y<3; Y++){ + dFp1invdT(X,Y)=0.; + for( int E=0; E<3; E++){ + for( int Z=0; Z<3; Z++){ + dFp1invdT(X,Y)-= Fp1inv(X,E)*dFp1dT(E,Z)*Fp1inv(Z,Y); + } + } + } + } + + for( int i=0; i<3; i++){ + for( int A=0; A<3; A++){ + dP1dT(i,A)=0.; + for( int N=0; N<3; N++){ + for( int M=0; M<3; M++){ + for( int K=0; K<3; K++){ + for( int L=0; L<3; L++){ + for( int S=0; S<3; S++){ + dP1dT(i,A)+=Fn(i,N)*dFp1invdT(N,M)*dlnCe1(K,L,M,S)*Me1(K,L)*Fp1inv(A,S); + dP1dT(i,A)+=Fn(i,N)*Fp1inv(N,M)*dlnCe1(K,L,M,S)*dMe1dT(K,L)*Fp1inv(A,S); + dP1dT(i,A)+=Fn(i,N)*Fp1inv(N,M)*dlnCe1(K,L,M,S)*Me1(K,L)*dFp1invdT(A,S); + for( int Q=0; Q<3; Q++){ + for( int V=0; V<3; V++){ + for( int E=0; E<3; E++){ + for( int U=0; U<3; U++){ + for( int W=0; W<3; W++){ + dP1dT(i,A)+=Fn(i,N)*Fp1inv(N,M)*ddlnCe1dce(K,L,M,S,Q,V)*(I2(Q,U)*Fe1(E,V)+Fe1(E,Q)*I2(V,U)) + *Fn(E,W)*dFp1invdT(W,V)*Me1(K,L)*Fp1inv(A,S); + } + } + } + } + } + } + } + } + } + } + } + } +} diff --git a/NonLinearSolver/materialLaw/mlawSMP.h b/NonLinearSolver/materialLaw/mlawSMP.h index ca80956c1fc4235f433184d3af3a61041defc680..615ca53e7473a6483480a73255e91bcc333b0b27 100644 --- a/NonLinearSolver/materialLaw/mlawSMP.h +++ b/NonLinearSolver/materialLaw/mlawSMP.h @@ -16,12 +16,12 @@ #include "STensor63.h" #include "ipSMP.h" - const STensor43 I4(1.,1.); - const STensor3 I2(1.); class mlawSMP : public mlawThermalConducter { protected: + const STensor43 I4; + const STensor3 I2; double _mu_groundState3, _Im3; double _pi; double _Tr,_mu_groundState2,_Nmu_groundState2, _Im2,_Sgl2,_Sr2,_Delta,_m2, _epsilonr,_n, _epsilonp02 ; @@ -34,11 +34,10 @@ class mlawSMP : public mlawThermalConducter STensor3 _alphaDilatation; STensor3 _Stiff_alphaDilatation; int _order; + bool _mechanism2; -private: - // mutable STensor3 Cedis; public: - mlawSMP(const int num,const double rho,const double alpha, const double beta, const double gamma ,const double t0, const double Kx,const double Ky, const double Kz, + mlawSMP(const int num,const double rho,const double alpha, const double beta, const double gamma ,const double t0, const double Kx,const double Ky, const double Kz, const double mu_groundState3,const double Im3, const double pi,const double Tr, const double Nmu_groundState2 ,const double mu_groundState2 , const double Im2,const double Sgl2,const double Sr2,const double Delta,const double m2, const double epsilonr ,const double n,const double epsilonp02, const double alphar1,const double alphagl1,const double Ggl1,const double Gr1 ,const double Mgl1,const double Mr1,const double Mugl1, @@ -61,6 +60,8 @@ private: public: void setStrainOrder(const int order){_order = order;}; + virtual void setMechanism2(bool mechanism2) {_mechanism2=mechanism2;}; + virtual double getSa0() const { return _Sa0;} virtual double getPhia0() const { return _phia01;} virtual double getSastar0() const { return -_b1*_phia01;} @@ -168,7 +169,6 @@ public: virtual void vectortomatricedomega( STensor43 &domega2dM24ord,const fullMatrix<double> &domega2dM2)const; virtual void matricetovectordomega(const STensor43 &domega2dM24ord,fullMatrix<double> &domega2dM2)const; - virtual void todistrotionalj(const STensor3 &Fn, double &inv2t) const; virtual void computeResidual2( STensor3 &ome2,const STensor3 &Cebar2,const STensor3 &M2, const STensor3 &dDp2,const STensor3 &Cepr2,const double Gmu_groundState2/*,const STensor3 expdDp2*/) const; virtual void computeJacobian2(STensor43 &domega2dM24ord, const STensor3 &Ce2,const STensor3 &M2, @@ -180,11 +180,11 @@ public: ,STensor3 &Cebar2,STensor3 &Cebarpr2,const double dh, STensor3 &Fp2,const double St2/*,STensor3 &expdDp2,STensor43 *dexpdDp2*/) const; virtual void tangent2(STensor43 &Tangent2,/*STensor43 &dFp2invdF,*/ const STensor3 &Fn, const STensor3 &Fp2,const STensor3 &SP2,const double Gmu_groundState2 , const STensor43 &dFp2dF, const STensor3 &Fe2, const STensor3 &Cebar2, const double invJ2third,const double T,const double Tg,const STensor43 &dSP2dF) const; - virtual void computintvardfpdf2(STensor43 &dFp2dF,const fullMatrix<double> &domega2dM2inv, const STensor3 &Fn, const STensor3 &Fppr2, + virtual void computeInternalVariabledfpdf2(STensor43 &dFp2dF,const fullMatrix<double> &domega2dM2inv, const STensor3 &Fn, const STensor3 &Fppr2, const STensor3 &SP2,const double Gmu_groundState2, const STensor3 &M2,const STensor3 &dDp2 , const STensor3 &Cebar2, const double invJ2third,const STensor3 &Cebarpr2, const double dh,const double St2,const double Ta2,const double depsilon2,STensor3 &dtauepsilon2dF, const STensor3 &dTgdF,const double T, const double Tg,const STensor3 &dSt2dF,STensor43 &dSP2dF) const; - virtual void computdpdt2(STensor3 &dp2dt,const fullMatrix<double> &domega2dM2inv, const STensor3 &Fn,/*,const STensor3 &Fp0,*/ const STensor3 &Fp2 + virtual void computedPdT2(STensor3 &dp2dt,const fullMatrix<double> &domega2dM2inv, const STensor3 &Fn,/*,const STensor3 &Fp0,*/ const STensor3 &Fp2 ,const STensor3 &Fp0,const STensor3 &SP2, const double Gmu_groundState2, const STensor3 &M2,const STensor3 &dDp2 , const STensor3 &Cebar2, const STensor3 &Ceprbar2,const double dh,const double St2,const double T,const double Tg,const double invJ2third ,double &dtauepsilon2dt,const double Ta2,const double depsilon2,double dSt2dT ) const; @@ -197,34 +197,33 @@ public: virtual void deltaepsilon1(const double TauE1,const double Q1,const double T,const double Tg,const double dh,double &depsilon1) const; virtual void computeResidual1( double &ome1,const STensor3 &lnCepr1,const double L1,const double Sa1,const double Sb1,const double depsilon1,const double T, const double Tg,const double K1,const double G1,const double Q1,const double dh,const double alalphath) const; - virtual void divatoric(const STensor3 &a, STensor3 &diva) const; - virtual void computSaphi(const double depsilon1 ,const double Sa0,const double phai0,const double T,const double Tg, + virtual void computeSaphi(const double depsilon1 ,const double Sa0,const double phai0,const double T,const double Tg, const double dh,double &phaistar0,double &Sastar0,double &Sa1,double &Sastar1,double &phai1,double &phaistar1,double &dSa1depsilon, double &dSa1dTg, double &dSa1dT)const; virtual void computeJacobian1(double &j1 , const double depsilon1,const double T, const double Tg, const double G1,const double L1, const double dSa1depsilon) const; - virtual void computM1(const STensor3& devlnCepr1,const STensor3& lnCepr1,const double depsilon1, const STensor3 &N1,const double T ,const double Tg, + virtual void computeM1(const STensor3& devlnCepr1,const STensor3& lnCepr1,const double depsilon1, const STensor3 &N1,const double T ,const double Tg, const double G1,const double Mu1, const double K1,STensor3 &Me1,const double dh,const double alalphath)const; - virtual void computTauE(const STensor3 &Me1,const STensor3 &devlnCepr1,const STensor3 &lnCepr1,const double depsilon1,const double G1,const double K1,const double Sa1, + virtual void computeTauE(const STensor3 &Me1,const STensor3 &devlnCepr1,const STensor3 &lnCepr1,const double depsilon1,const double G1,const double K1,const double Sa1, const double Sb1,const double T ,const double Tg, double &TauE1,double &tau1,const double alalphath)const; virtual void tangent1(STensor43 &Tangent1,const STensor43 &dMe1dF,const STensor3 &Fn, const STensor3 &Fp1,const STensor3 &Me1, const STensor43 &dFp1dF, const STensor3 &Fe1, const STensor3 &Ce1) const; - virtual void computintvardfpdf1(STensor43 &dFp1dF,STensor43 &dMe1dF,const double j1, const STensor3 &Fn, const STensor3 &Fppr1, const STensor3 &Cepr1 ,const STensor3 &N1, + virtual void computeInternalVariabledfpdf1(STensor43 &dFp1dF,STensor43 &dMe1dF,const double j1, const STensor3 &Fn, const STensor3 &Fppr1, const STensor3 &Cepr1 ,const STensor3 &N1, const double dh,const double depsilon1,const STensor43 &dexpdDp1,const double T, const double Tg,const double G1,const double K1, const STensor3 &C1,const double Hb,STensor3 &dtauepsilondF,const double Tau1,const STensor3& F0,const double alalphath,const double Q1, const double TauE1,const STensor3 &dTgdF,const STensor3 &dG1dF,const STensor3 &dMu1dF,const STensor3 &dK1dF,const STensor3 &dQ1dF ,const STensor3 &dHbdF,const STensor3 &dthermalalphadF,const double L1,const STensor3 &dL1dF,const STensor3 &Me1, const double dSa1dTg) const; - virtual void computdpdt1(STensor3 &dp1dt,const double j1, const STensor3 &Fn,const STensor3 &Fp1,const STensor3 &Fppr1,const STensor3 &Me1, const STensor3 &dDp1 , + virtual void computedPdT1(STensor3 &dp1dt,const double j1, const STensor3 &Fn,const STensor3 &Fp1,const STensor3 &Fppr1,const STensor3 &Me1, const STensor3 &dDp1 , const STensor3 &Ce1,const STensor3 &Cepr1,const double dh,const double T,const double Tg,const double depsilon1,const STensor43 &dexpdDp1, const double G1,const double K1,const double Mu1,const STensor3 C1,const double Hb ,const double Q1,/*const double L1,*/ const STensor3 &N1,const double alalphath,double &dtauepsilon1dt,const double Tau1,const double dG1dt,const double dMu1dt,const double dK1dt,const double dHbdt, const double dalphadt,const double L1,const double dQ1dt,const double dL1dt,const STensor3 &Fe1, const double dSa1dT) const; - virtual void computthermalalpha(const double T ,const double Tg, double &thermalalpha,double &dthermalalphadt, double &dthermalalphadtg)const; + virtual void computeThermalAlpha(const double T ,const double Tg, double &thermalalpha,double &dthermalalphadt, double &dthermalalphadtg)const; //virtual void derivativethermalalpha(const double T ,const double Tg, double &dthermalalphadt)const; virtual void heatcapacity(double &d2epsi1dt2, const STensor3 &N1,const STensor3 &Cepr1,const double T,const double Tg, const double G1,const double K1,const double Mu1,const double depsilon1 ) const {}; virtual void glassTrans(const STensor3& F0,const STensor3& Fn,const double T,double &Tg,STensor3& dTgdF)const; //virtual void derivativethermalalphadtg(const double T ,const double Tg, double &dthermalalphadtg)const; - virtual void computparameter1(const double T ,const double Tg,const STensor3 &dTgdF,bool stiff,double &G1,double &Mu1, double &K1,double &Hb,double &Q1,STensor3 &dG1dF,STensor3 &dMu1dF, + virtual void computeParameter1(const double T ,const double Tg,const STensor3 &dTgdF,bool stiff,double &G1,double &Mu1, double &K1,double &Hb,double &Q1,STensor3 &dG1dF,STensor3 &dMu1dF, STensor3 &dK1dF,STensor3 &dQ1dF,STensor3 &dHbdF,double &dG1dt,double &dMu1dt,double &dK1dt,double &dHbdt,const double dthermalalphadtg ,STensor3 &dthermalalphaddF,double &dQ1dt,double &L1,double &dL1dt,STensor3 &dL1dF,const double dh)const; diff --git a/NonLinearSolver/nlsolver/endSchemeMonitoring.cpp b/NonLinearSolver/nlsolver/endSchemeMonitoring.cpp index 995a48f124443e0b4e3fe9f156fd6bf4633804c5..2d82b8f1ed008b4f847fa2d1bdec21cb0749014e 100644 --- a/NonLinearSolver/nlsolver/endSchemeMonitoring.cpp +++ b/NonLinearSolver/nlsolver/endSchemeMonitoring.cpp @@ -18,7 +18,8 @@ bool EndSchemeMonitoringWithZeroLoad::willEnd(const nonLinearMechSolver* solver) const std::vector<partDomain*>& allDom = *(solver->getDomainVector()); const IPField* ipf = solver->getIPField(); - STensor3 Phomo(0.); + static STensor3 Phomo; + STensorOperation::zero(Phomo); double vsolid = 0.; for (int i=0; i< allDom.size(); i++){ diff --git a/NonLinearSolver/nlsolver/nonLinearMechSolver.cpp b/NonLinearSolver/nlsolver/nonLinearMechSolver.cpp index bfb89f6f78749f5dd509666de3603cd048e7450f..ecd3c59c9e4c97f261e0149745a6844a9e91a089 100644 --- a/NonLinearSolver/nlsolver/nonLinearMechSolver.cpp +++ b/NonLinearSolver/nlsolver/nonLinearMechSolver.cpp @@ -109,7 +109,7 @@ _isHommProSaveToFile(true), _tangentPerturbation(1.e-8), _perturbate(false), _fragmentationFile(NULL), _energyComputation(1), _fractureEnergyComputation(0), _timeStepByBenson(false),_lineSearch(false),_strainMap(NULL),_strainMappingFollwing(true), - _GmshOneLabViewNum(0), _isWriteDeformedMeshToFile(false),_FFile(NULL),_isPerturbedEigenMode(false),_numberPerturbedMode(1),_valPerturbedMode(1.), + _GmshOneLabViewNum(0), _isWriteDeformedMeshToFile(false),_isPerturbedEigenMode(false),_numberPerturbedMode(1),_valPerturbedMode(1.), _pbcGroup(NULL),_testFlag(false),_homogenizedStressPBC(NULL), _homogenizedStrainPBC(NULL), _eigenSolverType(DYNAMIC),_eigenSolverNumIteration(20),_eigenSolverMethod("krylovschur"), _eigenSolverConvergenCriterion(1e-6), _MKToFile(false),_lostSolutionUniquenssNormal(0.,0.,0.), _surfaceReductionRatio(1.), @@ -130,7 +130,8 @@ _GModelIsRotated(false), _checkFailureOnset(false), _damageVolumeCenter(0.,0.,0.),_homogenizedCrackSurface(0.), _microBCOld(NULL),_microFailureBC(NULL), _failureBCIsSwitched(false), - _pathFollowingSwitchCriterion(0.), _failureBasedOnPreviousState(true) + _pathFollowingSwitchCriterion(0.), _failureBasedOnPreviousState(true), + _currentTime(0.),_timeStep(0.) { // check parallelization of dofManager #if defined(HAVE_MPI) @@ -1138,13 +1139,6 @@ void nonLinearMechSolver::oneStepPostSolve(const double curtime, const int numst this->pathFollowingArchiving(curtime,numstep,pAssembler); this->computeIPCompOnDomain(curtime); this->computeIPCompDamageZoneAveraging(curtime); - - if (_FFile != NULL){ - for (int i=0; i<domainVector.size(); i++){ - partDomain* dom = domainVector[i]; - dom->writeDeformationGradient(_ipf,_FFile); - } - } if (domainVolumeIntegralFile.size() > 0){ for (std::map<int,FILE*>::iterator it = domainVolumeIntegralFile.begin(); it != domainVolumeIntegralFile.end(); it++){ @@ -2904,13 +2898,13 @@ double nonLinearMechSolver::solveEigen() linearSystemPETSc<double>* Apet = dynamic_cast<linearSystemPETSc<double>*>(lsysA); if (Apet!= NULL) { - MatToFile(Apet->getMatrix(),"Mat_Stiffness.txt"); + functionPETSc::MatToFile(Apet->getMatrix(),"Mat_Stiffness.txt"); linearSystemPETSc<double>* Bpet = dynamic_cast<linearSystemPETSc<double>*>(lsysB); if (Bpet!= NULL) { - MatToFile(Bpet->getMatrix(),"Mat_Mass.txt"); + functionPETSc::MatToFile(Bpet->getMatrix(),"Mat_Mass.txt"); }; - } + } #endif } @@ -8109,11 +8103,6 @@ void nonLinearMechSolver::setTimeForMicroBC(const double time){ } }; -void nonLinearMechSolver::writeDeformationGradient(const std::string filename){ - _FFile = fopen(filename.c_str(),"w"); - fprintf(_FFile,"e;x;y;z;Fxx;Fxy;Fxz;Fyx;Fyy;Fyz;Fzx;Fzy;Fzz\n"); -}; - void nonLinearMechSolver::microNumberDof(){ if (_pathFollowing){ _systemType = MULT_ELIM; @@ -11068,6 +11057,11 @@ double nonLinearMechSolver::solveMicroSolverForwardEuler(){ }; }; +void nonLinearMechSolver::setTime(const double ctime,const double dtime){ + _timeStep = dtime; + _currentTime = ctime; +} + double nonLinearMechSolver::microSolveStaticLinear(){ double t= Cpu(); initMicroSolver(); @@ -11446,12 +11440,12 @@ lsys=pAssembler->getLinearSystem(name); linearSystemPETSc<double>* lpet=dynamic_cast<linearSystemPETSc<double>*>(lsys); if(lpet==NULL)return; else{ - MatToFile(lpet->getMatrix(),"data/Mat_Stiffness.txt"); + functionPETSc::MatToFile(lpet->getMatrix(),"data/Mat_Stiffness.txt"); } implicitHulbertChungPetsc<double>* hcsys=dynamic_cast<implicitHulbertChungPetsc<double>*>(lsys); if(hcsys==NULL)return; else{ - MatToFile(hcsys->getMassMatrix(),"data/Mat_Mass.txt"); + functionPETSc::MatToFile(hcsys->getMassMatrix(),"data/Mat_Mass.txt"); } #endif }; diff --git a/NonLinearSolver/nlsolver/nonLinearMechSolver.h b/NonLinearSolver/nlsolver/nonLinearMechSolver.h index 29ed19f214c3f837b6081525040728ca787ba40a..f2ad270b26a02434b48aa0e734e3a3ad3fd6361d 100644 --- a/NonLinearSolver/nlsolver/nonLinearMechSolver.h +++ b/NonLinearSolver/nlsolver/nonLinearMechSolver.h @@ -331,7 +331,6 @@ class nonLinearMechSolver FILE* _controlStateFile; // For Onelab display mutable int _GmshOneLabViewNum; - FILE* _FFile; bool _bulkElementErosionFlag; // true if bulk element erosion bool _interfaceElementErosionFlag; // true if interface element erosion @@ -507,6 +506,9 @@ class nonLinearMechSolver GModel* getGModel(); const GModel* getGModel() const; + std::map<int,materialLaw*> getMaplaw() {return maplaw;}; + const std::map<int,materialLaw*> getMaplaw() const {return maplaw;}; + bool withFailureBasedOnPreviousState() const {return _failureBasedOnPreviousState;}; #endif @@ -637,7 +639,6 @@ class nonLinearMechSolver virtual void createStrainMapping(const std::string filename); virtual void setStrainMappingFollowing(const bool flag); - virtual void writeDeformationGradient(const std::string filename); // Get the value of a Dof contained in a txt file virtual double getArchivedNodalValue(const int numphys,const int comp,nonLinearBoundaryCondition::whichCondition) const; virtual double getArchivedForceOnPhysicalGroup(std::string onwhat, const int numphys,const int comp) const; @@ -706,6 +707,10 @@ class nonLinearMechSolver **/ protected: #ifndef SWIG + // time and time step + double _timeStep; // for law which works on increment. (Use only in so no getTimeStep function) + double _currentTime; // To save results vs time + //for micro flag SYSTEM_TYPE _systemType; CONTROL_TYPE _controlType; @@ -857,6 +862,7 @@ class nonLinearMechSolver #endif // SWIG public: #ifndef SWIG + void setTime(const double ctime,const double dtime); // RVE analysis newton raphson double microSolveStaticLinear(); double microSolveSNL(); diff --git a/NonLinearSolver/periodicBC/extractMacroPropertiesInterpolationPETSc.cpp b/NonLinearSolver/periodicBC/extractMacroPropertiesInterpolationPETSc.cpp index eb1aa5260fe087662c8ce954b76dc7ded901595d..12821c1b19ee8f15d1093ee6fb46b161871f77e6 100644 --- a/NonLinearSolver/periodicBC/extractMacroPropertiesInterpolationPETSc.cpp +++ b/NonLinearSolver/periodicBC/extractMacroPropertiesInterpolationPETSc.cpp @@ -188,7 +188,7 @@ void interpolationStiffnessCondensationPETSC::tangentCondensationSolve(fullMatri Mat Kbbt, Kbct, Kcbt, Kcct; - _try(CondenseMatrixBlocks(Kii,Kib,Kic,Kbi,Kbb,Kbc,Kci,Kcb,Kcc,&Kbbt,&Kbct,&Kcbt,&Kcct)); + _try(functionPETSc::CondenseMatrixBlocks(Kii,Kib,Kic,Kbi,Kbb,Kbc,Kci,Kcb,Kcc,&Kbbt,&Kbct,&Kcbt,&Kcct)); Mat& C = _bConMat->getFirstMatrix(); Mat& Sb = _bConMat->getKinematicalMatrix(); @@ -235,7 +235,7 @@ void interpolationStiffnessCondensationPETSC::tangentCondensationSolve(fullMatri _try(MatDestroy(&ScTKcct)); Mat L; - _try(CondenseMatrixBlocks(Kbbstar,Sbcstar,Scbstar,Sccstar,&L)); + _try(functionPETSc::CondenseMatrixBlocks(Kbbstar,Sbcstar,Scbstar,Sccstar,&L)); _try(MatAssemblyBegin(L,MAT_FINAL_ASSEMBLY)); _try(MatAssemblyEnd(L,MAT_FINAL_ASSEMBLY)); diff --git a/NonLinearSolver/periodicBC/extractMacroPropertiesLDBCPETSc.cpp b/NonLinearSolver/periodicBC/extractMacroPropertiesLDBCPETSc.cpp index df3fd31b7951235ca73a7e60b25c83fa794dfea1..18d75c596ef1510269af6d320ff1afe896283550 100644 --- a/NonLinearSolver/periodicBC/extractMacroPropertiesLDBCPETSc.cpp +++ b/NonLinearSolver/periodicBC/extractMacroPropertiesLDBCPETSc.cpp @@ -140,7 +140,7 @@ void stiffnessCondensationLDBCPETSc::tangentCondensationSolve(fullMatrix<double> _try(MatTransposeMatMult(S,Kbi,MAT_INITIAL_MATRIX,PETSC_DECIDE,&Kbit)); Mat L; - _try(CondenseMatrixBlocks(Kii,Kibt,Kbit,Kbbt,&L)); + _try(functionPETSc::CondenseMatrixBlocks(Kii,Kibt,Kbit,Kbbt,&L)); for (int row = 0; row< nK; ++row){ for (int col = 0; col< nK; ++col){ PetscScalar val; diff --git a/NonLinearSolver/periodicBC/extractMacroPropertiesPETSc.cpp b/NonLinearSolver/periodicBC/extractMacroPropertiesPETSc.cpp index 5ab924ad4c5ef61033cf9233e067d3b2c74268c9..b75b034020608a05493ce2df37088819fa7a2cce 100644 --- a/NonLinearSolver/periodicBC/extractMacroPropertiesPETSc.cpp +++ b/NonLinearSolver/periodicBC/extractMacroPropertiesPETSc.cpp @@ -59,7 +59,7 @@ void stiffnessCondensationPETScWithDirectConstraints::init(){ Mat CbCbT; _try(MatMatTransposeMult(Cb,Cb,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&CbCbT)); Mat invCbCbT; - _try(MatInverse_MatMatSolve(CbCbT, &invCbCbT,_comm)); + _try(functionPETSc::MatInverse_MatMatSolve(CbCbT, &invCbCbT,_comm)); _try(MatMatMult(invCbCbT,Cb,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&_RT)); _try(MatDestroy(&CbCbT)); _try(MatDestroy(&invCbCbT)); @@ -207,7 +207,7 @@ void stiffnessCondensationPETScWithDirectConstraints::tangentCondensationSolve(f // first condensation step Mat Kbbt, Kbct, Kcbt, Kcct; - _try(CondenseMatrixBlocks(Kii,Kib,Kic,Kbi,Kbb,Kbc,Kci,Kcb,Kcc,&Kbbt,&Kbct,&Kcbt,&Kcct)); + _try(functionPETSc::CondenseMatrixBlocks(Kii,Kib,Kic,Kbi,Kbb,Kbc,Kci,Kcb,Kcc,&Kbbt,&Kbct,&Kcbt,&Kcct)); Mat& Cc = _bConMat->getSecondMatrix(); Mat& Cb = _bConMat->getFirstMatrix(); @@ -217,7 +217,7 @@ void stiffnessCondensationPETScWithDirectConstraints::tangentCondensationSolve(f Mat Kccstar, Kblambda, Cbc, Ccb; _try(MatConvert(Cb,MATDENSE,MAT_REUSE_MATRIX,&Cb)); _try(MatConvert(_CbT,MATDENSE,MAT_REUSE_MATRIX,&_CbT)); - _try(CondenseMatrixBlocks(Kbbt,Kbct,_CbT,Kcbt,Kcct,_CcT,Cb,Cc,PETSC_NULL,&Kccstar,&Ccb,&Cbc,&Kblambda)); + _try(functionPETSc::CondenseMatrixBlocks(Kbbt,Kbct,_CbT,Kcbt,Kcct,_CcT,Cb,Cc,PETSC_NULL,&Kccstar,&Ccb,&Cbc,&Kblambda)); Mat Sbc, Scb, Scc; @@ -236,7 +236,7 @@ void stiffnessCondensationPETScWithDirectConstraints::tangentCondensationSolve(f _try(MatDestroy(&ScTKccstar)); Mat L; - _try(CondenseMatrixBlocks(Kblambda,Sbc,Scb,Scc,&L)); + _try(functionPETSc::CondenseMatrixBlocks(Kblambda,Sbc,Scb,Scc,&L)); for (int row = 0; row< nK; ++row){ for (int col = 0; col< nK; ++col){ @@ -299,7 +299,7 @@ void stiffnessCondensationPETScWithoutDirectConstraints::init(){ // first order matrix Mat& S = _bConMat->getKinematicalMatrix(); // - _try(MatMatSolve_MultipleRHS(Cb,Cc,S,&_Cbc,&_Sbc)); + _try(functionPETSc::MatMatSolve_MultipleRHS(Cb,Cc,S,&_Cbc,&_Sbc)); _try(MatScale(_Cbc,-1.)); } }; @@ -405,7 +405,7 @@ void stiffnessCondensationPETScWithoutDirectConstraints::tangentCondensationSolv // condense to other matrix by solving Schur problem Mat Kbbt, Kbct, Kcbt, Kcct; - _try(CondenseMatrixBlocks(Kii,Kib,Kic,Kbi,Kbb,Kbc,Kci,Kcb,Kcc,&Kbbt,&Kbct,&Kcbt,&Kcct)); + _try(functionPETSc::CondenseMatrixBlocks(Kii,Kib,Kic,Kbi,Kbb,Kbc,Kci,Kcb,Kcc,&Kbbt,&Kbct,&Kcbt,&Kcct)); Mat Kstar; if (nc>0){ @@ -424,7 +424,7 @@ void stiffnessCondensationPETScWithoutDirectConstraints::tangentCondensationSolv _try(MatDestroy(&mattemp)); - _try(CondenseMatrixBlocks(Kccstar,Kcbstar,Kbcstar,Kbbt,&Kstar)); + _try(functionPETSc::CondenseMatrixBlocks(Kccstar,Kcbstar,Kbcstar,Kbbt,&Kstar)); _try(MatDestroy(&Kccstar)); _try(MatDestroy(&Kcbstar)); _try(MatDestroy(&Kbcstar)); @@ -492,7 +492,7 @@ void stiffnessCondensationPETSc::init(){ Mat CCT; _try(MatMatTransposeMult(C,C,MAT_INITIAL_MATRIX,PETSC_DECIDE,&CCT)); Mat invCCT; - _try(MatInverse_MatMatSolve(CCT, &invCCT,_comm)); + _try(functionPETSc::MatInverse_MatMatSolve(CCT, &invCCT,_comm)); _try(MatMatMult(invCCT,C,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&_RT)); _try(MatDestroy(&CCT)); _try(MatDestroy(&invCCT)); @@ -593,16 +593,16 @@ void stiffnessCondensationPETSc::tangentCondensationSolve(fullMatrix<double>& ta // condense to other matrix by solving Schur problem Mat Kbbt; - _try(CondenseMatrixBlocks(Kii,Kib,Kbi,Kbb,&Kbbt)); + _try(functionPETSc::CondenseMatrixBlocks(Kii,Kib,Kbi,Kbb,&Kbbt)); Mat& C = _bConMat->getFirstMatrix(); // first order matrix Mat& S = _bConMat->getKinematicalMatrix(); Mat Kstar; - _try(CondenseMatrixBlocks(Kbbt,_CT,C,PETSC_NULL,&Kstar)); + _try(functionPETSc::CondenseMatrixBlocks(Kbbt,_CT,C,PETSC_NULL,&Kstar)); Mat L; - _try(CondenseMatrixBlocks(Kstar,S,_ST,PETSC_NULL,&L)); + _try(functionPETSc::CondenseMatrixBlocks(Kstar,S,_ST,PETSC_NULL,&L)); for (int row = 0; row< nK; ++row){ for (int col = 0; col<nK; ++col){ diff --git a/NonLinearSolver/periodicBC/functionPETSc.cpp b/NonLinearSolver/periodicBC/functionPETSc.cpp index 6c06f5c1e3eb162a1a6fe38007d6a0af863b8efd..d51c029ec03a2060371f16cc7a217b121fcd6d98 100644 --- a/NonLinearSolver/periodicBC/functionPETSc.cpp +++ b/NonLinearSolver/periodicBC/functionPETSc.cpp @@ -17,7 +17,7 @@ #define MatCreateVecs(mat, right, left) MatGetVecs(mat, right, left) #endif -void MatToFile(Mat const & a, const std::string filename){ +void functionPETSc::MatToFile(Mat const & a, const std::string filename){ FILE* file = fopen(filename.c_str(),"w"); PetscInt M, N, err; PetscBool isAssembled; @@ -38,7 +38,7 @@ void MatToFile(Mat const & a, const std::string filename){ fclose(file); }; -void VecToFile(Vec& a,const std::string filename){ +void functionPETSc::VecToFile(Vec& a,const std::string filename){ FILE* file = fopen(filename.c_str(),"w"); PetscInt size, err; err = VecGetSize(a,&size);CHKERRABORT(PETSC_COMM_WORLD,err); @@ -60,7 +60,7 @@ void VecToFile(Vec& a,const std::string filename){ // 0 - superlu, 1- superlu-dist, 2-mumps, 3- umfpack petsclu ortherwise */ -PetscErrorCode GetFactorMatrix(Mat A11, Mat* F){ +PetscErrorCode functionPETSc::GetFactorMatrix(Mat A11, Mat* F){ Msg::Info("Begin performing factorize matrix"); double t = Cpu(); // convert to aij matrix if necessary @@ -141,7 +141,7 @@ PetscErrorCode GetFactorMatrix(Mat A11, Mat* F){ }; -PetscErrorCode CondenseMatrixBlocks(Mat A11, Mat A12, Mat A13, +PetscErrorCode functionPETSc::CondenseMatrixBlocks(Mat A11, Mat A12, Mat A13, Mat A21, Mat A22, Mat A23, Mat A31, Mat A32, Mat A33, Mat* B22, Mat* B23, @@ -205,14 +205,14 @@ PetscErrorCode CondenseMatrixBlocks(Mat A11, Mat A12, Mat A13, PetscFunctionReturn(0); }; -PetscErrorCode CondenseMatrixBlocks(Mat A11, Mat A12, +PetscErrorCode functionPETSc::CondenseMatrixBlocks(Mat A11, Mat A12, Mat A21, Mat A22, Mat* B22){ Msg::Info("Begin performing 2x2 to 1 condensation"); double t = Cpu(); Mat F; // factored matrix - _try(GetFactorMatrix(A11,&F)); + _try(functionPETSc::GetFactorMatrix(A11,&F)); // Mat invA11A12; @@ -299,7 +299,7 @@ struct MatMUMPS{ }; #endif -PetscErrorCode MatGetDeterminant(Mat A, PetscReal* realpart, PetscReal* imagpart, PetscInt* ex){ +PetscErrorCode functionPETSc::MatGetDeterminant(Mat A, PetscReal* realpart, PetscReal* imagpart, PetscInt* ex){ #ifdef PETSC_HAVE_MUMPS MatMUMPS* FF = (MatMUMPS*)A->spptr; @@ -319,7 +319,7 @@ PetscErrorCode MatGetDeterminant(Mat A, PetscReal* realpart, PetscReal* imagpart }; // use MatMatSolve to compute schur complement -PetscErrorCode GetSchurComplementMat(Mat fA11, Mat A12, Mat A21, Mat A22, Mat* A){ +PetscErrorCode functionPETSc::GetSchurComplementMat(Mat fA11, Mat A12, Mat A21, Mat A22, Mat* A){ #ifdef _DEBUG Msg::Info("Begin computing Schur complement"); #endif @@ -351,7 +351,7 @@ PetscErrorCode GetSchurComplementMat(Mat fA11, Mat A12, Mat A21, Mat A22, Mat* A PetscFunctionReturn(0); }; -PetscErrorCode GetSchurComplementMat_Naive(KSP& ksp, Mat A11, Mat A12, Mat A21, Mat A22, Mat* A){ +PetscErrorCode functionPETSc::GetSchurComplementMat_Naive(KSP& ksp, Mat A11, Mat A12, Mat A21, Mat A22, Mat* A){ MPI_Comm comm = PETSC_COMM_WORLD; //Msg::Info("Begin computing Schur complement"); _try(MatAssemblyBegin(A12,MAT_FINAL_ASSEMBLY)); @@ -429,7 +429,7 @@ PetscErrorCode GetSchurComplementMat_Naive(KSP& ksp, Mat A11, Mat A12, Mat A21, }; -PetscErrorCode MatInverse_MatMatSolve(Mat A, Mat* B, MPI_Comm comm){ +PetscErrorCode functionPETSc::MatInverse_MatMatSolve(Mat A, Mat* B, MPI_Comm comm){ Msg::Info("Begin inverting matrix MatInverse_MatMatSolve"); double t = Cpu(); PetscInt M, N; @@ -437,7 +437,7 @@ PetscErrorCode MatInverse_MatMatSolve(Mat A, Mat* B, MPI_Comm comm){ if (M != N) Msg::Fatal("it is not a squared matrix"); Mat F; - _try(GetFactorMatrix(A,&F)); + _try(functionPETSc::GetFactorMatrix(A,&F)); // create multiple RHS identity matrix Mat I; @@ -464,7 +464,7 @@ PetscErrorCode MatInverse_MatMatSolve(Mat A, Mat* B, MPI_Comm comm){ -PetscErrorCode MatInverse_Naive(Mat A, Mat* B, MPI_Comm comm){ +PetscErrorCode functionPETSc::MatInverse_Naive(Mat A, Mat* B, MPI_Comm comm){ Msg::Info("Begin inverting matrix MatInverse_Naive"); double t = Cpu(); PetscInt M,N; @@ -525,7 +525,7 @@ PetscErrorCode MatInverse_Naive(Mat A, Mat* B, MPI_Comm comm){ PetscFunctionReturn(0); }; -PetscErrorCode MatMatSolve_MultipleRHS(Mat A, Mat RHS, Mat* B){ +PetscErrorCode functionPETSc::MatMatSolve_MultipleRHS(Mat A, Mat RHS, Mat* B){ Msg::Info("Begin performing MatMatSolve_MultipleRHS"); double t = Cpu(); PetscInt M, N; @@ -533,7 +533,7 @@ PetscErrorCode MatMatSolve_MultipleRHS(Mat A, Mat RHS, Mat* B){ if (M != N) Msg::Fatal("it is not a squared matrix"); Mat F; - _try(GetFactorMatrix(A,&F)); + _try(functionPETSc::GetFactorMatrix(A,&F)); // create multiple RHS dense matrix _try(MatDuplicate(RHS,MAT_DO_NOT_COPY_VALUES,B)); @@ -548,7 +548,7 @@ PetscErrorCode MatMatSolve_MultipleRHS(Mat A, Mat RHS, Mat* B){ PetscFunctionReturn(0); }; -PetscErrorCode MatMatSolve_MultipleRHS(Mat A, Mat RHS1, Mat RHS2, Mat* B1, Mat* B2){ +PetscErrorCode functionPETSc::MatMatSolve_MultipleRHS(Mat A, Mat RHS1, Mat RHS2, Mat* B1, Mat* B2){ Msg::Info("Begin performing MatMatSolve_MultipleRHS"); double t = Cpu(); PetscInt M, N; @@ -556,7 +556,7 @@ PetscErrorCode MatMatSolve_MultipleRHS(Mat A, Mat RHS1, Mat RHS2, Mat* B1, Mat* if (M != N) Msg::Fatal("it is not a squared matrix"); Mat F; - _try(GetFactorMatrix(A,&F)); + _try(functionPETSc::GetFactorMatrix(A,&F)); // create multiple RHS dense matrix _try(MatDuplicate(RHS1,MAT_DO_NOT_COPY_VALUES,B1)); diff --git a/NonLinearSolver/periodicBC/functionPETSc.h b/NonLinearSolver/periodicBC/functionPETSc.h index 20ef6c28ebcd54089f9c2e86ca3076a79ab7147d..cbd0d68da5b6ae074d2b2027760b36e4aa131d4d 100644 --- a/NonLinearSolver/periodicBC/functionPETSc.h +++ b/NonLinearSolver/periodicBC/functionPETSc.h @@ -16,45 +16,47 @@ #include <iostream> -PetscErrorCode MatGetDeterminant(Mat A, PetscReal* realpart, PetscReal* imagpart, PetscInt* ex); +namespace functionPETSc{ + PetscErrorCode MatGetDeterminant(Mat A, PetscReal* realpart, PetscReal* imagpart, PetscInt* ex); + void MatToFile(Mat const & a, const std::string filename); + void VecToFile(Vec& a,const std::string filename); -void MatToFile(Mat const & a, const std::string filename); -void VecToFile(Vec& a,const std::string filename); + /* + // A11 A12 A13 + // A21 A22 A23 --> B22 B23 + // A31 A32 A33 B32 B33 + // with B22 = A22 - A21*invA11*A12 + // B23 = A23 - A21*invA11*A13 + // B32 = A32 - A31*invA11*A12 + // B33 = A33 - A31*invA11*A13 + */ -/* -// A11 A12 A13 -// A21 A22 A23 --> B22 B23 -// A31 A32 A33 B32 B33 -// with B22 = A22 - A21*invA11*A12 -// B23 = A23 - A21*invA11*A13 -// B32 = A32 - A31*invA11*A12 -// B33 = A33 - A31*invA11*A13 -*/ + PetscErrorCode GetFactorMatrix(Mat A11, Mat* F); -PetscErrorCode GetFactorMatrix(Mat A11, Mat* F); + PetscErrorCode CondenseMatrixBlocks(Mat A11, Mat A12, Mat A13, + Mat A21, Mat A22, Mat A23, + Mat A31, Mat A32, Mat A33, + Mat* B22, Mat* B23, + Mat* B32, Mat* B33); + PetscErrorCode CondenseMatrixBlocks(Mat A11, Mat A12, + Mat A21, Mat A22, Mat* B22); -PetscErrorCode CondenseMatrixBlocks(Mat A11, Mat A12, Mat A13, - Mat A21, Mat A22, Mat A23, - Mat A31, Mat A32, Mat A33, - Mat* B22, Mat* B23, - Mat* B32, Mat* B33); -PetscErrorCode CondenseMatrixBlocks(Mat A11, Mat A12, - Mat A21, Mat A22, Mat* B22); + // interface PETSc for compute A22 - A21 inv(A11) A12 + PetscErrorCode GetSchurComplementMat(Mat fA11, Mat A12, Mat A21, Mat A22, Mat* A); + PetscErrorCode GetSchurComplementMat_Naive(KSP& ksp, Mat A11, Mat A12, Mat A21, Mat A22, Mat* A); -// interface PETSc for compute A22 - A21 inv(A11) A12 -PetscErrorCode GetSchurComplementMat(Mat fA11, Mat A12, Mat A21, Mat A22, Mat* A); -PetscErrorCode GetSchurComplementMat_Naive(KSP& ksp, Mat A11, Mat A12, Mat A21, Mat A22, Mat* A); + // interface PETSc for compute B = inv(A) -// interface PETSc for compute B = inv(A) + PetscErrorCode MatInverse_MatMatSolve(Mat A, Mat* B, MPI_Comm comm = PETSC_COMM_SELF); -PetscErrorCode MatInverse_MatMatSolve(Mat A, Mat* B, MPI_Comm comm = PETSC_COMM_SELF); + PetscErrorCode MatInverse_Naive(Mat A, Mat* B, MPI_Comm comm = PETSC_COMM_SELF); -PetscErrorCode MatInverse_Naive(Mat A, Mat* B, MPI_Comm comm = PETSC_COMM_SELF); + PetscErrorCode MatMatSolve_MultipleRHS(Mat A, Mat RHS, Mat* B); -PetscErrorCode MatMatSolve_MultipleRHS(Mat A, Mat RHS, Mat* B); + PetscErrorCode MatMatSolve_MultipleRHS(Mat A, Mat RHS1, Mat RHS2, Mat* B1, Mat* B2); -PetscErrorCode MatMatSolve_MultipleRHS(Mat A, Mat RHS1, Mat RHS2, Mat* B1, Mat* B2); + } #endif // PETSC diff --git a/NonLinearSolver/periodicBC/pbcConstraintEliminationNonLinearSystemPETSc.h b/NonLinearSolver/periodicBC/pbcConstraintEliminationNonLinearSystemPETSc.h index 3a1b2784fa83c93690a936acfe891f6a8283d3fc..94849c8dd790693c5e138c74210d4fa9e6fa6d5f 100644 --- a/NonLinearSolver/periodicBC/pbcConstraintEliminationNonLinearSystemPETSc.h +++ b/NonLinearSolver/periodicBC/pbcConstraintEliminationNonLinearSystemPETSc.h @@ -264,12 +264,12 @@ class pbcConstraintEliminationNonLinearSystemPETSc : public pbcSystemConden<scal // from matrix Cd u_d + C_f*u_f = Sbc*FM becomes u_d = Cdf u_f + Sdf*FM if (_useMatMatSolveToInvertMatrix){ - _try(MatMatSolve_MultipleRHS(Cd,Cf,Sbc,&Cdf,&Sdf)); + _try(functionPETSc::MatMatSolve_MultipleRHS(Cd,Cf,Sbc,&Cdf,&Sdf)); _try(MatScale(Cdf,-1.)); } else{ Mat invCd; - _try(MatInverse_Naive(Cd,&invCd,this->getComm())); + _try(functionPETSc::MatInverse_Naive(Cd,&invCd,this->getComm())); if (_pAl->getSplittedDof()->sizeOfIndependentDof()>0){ _try(MatMatMult(invCd,Cf,MAT_INITIAL_MATRIX,PETSC_DECIDE,&Cdf)); diff --git a/NonLinearSolver/periodicBC/pbcNonLinearSystemPETSc.h b/NonLinearSolver/periodicBC/pbcNonLinearSystemPETSc.h index 2d0dcc6ea1ac76a17ce40a964060301547834ce7..d48800df5eff66c0520217629ff555ee2eb5ac05 100644 --- a/NonLinearSolver/periodicBC/pbcNonLinearSystemPETSc.h +++ b/NonLinearSolver/periodicBC/pbcNonLinearSystemPETSc.h @@ -198,11 +198,11 @@ class pbcNonLinearSystemPETSc : public pbcSystem<scalar>, if (_useMatMatSolveToInvertMatrix){ Msg::Info("use MatMatSolve to invert matrix"); - _try(MatInverse_MatMatSolve(CCT,&invCCT)); + _try(functionPETSc::MatInverse_MatMatSolve(CCT,&invCCT)); } else{ Msg::Info("use KSP to invert matrix"); - _try(MatInverse_Naive(CCT,&invCCT)); + _try(functionPETSc::MatInverse_Naive(CCT,&invCCT)); } diff --git a/NonLinearSolver/space/ThreeDLagrangeFunctionSpace.h b/NonLinearSolver/space/ThreeDLagrangeFunctionSpace.h index 1c42c0e769a11e6c33582c3fe19727ee87baf0b1..5e37981e2f000dad26485fbf1a32f4db4a2de3c0 100644 --- a/NonLinearSolver/space/ThreeDLagrangeFunctionSpace.h +++ b/NonLinearSolver/space/ThreeDLagrangeFunctionSpace.h @@ -18,16 +18,16 @@ class ThreeDLagrangeFunctionSpace : public nlsFunctionSpaceXYZ<double> { protected : std::vector<int> comp; - virtual void getKeysOnElement(MElement *ele, std::vector<Dof> &keys)=0; + virtual void getKeysOnElement(MElement *ele, std::vector<Dof> &keys) const=0; const int _ifield; private: // avoid constant reallocation - double _ival[256]; - double _igrad[256][3]; - double _ihess [256][3][3]; - double _ithird[256][3][3][3]; - HessType hesst; - GradType gradt; - ThirdDevType thirdt; + mutable double _ival[256]; + mutable double _igrad[256][3]; + mutable double _ihess [256][3][3]; + mutable double _ithird[256][3][3][3]; + mutable HessType hesst; + mutable GradType gradt; + mutable ThirdDevType thirdt; public: ThreeDLagrangeFunctionSpace(int id, int ncomp,const bool hesscompute, @@ -58,7 +58,7 @@ class ThreeDLagrangeFunctionSpace : public nlsFunctionSpaceXYZ<double> } virtual ~ThreeDLagrangeFunctionSpace(){} - virtual void f(MElement *ele, double u, double v, double w, std::vector<ValType> &vals) + virtual void f(MElement *ele, double u, double v, double w, std::vector<ValType> &vals) const { ele->getShapeFunctions(u,v,w,_ival); int nbFF = ele->getNumShapeFunctions(); @@ -69,7 +69,7 @@ class ThreeDLagrangeFunctionSpace : public nlsFunctionSpaceXYZ<double> vals[valssize + i+l*nbFF] = _ival[i]; } - virtual void fuvw(MElement *ele, double u, double v, double w, std::vector<ValType> &vals) + virtual void fuvw(MElement *ele, double u, double v, double w, std::vector<ValType> &vals) const { ele->getShapeFunctions(u,v,w,_ival); int nbFF = ele->getNumShapeFunctions(); @@ -80,7 +80,7 @@ class ThreeDLagrangeFunctionSpace : public nlsFunctionSpaceXYZ<double> vals[valssize + i+l*nbFF] = _ival[i]; } - virtual void gradf(MElement *ele, double u, double v, double w,std::vector<GradType> &grads) + virtual void gradf(MElement *ele, double u, double v, double w,std::vector<GradType> &grads) const { ele->getGradShapeFunctions(u, v, w, _igrad); int nbFF = ele->getNumShapeFunctions(); @@ -99,7 +99,7 @@ class ThreeDLagrangeFunctionSpace : public nlsFunctionSpaceXYZ<double> grads[gradssize + i+l*nbFF]=gradt; } } - virtual void gradfuvw(MElement *ele, double u, double v, double w, std::vector<GradType> &grads) + virtual void gradfuvw(MElement *ele, double u, double v, double w, std::vector<GradType> &grads) const { ele->getGradShapeFunctions(u,v,w,_igrad); int nbFF = ele->getNumShapeFunctions(); @@ -113,7 +113,7 @@ class ThreeDLagrangeFunctionSpace : public nlsFunctionSpaceXYZ<double> grads[gradssize + i + l*nbFF] = gradt; } } - virtual void hessfuvw(MElement *ele, double u, double v, double w,std::vector<HessType> &hess) + virtual void hessfuvw(MElement *ele, double u, double v, double w,std::vector<HessType> &hess) const { ele->getHessShapeFunctions(u,v,w,_ihess); int nbFF = ele->getNumShapeFunctions(); @@ -128,7 +128,7 @@ class ThreeDLagrangeFunctionSpace : public nlsFunctionSpaceXYZ<double> } } } - virtual void hessf(MElement *ele, double u, double v, double w,std::vector<HessType> &hess) + virtual void hessf(MElement *ele, double u, double v, double w,std::vector<HessType> &hess) const { ele->getGradShapeFunctions(u,v,w,_igrad); ele->getHessShapeFunctions(u,v,w,_ihess); @@ -177,7 +177,7 @@ class ThreeDLagrangeFunctionSpace : public nlsFunctionSpaceXYZ<double> }; }; - virtual void thirdDevfuvw(MElement *ele, double u, double v, double w,std::vector<ThirdDevType> &third){ + virtual void thirdDevfuvw(MElement *ele, double u, double v, double w,std::vector<ThirdDevType> &third) const{ ele->getThirdDerivativeShapeFunctions(u,v,w,_ithird); int nbFF = ele->getNumShapeFunctions(); int thirdsize = third.size(); @@ -192,7 +192,7 @@ class ThreeDLagrangeFunctionSpace : public nlsFunctionSpaceXYZ<double> } } }; //need to high order fem - virtual void thirdDevf(MElement *ele, double u, double v, double w,std::vector<ThirdDevType> &third){ + virtual void thirdDevf(MElement *ele, double u, double v, double w,std::vector<ThirdDevType> &third) const{ ele->getGradShapeFunctions(u,v,w,_igrad); ele->getHessShapeFunctions(u,v,w,_ihess); ele->getThirdDerivativeShapeFunctions(u,v,w,_ithird); @@ -270,10 +270,10 @@ class ThreeDLagrangeFunctionSpace : public nlsFunctionSpaceXYZ<double> }; }; //need to high order fem - virtual int getNumKeys(MElement *ele) {if (ele->getParent()) ele = ele->getParent();return _ncomp*ele->getNumVertices();} + virtual int getNumKeys(MElement *ele) const {if (ele->getParent()) ele = ele->getParent();return _ncomp*ele->getNumVertices();} virtual int getId(void) const {return _ifield;} - virtual void getKeys(MElement *ele, std::vector<Dof> &keys){ + virtual void getKeys(MElement *ele, std::vector<Dof> &keys) const{ /* // Keys depends if MElement *ele is a bulk element or an interface element if(ele->getDim() == 2){ @@ -303,7 +303,7 @@ class ThreeDLagrangeFunctionSpace : public nlsFunctionSpaceXYZ<double> virtual FunctionSpaceBase* clone(const int id) const = 0; protected : - virtual void getKeys(MInterfaceElement *iele, std::vector<Dof> &keys){ + virtual void getKeys(MInterfaceElement *iele, std::vector<Dof> &keys) const{ this->getKeysOnElement(iele->getElem(0),keys); if(!(iele->getElem(0) == iele->getElem(1))) this->getKeysOnElement(iele->getElem(1),keys); @@ -316,15 +316,15 @@ class IsoparametricLagrangeFunctionSpace : public nlsFunctionSpaceUVW<double> { protected : std::vector<int> comp; - virtual void getKeysOnElement(MElement *ele, std::vector<Dof> &keys) {Msg::Error("You forget to define getKeysOnElement for your functional space");} + virtual void getKeysOnElement(MElement *ele, std::vector<Dof> &keys) const {Msg::Error("You forget to define getKeysOnElement for your functional space");} const int _ifield; public: private: // avoid constant reallocation - double _ival[256]; - double _igrad[256][3]; - double _ihess [256][3][3]; - HessType hesst; - GradType gradt; + mutable double _ival[256]; + mutable double _igrad[256][3]; + mutable double _ihess [256][3][3]; + mutable HessType hesst; + mutable GradType gradt; public: IsoparametricLagrangeFunctionSpace(int id) : nlsFunctionSpaceUVW<double>(3,true,false), _ifield(id) @@ -354,7 +354,7 @@ class IsoparametricLagrangeFunctionSpace : public nlsFunctionSpaceUVW<double> } }; - virtual void fuvw(MElement *ele, double u, double v, double w,std::vector<ValType> &vals) + virtual void fuvw(MElement *ele, double u, double v, double w,std::vector<ValType> &vals) const { ele->getShapeFunctions(u,v,w,_ival); int nbFF = ele->getNumShapeFunctions(); @@ -365,12 +365,12 @@ class IsoparametricLagrangeFunctionSpace : public nlsFunctionSpaceUVW<double> vals[valssize + i+l*nbFF] = _ival[i]; } // ==fuvw - virtual void f(MElement *ele, double u, double v, double w, std::vector<ValType> &vals) + virtual void f(MElement *ele, double u, double v, double w, std::vector<ValType> &vals) const { this->fuvw(ele,u,v,w,vals); } - virtual void gradfuvw(MElement *ele, double u, double v, double w, std::vector<GradType> &grads) + virtual void gradfuvw(MElement *ele, double u, double v, double w, std::vector<GradType> &grads) const { ele->getGradShapeFunctions(u,v,w,_igrad); int nbFF = ele->getNumShapeFunctions(); @@ -385,12 +385,12 @@ class IsoparametricLagrangeFunctionSpace : public nlsFunctionSpaceUVW<double> } } // == gradfuvw - virtual void gradf(MElement *ele, double u, double v, double w,std::vector<GradType> &grads) + virtual void gradf(MElement *ele, double u, double v, double w,std::vector<GradType> &grads) const { this->gradfuvw(ele,u,v,w,grads); } - virtual void hessfuvw(MElement *ele, double u, double v, double w,std::vector<HessType> &hess) + virtual void hessfuvw(MElement *ele, double u, double v, double w,std::vector<HessType> &hess) const { ele->getHessShapeFunctions(u,v,w,_ihess); int nbFF = ele->getNumShapeFunctions(); @@ -406,20 +406,20 @@ class IsoparametricLagrangeFunctionSpace : public nlsFunctionSpaceUVW<double> } } // == hessfuvw - virtual void hessf(MElement *ele, double u, double v, double w,std::vector<HessType> &hess) + virtual void hessf(MElement *ele, double u, double v, double w,std::vector<HessType> &hess) const { this->hessfuvw(ele,u,v,w,hess); } - virtual void thirdDevfuvw(MElement *ele, double u, double v, double w,ContainerThirdDevType &third){}; // Empty as "false" + virtual void thirdDevfuvw(MElement *ele, double u, double v, double w,ContainerThirdDevType &third) const{}; // Empty as "false" // == thirdDevuvw - virtual void thirdDevf(MElement *ele, double u, double v, double w,ContainerThirdDevType &third) + virtual void thirdDevf(MElement *ele, double u, double v, double w,ContainerThirdDevType &third) const { this->thirdDevfuvw(ele,u,v,w,third); } - virtual int getNumKeys(MElement *ele) {if (ele->getParent()) ele = ele->getParent();return _ncomp*ele->getNumVertices();} + virtual int getNumKeys(MElement *ele) const {if (ele->getParent()) ele = ele->getParent();return _ncomp*ele->getNumVertices();} virtual int getId(void) const {return _ifield;} - virtual void getKeys(MElement *ele, std::vector<Dof> &keys){ + virtual void getKeys(MElement *ele, std::vector<Dof> &keys) const{ // Keys depends if MElement *ele is a bulk element or an interface element if(ele->getDim() == 1){ MInterfaceElement *iele = dynamic_cast<MInterfaceElement*>(ele); @@ -441,7 +441,7 @@ class IsoparametricLagrangeFunctionSpace : public nlsFunctionSpaceUVW<double> } protected : - virtual void getKeys(MInterfaceElement *iele, std::vector<Dof> &keys){ + virtual void getKeys(MInterfaceElement *iele, std::vector<Dof> &keys) const{ this->getKeysOnElement(iele->getElem(0),keys); if(!(iele->getElem(0) == iele->getElem(1))) this->getKeysOnElement(iele->getElem(1),keys); diff --git a/NonLinearSolver/space/interFunctionSpace.h b/NonLinearSolver/space/interFunctionSpace.h index 97849eb0c6f708dfdf73394ccc15abddbcee4563..e0cda6d2cf06960cdd462234de94f17b8fc42025 100644 --- a/NonLinearSolver/space/interFunctionSpace.h +++ b/NonLinearSolver/space/interFunctionSpace.h @@ -13,11 +13,13 @@ #include "functionSpace.h" class interFunctionSpace { - public: - virtual FunctionSpaceBase* getMinusSpace() const=0; - virtual FunctionSpaceBase* getPlusSpace() const=0; - virtual void getNumKeys(MInterfaceElement *ele, int &numMinus, int &numPlus) const= 0; // if one needs the number of dofs - virtual void getKeys(MInterfaceElement *ele, std::vector<Dof> &Rminus,std::vector<Dof> &Rplus) const=0; + public: + virtual FunctionSpaceBase* getMinusSpace() =0; + virtual FunctionSpaceBase* getPlusSpace() =0; + virtual const FunctionSpaceBase* getMinusSpace() const=0; + virtual const FunctionSpaceBase* getPlusSpace() const=0; + virtual void getNumKeys(MInterfaceElement *ele, int &numMinus, int &numPlus) const= 0; // if one needs the number of dofs + virtual void getKeys(MInterfaceElement *ele, std::vector<Dof> &Rminus,std::vector<Dof> &Rplus) const=0; }; #endif //_INTERFUNCTIONSPACE_H_ diff --git a/NonLinearSolver/space/nlsFunctionSpace.h b/NonLinearSolver/space/nlsFunctionSpace.h index 498b9de6a6cdf144fbb8850746bcd267eec3ccd2..072b8eca214f284599f17a9c5129a02e3ed17ff4 100644 --- a/NonLinearSolver/space/nlsFunctionSpace.h +++ b/NonLinearSolver/space/nlsFunctionSpace.h @@ -46,7 +46,7 @@ template<class T> struct GaussPointSpaceValues ContainerHessType _vhess; ContainerThirdDevType _vthird; double _detJ; // value of detJacobian only for XYZ space as in UVW it is the same container for all elements !! - GaussPointSpaceValues(nlsFunctionSpaceUVW<T> *sp,MElement *ele,const int ncomp,const double u, const double v, const double w, + GaussPointSpaceValues(const nlsFunctionSpaceUVW<T> *sp,MElement *ele,const int ncomp,const double u, const double v, const double w, const bool hessian, const bool thirdDev) : _detJ(0.) { // compute the value @@ -97,10 +97,10 @@ template<class T> class nlsFunctionSpaceUVW : public FunctionSpace<T> const bool _hessianComputation; const bool _thirdDevComputation; // map to store the data - std::map<IntPt*,std::vector<GaussPointSpaceValues<T>*> > _mapGaussValues; + mutable std::map<IntPt*,std::vector<GaussPointSpaceValues<T>*> > _mapGaussValues; // cache in order to assess everywhere // function to allocate the map - typename std::map<IntPt*,std::vector<GaussPointSpaceValues<T>*> >::iterator allocatePoints(MElement *ele,int npts, IntPt *GP) + typename std::map<IntPt*,std::vector<GaussPointSpaceValues<T>*> >::iterator allocatePoints(MElement *ele,int npts, IntPt *GP) const { std::vector<GaussPointSpaceValues<T>*> allval; for(int i=0;i<npts;i++) @@ -112,12 +112,12 @@ template<class T> class nlsFunctionSpaceUVW : public FunctionSpace<T> return pib.first; } public: - virtual int getNumKeys(MElement *ele) = 0; - virtual void getKeys(MElement *ele, std::vector<Dof> &keys) = 0; + virtual int getNumKeys(MElement *ele) const = 0; + virtual void getKeys(MElement *ele, std::vector<Dof> &keys) const = 0; virtual void getComp(std::vector<int> &comp) const = 0; virtual FunctionSpaceBase* clone(const int id) const = 0; - virtual void getKeysOnVertex(MElement* ele, MVertex* v, const std::vector<int>& vercomp, std::vector<Dof>& keys){ + virtual void getKeysOnVertex(MElement* ele, MVertex* v, const std::vector<int>& vercomp, std::vector<Dof>& keys) const{ // get keys on element std::vector<Dof> elekeys; this->getKeys(ele,elekeys); @@ -174,19 +174,19 @@ template<class T> class nlsFunctionSpaceUVW : public FunctionSpace<T> _mapGaussValues.clear(); } // traditionel functions - virtual void fuvw(MElement *ele, double u, double v, double w, ContainerValType &vals)=0; - virtual void f(MElement *ele, double u, double v, double w, ContainerValType &vals) = 0; - virtual void gradfuvw(MElement *ele, double u, double v, double w, ContainerGradType &grads)=0; - virtual void gradf(MElement *ele, double u, double v, double w, ContainerGradType &grads) = 0; - virtual void hessfuvw(MElement *ele, double u, double v, double w, ContainerHessType &hess)=0; - virtual void hessf(MElement *ele, double u, double v, double w, ContainerHessType &hess) =0; // define it empty if _hessianComputation == false - virtual void thirdDevfuvw(MElement *ele, double u, double v, double w,ContainerThirdDevType &third)=0; - virtual void thirdDevf(MElement *ele, double u, double v, double w,ContainerThirdDevType &third)=0; // define it empty if _thirdDevComputation == false + virtual void fuvw(MElement *ele, double u, double v, double w, ContainerValType &vals) const=0; + virtual void f(MElement *ele, double u, double v, double w, ContainerValType &vals) const= 0; + virtual void gradfuvw(MElement *ele, double u, double v, double w, ContainerGradType &grads) const=0; + virtual void gradf(MElement *ele, double u, double v, double w, ContainerGradType &grads) const = 0; + virtual void hessfuvw(MElement *ele, double u, double v, double w, ContainerHessType &hess) const=0; + virtual void hessf(MElement *ele, double u, double v, double w, ContainerHessType &hess) const =0; // define it empty if _hessianComputation == false + virtual void thirdDevfuvw(MElement *ele, double u, double v, double w,ContainerThirdDevType &third) const=0; + virtual void thirdDevf(MElement *ele, double u, double v, double w,ContainerThirdDevType &third) const=0; // define it empty if _thirdDevComputation == false // Functions needed to use a map which store the values for the different Gauss Points // These ones can be const if fuvw,gradfuvw, hessfuvw and thirdfuvw are const functions - virtual void get(MElement *ele, int npts, IntPt *GP, std::vector< ContainerValType > &vvals) + virtual void get(MElement *ele, int npts, IntPt *GP, std::vector< ContainerValType > &vvals) const { typename std::map<IntPt*,std::vector<GaussPointSpaceValues<T>*> >::iterator itG = _mapGaussValues.find(GP); // fill the value if not allocated @@ -198,7 +198,7 @@ template<class T> class nlsFunctionSpaceUVW : public FunctionSpace<T> for(int i=0;i<npts;i++) vvals.push_back(allc[i]->_vvals); // space in uvw --> vvals == _vvals; } - virtual void get(MElement *ele, int npts, IntPt *GP, std::vector< GaussPointSpaceValues<T>*> &vall) + virtual void get(MElement *ele, int npts, IntPt *GP, std::vector< GaussPointSpaceValues<T>*> &vall) const { typename std::map<IntPt*,std::vector<GaussPointSpaceValues<T>*> >::iterator itG = _mapGaussValues.find(GP); // fill the value if not allocated @@ -209,7 +209,7 @@ template<class T> class nlsFunctionSpaceUVW : public FunctionSpace<T> std::vector<GaussPointSpaceValues<T>*>& allc = itG->second; vall.assign(allc.begin(),allc.end()); // space in uvw --> vall == allc; } - virtual void getgradf(MElement *ele, int npts, IntPt *GP, std::vector< ContainerGradType > &vgrads) + virtual void getgradf(MElement *ele, int npts, IntPt *GP, std::vector< ContainerGradType > &vgrads) const { typename std::map<IntPt*,std::vector<GaussPointSpaceValues<T>*> >::iterator itG = _mapGaussValues.find(GP); // fill the value if not allocated @@ -222,11 +222,11 @@ template<class T> class nlsFunctionSpaceUVW : public FunctionSpace<T> vgrads.push_back(allc[i]->_vgrads); // space in uvw --> vgrads == _vgrads; } // Needed to compute the Jacobian quickly ! - virtual void getgradfuvw(MElement *ele, int npts, IntPt *GP, std::vector< ContainerGradType > &vgrads) + virtual void getgradfuvw(MElement *ele, int npts, IntPt *GP, std::vector< ContainerGradType > &vgrads) const { this->getgradf(ele,npts,GP,vgrads); } - virtual void gethessf(MElement *ele, int npts, IntPt *GP, std::vector< ContainerHessType > &vhesss) + virtual void gethessf(MElement *ele, int npts, IntPt *GP, std::vector< ContainerHessType > &vhesss) const { if(_hessianComputation) { @@ -244,7 +244,7 @@ template<class T> class nlsFunctionSpaceUVW : public FunctionSpace<T> Msg::Fatal("You compute the hessian but give false for _hessianComputation to your function space"); } } - virtual void getthirdDevf(MElement *ele, int npts, IntPt *GP,std::vector<ContainerThirdDevType> &third) + virtual void getthirdDevf(MElement *ele, int npts, IntPt *GP,std::vector<ContainerThirdDevType> &third) const { if(_thirdDevComputation) { @@ -280,9 +280,9 @@ template<class T> class nlsFunctionSpaceXYZ : public nlsFunctionSpaceUVW<T> mutable GradType gradt; mutable HessType hesst; mutable ThirdDevType thirdt; - std::map<IntPt*,std::vector<GaussPointSpaceValues<T>*> > _mapgt; // to avoid constant allocation FIX double map search (one uvw one xyz) HOW ?? + mutable std::map<IntPt*,std::vector<GaussPointSpaceValues<T>*> > _mapgt; // to avoid constant allocation FIX double map search (one uvw one xyz) HOW ?? // allocation of the map - typename std::map<IntPt*,std::vector<GaussPointSpaceValues<T>*> >::iterator getStorageSpace(MElement *ele,const int npts,IntPt* GP) + typename std::map<IntPt*,std::vector<GaussPointSpaceValues<T>*> >::iterator getStorageSpace(MElement *ele,const int npts,IntPt* GP) const { typename std::map<IntPt*,std::vector<GaussPointSpaceValues<T>*> >::iterator itG = _mapgt.find(GP); if(itG == _mapgt.end()) @@ -299,8 +299,8 @@ template<class T> class nlsFunctionSpaceXYZ : public nlsFunctionSpaceUVW<T> return itG; } public: - virtual int getNumKeys(MElement *ele) = 0; - virtual void getKeys(MElement *ele, std::vector<Dof> &keys) = 0; + virtual int getNumKeys(MElement *ele) const= 0; + virtual void getKeys(MElement *ele, std::vector<Dof> &keys) const = 0; virtual void getComp(std::vector<int> &comp) const = 0; nlsFunctionSpaceXYZ(const int nc,const bool hessian,const bool thirdDev) : nlsFunctionSpaceUVW<T>(nc,hessian,thirdDev), gradt(0.), hesst(0.), thirdt(0.){} @@ -316,17 +316,17 @@ template<class T> class nlsFunctionSpaceXYZ : public nlsFunctionSpaceUVW<T> _mapgt.clear(); } // traditionel functions - virtual void fuvw(MElement *ele, double u, double v, double w, ContainerValType &vals)=0; - virtual void f(MElement *ele, double u, double v, double w, ContainerValType &vals) = 0; - virtual void gradfuvw(MElement *ele, double u, double v, double w, ContainerGradType &grads)=0; - virtual void gradf(MElement *ele, double u, double v, double w, ContainerGradType &grads) = 0; - virtual void hessfuvw(MElement *ele, double u, double v, double w, ContainerHessType &hess)=0; - virtual void hessf(MElement *ele, double u, double v, double w, ContainerHessType &hess) =0; // define it empty if _hessianComputation == false - virtual void thirdDevfuvw(MElement *ele, double u, double v, double w,ContainerThirdDevType &third)=0; - virtual void thirdDevf(MElement *ele, double u, double v, double w,ContainerThirdDevType &third)=0; // define it empty if _thirdDevComputation == false + virtual void fuvw(MElement *ele, double u, double v, double w, ContainerValType &vals) const=0; + virtual void f(MElement *ele, double u, double v, double w, ContainerValType &vals) const= 0; + virtual void gradfuvw(MElement *ele, double u, double v, double w, ContainerGradType &grads)const=0; + virtual void gradf(MElement *ele, double u, double v, double w, ContainerGradType &grads) const= 0; + virtual void hessfuvw(MElement *ele, double u, double v, double w, ContainerHessType &hess) const=0; + virtual void hessf(MElement *ele, double u, double v, double w, ContainerHessType &hess) const =0; // define it empty if _hessianComputation == false + virtual void thirdDevfuvw(MElement *ele, double u, double v, double w,ContainerThirdDevType &third) const=0; + virtual void thirdDevf(MElement *ele, double u, double v, double w,ContainerThirdDevType &third) const=0; // define it empty if _thirdDevComputation == false // Redifine the functions to return the values in XYZ - virtual void get(MElement *ele, int npts, IntPt *GP, std::vector< ContainerValType > &vvals) + virtual void get(MElement *ele, int npts, IntPt *GP, std::vector< ContainerValType > &vvals) const { typename std::map<IntPt*,std::vector<GaussPointSpaceValues<T>*> >::iterator itG = this->_mapGaussValues.find(GP); // fill the value if not allocated @@ -340,7 +340,7 @@ template<class T> class nlsFunctionSpaceXYZ : public nlsFunctionSpaceUVW<T> vvals.push_back(allc[i]->_vvals); // value in uvw == value in xyz } // no resize allowed after initialization --> grad.resize() is not allowed idem val,hess and third !! - virtual void get(MElement *ele, int npts, IntPt *GP, std::vector< GaussPointSpaceValues<T>*> &vall) + virtual void get(MElement *ele, int npts, IntPt *GP, std::vector< GaussPointSpaceValues<T>*> &vall) const { typename std::map<IntPt*,std::vector<GaussPointSpaceValues<T>*> >::iterator itG = this->_mapGaussValues.find(GP); // fill the value if not allocated @@ -483,7 +483,7 @@ template<class T> class nlsFunctionSpaceXYZ : public nlsFunctionSpaceUVW<T> vall.assign(allc.begin(),allc.end()); // vall have pointer on storage space } // Needed to compute the Jacobian quickly without computing third - virtual void getgradfuvw(MElement *ele, int npts, IntPt *GP, std::vector< ContainerGradType > &vgrads) + virtual void getgradfuvw(MElement *ele, int npts, IntPt *GP, std::vector< ContainerGradType > &vgrads) const { nlsFunctionSpaceUVW<T>::getgradf(ele,npts,GP,vgrads); } @@ -521,7 +521,7 @@ template<class T> class nlsFunctionSpaceXYZ : public nlsFunctionSpaceUVW<T> } } } - virtual void gethessf(MElement *ele, int npts, IntPt *GP, std::vector< ContainerHessType > &vhesss) + virtual void gethessf(MElement *ele, int npts, IntPt *GP, std::vector< ContainerHessType > &vhesss) const { if(this->_hessianComputation) { @@ -590,7 +590,7 @@ template<class T> class nlsFunctionSpaceXYZ : public nlsFunctionSpaceUVW<T> Msg::Fatal("You compute the hessian but give false for _hessianComputation to your function space"); } } - virtual void getthirdDevf(MElement *ele, int npts, IntPt *GP,std::vector<ContainerThirdDevType> &vthird) + virtual void getthirdDevf(MElement *ele, int npts, IntPt *GP,std::vector<ContainerThirdDevType> &vthird) const { if(this->_thirdDevComputation) { diff --git a/dG3D/benchmarks/CMakeLists.txt b/dG3D/benchmarks/CMakeLists.txt index 5e4f0869deef0d1f548af08a83d2d4179e75b270..ab01c8f2e1c32ffada6155b8b4b5a262cf9aebd9 100644 --- a/dG3D/benchmarks/CMakeLists.txt +++ b/dG3D/benchmarks/CMakeLists.txt @@ -55,6 +55,7 @@ add_subdirectory(DG_TET4) add_subdirectory(DG_PRI6) add_subdirectory(DG_PRI18) add_subdirectory(DG_HEX8_PRI6) +add_subdirectory(DG_PRI6_smallStrain) add_subdirectory(twoField_PRI6) add_subdirectory(twoField_TET4) add_subdirectory(twoField_HEX8_PRI6) @@ -109,6 +110,7 @@ add_subdirectory(multiscaleCohesiveTest2D_mixedMode) add_subdirectory(multiscaleCohesiveTest2D_fullDG) add_subdirectory(compRVE) add_subdirectory(smpT22) +add_subdirectory(smpT22Mechanism2) add_subdirectory(smpT58) add_subdirectory(multiscaleCohesiveTest2D_fullDG_rotateRVE) add_subdirectory(multiscaleEnhanceStrain) @@ -131,3 +133,4 @@ add_subdirectory(J2plasticExtractCohesiveLaw) add_subdirectory(cylinderPlaneFrictionContact) add_subdirectory(axisymmetricNonLocalTest) add_subdirectory(axisymmetricTest) +add_subdirectory(secondOrderElasticShearlayer3D) diff --git a/dG3D/benchmarks/CrackCompositeFailure/composite.py b/dG3D/benchmarks/CrackCompositeFailure/composite.py index af36af99c7650729dbf15fe97791a8a12eadae16..68ee27b745713f2b66391253cc9589614bde4578 100644 --- a/dG3D/benchmarks/CrackCompositeFailure/composite.py +++ b/dG3D/benchmarks/CrackCompositeFailure/composite.py @@ -124,4 +124,4 @@ mysolver.archivingNodeDisplacement(86,0,1) mysolver.solve() check = TestCheck() -check.equal(1.062128e-08,mysolver.getEnergy(3),5.e-3) +check.equal(1.065452e-08,mysolver.getEnergy(3),5.e-3) diff --git a/dG3D/benchmarks/DG_PRI6_smallStrain/CMakeLists.txt b/dG3D/benchmarks/DG_PRI6_smallStrain/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..0edf456a5cc7fbc96d53d69559430e4ffafb88dd --- /dev/null +++ b/dG3D/benchmarks/DG_PRI6_smallStrain/CMakeLists.txt @@ -0,0 +1,11 @@ +# test file + +set(PYFILE twoHole.py) + +set(FILES2DELETE + *.csv + disp* + stress* +) + +add_cm3python_mpi_test(4 ${PYFILE} "${FILES2DELETE}") diff --git a/dG3D/benchmarks/DG_PRI6_smallStrain/twoHole.geo b/dG3D/benchmarks/DG_PRI6_smallStrain/twoHole.geo new file mode 100644 index 0000000000000000000000000000000000000000..9b42aefe356d6eff249f6f74ccae56f8f5f0ae66 --- /dev/null +++ b/dG3D/benchmarks/DG_PRI6_smallStrain/twoHole.geo @@ -0,0 +1,72 @@ + +mm=1.0e-3; +n=1; +L=10*mm; +sl1=0.4*L/n; +Lx = 2*L; +Ly = 4*L; +Point(1)={0,0,0,sl1}; +Point(2)={Lx,0,0,sl1}; +Point(3)={Lx,Ly,0,sl1}; +Point(4)={0,Ly,0,sl1}; +Line(1)={1,2}; +Line(2)={2,3}; +Line(3)={3,4}; +Line(4)={4,1}; +x0=0.5*Lx/n; y0=0.5*Ly/n; r=0.2*L/n; + +x=0.3*Lx; +y=0.4*Ly; +r = 0.2*L; +sl2=0.7*sl1; +p1=newp; Point(p1)={x-r,y,0,sl2}; +p2=newp; Point(p2)={x,y+r,0,sl2}; +p3=newp; Point(p3)={x+r,y,0,sl2}; +p4=newp; Point(p4)={x,y-r,0,sl2}; +pc=newp; Point(pc)={x,y,0,sl2}; +c1 = newreg; Circle(c1) = {p1,pc,p2}; +c2 = newreg; Circle(c2) = {p2,pc,p3}; +c3 = newreg; Circle(c3) = {p3,pc,p4}; +c4 = newreg; Circle(c4) = {p4,pc,p1}; +l[1]=newreg; Line Loop(l[1]) = {c1,c2,c3,c4}; + + +x=0.7*Lx; +y=0.6*Ly; +r = 0.2*L; +sl2=0.4*sl1; +p1=newp; Point(p1)={x-r,y,0,sl2}; +p2=newp; Point(p2)={x,y+r,0,sl2}; +p3=newp; Point(p3)={x+r,y,0,sl2}; +p4=newp; Point(p4)={x,y-r,0,sl2}; +pc=newp; Point(pc)={x,y,0,sl2}; +c1 = newreg; Circle(c1) = {p1,pc,p2}; +c2 = newreg; Circle(c2) = {p2,pc,p3}; +c3 = newreg; Circle(c3) = {p3,pc,p4}; +c4 = newreg; Circle(c4) = {p4,pc,p1}; +l[2]=newreg; Line Loop(l[2]) = {c1,c2,c3,c4}; + + +l[0]=newreg; +Line Loop(l[0])={1,2,3,4}; +Plane Surface(11)={l[]}; +//Recombine Surface{11}; + +Physical Surface(16) = {11}; +Physical Line(17) = {1}; +Physical Line(18) = {3}; +Physical Point(19) = {4}; +Physical Point(20) = {1}; +//+ +//Recombine Surface {11}; +//+ +Extrude {0, 0, 1e-3} { + Surface{11}; Layers{2}; Recombine; +} + +//+ +Physical Volume(83) = {1}; +//+ +Physical Surface(84) = {37}; +//+ +Physical Surface(85) = {45}; diff --git a/dG3D/benchmarks/DG_PRI6_smallStrain/twoHole.msh b/dG3D/benchmarks/DG_PRI6_smallStrain/twoHole.msh new file mode 100644 index 0000000000000000000000000000000000000000..a3e26cda8fef10667b50e4f68cb7ba3f7aaa6e4a --- /dev/null +++ b/dG3D/benchmarks/DG_PRI6_smallStrain/twoHole.msh @@ -0,0 +1,1313 @@ +$MeshFormat +2.2 0 8 +$EndMeshFormat +$Nodes +468 +1 0 0 0 +2 0.02 0 0 +3 0.02 0.04 0 +4 0 0.04 0 +5 0.004 0.016 0 +6 0.006 0.018 0 +7 0.008 0.016 0 +8 0.006 0.014 0 +9 0.012 0.024 0 +10 0.014 0.026 0 +11 0.016 0.024 0 +12 0.014 0.022 0 +13 0 0 0.001 +14 0.02 0 0.001 +15 0.02 0.04 0.001 +16 0 0.04 0.001 +17 0.004 0.016 0.001 +18 0.006 0.014 0.001 +19 0.008 0.016 0.001 +20 0.006 0.018 0.001 +21 0.012 0.024 0.001 +22 0.014 0.022 0.001 +23 0.016 0.024 0.001 +24 0.014 0.026 0.001 +25 0.003999999999991045 0 0 +26 0.007999999999979423 0 0 +27 0.01199999999997901 0 0 +28 0.01599999999998917 0 0 +29 0.02 0.003999999999992779 0 +30 0.02 0.007999999999982091 0 +31 0.02 0.0119999999999705 0 +32 0.02 0.01599999999995885 0 +33 0.02 0.01999999999994786 0 +34 0.02 0.02399999999995802 0 +35 0.02 0.02799999999996886 0 +36 0.02 0.03199999999997834 0 +37 0.02 0.03599999999998998 0 +38 0.01600000000001043 0.04 0 +39 0.01200000000002099 0.04 0 +40 0.008000000000021266 0.04 0 +41 0.004000000000010967 0.04 0 +42 0 0.0360000000000088 0 +43 0 0.03200000000002086 0 +44 0 0.02800000000003047 0 +45 0 0.02400000000004199 0 +46 0 0.02000000000005283 0 +47 0 0.01600000000004253 0 +48 0 0.01200000000003156 0 +49 0 0.008000000000021934 0 +50 0 0.004000000000010155 0 +51 0.004585786437623847 0.01741421356237004 0 +52 0.007414213562370057 0.01741421356237614 0 +53 0.007414213562374714 0.01458578643762852 0 +54 0.004585786437629543 0.01458578643762427 0 +55 0.01258578643762438 0.02541421356237057 0 +56 0.01541421356237008 0.02541421356237611 0 +57 0.01541421356237474 0.02258578643762854 0 +58 0.01258578643763034 0.02258578643762347 0 +59 0.003999999999991045 0 0.001 +60 0.007999999999979423 0 0.001 +61 0.01199999999997901 0 0.001 +62 0.01599999999998917 0 0.001 +63 0.02 0.003999999999992779 0.001 +64 0.02 0.007999999999982091 0.001 +65 0.02 0.0119999999999705 0.001 +66 0.02 0.01599999999995885 0.001 +67 0.02 0.01999999999994786 0.001 +68 0.02 0.02399999999995802 0.001 +69 0.02 0.02799999999996886 0.001 +70 0.02 0.03199999999997834 0.001 +71 0.02 0.03599999999998998 0.001 +72 0.01600000000001043 0.04 0.001 +73 0.01200000000002099 0.04 0.001 +74 0.008000000000021266 0.04 0.001 +75 0.004000000000010967 0.04 0.001 +76 0 0.0360000000000088 0.001 +77 0 0.03200000000002086 0.001 +78 0 0.02800000000003047 0.001 +79 0 0.02400000000004199 0.001 +80 0 0.02000000000005283 0.001 +81 0 0.01600000000004253 0.001 +82 0 0.01200000000003156 0.001 +83 0 0.008000000000021934 0.001 +84 0 0.004000000000010155 0.001 +85 0.004585786437629543 0.01458578643762427 0.001 +86 0.007414213562374714 0.01458578643762852 0.001 +87 0.007414213562370057 0.01741421356237614 0.001 +88 0.004585786437623847 0.01741421356237004 0.001 +89 0.01258578643763034 0.02258578643762347 0.001 +90 0.01541421356237474 0.02258578643762854 0.001 +91 0.01541421356237008 0.02541421356237611 0.001 +92 0.01258578643762438 0.02541421356237057 0.001 +93 0 0 0.0005 +94 0.02 0 0.0005 +95 0.02 0.04 0.0005 +96 0 0.04 0.0005 +97 0.004 0.016 0.0005 +98 0.006 0.014 0.0005 +99 0.008 0.016 0.0005 +100 0.006 0.018 0.0005 +101 0.012 0.024 0.0005 +102 0.014 0.022 0.0005 +103 0.016 0.024 0.0005 +104 0.014 0.026 0.0005 +105 0.01069491464816358 0.03275706766290422 0 +106 0.009305085351833411 0.007242932337095427 0 +107 0.01195336568324533 0.0185033339521395 0 +108 0.01169692766308796 0.01273881552073795 0 +109 0.008268255376061502 0.02156696680671535 0 +110 0.008303072336911339 0.0272611844792605 0 +111 0.01187364030974172 0.02913348640269208 0 +112 0.008126359690256567 0.01086651359730744 0 +113 0.003890646163783284 0.02210218278604862 0 +114 0.01610129463824833 0.01788473837026788 0 +115 0.00527471461890471 0.0312856638364231 0 +116 0.01472528538109378 0.00871433616357243 0 +117 0.01623634084102215 0.03000849594336865 0 +118 0.003763659158977146 0.009991504056632143 0 +119 0.01443926882698468 0.03459017605072594 0 +120 0.005560731173012774 0.005409823949275546 0 +121 0.0107927702276238 0.02079995987352916 0 +122 0.009311828935983526 0.02433847876298567 0 +123 0.010650184926707 0.01597034408016557 0 +124 0.009488676316585596 0.01873394905844636 0 +125 0.007122237134825811 0.0361465517015278 0 +126 0.01287776286517032 0.003853448298470202 0 +127 0.008170792723072185 0.02983066727881701 0 +128 0.01182920727692591 0.01016933272118098 0 +129 0.006054294952975383 0.02377714633014847 0 +130 0.01401598402785484 0.01623087328408668 0 +131 0.007294908290742023 0.01983327956720814 0 +132 0.003027281658933691 0.02681472674903151 0 +133 0.01697271834106652 0.01318527325096741 0 +134 0.01069523874921455 0.02713050105997452 0 +135 0.009304761250784256 0.01286949894002464 0 +136 0.01275290459629123 0.02014826212529715 0 +137 0.01086648419919772 0.02253493272183303 0 +138 0.008075124555504954 0.003752623987231804 0 +139 0.01192487544449155 0.03624737601276829 0 +140 0.004476527263781469 0.01967798854167316 0 +141 0.01563081723820658 0.02008827489546555 0 +142 0.01340073119304642 0.03170462382804348 0 +143 0.006599268806951706 0.00829537617195707 0 +144 0.01261348915701591 0.02734733328150114 0 +145 0.00738651084298308 0.01265266671849831 0 +146 0.002370572056322577 0.01441224443541275 0 +147 0.01762942794367732 0.02558775556458744 0 +148 0.01790285673843247 0.0223785889447873 0 +149 0.002097143261567581 0.01762141105521092 0 +150 0.009240952099717004 0.01705617258380826 0 +151 0.01382198503784448 0.01859814134267057 0 +152 0.006250563403148177 0.02138407985407196 0 +153 0.00387890972637342 0.03353716237557244 0 +154 0.01612109027362417 0.0064628376244262 0 +155 0.01088597704851552 0.02528987054004267 0 +156 0.009114022951483688 0.01471012945995643 0 +157 0.01543332795189227 0.02746035978079723 0 +158 0.01396135682223692 0.02895194262264064 0 +159 0.004566672048107451 0.01253964021920341 0 +160 0.006038643177761786 0.01104805737735952 0 +161 0.005504168720476045 0.02848787898487717 0 +162 0.01449583127952335 0.01151212101512063 0 +163 0.007738762426519678 0.03238279071413182 0 +164 0.01226123757347748 0.00761720928586648 0 +165 0.009183244138059175 0.02006818767405194 0 +166 0.01705248754588463 0.009979094675673207 0 +167 0.002947512454114644 0.03002090532432592 0 +168 0.01627553539450034 0.0154740135035758 0 +169 0.003736908562072098 0.02452497465053428 0 +170 0.01210320004370289 0.02141430992964029 0 +171 0.01457530738257165 0.03732467934410703 0 +172 0.005424692617424976 0.002675320655894944 0 +173 0.01688464871030633 0.03342212420093356 0 +174 0.003115351289692558 0.006577875799067628 0 +175 0.0107562083351965 0.01938171418718952 0 +176 0.00801907739032294 0.01859656757431411 0 +177 0.009706092248953283 0.0349745083483644 0 +178 0.01029390775104271 0.005025491651635151 0 +179 0.01041939478605073 0.03065899224442401 0 +180 0.009580605213946953 0.009341007755575252 0 +181 0.005956735004202661 0.01958735532173931 0 +182 0.007863373369673484 0.02328580803017795 0 +183 0.01213662663032719 0.01671419196982107 0 +184 0.009892427780998104 0.02880296629303362 0 +185 0.01010757221900033 0.01119703370696525 0 +186 0.009309166871142322 0.02282005571001185 0 +187 0.01061502462136631 0.02392672936345621 0 +188 0.01237424154086746 0.03390544608957453 0 +189 0.007625758459129293 0.006094553910425497 0 +190 0.01168498587988745 0.02632369803138027 0 +191 0.008315014120111609 0.01367630196861893 0 +192 0.005728816107385676 0.02596630605182034 0 +193 0.0142849710488482 0.01403486190956942 0 +194 0.004600229372246293 0.0371367428154218 0 +195 0.01539977062775254 0.002863257184577836 0 +196 0.01424508695900598 0.02065138529069585 0 +197 0.01070433566529643 0.01772661763859504 0 +198 0.01031585238516193 0.002273382678171541 0 +199 0.009684147614835145 0.0377266173218274 0 +200 0.009388657496714088 0.0257903919918667 0 +201 0.01060374527582382 0.01427137257676253 0 +202 0.01698320415331218 0.03688949659929274 0 +203 0.003016795846686892 0.003110503400708045 0 +204 0.0176937946876085 0.02816647553920276 0 +205 0.002306205312391421 0.01183352446079793 0 +206 0.01771383789648296 0.01965170741782519 0 +207 0.002297981782566727 0.02031890979568184 0 +208 0.01402312665197501 0.02741087956810794 0 +209 0.005976873348024324 0.01258912043189244 0 +210 0.0122314065954415 0.01499340989019054 0 +211 0.007775007199940583 0.02506988594104327 0 +212 0.009683984162416904 0.02155802055722826 0 +213 0.003364359686384905 0.01875813073873399 0 +214 0.01665173125013881 0.02127130301017035 0 +215 0.003999999999991045 0 0.0005 +216 0.007999999999979423 0 0.0005 +217 0.01199999999997901 0 0.0005 +218 0.01599999999998917 0 0.0005 +219 0.02 0.003999999999992779 0.0005 +220 0.02 0.007999999999982091 0.0005 +221 0.02 0.0119999999999705 0.0005 +222 0.02 0.01599999999995885 0.0005 +223 0.02 0.01999999999994786 0.0005 +224 0.02 0.02399999999995802 0.0005 +225 0.02 0.02799999999996886 0.0005 +226 0.02 0.03199999999997834 0.0005 +227 0.02 0.03599999999998998 0.0005 +228 0.01600000000001043 0.04 0.0005 +229 0.01200000000002099 0.04 0.0005 +230 0.008000000000021266 0.04 0.0005 +231 0.004000000000010967 0.04 0.0005 +232 0 0.0360000000000088 0.0005 +233 0 0.03200000000002086 0.0005 +234 0 0.02800000000003047 0.0005 +235 0 0.02400000000004199 0.0005 +236 0 0.02000000000005283 0.0005 +237 0 0.01600000000004253 0.0005 +238 0 0.01200000000003156 0.0005 +239 0 0.008000000000021934 0.0005 +240 0 0.004000000000010155 0.0005 +241 0.004585786437629543 0.01458578643762427 0.0005 +242 0.007414213562374714 0.01458578643762852 0.0005 +243 0.007414213562370057 0.01741421356237614 0.0005 +244 0.004585786437623847 0.01741421356237004 0.0005 +245 0.01258578643763034 0.02258578643762347 0.0005 +246 0.01541421356237474 0.02258578643762854 0.0005 +247 0.01541421356237008 0.02541421356237611 0.0005 +248 0.01258578643762438 0.02541421356237057 0.0005 +249 0.01069491464816358 0.03275706766290422 0.001 +250 0.009305085351833411 0.007242932337095427 0.001 +251 0.01195336568324533 0.0185033339521395 0.001 +252 0.01169692766308796 0.01273881552073795 0.001 +253 0.008268255376061502 0.02156696680671535 0.001 +254 0.008303072336911339 0.0272611844792605 0.001 +255 0.01187364030974172 0.02913348640269208 0.001 +256 0.008126359690256567 0.01086651359730744 0.001 +257 0.003890646163783284 0.02210218278604862 0.001 +258 0.01610129463824833 0.01788473837026788 0.001 +259 0.00527471461890471 0.0312856638364231 0.001 +260 0.01472528538109378 0.00871433616357243 0.001 +261 0.01623634084102215 0.03000849594336865 0.001 +262 0.003763659158977146 0.009991504056632143 0.001 +263 0.01443926882698468 0.03459017605072594 0.001 +264 0.005560731173012774 0.005409823949275546 0.001 +265 0.0107927702276238 0.02079995987352916 0.001 +266 0.009311828935983526 0.02433847876298567 0.001 +267 0.010650184926707 0.01597034408016557 0.001 +268 0.009488676316585596 0.01873394905844636 0.001 +269 0.007122237134825811 0.0361465517015278 0.001 +270 0.01287776286517032 0.003853448298470202 0.001 +271 0.008170792723072185 0.02983066727881701 0.001 +272 0.01182920727692591 0.01016933272118098 0.001 +273 0.006054294952975383 0.02377714633014847 0.001 +274 0.01401598402785484 0.01623087328408668 0.001 +275 0.007294908290742023 0.01983327956720814 0.001 +276 0.003027281658933691 0.02681472674903151 0.001 +277 0.01697271834106652 0.01318527325096741 0.001 +278 0.01069523874921455 0.02713050105997452 0.001 +279 0.009304761250784256 0.01286949894002464 0.001 +280 0.01275290459629123 0.02014826212529715 0.001 +281 0.01086648419919772 0.02253493272183303 0.001 +282 0.008075124555504954 0.003752623987231804 0.001 +283 0.01192487544449155 0.03624737601276829 0.001 +284 0.004476527263781469 0.01967798854167316 0.001 +285 0.01563081723820658 0.02008827489546555 0.001 +286 0.01340073119304642 0.03170462382804348 0.001 +287 0.006599268806951706 0.00829537617195707 0.001 +288 0.01261348915701591 0.02734733328150114 0.001 +289 0.00738651084298308 0.01265266671849831 0.001 +290 0.002370572056322577 0.01441224443541275 0.001 +291 0.01762942794367732 0.02558775556458744 0.001 +292 0.01790285673843247 0.0223785889447873 0.001 +293 0.002097143261567581 0.01762141105521092 0.001 +294 0.009240952099717004 0.01705617258380826 0.001 +295 0.01382198503784448 0.01859814134267057 0.001 +296 0.006250563403148177 0.02138407985407196 0.001 +297 0.00387890972637342 0.03353716237557244 0.001 +298 0.01612109027362417 0.0064628376244262 0.001 +299 0.01088597704851552 0.02528987054004267 0.001 +300 0.009114022951483688 0.01471012945995643 0.001 +301 0.01543332795189227 0.02746035978079723 0.001 +302 0.01396135682223692 0.02895194262264064 0.001 +303 0.004566672048107451 0.01253964021920341 0.001 +304 0.006038643177761786 0.01104805737735952 0.001 +305 0.005504168720476045 0.02848787898487717 0.001 +306 0.01449583127952335 0.01151212101512063 0.001 +307 0.007738762426519678 0.03238279071413182 0.001 +308 0.01226123757347748 0.00761720928586648 0.001 +309 0.009183244138059175 0.02006818767405194 0.001 +310 0.01705248754588463 0.009979094675673207 0.001 +311 0.002947512454114644 0.03002090532432592 0.001 +312 0.01627553539450034 0.0154740135035758 0.001 +313 0.003736908562072098 0.02452497465053428 0.001 +314 0.01210320004370289 0.02141430992964029 0.001 +315 0.01457530738257165 0.03732467934410703 0.001 +316 0.005424692617424976 0.002675320655894944 0.001 +317 0.01688464871030633 0.03342212420093356 0.001 +318 0.003115351289692558 0.006577875799067628 0.001 +319 0.0107562083351965 0.01938171418718952 0.001 +320 0.00801907739032294 0.01859656757431411 0.001 +321 0.009706092248953283 0.0349745083483644 0.001 +322 0.01029390775104271 0.005025491651635151 0.001 +323 0.01041939478605073 0.03065899224442401 0.001 +324 0.009580605213946953 0.009341007755575252 0.001 +325 0.005956735004202661 0.01958735532173931 0.001 +326 0.007863373369673484 0.02328580803017795 0.001 +327 0.01213662663032719 0.01671419196982107 0.001 +328 0.009892427780998104 0.02880296629303362 0.001 +329 0.01010757221900033 0.01119703370696525 0.001 +330 0.009309166871142322 0.02282005571001185 0.001 +331 0.01061502462136631 0.02392672936345621 0.001 +332 0.01237424154086746 0.03390544608957453 0.001 +333 0.007625758459129293 0.006094553910425497 0.001 +334 0.01168498587988745 0.02632369803138027 0.001 +335 0.008315014120111609 0.01367630196861893 0.001 +336 0.005728816107385676 0.02596630605182034 0.001 +337 0.0142849710488482 0.01403486190956942 0.001 +338 0.004600229372246293 0.0371367428154218 0.001 +339 0.01539977062775254 0.002863257184577836 0.001 +340 0.01424508695900598 0.02065138529069585 0.001 +341 0.01070433566529643 0.01772661763859504 0.001 +342 0.01031585238516193 0.002273382678171541 0.001 +343 0.009684147614835145 0.0377266173218274 0.001 +344 0.009388657496714088 0.0257903919918667 0.001 +345 0.01060374527582382 0.01427137257676253 0.001 +346 0.01698320415331218 0.03688949659929274 0.001 +347 0.003016795846686892 0.003110503400708045 0.001 +348 0.0176937946876085 0.02816647553920276 0.001 +349 0.002306205312391421 0.01183352446079793 0.001 +350 0.01771383789648296 0.01965170741782519 0.001 +351 0.002297981782566727 0.02031890979568184 0.001 +352 0.01402312665197501 0.02741087956810794 0.001 +353 0.005976873348024324 0.01258912043189244 0.001 +354 0.0122314065954415 0.01499340989019054 0.001 +355 0.007775007199940583 0.02506988594104327 0.001 +356 0.009683984162416904 0.02155802055722826 0.001 +357 0.003364359686384905 0.01875813073873399 0.001 +358 0.01665173125013881 0.02127130301017035 0.001 +359 0.01069491464816358 0.03275706766290422 0.0005 +360 0.009305085351833411 0.007242932337095427 0.0005 +361 0.01195336568324533 0.0185033339521395 0.0005 +362 0.01169692766308796 0.01273881552073795 0.0005 +363 0.008268255376061502 0.02156696680671535 0.0005 +364 0.008303072336911339 0.0272611844792605 0.0005 +365 0.01187364030974172 0.02913348640269208 0.0005 +366 0.008126359690256567 0.01086651359730744 0.0005 +367 0.003890646163783284 0.02210218278604862 0.0005 +368 0.01610129463824833 0.01788473837026788 0.0005 +369 0.00527471461890471 0.0312856638364231 0.0005 +370 0.01472528538109378 0.00871433616357243 0.0005 +371 0.01623634084102215 0.03000849594336865 0.0005 +372 0.003763659158977146 0.009991504056632143 0.0005 +373 0.01443926882698468 0.03459017605072594 0.0005 +374 0.005560731173012774 0.005409823949275546 0.0005 +375 0.0107927702276238 0.02079995987352916 0.0005 +376 0.009311828935983526 0.02433847876298567 0.0005 +377 0.010650184926707 0.01597034408016557 0.0005 +378 0.009488676316585596 0.01873394905844636 0.0005 +379 0.007122237134825811 0.0361465517015278 0.0005 +380 0.01287776286517032 0.003853448298470202 0.0005 +381 0.008170792723072185 0.02983066727881701 0.0005 +382 0.01182920727692591 0.01016933272118098 0.0005 +383 0.006054294952975383 0.02377714633014847 0.0005 +384 0.01401598402785484 0.01623087328408668 0.0005 +385 0.007294908290742023 0.01983327956720814 0.0005 +386 0.003027281658933691 0.02681472674903151 0.0005 +387 0.01697271834106652 0.01318527325096741 0.0005 +388 0.01069523874921455 0.02713050105997452 0.0005 +389 0.009304761250784256 0.01286949894002464 0.0005 +390 0.01275290459629123 0.02014826212529715 0.0005 +391 0.01086648419919772 0.02253493272183303 0.0005 +392 0.008075124555504954 0.003752623987231804 0.0005 +393 0.01192487544449155 0.03624737601276829 0.0005 +394 0.004476527263781469 0.01967798854167316 0.0005 +395 0.01563081723820658 0.02008827489546555 0.0005 +396 0.01340073119304642 0.03170462382804348 0.0005 +397 0.006599268806951706 0.00829537617195707 0.0005 +398 0.01261348915701591 0.02734733328150114 0.0005 +399 0.00738651084298308 0.01265266671849831 0.0005 +400 0.002370572056322577 0.01441224443541275 0.0005 +401 0.01762942794367732 0.02558775556458744 0.0005 +402 0.01790285673843247 0.0223785889447873 0.0005 +403 0.002097143261567581 0.01762141105521092 0.0005 +404 0.009240952099717004 0.01705617258380826 0.0005 +405 0.01382198503784448 0.01859814134267057 0.0005 +406 0.006250563403148177 0.02138407985407196 0.0005 +407 0.00387890972637342 0.03353716237557244 0.0005 +408 0.01612109027362417 0.0064628376244262 0.0005 +409 0.01088597704851552 0.02528987054004267 0.0005 +410 0.009114022951483688 0.01471012945995643 0.0005 +411 0.01543332795189227 0.02746035978079723 0.0005 +412 0.01396135682223692 0.02895194262264064 0.0005 +413 0.004566672048107451 0.01253964021920341 0.0005 +414 0.006038643177761786 0.01104805737735952 0.0005 +415 0.005504168720476045 0.02848787898487717 0.0005 +416 0.01449583127952335 0.01151212101512063 0.0005 +417 0.007738762426519678 0.03238279071413182 0.0005 +418 0.01226123757347748 0.00761720928586648 0.0005 +419 0.009183244138059175 0.02006818767405194 0.0005 +420 0.01705248754588463 0.009979094675673207 0.0005 +421 0.002947512454114644 0.03002090532432592 0.0005 +422 0.01627553539450034 0.0154740135035758 0.0005 +423 0.003736908562072098 0.02452497465053428 0.0005 +424 0.01210320004370289 0.02141430992964029 0.0005 +425 0.01457530738257165 0.03732467934410703 0.0005 +426 0.005424692617424976 0.002675320655894944 0.0005 +427 0.01688464871030633 0.03342212420093356 0.0005 +428 0.003115351289692558 0.006577875799067628 0.0005 +429 0.0107562083351965 0.01938171418718952 0.0005 +430 0.00801907739032294 0.01859656757431411 0.0005 +431 0.009706092248953283 0.0349745083483644 0.0005 +432 0.01029390775104271 0.005025491651635151 0.0005 +433 0.01041939478605073 0.03065899224442401 0.0005 +434 0.009580605213946953 0.009341007755575252 0.0005 +435 0.005956735004202661 0.01958735532173931 0.0005 +436 0.007863373369673484 0.02328580803017795 0.0005 +437 0.01213662663032719 0.01671419196982107 0.0005 +438 0.009892427780998104 0.02880296629303362 0.0005 +439 0.01010757221900033 0.01119703370696525 0.0005 +440 0.009309166871142322 0.02282005571001185 0.0005 +441 0.01061502462136631 0.02392672936345621 0.0005 +442 0.01237424154086746 0.03390544608957453 0.0005 +443 0.007625758459129293 0.006094553910425497 0.0005 +444 0.01168498587988745 0.02632369803138027 0.0005 +445 0.008315014120111609 0.01367630196861893 0.0005 +446 0.005728816107385676 0.02596630605182034 0.0005 +447 0.0142849710488482 0.01403486190956942 0.0005 +448 0.004600229372246293 0.0371367428154218 0.0005 +449 0.01539977062775254 0.002863257184577836 0.0005 +450 0.01424508695900598 0.02065138529069585 0.0005 +451 0.01070433566529643 0.01772661763859504 0.0005 +452 0.01031585238516193 0.002273382678171541 0.0005 +453 0.009684147614835145 0.0377266173218274 0.0005 +454 0.009388657496714088 0.0257903919918667 0.0005 +455 0.01060374527582382 0.01427137257676253 0.0005 +456 0.01698320415331218 0.03688949659929274 0.0005 +457 0.003016795846686892 0.003110503400708045 0.0005 +458 0.0176937946876085 0.02816647553920276 0.0005 +459 0.002306205312391421 0.01183352446079793 0.0005 +460 0.01771383789648296 0.01965170741782519 0.0005 +461 0.002297981782566727 0.02031890979568184 0.0005 +462 0.01402312665197501 0.02741087956810794 0.0005 +463 0.005976873348024324 0.01258912043189244 0.0005 +464 0.0122314065954415 0.01499340989019054 0.0005 +465 0.007775007199940583 0.02506988594104327 0.0005 +466 0.009683984162416904 0.02155802055722826 0.0005 +467 0.003364359686384905 0.01875813073873399 0.0005 +468 0.01665173125013881 0.02127130301017035 0.0005 +$EndNodes +$Elements +836 +1 15 2 20 1 1 +2 15 2 19 4 4 +3 1 2 17 1 1 25 +4 1 2 17 1 25 26 +5 1 2 17 1 26 27 +6 1 2 17 1 27 28 +7 1 2 17 1 28 2 +8 1 2 18 3 3 38 +9 1 2 18 3 38 39 +10 1 2 18 3 39 40 +11 1 2 18 3 40 41 +12 1 2 18 3 41 4 +13 2 4 16 11 1 2 12 196 57 +14 2 4 16 11 1 3 153 115 163 +15 2 4 16 11 1 1 154 116 164 +16 2 4 16 11 1 1 118 205 49 +17 2 4 16 11 1 3 117 204 36 +18 2 4 16 11 1 3 41 42 194 +19 2 4 16 11 1 1 28 29 195 +20 2 4 16 11 1 3 4 42 41 +21 2 4 16 11 1 1 2 29 28 +22 2 4 16 11 1 2 32 168 133 +23 2 4 16 11 1 4 45 169 132 +24 2 4 16 11 1 4 6 176 131 +25 2 4 16 11 1 1 126 154 164 +26 2 4 16 11 1 3 125 153 163 +27 2 4 16 11 1 3 56 147 157 +28 2 4 16 11 1 1 54 146 159 +29 2 4 16 11 1 2 121 175 136 +30 2 4 16 11 1 2 7 156 150 +31 2 4 16 11 1 2 12 170 136 +32 2 4 16 11 1 2 107 136 175 +33 2 4 16 11 1 2 52 150 176 +34 2 4 16 11 1 3 11 148 147 +35 2 4 16 11 1 4 5 149 146 +36 2 4 16 11 1 3 110 134 184 +37 2 4 16 11 1 1 108 135 185 +38 2 4 16 11 1 4 6 140 51 +39 2 4 16 11 1 4 5 146 54 +40 2 4 16 11 1 3 11 147 56 +41 2 4 16 11 1 4 5 51 149 +42 2 4 16 11 1 2 11 57 148 +43 2 4 16 11 1 2 6 52 176 +44 2 4 16 11 1 4 110 184 127 +45 2 4 16 11 1 1 108 185 128 +46 2 4 16 11 1 1 49 174 118 +47 2 4 16 11 1 3 36 173 117 +48 2 4 16 11 1 2 32 206 114 +49 2 4 16 11 1 4 45 207 113 +50 2 4 16 11 1 2 7 150 52 +51 2 4 16 11 1 3 111 134 144 +52 2 4 16 11 1 1 112 135 145 +53 2 4 16 11 1 4 131 176 165 +54 2 4 16 11 1 1 116 154 166 +55 2 4 16 11 1 3 115 153 167 +56 2 4 16 11 1 3 111 142 179 +57 2 4 16 11 1 1 112 143 180 +58 2 4 16 11 1 1 49 205 48 +59 2 4 16 11 1 3 36 204 35 +60 2 4 16 11 1 2 31 32 133 +61 2 4 16 11 1 4 44 45 132 +62 2 4 16 11 1 4 45 113 169 +63 2 4 16 11 1 2 32 114 168 +64 2 4 16 11 1 2 124 165 176 +65 2 4 16 11 1 3 117 142 158 +66 2 4 16 11 1 1 118 143 160 +67 2 4 16 11 1 2 121 136 170 +68 2 4 16 11 1 2 12 58 170 +69 2 4 16 11 1 2 12 136 196 +70 2 4 16 11 1 4 109 131 165 +71 2 4 16 11 1 4 109 152 131 +72 2 4 16 11 1 2 123 150 156 +73 2 4 16 11 1 3 111 158 142 +74 2 4 16 11 1 1 112 160 143 +75 2 4 16 11 1 4 6 131 181 +76 2 4 16 11 1 3 10 144 55 +77 2 4 16 11 1 1 8 145 53 +78 2 4 16 11 1 2 124 176 150 +79 2 4 16 11 1 1 50 203 174 +80 2 4 16 11 1 3 37 202 173 +81 2 4 16 11 1 2 196 141 57 +82 2 4 16 11 1 3 117 173 142 +83 2 4 16 11 1 1 118 174 143 +84 2 4 16 11 1 1 30 166 154 +85 2 4 16 11 1 3 43 167 153 +86 2 4 16 11 1 2 107 151 136 +87 2 4 16 11 1 2 9 137 58 +88 2 4 16 11 1 2 123 197 150 +89 2 4 16 11 1 2 141 196 151 +90 2 4 16 11 1 4 110 127 161 +91 2 4 16 11 1 1 108 128 162 +92 2 4 16 11 1 2 135 191 145 +93 2 4 16 11 1 4 134 190 144 +94 2 4 16 11 1 3 40 194 125 +95 2 4 16 11 1 1 27 195 126 +96 2 4 16 11 1 1 49 50 174 +97 2 4 16 11 1 3 36 37 173 +98 2 4 16 11 1 1 1 25 203 +99 2 4 16 11 1 3 3 38 202 +100 2 4 16 11 1 2 123 183 197 +101 2 4 16 11 1 2 136 151 196 +102 2 4 16 11 1 2 58 137 170 +103 2 4 16 11 1 3 105 179 142 +104 2 4 16 11 1 1 106 180 143 +105 2 4 16 11 1 4 6 181 140 +106 2 4 16 11 1 3 10 56 157 +107 2 4 16 11 1 1 8 54 159 +108 2 4 16 11 1 1 116 162 128 +109 2 4 16 11 1 4 115 161 127 +110 2 4 16 11 1 4 110 200 134 +111 2 4 16 11 1 2 108 201 135 +112 2 4 16 11 1 3 40 125 199 +113 2 4 16 11 1 1 27 126 198 +114 2 4 16 11 1 3 111 184 134 +115 2 4 16 11 1 1 112 185 135 +116 2 4 16 11 1 1 29 154 195 +117 2 4 16 11 1 3 42 153 194 +118 2 4 16 11 1 1 116 128 164 +119 2 4 16 11 1 3 115 127 163 +120 2 4 16 11 1 1 1 203 50 +121 2 4 16 11 1 3 3 202 37 +122 2 4 16 11 1 2 121 170 137 +123 2 4 16 11 1 4 109 182 152 +124 2 4 16 11 1 3 119 142 173 +125 2 4 16 11 1 1 120 143 174 +126 2 4 16 11 1 3 127 179 163 +127 2 4 16 11 1 1 128 180 164 +128 2 4 16 11 1 2 57 214 148 +129 2 4 16 11 1 4 51 213 149 +130 2 4 16 11 1 4 140 181 152 +131 2 4 16 11 1 1 29 30 154 +132 2 4 16 11 1 3 42 43 153 +133 2 4 16 11 1 4 131 152 181 +134 2 4 16 11 1 2 133 162 166 +135 2 4 16 11 1 4 132 161 167 +136 2 4 16 11 1 3 105 163 179 +137 2 4 16 11 1 1 106 164 180 +138 2 4 16 11 1 3 119 139 188 +139 2 4 16 11 1 1 120 138 189 +140 2 4 16 11 1 3 40 41 194 +141 2 4 16 11 1 1 27 28 195 +142 2 4 16 11 1 4 9 55 155 +143 2 4 16 11 1 2 7 53 156 +144 2 4 16 11 1 2 32 33 206 +145 2 4 16 11 1 4 45 46 207 +146 2 4 16 11 1 2 107 197 183 +147 2 4 16 11 1 2 114 151 130 +148 2 4 16 11 1 1 116 166 162 +149 2 4 16 11 1 4 115 167 161 +150 2 4 16 11 1 3 119 173 202 +151 2 4 16 11 1 1 120 174 203 +152 2 4 16 11 1 4 113 152 129 +153 2 4 16 11 1 2 107 183 151 +154 2 4 16 11 1 2 114 141 151 +155 2 4 16 11 1 1 26 138 172 +156 2 4 16 11 1 3 39 139 171 +157 2 4 16 11 1 3 147 204 157 +158 2 4 16 11 1 1 146 205 159 +159 2 4 16 11 1 3 119 171 139 +160 2 4 16 11 1 1 120 172 138 +161 2 4 16 11 1 4 55 144 190 +162 2 4 16 11 1 2 53 145 191 +163 2 4 16 11 1 2 31 133 166 +164 2 4 16 11 1 4 44 132 167 +165 2 4 16 11 1 4 9 187 137 +166 2 4 16 11 1 4 46 47 149 +167 2 4 16 11 1 3 33 34 148 +168 2 4 16 11 1 3 34 35 147 +169 2 4 16 11 1 1 47 48 146 +170 2 4 16 11 1 4 51 140 213 +171 2 4 16 11 1 2 57 141 214 +172 2 4 16 11 1 3 111 144 158 +173 2 4 16 11 1 1 112 145 160 +174 2 4 16 11 1 3 105 177 163 +175 2 4 16 11 1 1 106 178 164 +176 2 4 16 11 1 4 113 129 169 +177 2 4 16 11 1 2 114 130 168 +178 2 4 16 11 1 2 108 162 193 +179 2 4 16 11 1 4 110 161 192 +180 2 4 16 11 1 1 25 26 172 +181 2 4 16 11 1 3 38 39 171 +182 2 4 16 11 1 3 105 142 188 +183 2 4 16 11 1 1 106 143 189 +184 2 4 16 11 1 2 124 175 165 +185 2 4 16 11 1 4 113 140 152 +186 2 4 16 11 1 4 121 137 212 +187 2 4 16 11 1 3 10 208 144 +188 2 4 16 11 1 1 8 209 145 +189 2 4 16 11 1 2 121 165 175 +190 2 4 16 11 1 2 124 150 197 +191 2 4 16 11 1 3 125 163 177 +192 2 4 16 11 1 1 126 164 178 +193 2 4 16 11 1 4 129 152 182 +194 2 4 16 11 1 4 43 44 167 +195 2 4 16 11 1 2 30 31 166 +196 2 4 16 11 1 3 119 188 142 +197 2 4 16 11 1 1 120 189 143 +198 2 4 16 11 1 3 39 199 139 +199 2 4 16 11 1 1 26 198 138 +200 2 4 16 11 1 3 105 188 177 +201 2 4 16 11 1 1 106 189 178 +202 2 4 16 11 1 1 25 172 203 +203 2 4 16 11 1 3 38 171 202 +204 2 4 16 11 1 3 10 157 208 +205 2 4 16 11 1 1 8 159 209 +206 2 4 16 11 1 3 39 40 199 +207 2 4 16 11 1 1 26 27 198 +208 2 4 16 11 1 4 137 187 186 +209 2 4 16 11 1 2 133 193 162 +210 2 4 16 11 1 4 132 192 161 +211 2 4 16 11 1 4 122 187 155 +212 2 4 16 11 1 3 34 147 148 +213 2 4 16 11 1 4 47 146 149 +214 2 4 16 11 1 3 125 194 153 +215 2 4 16 11 1 1 126 195 154 +216 2 4 16 11 1 3 125 177 199 +217 2 4 16 11 1 1 126 178 198 +218 2 4 16 11 1 2 130 151 183 +219 2 4 16 11 1 4 9 155 187 +220 2 4 16 11 1 4 55 190 155 +221 2 4 16 11 1 2 53 191 156 +222 2 4 16 11 1 4 122 186 187 +223 2 4 16 11 1 4 122 155 200 +224 2 4 16 11 1 2 123 156 201 +225 2 4 16 11 1 3 144 208 158 +226 2 4 16 11 1 1 145 209 160 +227 2 4 16 11 1 3 139 177 188 +228 2 4 16 11 1 1 138 178 189 +229 2 4 16 11 1 2 130 193 168 +230 2 4 16 11 1 4 129 192 169 +231 2 4 16 11 1 3 111 179 184 +232 2 4 16 11 1 1 112 180 185 +233 2 4 16 11 1 4 113 207 140 +234 2 4 16 11 1 2 114 206 141 +235 2 4 16 11 1 4 129 211 192 +236 2 4 16 11 1 2 130 210 193 +237 2 4 16 11 1 4 46 149 207 +238 2 4 16 11 1 2 33 148 206 +239 2 4 16 11 1 3 117 158 157 +240 2 4 16 11 1 1 118 160 159 +241 2 4 16 11 1 4 109 165 212 +242 2 4 16 11 1 4 149 213 207 +243 2 4 16 11 1 2 148 214 206 +244 2 4 16 11 1 4 110 192 211 +245 2 4 16 11 1 2 108 193 210 +246 2 4 16 11 1 4 109 186 182 +247 2 4 16 11 1 4 121 212 165 +248 2 4 16 11 1 2 124 197 175 +249 2 4 16 11 1 2 123 201 210 +250 2 4 16 11 1 4 122 200 211 +251 2 4 16 11 1 3 35 204 147 +252 2 4 16 11 1 1 48 205 146 +253 2 4 16 11 1 3 119 202 171 +254 2 4 16 11 1 1 120 203 172 +255 2 4 16 11 1 3 157 158 208 +256 2 4 16 11 1 1 159 160 209 +257 2 4 16 11 1 4 140 207 213 +258 2 4 16 11 1 2 141 206 214 +259 2 4 16 11 1 2 108 210 201 +260 2 4 16 11 1 4 110 211 200 +261 2 4 16 11 1 4 134 200 155 +262 2 4 16 11 1 2 135 201 156 +263 2 4 16 11 1 2 133 168 193 +264 2 4 16 11 1 4 132 169 192 +265 2 4 16 11 1 4 134 155 190 +266 2 4 16 11 1 2 135 156 191 +267 2 4 16 11 1 4 122 182 186 +268 2 4 16 11 1 4 137 186 212 +269 2 4 16 11 1 1 138 198 178 +270 2 4 16 11 1 3 139 199 177 +271 2 4 16 11 1 2 107 175 197 +272 2 4 16 11 1 4 109 212 186 +273 2 4 16 11 1 4 122 211 182 +274 2 4 16 11 1 2 123 210 183 +275 2 4 16 11 1 3 127 184 179 +276 2 4 16 11 1 1 128 185 180 +277 2 4 16 11 1 4 129 182 211 +278 2 4 16 11 1 2 130 183 210 +279 2 4 16 11 1 3 117 157 204 +280 2 4 16 11 1 1 118 159 205 +281 3 4 84 37 1 1 1 25 215 93 +282 3 4 84 37 1 1 93 215 59 13 +283 3 4 84 37 1 1 25 26 216 215 +284 3 4 84 37 1 1 215 216 60 59 +285 3 4 84 37 1 1 26 27 217 216 +286 3 4 84 37 1 1 216 217 61 60 +287 3 4 84 37 1 1 27 28 218 217 +288 3 4 84 37 1 1 217 218 62 61 +289 3 4 84 37 1 1 28 2 94 218 +290 3 4 84 37 1 1 218 94 14 62 +291 3 4 85 45 1 3 3 38 228 95 +292 3 4 85 45 1 3 95 228 72 15 +293 3 4 85 45 1 3 38 39 229 228 +294 3 4 85 45 1 3 228 229 73 72 +295 3 4 85 45 1 3 39 40 230 229 +296 3 4 85 45 1 3 229 230 74 73 +297 3 4 85 45 1 3 40 41 231 230 +298 3 4 85 45 1 3 230 231 75 74 +299 3 4 85 45 1 3 41 4 96 231 +300 3 4 85 45 1 3 231 96 16 75 +301 6 4 83 1 1 2 57 12 196 246 102 450 +302 6 4 83 1 1 2 246 102 450 90 22 340 +303 6 5 83 1 2 3 -4 163 153 115 417 407 369 +304 6 5 83 1 2 3 -4 417 407 369 307 297 259 +305 6 4 83 1 1 1 164 154 116 418 408 370 +306 6 4 83 1 1 1 418 408 370 308 298 260 +307 6 4 83 1 1 1 49 118 205 239 372 459 +308 6 4 83 1 1 1 239 372 459 83 262 349 +309 6 4 83 1 1 3 36 117 204 226 371 458 +310 6 4 83 1 1 3 226 371 458 70 261 348 +311 6 4 83 1 1 3 194 41 42 448 231 232 +312 6 4 83 1 1 3 448 231 232 338 75 76 +313 6 4 83 1 1 1 195 28 29 449 218 219 +314 6 4 83 1 1 1 449 218 219 339 62 63 +315 6 4 83 1 1 3 41 4 42 231 96 232 +316 6 4 83 1 1 3 231 96 232 75 16 76 +317 6 4 83 1 1 1 28 2 29 218 94 219 +318 6 4 83 1 1 1 218 94 219 62 14 63 +319 6 4 83 1 1 2 133 32 168 387 222 422 +320 6 4 83 1 1 2 387 222 422 277 66 312 +321 6 4 83 1 1 4 132 45 169 386 235 423 +322 6 4 83 1 1 4 386 235 423 276 79 313 +323 6 5 83 1 2 4 -2 131 6 176 385 100 430 +324 6 5 83 1 2 4 -2 385 100 430 275 20 320 +325 6 4 83 1 1 1 164 126 154 418 380 408 +326 6 4 83 1 1 1 418 380 408 308 270 298 +327 6 4 83 1 1 3 163 125 153 417 379 407 +328 6 4 83 1 1 3 417 379 407 307 269 297 +329 6 4 83 1 1 3 157 56 147 411 247 401 +330 6 4 83 1 1 3 411 247 401 301 91 291 +331 6 5 83 1 2 1 -4 159 54 146 413 241 400 +332 6 5 83 1 2 1 -4 413 241 400 303 85 290 +333 6 5 83 1 2 2 -4 136 121 175 390 375 429 +334 6 5 83 1 2 2 -4 390 375 429 280 265 319 +335 6 4 83 1 1 2 150 7 156 404 99 410 +336 6 4 83 1 1 2 404 99 410 294 19 300 +337 6 4 83 1 1 2 136 12 170 390 102 424 +338 6 4 83 1 1 2 390 102 424 280 22 314 +339 6 4 83 1 1 2 175 107 136 429 361 390 +340 6 4 83 1 1 2 429 361 390 319 251 280 +341 6 5 83 1 2 2 -4 176 52 150 430 243 404 +342 6 5 83 1 2 2 -4 430 243 404 320 87 294 +343 6 5 83 1 2 3 -2 147 11 148 401 103 402 +344 6 5 83 1 2 3 -2 401 103 402 291 23 292 +345 6 5 83 1 2 4 -1 146 5 149 400 97 403 +346 6 5 83 1 2 4 -1 400 97 403 290 17 293 +347 6 5 83 1 2 3 -4 184 110 134 438 364 388 +348 6 5 83 1 2 3 -4 438 364 388 328 254 278 +349 6 5 83 1 2 1 -2 185 108 135 439 362 389 +350 6 5 83 1 2 1 -2 439 362 389 329 252 279 +351 6 5 83 1 2 4 -2 51 6 140 244 100 394 +352 6 5 83 1 2 4 -2 244 100 394 88 20 284 +353 6 5 83 1 2 4 -1 54 5 146 241 97 400 +354 6 5 83 1 2 4 -1 241 97 400 85 17 290 +355 6 5 83 1 2 3 -2 56 11 147 247 103 401 +356 6 5 83 1 2 3 -2 247 103 401 91 23 291 +357 6 4 83 1 1 4 149 5 51 403 97 244 +358 6 4 83 1 1 4 403 97 244 293 17 88 +359 6 5 83 1 2 2 -3 148 11 57 402 103 246 +360 6 5 83 1 2 2 -3 402 103 246 292 23 90 +361 6 5 83 1 2 2 -4 176 6 52 430 100 243 +362 6 5 83 1 2 2 -4 430 100 243 320 20 87 +363 6 5 83 1 2 4 -3 127 110 184 381 364 438 +364 6 5 83 1 2 4 -3 381 364 438 271 254 328 +365 6 5 83 1 2 1 -2 128 108 185 382 362 439 +366 6 5 83 1 2 1 -2 382 362 439 272 252 329 +367 6 4 83 1 1 1 118 49 174 372 239 428 +368 6 4 83 1 1 1 372 239 428 262 83 318 +369 6 4 83 1 1 3 117 36 173 371 226 427 +370 6 4 83 1 1 3 371 226 427 261 70 317 +371 6 4 83 1 1 2 114 32 206 368 222 460 +372 6 4 83 1 1 2 368 222 460 258 66 350 +373 6 4 83 1 1 4 113 45 207 367 235 461 +374 6 4 83 1 1 4 367 235 461 257 79 351 +375 6 4 83 1 1 2 52 7 150 243 99 404 +376 6 4 83 1 1 2 243 99 404 87 19 294 +377 6 5 83 1 2 3 -4 144 111 134 398 365 388 +378 6 5 83 1 2 3 -4 398 365 388 288 255 278 +379 6 5 83 1 2 1 -2 145 112 135 399 366 389 +380 6 5 83 1 2 1 -2 399 366 389 289 256 279 +381 6 5 83 1 2 4 -2 165 131 176 419 385 430 +382 6 5 83 1 2 4 -2 419 385 430 309 275 320 +383 6 5 83 1 2 1 -2 166 116 154 420 370 408 +384 6 5 83 1 2 1 -2 420 370 408 310 260 298 +385 6 5 83 1 2 3 -4 167 115 153 421 369 407 +386 6 5 83 1 2 3 -4 421 369 407 311 259 297 +387 6 4 83 1 1 3 179 111 142 433 365 396 +388 6 4 83 1 1 3 433 365 396 323 255 286 +389 6 4 83 1 1 1 180 112 143 434 366 397 +390 6 4 83 1 1 1 434 366 397 324 256 287 +391 6 4 83 1 1 1 48 49 205 238 239 459 +392 6 4 83 1 1 1 238 239 459 82 83 349 +393 6 4 83 1 1 3 35 36 204 225 226 458 +394 6 4 83 1 1 3 225 226 458 69 70 348 +395 6 4 83 1 1 2 133 31 32 387 221 222 +396 6 4 83 1 1 2 387 221 222 277 65 66 +397 6 4 83 1 1 4 132 44 45 386 234 235 +398 6 4 83 1 1 4 386 234 235 276 78 79 +399 6 4 83 1 1 4 169 45 113 423 235 367 +400 6 4 83 1 1 4 423 235 367 313 79 257 +401 6 4 83 1 1 2 168 32 114 422 222 368 +402 6 4 83 1 1 2 422 222 368 312 66 258 +403 6 5 83 1 2 2 -4 176 124 165 430 378 419 +404 6 5 83 1 2 2 -4 430 378 419 320 268 309 +405 6 4 83 1 1 3 158 117 142 412 371 396 +406 6 4 83 1 1 3 412 371 396 302 261 286 +407 6 4 83 1 1 1 160 118 143 414 372 397 +408 6 4 83 1 1 1 414 372 397 304 262 287 +409 6 5 83 1 2 2 -4 170 121 136 424 375 390 +410 6 5 83 1 2 2 -4 424 375 390 314 265 280 +411 6 4 83 1 1 2 170 12 58 424 102 245 +412 6 4 83 1 1 2 424 102 245 314 22 89 +413 6 4 83 1 1 2 196 12 136 450 102 390 +414 6 4 83 1 1 2 450 102 390 340 22 280 +415 6 5 83 1 2 4 -2 165 109 131 419 363 385 +416 6 5 83 1 2 4 -2 419 363 385 309 253 275 +417 6 4 83 1 1 4 131 109 152 385 363 406 +418 6 4 83 1 1 4 385 363 406 275 253 296 +419 6 4 83 1 1 2 156 123 150 410 377 404 +420 6 4 83 1 1 2 410 377 404 300 267 294 +421 6 4 83 1 1 3 142 111 158 396 365 412 +422 6 4 83 1 1 3 396 365 412 286 255 302 +423 6 4 83 1 1 1 143 112 160 397 366 414 +424 6 4 83 1 1 1 397 366 414 287 256 304 +425 6 5 83 1 2 4 -2 181 6 131 435 100 385 +426 6 5 83 1 2 4 -2 435 100 385 325 20 275 +427 6 5 83 1 2 3 -4 55 10 144 248 104 398 +428 6 5 83 1 2 3 -4 248 104 398 92 24 288 +429 6 5 83 1 2 1 -2 53 8 145 242 98 399 +430 6 5 83 1 2 1 -2 242 98 399 86 18 289 +431 6 5 83 1 2 2 -4 150 124 176 404 378 430 +432 6 5 83 1 2 2 -4 404 378 430 294 268 320 +433 6 4 83 1 1 1 174 50 203 428 240 457 +434 6 4 83 1 1 1 428 240 457 318 84 347 +435 6 4 83 1 1 3 173 37 202 427 227 456 +436 6 4 83 1 1 3 427 227 456 317 71 346 +437 6 4 83 1 1 2 57 196 141 246 450 395 +438 6 4 83 1 1 2 246 450 395 90 340 285 +439 6 4 83 1 1 3 142 117 173 396 371 427 +440 6 4 83 1 1 3 396 371 427 286 261 317 +441 6 4 83 1 1 1 143 118 174 397 372 428 +442 6 4 83 1 1 1 397 372 428 287 262 318 +443 6 5 83 1 2 1 -2 154 30 166 408 220 420 +444 6 5 83 1 2 1 -2 408 220 420 298 64 310 +445 6 5 83 1 2 3 -4 153 43 167 407 233 421 +446 6 5 83 1 2 3 -4 407 233 421 297 77 311 +447 6 4 83 1 1 2 136 107 151 390 361 405 +448 6 4 83 1 1 2 390 361 405 280 251 295 +449 6 5 83 1 2 2 -4 58 9 137 245 101 391 +450 6 5 83 1 2 2 -4 245 101 391 89 21 281 +451 6 4 83 1 1 2 150 123 197 404 377 451 +452 6 4 83 1 1 2 404 377 451 294 267 341 +453 6 4 83 1 1 2 151 141 196 405 395 450 +454 6 4 83 1 1 2 405 395 450 295 285 340 +455 6 5 83 1 2 4 -3 161 110 127 415 364 381 +456 6 5 83 1 2 4 -3 415 364 381 305 254 271 +457 6 5 83 1 2 1 -2 162 108 128 416 362 382 +458 6 5 83 1 2 1 -2 416 362 382 306 252 272 +459 6 5 83 1 2 2 -1 145 135 191 399 389 445 +460 6 5 83 1 2 2 -1 399 389 445 289 279 335 +461 6 5 83 1 2 4 -3 144 134 190 398 388 444 +462 6 5 83 1 2 4 -3 398 388 444 288 278 334 +463 6 4 83 1 1 3 125 40 194 379 230 448 +464 6 4 83 1 1 3 379 230 448 269 74 338 +465 6 4 83 1 1 1 126 27 195 380 217 449 +466 6 4 83 1 1 1 380 217 449 270 61 339 +467 6 4 83 1 1 1 174 49 50 428 239 240 +468 6 4 83 1 1 1 428 239 240 318 83 84 +469 6 4 83 1 1 3 173 36 37 427 226 227 +470 6 4 83 1 1 3 427 226 227 317 70 71 +471 6 4 83 1 1 1 203 1 25 457 93 215 +472 6 4 83 1 1 1 457 93 215 347 13 59 +473 6 4 83 1 1 3 202 3 38 456 95 228 +474 6 4 83 1 1 3 456 95 228 346 15 72 +475 6 4 83 1 1 2 197 123 183 451 377 437 +476 6 4 83 1 1 2 451 377 437 341 267 327 +477 6 4 83 1 1 2 196 136 151 450 390 405 +478 6 4 83 1 1 2 450 390 405 340 280 295 +479 6 5 83 1 2 2 -4 170 58 137 424 245 391 +480 6 5 83 1 2 2 -4 424 245 391 314 89 281 +481 6 4 83 1 1 3 142 105 179 396 359 433 +482 6 4 83 1 1 3 396 359 433 286 249 323 +483 6 4 83 1 1 1 143 106 180 397 360 434 +484 6 4 83 1 1 1 397 360 434 287 250 324 +485 6 5 83 1 2 4 -2 140 6 181 394 100 435 +486 6 5 83 1 2 4 -2 394 100 435 284 20 325 +487 6 4 83 1 1 3 157 10 56 411 104 247 +488 6 4 83 1 1 3 411 104 247 301 24 91 +489 6 5 83 1 2 1 -4 159 8 54 413 98 241 +490 6 5 83 1 2 1 -4 413 98 241 303 18 85 +491 6 5 83 1 2 1 -2 128 116 162 382 370 416 +492 6 5 83 1 2 1 -2 382 370 416 272 260 306 +493 6 5 83 1 2 4 -3 127 115 161 381 369 415 +494 6 5 83 1 2 4 -3 381 369 415 271 259 305 +495 6 5 83 1 2 4 -3 134 110 200 388 364 454 +496 6 5 83 1 2 4 -3 388 364 454 278 254 344 +497 6 5 83 1 2 2 -1 135 108 201 389 362 455 +498 6 5 83 1 2 2 -1 389 362 455 279 252 345 +499 6 4 83 1 1 3 199 40 125 453 230 379 +500 6 4 83 1 1 3 453 230 379 343 74 269 +501 6 4 83 1 1 1 198 27 126 452 217 380 +502 6 4 83 1 1 1 452 217 380 342 61 270 +503 6 5 83 1 2 3 -4 134 111 184 388 365 438 +504 6 5 83 1 2 3 -4 388 365 438 278 255 328 +505 6 5 83 1 2 1 -2 135 112 185 389 366 439 +506 6 5 83 1 2 1 -2 389 366 439 279 256 329 +507 6 4 83 1 1 1 195 29 154 449 219 408 +508 6 4 83 1 1 1 449 219 408 339 63 298 +509 6 4 83 1 1 3 194 42 153 448 232 407 +510 6 4 83 1 1 3 448 232 407 338 76 297 +511 6 4 83 1 1 1 164 116 128 418 370 382 +512 6 4 83 1 1 1 418 370 382 308 260 272 +513 6 5 83 1 2 3 -4 163 115 127 417 369 381 +514 6 5 83 1 2 3 -4 417 369 381 307 259 271 +515 6 4 83 1 1 1 50 1 203 240 93 457 +516 6 4 83 1 1 1 240 93 457 84 13 347 +517 6 4 83 1 1 3 37 3 202 227 95 456 +518 6 4 83 1 1 3 227 95 456 71 15 346 +519 6 5 83 1 2 2 -4 137 121 170 391 375 424 +520 6 5 83 1 2 2 -4 391 375 424 281 265 314 +521 6 4 83 1 1 4 152 109 182 406 363 436 +522 6 4 83 1 1 4 406 363 436 296 253 326 +523 6 4 83 1 1 3 173 119 142 427 373 396 +524 6 4 83 1 1 3 427 373 396 317 263 286 +525 6 4 83 1 1 1 174 120 143 428 374 397 +526 6 4 83 1 1 1 428 374 397 318 264 287 +527 6 5 83 1 2 3 -4 163 127 179 417 381 433 +528 6 5 83 1 2 3 -4 417 381 433 307 271 323 +529 6 4 83 1 1 1 164 128 180 418 382 434 +530 6 4 83 1 1 1 418 382 434 308 272 324 +531 6 5 83 1 2 2 -3 148 57 214 402 246 468 +532 6 5 83 1 2 2 -3 402 246 468 292 90 358 +533 6 4 83 1 1 4 149 51 213 403 244 467 +534 6 4 83 1 1 4 403 244 467 293 88 357 +535 6 4 83 1 1 4 152 140 181 406 394 435 +536 6 4 83 1 1 4 406 394 435 296 284 325 +537 6 5 83 1 2 1 -2 154 29 30 408 219 220 +538 6 5 83 1 2 1 -2 408 219 220 298 63 64 +539 6 5 83 1 2 3 -4 153 42 43 407 232 233 +540 6 5 83 1 2 3 -4 407 232 233 297 76 77 +541 6 4 83 1 1 4 181 131 152 435 385 406 +542 6 4 83 1 1 4 435 385 406 325 275 296 +543 6 5 83 1 2 2 -1 166 133 162 420 387 416 +544 6 5 83 1 2 2 -1 420 387 416 310 277 306 +545 6 5 83 1 2 4 -3 167 132 161 421 386 415 +546 6 5 83 1 2 4 -3 421 386 415 311 276 305 +547 6 4 83 1 1 3 179 105 163 433 359 417 +548 6 4 83 1 1 3 433 359 417 323 249 307 +549 6 4 83 1 1 1 180 106 164 434 360 418 +550 6 4 83 1 1 1 434 360 418 324 250 308 +551 6 4 83 1 1 3 188 119 139 442 373 393 +552 6 4 83 1 1 3 442 373 393 332 263 283 +553 6 4 83 1 1 1 189 120 138 443 374 392 +554 6 4 83 1 1 1 443 374 392 333 264 282 +555 6 4 83 1 1 3 194 40 41 448 230 231 +556 6 4 83 1 1 3 448 230 231 338 74 75 +557 6 4 83 1 1 1 195 27 28 449 217 218 +558 6 4 83 1 1 1 449 217 218 339 61 62 +559 6 6 83 1 3 4 -2 -3 155 9 55 409 101 248 +560 6 6 83 1 3 4 -2 -3 409 101 248 299 21 92 +561 6 5 83 1 2 2 -1 156 7 53 410 99 242 +562 6 5 83 1 2 2 -1 410 99 242 300 19 86 +563 6 5 83 1 2 2 -3 206 32 33 460 222 223 +564 6 5 83 1 2 2 -3 460 222 223 350 66 67 +565 6 4 83 1 1 4 207 45 46 461 235 236 +566 6 4 83 1 1 4 461 235 236 351 79 80 +567 6 4 83 1 1 2 183 107 197 437 361 451 +568 6 4 83 1 1 2 437 361 451 327 251 341 +569 6 4 83 1 1 2 130 114 151 384 368 405 +570 6 4 83 1 1 2 384 368 405 274 258 295 +571 6 5 83 1 2 1 -2 162 116 166 416 370 420 +572 6 5 83 1 2 1 -2 416 370 420 306 260 310 +573 6 5 83 1 2 4 -3 161 115 167 415 369 421 +574 6 5 83 1 2 4 -3 415 369 421 305 259 311 +575 6 4 83 1 1 3 202 119 173 456 373 427 +576 6 4 83 1 1 3 456 373 427 346 263 317 +577 6 4 83 1 1 1 203 120 174 457 374 428 +578 6 4 83 1 1 1 457 374 428 347 264 318 +579 6 4 83 1 1 4 129 113 152 383 367 406 +580 6 4 83 1 1 4 383 367 406 273 257 296 +581 6 4 83 1 1 2 151 107 183 405 361 437 +582 6 4 83 1 1 2 405 361 437 295 251 327 +583 6 4 83 1 1 2 151 114 141 405 368 395 +584 6 4 83 1 1 2 405 368 395 295 258 285 +585 6 4 83 1 1 1 172 26 138 426 216 392 +586 6 4 83 1 1 1 426 216 392 316 60 282 +587 6 4 83 1 1 3 171 39 139 425 229 393 +588 6 4 83 1 1 3 425 229 393 315 73 283 +589 6 4 83 1 1 3 157 147 204 411 401 458 +590 6 4 83 1 1 3 411 401 458 301 291 348 +591 6 5 83 1 2 1 -4 159 146 205 413 400 459 +592 6 5 83 1 2 1 -4 413 400 459 303 290 349 +593 6 4 83 1 1 3 139 119 171 393 373 425 +594 6 4 83 1 1 3 393 373 425 283 263 315 +595 6 4 83 1 1 1 138 120 172 392 374 426 +596 6 4 83 1 1 1 392 374 426 282 264 316 +597 6 5 83 1 2 4 -3 190 55 144 444 248 398 +598 6 5 83 1 2 4 -3 444 248 398 334 92 288 +599 6 5 83 1 2 2 -1 191 53 145 445 242 399 +600 6 5 83 1 2 2 -1 445 242 399 335 86 289 +601 6 5 83 1 2 2 -1 166 31 133 420 221 387 +602 6 5 83 1 2 2 -1 420 221 387 310 65 277 +603 6 5 83 1 2 4 -3 167 44 132 421 234 386 +604 6 5 83 1 2 4 -3 421 234 386 311 78 276 +605 6 5 83 1 2 4 -2 137 9 187 391 101 441 +606 6 5 83 1 2 4 -2 391 101 441 281 21 331 +607 6 5 83 1 2 4 -1 149 46 47 403 236 237 +608 6 5 83 1 2 4 -1 403 236 237 293 80 81 +609 6 5 83 1 2 3 -2 148 33 34 402 223 224 +610 6 5 83 1 2 3 -2 402 223 224 292 67 68 +611 6 4 83 1 1 3 147 34 35 401 224 225 +612 6 4 83 1 1 3 401 224 225 291 68 69 +613 6 5 83 1 2 1 -4 146 47 48 400 237 238 +614 6 5 83 1 2 1 -4 400 237 238 290 81 82 +615 6 4 83 1 1 4 213 51 140 467 244 394 +616 6 4 83 1 1 4 467 244 394 357 88 284 +617 6 4 83 1 1 2 214 57 141 468 246 395 +618 6 4 83 1 1 2 468 246 395 358 90 285 +619 6 5 83 1 2 3 -4 158 111 144 412 365 398 +620 6 5 83 1 2 3 -4 412 365 398 302 255 288 +621 6 5 83 1 2 1 -2 160 112 145 414 366 399 +622 6 5 83 1 2 1 -2 414 366 399 304 256 289 +623 6 4 83 1 1 3 163 105 177 417 359 431 +624 6 4 83 1 1 3 417 359 431 307 249 321 +625 6 4 83 1 1 1 164 106 178 418 360 432 +626 6 4 83 1 1 1 418 360 432 308 250 322 +627 6 4 83 1 1 4 169 113 129 423 367 383 +628 6 4 83 1 1 4 423 367 383 313 257 273 +629 6 4 83 1 1 2 168 114 130 422 368 384 +630 6 4 83 1 1 2 422 368 384 312 258 274 +631 6 5 83 1 2 2 -1 193 108 162 447 362 416 +632 6 5 83 1 2 2 -1 447 362 416 337 252 306 +633 6 5 83 1 2 4 -3 192 110 161 446 364 415 +634 6 5 83 1 2 4 -3 446 364 415 336 254 305 +635 6 4 83 1 1 1 172 25 26 426 215 216 +636 6 4 83 1 1 1 426 215 216 316 59 60 +637 6 4 83 1 1 3 171 38 39 425 228 229 +638 6 4 83 1 1 3 425 228 229 315 72 73 +639 6 4 83 1 1 3 188 105 142 442 359 396 +640 6 4 83 1 1 3 442 359 396 332 249 286 +641 6 4 83 1 1 1 189 106 143 443 360 397 +642 6 4 83 1 1 1 443 360 397 333 250 287 +643 6 5 83 1 2 2 -4 165 124 175 419 378 429 +644 6 5 83 1 2 2 -4 419 378 429 309 268 319 +645 6 4 83 1 1 4 152 113 140 406 367 394 +646 6 4 83 1 1 4 406 367 394 296 257 284 +647 6 5 83 1 2 4 -2 212 121 137 466 375 391 +648 6 5 83 1 2 4 -2 466 375 391 356 265 281 +649 6 5 83 1 2 3 -4 144 10 208 398 104 462 +650 6 5 83 1 2 3 -4 398 104 462 288 24 352 +651 6 5 83 1 2 1 -2 145 8 209 399 98 463 +652 6 5 83 1 2 1 -2 399 98 463 289 18 353 +653 6 5 83 1 2 2 -4 175 121 165 429 375 419 +654 6 5 83 1 2 2 -4 429 375 419 319 265 309 +655 6 4 83 1 1 2 197 124 150 451 378 404 +656 6 4 83 1 1 2 451 378 404 341 268 294 +657 6 4 83 1 1 3 177 125 163 431 379 417 +658 6 4 83 1 1 3 431 379 417 321 269 307 +659 6 4 83 1 1 1 178 126 164 432 380 418 +660 6 4 83 1 1 1 432 380 418 322 270 308 +661 6 4 83 1 1 4 182 129 152 436 383 406 +662 6 4 83 1 1 4 436 383 406 326 273 296 +663 6 5 83 1 2 4 -3 167 43 44 421 233 234 +664 6 5 83 1 2 4 -3 421 233 234 311 77 78 +665 6 5 83 1 2 2 -1 166 30 31 420 220 221 +666 6 5 83 1 2 2 -1 420 220 221 310 64 65 +667 6 4 83 1 1 3 142 119 188 396 373 442 +668 6 4 83 1 1 3 396 373 442 286 263 332 +669 6 4 83 1 1 1 143 120 189 397 374 443 +670 6 4 83 1 1 1 397 374 443 287 264 333 +671 6 4 83 1 1 3 139 39 199 393 229 453 +672 6 4 83 1 1 3 393 229 453 283 73 343 +673 6 4 83 1 1 1 138 26 198 392 216 452 +674 6 4 83 1 1 1 392 216 452 282 60 342 +675 6 4 83 1 1 3 177 105 188 431 359 442 +676 6 4 83 1 1 3 431 359 442 321 249 332 +677 6 4 83 1 1 1 178 106 189 432 360 443 +678 6 4 83 1 1 1 432 360 443 322 250 333 +679 6 4 83 1 1 1 203 25 172 457 215 426 +680 6 4 83 1 1 1 457 215 426 347 59 316 +681 6 4 83 1 1 3 202 38 171 456 228 425 +682 6 4 83 1 1 3 456 228 425 346 72 315 +683 6 4 83 1 1 3 208 10 157 462 104 411 +684 6 4 83 1 1 3 462 104 411 352 24 301 +685 6 4 83 1 1 1 209 8 159 463 98 413 +686 6 4 83 1 1 1 463 98 413 353 18 303 +687 6 4 83 1 1 3 199 39 40 453 229 230 +688 6 4 83 1 1 3 453 229 230 343 73 74 +689 6 4 83 1 1 1 198 26 27 452 216 217 +690 6 4 83 1 1 1 452 216 217 342 60 61 +691 6 5 83 1 2 4 -2 186 137 187 440 391 441 +692 6 5 83 1 2 4 -2 440 391 441 330 281 331 +693 6 5 83 1 2 2 -1 162 133 193 416 387 447 +694 6 5 83 1 2 2 -1 416 387 447 306 277 337 +695 6 4 83 1 1 4 161 132 192 415 386 446 +696 6 4 83 1 1 4 415 386 446 305 276 336 +697 6 4 83 1 1 4 155 122 187 409 376 441 +698 6 4 83 1 1 4 409 376 441 299 266 331 +699 6 5 83 1 2 3 -2 148 34 147 402 224 401 +700 6 5 83 1 2 3 -2 402 224 401 292 68 291 +701 6 5 83 1 2 4 -1 149 47 146 403 237 400 +702 6 5 83 1 2 4 -1 403 237 400 293 81 290 +703 6 4 83 1 1 3 153 125 194 407 379 448 +704 6 4 83 1 1 3 407 379 448 297 269 338 +705 6 4 83 1 1 1 154 126 195 408 380 449 +706 6 4 83 1 1 1 408 380 449 298 270 339 +707 6 4 83 1 1 3 199 125 177 453 379 431 +708 6 4 83 1 1 3 453 379 431 343 269 321 +709 6 4 83 1 1 1 198 126 178 452 380 432 +710 6 4 83 1 1 1 452 380 432 342 270 322 +711 6 4 83 1 1 2 183 130 151 437 384 405 +712 6 4 83 1 1 2 437 384 405 327 274 295 +713 6 5 83 1 2 4 -2 187 9 155 441 101 409 +714 6 5 83 1 2 4 -2 441 101 409 331 21 299 +715 6 5 83 1 2 4 -3 155 55 190 409 248 444 +716 6 5 83 1 2 4 -3 409 248 444 299 92 334 +717 6 5 83 1 2 2 -1 156 53 191 410 242 445 +718 6 5 83 1 2 2 -1 410 242 445 300 86 335 +719 6 4 83 1 1 4 187 122 186 441 376 440 +720 6 4 83 1 1 4 441 376 440 331 266 330 +721 6 4 83 1 1 4 200 122 155 454 376 409 +722 6 4 83 1 1 4 454 376 409 344 266 299 +723 6 4 83 1 1 2 201 123 156 455 377 410 +724 6 4 83 1 1 2 455 377 410 345 267 300 +725 6 5 83 1 2 3 -4 158 144 208 412 398 462 +726 6 5 83 1 2 3 -4 412 398 462 302 288 352 +727 6 5 83 1 2 1 -2 160 145 209 414 399 463 +728 6 5 83 1 2 1 -2 414 399 463 304 289 353 +729 6 4 83 1 1 3 188 139 177 442 393 431 +730 6 4 83 1 1 3 442 393 431 332 283 321 +731 6 4 83 1 1 1 189 138 178 443 392 432 +732 6 4 83 1 1 1 443 392 432 333 282 322 +733 6 4 83 1 1 2 168 130 193 422 384 447 +734 6 4 83 1 1 2 422 384 447 312 274 337 +735 6 4 83 1 1 4 169 129 192 423 383 446 +736 6 4 83 1 1 4 423 383 446 313 273 336 +737 6 5 83 1 2 3 -4 184 111 179 438 365 433 +738 6 5 83 1 2 3 -4 438 365 433 328 255 323 +739 6 4 83 1 1 1 185 112 180 439 366 434 +740 6 4 83 1 1 1 439 366 434 329 256 324 +741 6 4 83 1 1 4 140 113 207 394 367 461 +742 6 4 83 1 1 4 394 367 461 284 257 351 +743 6 4 83 1 1 2 141 114 206 395 368 460 +744 6 4 83 1 1 2 395 368 460 285 258 350 +745 6 4 83 1 1 4 192 129 211 446 383 465 +746 6 4 83 1 1 4 446 383 465 336 273 355 +747 6 4 83 1 1 2 193 130 210 447 384 464 +748 6 4 83 1 1 2 447 384 464 337 274 354 +749 6 4 83 1 1 4 207 46 149 461 236 403 +750 6 4 83 1 1 4 461 236 403 351 80 293 +751 6 5 83 1 2 2 -3 206 33 148 460 223 402 +752 6 5 83 1 2 2 -3 460 223 402 350 67 292 +753 6 4 83 1 1 3 157 117 158 411 371 412 +754 6 4 83 1 1 3 411 371 412 301 261 302 +755 6 4 83 1 1 1 159 118 160 413 372 414 +756 6 4 83 1 1 1 413 372 414 303 262 304 +757 6 5 83 1 2 4 -2 212 109 165 466 363 419 +758 6 5 83 1 2 4 -2 466 363 419 356 253 309 +759 6 4 83 1 1 4 207 149 213 461 403 467 +760 6 4 83 1 1 4 461 403 467 351 293 357 +761 6 5 83 1 2 2 -3 206 148 214 460 402 468 +762 6 5 83 1 2 2 -3 460 402 468 350 292 358 +763 6 5 83 1 2 4 -3 211 110 192 465 364 446 +764 6 5 83 1 2 4 -3 465 364 446 355 254 336 +765 6 5 83 1 2 2 -1 210 108 193 464 362 447 +766 6 5 83 1 2 2 -1 464 362 447 354 252 337 +767 6 4 83 1 1 4 182 109 186 436 363 440 +768 6 4 83 1 1 4 436 363 440 326 253 330 +769 6 5 83 1 2 4 -2 165 121 212 419 375 466 +770 6 5 83 1 2 4 -2 419 375 466 309 265 356 +771 6 4 83 1 1 2 175 124 197 429 378 451 +772 6 4 83 1 1 2 429 378 451 319 268 341 +773 6 4 83 1 1 2 210 123 201 464 377 455 +774 6 4 83 1 1 2 464 377 455 354 267 345 +775 6 4 83 1 1 4 211 122 200 465 376 454 +776 6 4 83 1 1 4 465 376 454 355 266 344 +777 6 4 83 1 1 3 147 35 204 401 225 458 +778 6 4 83 1 1 3 401 225 458 291 69 348 +779 6 5 83 1 2 1 -4 146 48 205 400 238 459 +780 6 5 83 1 2 1 -4 400 238 459 290 82 349 +781 6 4 83 1 1 3 171 119 202 425 373 456 +782 6 4 83 1 1 3 425 373 456 315 263 346 +783 6 4 83 1 1 1 172 120 203 426 374 457 +784 6 4 83 1 1 1 426 374 457 316 264 347 +785 6 4 83 1 1 3 208 157 158 462 411 412 +786 6 4 83 1 1 3 462 411 412 352 301 302 +787 6 4 83 1 1 1 209 159 160 463 413 414 +788 6 4 83 1 1 1 463 413 414 353 303 304 +789 6 4 83 1 1 4 213 140 207 467 394 461 +790 6 4 83 1 1 4 467 394 461 357 284 351 +791 6 4 83 1 1 2 214 141 206 468 395 460 +792 6 4 83 1 1 2 468 395 460 358 285 350 +793 6 5 83 1 2 2 -1 201 108 210 455 362 464 +794 6 5 83 1 2 2 -1 455 362 464 345 252 354 +795 6 5 83 1 2 4 -3 200 110 211 454 364 465 +796 6 5 83 1 2 4 -3 454 364 465 344 254 355 +797 6 5 83 1 2 4 -3 155 134 200 409 388 454 +798 6 5 83 1 2 4 -3 409 388 454 299 278 344 +799 6 5 83 1 2 2 -1 156 135 201 410 389 455 +800 6 5 83 1 2 2 -1 410 389 455 300 279 345 +801 6 4 83 1 1 2 193 133 168 447 387 422 +802 6 4 83 1 1 2 447 387 422 337 277 312 +803 6 4 83 1 1 4 192 132 169 446 386 423 +804 6 4 83 1 1 4 446 386 423 336 276 313 +805 6 5 83 1 2 4 -3 190 134 155 444 388 409 +806 6 5 83 1 2 4 -3 444 388 409 334 278 299 +807 6 5 83 1 2 2 -1 191 135 156 445 389 410 +808 6 5 83 1 2 2 -1 445 389 410 335 279 300 +809 6 4 83 1 1 4 186 122 182 440 376 436 +810 6 4 83 1 1 4 440 376 436 330 266 326 +811 6 5 83 1 2 4 -2 212 137 186 466 391 440 +812 6 5 83 1 2 4 -2 466 391 440 356 281 330 +813 6 4 83 1 1 1 178 138 198 432 392 452 +814 6 4 83 1 1 1 432 392 452 322 282 342 +815 6 4 83 1 1 3 177 139 199 431 393 453 +816 6 4 83 1 1 3 431 393 453 321 283 343 +817 6 4 83 1 1 2 197 107 175 451 361 429 +818 6 4 83 1 1 2 451 361 429 341 251 319 +819 6 4 83 1 1 4 186 109 212 440 363 466 +820 6 4 83 1 1 4 440 363 466 330 253 356 +821 6 4 83 1 1 4 182 122 211 436 376 465 +822 6 4 83 1 1 4 436 376 465 326 266 355 +823 6 4 83 1 1 2 183 123 210 437 377 464 +824 6 4 83 1 1 2 437 377 464 327 267 354 +825 6 5 83 1 2 3 -4 179 127 184 433 381 438 +826 6 5 83 1 2 3 -4 433 381 438 323 271 328 +827 6 4 83 1 1 1 180 128 185 434 382 439 +828 6 4 83 1 1 1 434 382 439 324 272 329 +829 6 4 83 1 1 4 211 129 182 465 383 436 +830 6 4 83 1 1 4 465 383 436 355 273 326 +831 6 4 83 1 1 2 210 130 183 464 384 437 +832 6 4 83 1 1 2 464 384 437 354 274 327 +833 6 4 83 1 1 3 204 117 157 458 371 411 +834 6 4 83 1 1 3 458 371 411 348 261 301 +835 6 4 83 1 1 1 205 118 159 459 372 413 +836 6 4 83 1 1 1 459 372 413 349 262 303 +$EndElements diff --git a/dG3D/benchmarks/DG_PRI6_smallStrain/twoHole.py b/dG3D/benchmarks/DG_PRI6_smallStrain/twoHole.py new file mode 100644 index 0000000000000000000000000000000000000000..b9454f503d48d750a505e304160d788a529436e2 --- /dev/null +++ b/dG3D/benchmarks/DG_PRI6_smallStrain/twoHole.py @@ -0,0 +1,81 @@ +#coding-Utf-8-*- +from gmshpy import * +from dG3Dpy import* + +#script to launch beam problem with a python script + + +lawnum1 = 1 # unique number of law +rho = 7850 +young = 28.9e9 +nu = 0.3 +sy0 = 150.e6 +h = young/50. + + +# geometry +meshfile="twoHole.msh" # name of mesh file + +# solver +sol = 2 # Gmm=0 (default) Taucs=1 PETsc=2 +soltype = 1 # StaticLinear=0 (default) StaticNonLinear=1 +nstep = 125 # number of step (used only if soltype=1) +ftime =1. # Final time (used only if soltype=1) +tol=1.e-6 # relative tolerance for NR scheme (used only if soltype=1) +nstepArch=1 # Number of step between 2 archiving (used only if soltype=1) + + + +harden = LinearExponentialJ2IsotropicHardening(1, sy0, h, 0., 10.) +law1 = J2SmallStrainDG3DMaterialLaw(lawnum1,rho,young,nu,harden) + + +# creation of ElasticField +beta1 = 1e2 +fullDG = True; +averageStrainBased = False + +myfield1 = dG3DDomain(1000,83,0,lawnum1,fullDG,3) +myfield1.stabilityParameters(beta1) +myfield1.averageStrainBased(averageStrainBased) + + +# creation of Solver +mysolver = nonLinearMechSolver(1000) +mysolver.loadModel(meshfile) +mysolver.addDomain(myfield1) +mysolver.addMaterialLaw(law1) + +mysolver.Scheme(soltype) +mysolver.Solver(sol) +mysolver.snlData(nstep,ftime,tol) +mysolver.stepBetweenArchiving(nstepArch) +mysolver.options("-ksp_type preonly -pc_type lu -pc_factor_mat_solver_package mumps") + +# BC +#mysolver.displacementBC("Volume",83,2,0.) +mysolver.displacementBC("Face",84,0,0.) +mysolver.displacementBC("Face",84,1,0.) +mysolver.displacementBC("Face",84,2,0.) +mysolver.displacementBC("Face",85,0,0.) +mysolver.displacementBC("Face",85,1,5e-4) +mysolver.displacementBC("Face",85,2,0.) + + +mysolver.internalPointBuildView("svm",IPField.SVM, 1, 1) +mysolver.internalPointBuildView("sig_xx",IPField.SIG_XX, 1, 1) +mysolver.internalPointBuildView("sig_yy",IPField.SIG_YY, 1, 1) +mysolver.internalPointBuildView("sig_zz",IPField.SIG_ZZ, 1, 1) +mysolver.internalPointBuildView("sig_xy",IPField.SIG_XY, 1, 1) +mysolver.internalPointBuildView("sig_yz",IPField.SIG_YZ, 1, 1) +mysolver.internalPointBuildView("sig_xz",IPField.SIG_XZ, 1, 1) +mysolver.internalPointBuildView("epl",IPField.PLASTICSTRAIN, 1, 1) +mysolver.internalPointBuildView("Damage",IPField.DAMAGE, 1, 1) + +mysolver.archivingForceOnPhysicalGroup("Face", 84, 1) +mysolver.archivingNodeDisplacement(19,1,1) + +mysolver.solve() + +check = TestCheck() +check.equal(-2.860811e+03,mysolver.getArchivedForceOnPhysicalGroup("Face", 84, 1),1.e-4) diff --git a/dG3D/benchmarks/fullThermoMecaMicro/run.py b/dG3D/benchmarks/fullThermoMecaMicro/run.py index 91c086ddea24f7c78771a5944bac9439391ba67d..708824c6bde9be98731fcdfccee87a64aafdb113 100644 --- a/dG3D/benchmarks/fullThermoMecaMicro/run.py +++ b/dG3D/benchmarks/fullThermoMecaMicro/run.py @@ -53,8 +53,8 @@ law2.setTaylorQuineyFactor(TQff) meshfile="rve.msh" # name of mesh file # creation of part Domain -thermalSource = False -mecaSource = False +thermalSource = True +mecaSource = True ExtraEqRatio = 1.e2 myfield1 = ThermoMechanicsDG3DDomain(1000,11,0,lawnum1,0,ExtraEqRatio,3) myfield1.accountSource(thermalSource,mecaSource) @@ -141,6 +141,11 @@ mysolver.internalPointBuildView("temperature",IPField.TEMPERATURE, 1, 1) mysolver.internalPointBuildView("qx",IPField.THERMALFLUX_X, 1, 1) mysolver.internalPointBuildView("qy",IPField.THERMALFLUX_Y, 1, 1) mysolver.internalPointBuildView("qz",IPField.THERMALFLUX_Z, 1, 1) + +mysolver.internalPointBuildView("mecaSource",IPField.MECHANICAL_SOURCE,1,1) +mysolver.internalPointBuildView("field source",IPField.FIELD_SOURCE,1,1) + + # solve mysolver.solve() diff --git a/dG3D/benchmarks/pathFollowing_cohesive/model.py b/dG3D/benchmarks/pathFollowing_cohesive/model.py index b3acfa6ea101a9858051e5c923004ee08569455b..83b77c1897e4b5a12b2c32d4cd7796505ab645e5 100644 --- a/dG3D/benchmarks/pathFollowing_cohesive/model.py +++ b/dG3D/benchmarks/pathFollowing_cohesive/model.py @@ -117,4 +117,4 @@ mysolver.archivingForceOnPhysicalGroup('Face',1,1) mysolver.solve() check = TestCheck() -check.equal(-1.229660e+03,mysolver.getArchivedForceOnPhysicalGroup("Face", 1, 1),1.e-2) +check.equal(-1.195570e+03,mysolver.getArchivedForceOnPhysicalGroup("Face", 1, 1),1.e-2) diff --git a/dG3D/benchmarks/secondOrderElasticShearlayer3D/CMakeLists.txt b/dG3D/benchmarks/secondOrderElasticShearlayer3D/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..6ec52c01a1f3c0c770178c8fe80b2073829455e3 --- /dev/null +++ b/dG3D/benchmarks/secondOrderElasticShearlayer3D/CMakeLists.txt @@ -0,0 +1,11 @@ +# test file + +set(PYFILE shearlayer3D.py) + +set(FILES2DELETE + *.csv + disp* + stress* +) + +add_cm3python_mpi_test(4 ${PYFILE} "${FILES2DELETE}") diff --git a/dG3D/benchmarks/secondOrderElasticShearlayer3D/shearlayer3D.geo b/dG3D/benchmarks/secondOrderElasticShearlayer3D/shearlayer3D.geo new file mode 100644 index 0000000000000000000000000000000000000000..a956efec2c6f2b82e2c67343eb5c7b5e5dca2314 --- /dev/null +++ b/dG3D/benchmarks/secondOrderElasticShearlayer3D/shearlayer3D.geo @@ -0,0 +1,33 @@ +L=1; +lca = 0.1*L; +Point(1) = {0.0, 0.0, 0.0, lca}; +Point(2) = {0.1*L, 0.0, 0.0, lca}; +Point(3) = {0.1*L, 0.0, 0.1*L, lca}; +Point(4) = {0.0, 0.0, 0.1*L, lca}; +Line(1) = {4, 3}; +Line(2) = {3, 2}; +Line(3) = {2, 1}; +Line(4) = {1, 4}; +Line Loop(5) = {1, 2, 3, 4}; +Plane Surface(6) = {5}; +out[] = Extrude {0, L, 0} { + Surface{6}; +}; +outUp[] = Extrude {0, 0.1*L, 0}{ + Surface{out[0]}; +}; +outLow[] = Extrude {0, -0.1*L, 0}{ + Surface{6}; +}; + +Physical Volume(1) = {out[1]}; +Physical Volume(2) = {outUp[1]}; +Physical Volume(3) = {outLow[1]}; +Transfinite Line {18, 14, 22, 13} = 15 Using Progression 1; +Transfinite Line {10, 8, 11, 9, 40, 36, 30, 32, 31, 33, 30, 44, 35, 3, 4, 1, 2, 62, 58, 66, 57, 58, 52, 57, 53, 62, 54, 55, 66} = 2 Using Progression 1; +Transfinite Surface {50, 37, 41, 49, 28, 45, 15, 19, 27, 6, 23, 59, 63, 71, 72, 67}; +Recombine Surface {50, 37, 41, 49, 28, 45, 15, 19, 27, 6, 23, 59, 63, 71, 72, 67}; +Transfinite Volume{2, 1, 3}; +Physical Surface(73) = {19}; +Physical Surface(74) = {27}; +Physical Line(75) = {18}; diff --git a/dG3D/benchmarks/secondOrderElasticShearlayer3D/shearlayer3D.py b/dG3D/benchmarks/secondOrderElasticShearlayer3D/shearlayer3D.py new file mode 100644 index 0000000000000000000000000000000000000000..a496025992129d6547b4d7728e8ac60be9a25609 --- /dev/null +++ b/dG3D/benchmarks/secondOrderElasticShearlayer3D/shearlayer3D.py @@ -0,0 +1,182 @@ +#coding-Utf-8-*- +from gmshpy import * +from dG3Dpy import* + +#script to launch PBC problem with a python script + +# macro-material law +lawnum1 = 11 # unique number of law +E1 = 70E3 +nu1 = 0.3 +K1 = E1/3./(1.-2.*nu1) # Bulk mudulus +mu1 =E1/2./(1.+nu1) # Shear mudulus +rho1 = 2700. # Bulk mass + +le1 = 0.1 +a =0.5*le1*le1*mu1; +b =le1*mu1; + +# creation of material law +law1 = fullHODGElasticMaterialLaw(lawnum1,rho1) +law1.setType(0,3) +law1.setParameter('BULK_MODULUS',K1) +law1.setParameter('SHEAR_MODULUS',mu1) + +law1.setParameter('A1',a) +law1.setParameter('A2',a) +law1.setParameter('A3',a) +law1.setParameter('A4',a) +law1.setParameter('A5',a) + +law1.setParameter('B0',b) +law1.setParameter('B1',b) +law1.setParameter('B2',b) + +# micro-geometry +#meshfile="shearlayer3D_Quad.msh" # name of mesh file +meshfile="shearlayer3D_QuadPart4.msh" + +# creation of micro part Domain +fulldg= 1 +beta1 = 10 +bulkpert =0 +interpert = 0 +perturbation = 1e-6 + +nfield1 = 1 # number of the field (physical number of entity) +myfield1 = hoDGDomain(1000,nfield1,0,lawnum1,fulldg) +myfield1.stabilityParameters(beta1) +myfield1.matrixByPerturbation(bulkpert,interpert,interpert,perturbation) +#myfield1.gaussIntegration(hoDGDomain.Gauss,2,2) + +nfield2 = 2 # number of the field (physical number of entity) +myfield2 = hoDGDomain(1000,nfield2,0,lawnum1,fulldg) +myfield2.stabilityParameters(beta1) +myfield2.matrixByPerturbation(bulkpert,interpert,interpert,perturbation) +#myfield2.gaussIntegration(hoDGDomain.Gauss,2,2) + +nfield3 = 3 # number of the field (physical number of entity) +myfield3 = hoDGDomain(1000,nfield3,0,lawnum1,fulldg) +myfield3.stabilityParameters(beta1) +myfield3.matrixByPerturbation(bulkpert,interpert,interpert,perturbation) +#myfield3.gaussIntegration(hoDGDomain.Gauss,2,2) + + +myfieldinter1 = hoDGInterDomain(1000,myfield1,myfield2) +myfieldinter1.stabilityParameters(beta1) +myfieldinter1.matrixByPerturbation(interpert,perturbation) +#myfieldinter1.gaussIntegration(hoDGDomain.Gauss,2,2) + +myfieldinter2 = hoDGInterDomain(1000,myfield1,myfield3) +myfieldinter2.stabilityParameters(beta1) +myfieldinter2.matrixByPerturbation(interpert,perturbation) +#myfieldinter.gaussIntegration(hoDGDomain.Gauss,2,2) + + +# solver +sol = 2 # Gmm=0 (default) Taucs=1 PETsc=2 +soltype =1 # StaticLinear=0 (default) StaticNonLinear=1 +nstep = 5 # number of step (used only if soltype=1) +ftime =1. # Final time (used only if soltype=1) +tol=1.e-2 # relative tolerance for NR scheme (used only if soltype=1) +nstepArch=1 # Number of step between 2 archiving (used only if soltype=1) + + + +# creation of Solver +mysolver = nonLinearMechSolver(1000) +mysolver.loadModel(meshfile) + +mysolver.addMaterialLaw(law1) + +mysolver.addDomain(myfield1) +mysolver.addDomain(myfield2) +mysolver.addDomain(myfield3) +mysolver.addDomain(myfieldinter1) +mysolver.addDomain(myfieldinter2) + +mysolver.Scheme(soltype) +mysolver.Solver(sol) +mysolver.snlData(nstep,ftime,tol) + +# boundary condition + +mysolver.displacementBC("Volume",1,1,0.0) +mysolver.displacementBC("Volume",1,2,0.0) + +mysolver.displacementBC("Volume",2,0,0.1) +mysolver.displacementBC("Volume",2,1,0) +mysolver.displacementBC("Volume",2,2,0) + +mysolver.displacementBC("Volume",3,0,0) +mysolver.displacementBC("Volume",3,1,0) +mysolver.displacementBC("Volume",3,2,0) + +#mysolver.periodicBC("Face",73,74,0) + +# archivage +mysolver.internalPointBuildView("F_xx",IPField.F_XX, 1, 1); +mysolver.internalPointBuildView("F_xy",IPField.F_XY, 1, 1); +mysolver.internalPointBuildView("F_xz",IPField.F_XZ, 1, 1); +mysolver.internalPointBuildView("F_yx",IPField.F_YX, 1, 1); +mysolver.internalPointBuildView("F_yy",IPField.F_YY, 1, 1); +mysolver.internalPointBuildView("F_yz",IPField.F_YZ, 1, 1); +mysolver.internalPointBuildView("F_zx",IPField.F_ZX, 1, 1); +mysolver.internalPointBuildView("F_zy",IPField.F_ZY, 1, 1); +mysolver.internalPointBuildView("F_zz",IPField.F_ZZ, 1, 1); + + +mysolver.internalPointBuildView("G_xxx",IPField.G_XXX, 1, 1); +mysolver.internalPointBuildView("G_xyy",IPField.G_XYY, 1, 1); +mysolver.internalPointBuildView("G_xzz",IPField.G_XZZ, 1, 1); +mysolver.internalPointBuildView("G_xxy",IPField.G_XXY, 1, 1); +mysolver.internalPointBuildView("G_xxz",IPField.G_XXZ, 1, 1); +mysolver.internalPointBuildView("G_xyz",IPField.G_XYZ, 1, 1); + +mysolver.internalPointBuildView("G_yxx",IPField.G_YXX, 1, 1); +mysolver.internalPointBuildView("G_yyy",IPField.G_YYY, 1, 1); +mysolver.internalPointBuildView("G_yzz",IPField.G_YZZ, 1, 1); +mysolver.internalPointBuildView("G_yxy",IPField.G_YXY, 1, 1); +mysolver.internalPointBuildView("G_yxz",IPField.G_YXZ, 1, 1); +mysolver.internalPointBuildView("G_yyz",IPField.G_YYZ, 1, 1); + +mysolver.internalPointBuildView("G_zxx",IPField.G_ZXX, 1, 1); +mysolver.internalPointBuildView("G_zyy",IPField.G_ZYY, 1, 1); +mysolver.internalPointBuildView("G_zzz",IPField.G_ZZZ, 1, 1); +mysolver.internalPointBuildView("G_zxy",IPField.G_ZXY, 1, 1); +mysolver.internalPointBuildView("G_zxz",IPField.G_ZXZ, 1, 1); +mysolver.internalPointBuildView("G_zyz",IPField.G_ZYZ, 1, 1); + + + +mysolver.internalPointBuildView("strain_xx",IPField.STRAIN_XX, 1, 1); +mysolver.internalPointBuildView("strain_yy",IPField.STRAIN_YY, 1, 1); +mysolver.internalPointBuildView("strain_zz",IPField.STRAIN_ZZ, 1, 1); +mysolver.internalPointBuildView("strain_xy",IPField.STRAIN_XY, 1, 1); +mysolver.internalPointBuildView("strain_yz",IPField.STRAIN_YZ, 1, 1); +mysolver.internalPointBuildView("strain_xz",IPField.STRAIN_XZ, 1, 1); + +mysolver.internalPointBuildView("sig_xx",IPField.SIG_XX, 1, 1); +mysolver.internalPointBuildView("sig_yy",IPField.SIG_YY, 1, 1); +mysolver.internalPointBuildView("sig_zz",IPField.SIG_ZZ, 1, 1); +mysolver.internalPointBuildView("sig_xy",IPField.SIG_XY, 1, 1); +mysolver.internalPointBuildView("sig_yz",IPField.SIG_YZ, 1, 1); +mysolver.internalPointBuildView("sig_xz",IPField.SIG_XZ, 1, 1); +mysolver.internalPointBuildView("sig VM",IPField.SVM,1,1); + +mysolver.internalPointBuildView("High-order strain norm",IPField.HIGHSTRAIN_NORM, 1, 1); +mysolver.internalPointBuildView("High-order stress norm",IPField.HIGHSTRESS_NORM, 1, 1); +mysolver.internalPointBuildView("Green -Lagrange strain norm",IPField.GL_NORM, 1, 1); + +mysolver.archivingForceOnPhysicalGroup("Volume",2,0) +mysolver.archivingForceOnPhysicalGroup("Volume",2,1) +mysolver.archivingForceOnPhysicalGroup("Volume",2,2) + + +# solve +mysolver.solve() + +check = TestCheck() +check.equal(3.537427e+01,mysolver.getArchivedForceOnPhysicalGroup("Volume",2, 0),1.e-4) + + diff --git a/dG3D/benchmarks/secondOrderElasticShearlayer3D/shearlayer3D_QuadPart4.msh b/dG3D/benchmarks/secondOrderElasticShearlayer3D/shearlayer3D_QuadPart4.msh new file mode 100644 index 0000000000000000000000000000000000000000..d31e6b14dfb72f5cc399b1c2c69869786e924702 --- /dev/null +++ b/dG3D/benchmarks/secondOrderElasticShearlayer3D/shearlayer3D_QuadPart4.msh @@ -0,0 +1,377 @@ +$MeshFormat +2.2 0 8 +$EndMeshFormat +$Nodes +310 +1 0 0 0 +2 0.1 0 0 +3 0.1 0 0.1 +4 0 0 0.1 +5 0 1 0.1 +6 0.1 1 0.1 +7 0.1 1 0 +8 0 1 0 +9 0 1.1 0.1 +10 0.1 1.1 0.1 +11 0.1 1.1 0 +12 0 1.1 0 +13 0 -0.1 0.1 +14 0.1 -0.1 0.1 +15 0.1 -0.1 0 +16 0 -0.1 0 +17 0.04999999999985524 0 0.1 +18 0.1 0 0.05000000000015159 +19 0.05000000000015159 0 0 +20 0 0 0.04999999999985524 +21 0.04999999999985524 1 0.1 +22 0.1 1 0.05000000000015159 +23 0.05000000000015159 1 0 +24 0 1 0.04999999999985524 +25 0 0.07142857142842932 0.1 +26 0 0.1428571428568666 0.1 +27 0 0.2142857142852295 0.1 +28 0 0.2857142857135924 0.1 +29 0 0.3571428571419553 0.1 +30 0 0.4285714285703183 0.1 +31 0 0.4999999999986921 0.1 +32 0 0.5714285714274411 0.1 +33 0 0.6428571428562009 0.1 +34 0 0.7142857142849607 0.1 +35 0 0.7857142857137205 0.1 +36 0 0.8571428571424804 0.1 +37 0 0.9285714285712401 0.1 +38 0 0.03571428571421741 0.1 +39 0 0.1071428571426603 0.1 +40 0 0.178571428571048 0.1 +41 0 0.249999999999411 0.1 +42 0 0.3214285714277739 0.1 +43 0 0.3928571428561368 0.1 +44 0 0.4642857142845052 0.1 +45 0 0.5357142857130666 0.1 +46 0 0.607142857141821 0.1 +47 0 0.6785714285705808 0.1 +48 0 0.7499999999993406 0.1 +49 0 0.8214285714281004 0.1 +50 0 0.8928571428568602 0.1 +51 0 0.96428571428562 0.1 +52 0.1 0.07142857142842932 0.1 +53 0.1 0.1428571428568666 0.1 +54 0.1 0.2142857142852295 0.1 +55 0.1 0.2857142857135924 0.1 +56 0.1 0.3571428571419553 0.1 +57 0.1 0.4285714285703183 0.1 +58 0.1 0.4999999999986921 0.1 +59 0.1 0.5714285714274411 0.1 +60 0.1 0.6428571428562009 0.1 +61 0.1 0.7142857142849607 0.1 +62 0.1 0.7857142857137205 0.1 +63 0.1 0.8571428571424804 0.1 +64 0.1 0.9285714285712401 0.1 +65 0.1 0.03571428571421741 0.1 +66 0.1 0.1071428571426603 0.1 +67 0.1 0.178571428571048 0.1 +68 0.1 0.249999999999411 0.1 +69 0.1 0.3214285714277739 0.1 +70 0.1 0.3928571428561368 0.1 +71 0.1 0.4642857142845052 0.1 +72 0.1 0.5357142857130666 0.1 +73 0.1 0.607142857141821 0.1 +74 0.1 0.6785714285705808 0.1 +75 0.1 0.7499999999993406 0.1 +76 0.1 0.8214285714281004 0.1 +77 0.1 0.8928571428568602 0.1 +78 0.1 0.96428571428562 0.1 +79 0.1 0.07142857142842932 0 +80 0.1 0.1428571428568666 0 +81 0.1 0.2142857142852295 0 +82 0.1 0.2857142857135924 0 +83 0.1 0.3571428571419553 0 +84 0.1 0.4285714285703183 0 +85 0.1 0.4999999999986921 0 +86 0.1 0.5714285714274411 0 +87 0.1 0.6428571428562009 0 +88 0.1 0.7142857142849607 0 +89 0.1 0.7857142857137205 0 +90 0.1 0.8571428571424804 0 +91 0.1 0.9285714285712401 0 +92 0.1 0.03571428571421741 0 +93 0.1 0.1071428571426603 0 +94 0.1 0.178571428571048 0 +95 0.1 0.249999999999411 0 +96 0.1 0.3214285714277739 0 +97 0.1 0.3928571428561368 0 +98 0.1 0.4642857142845052 0 +99 0.1 0.5357142857130666 0 +100 0.1 0.607142857141821 0 +101 0.1 0.6785714285705808 0 +102 0.1 0.7499999999993406 0 +103 0.1 0.8214285714281004 0 +104 0.1 0.8928571428568602 0 +105 0.1 0.96428571428562 0 +106 0 0.07142857142842932 0 +107 0 0.1428571428568666 0 +108 0 0.2142857142852295 0 +109 0 0.2857142857135924 0 +110 0 0.3571428571419553 0 +111 0 0.4285714285703183 0 +112 0 0.4999999999986921 0 +113 0 0.5714285714274411 0 +114 0 0.6428571428562009 0 +115 0 0.7142857142849607 0 +116 0 0.7857142857137205 0 +117 0 0.8571428571424804 0 +118 0 0.9285714285712401 0 +119 0 0.03571428571421741 0 +120 0 0.1071428571426603 0 +121 0 0.178571428571048 0 +122 0 0.249999999999411 0 +123 0 0.3214285714277739 0 +124 0 0.3928571428561368 0 +125 0 0.4642857142845052 0 +126 0 0.5357142857130666 0 +127 0 0.607142857141821 0 +128 0 0.6785714285705808 0 +129 0 0.7499999999993406 0 +130 0 0.8214285714281004 0 +131 0 0.8928571428568602 0 +132 0 0.96428571428562 0 +133 0.04999999999985524 1.1 0.1 +134 0.1 1.1 0.05000000000015159 +135 0.05000000000015159 1.1 0 +136 0 1.1 0.04999999999985524 +137 0 1.05 0.1 +138 0.1 1.05 0.1 +139 0.1 1.05 0 +140 0 1.05 0 +141 0.04999999999985524 -0.1 0.1 +142 0.1 -0.1 0.05000000000015159 +143 0.05000000000015159 -0.1 0 +144 0 -0.1 0.04999999999985524 +145 0 -0.04999999999985524 0.1 +146 0.1 -0.04999999999985524 0.1 +147 0.1 -0.04999999999985524 0 +148 0 -0.04999999999985524 0 +149 0.05000000000000342 0 0.05000000000000342 +150 0.05 0.07142857142842932 0.1 +151 0.04999999999992763 0.03571428571421742 0.1 +152 0.05 0.1428571428568666 0.1 +153 0.05 0.1071428571426604 0.1 +154 0.05 0.2142857142852295 0.1 +155 0.05 0.1785714285710481 0.1 +156 0.05 0.2857142857135924 0.1 +157 0.05 0.249999999999411 0.1 +158 0.05 0.3571428571419553 0.1 +159 0.05 0.3214285714277739 0.1 +160 0.05 0.4285714285703183 0.1 +161 0.05 0.3928571428561368 0.1 +162 0.05 0.4999999999986921 0.1 +163 0.05 0.4642857142845052 0.1 +164 0.05 0.5714285714274411 0.1 +165 0.05 0.5357142857130666 0.1 +166 0.05 0.6428571428562009 0.1 +167 0.05 0.6071428571418211 0.1 +168 0.05 0.7142857142849607 0.1 +169 0.05 0.6785714285705808 0.1 +170 0.05 0.7857142857137205 0.1 +171 0.05 0.7499999999993407 0.1 +172 0.05 0.8571428571424804 0.1 +173 0.05 0.8214285714281004 0.1 +174 0.05 0.9285714285712401 0.1 +175 0.05 0.8928571428568602 0.1 +176 0.04999999999992763 0.96428571428562 0.1 +177 0.1 0.07142857142842932 0.05 +178 0.1 0.03571428571421742 0.0500000000000758 +179 0.1 0.1428571428568666 0.05 +180 0.1 0.1071428571426604 0.05 +181 0.1 0.2142857142852295 0.05 +182 0.1 0.1785714285710481 0.05 +183 0.1 0.2857142857135924 0.05 +184 0.1 0.249999999999411 0.05 +185 0.1 0.3571428571419553 0.05 +186 0.1 0.3214285714277739 0.05 +187 0.1 0.4285714285703183 0.05 +188 0.1 0.3928571428561368 0.05 +189 0.1 0.4999999999986921 0.05 +190 0.1 0.4642857142845052 0.05 +191 0.1 0.5714285714274411 0.05 +192 0.1 0.5357142857130666 0.05 +193 0.1 0.6428571428562009 0.05 +194 0.1 0.6071428571418211 0.05 +195 0.1 0.7142857142849607 0.05 +196 0.1 0.6785714285705808 0.05 +197 0.1 0.7857142857137205 0.05 +198 0.1 0.7499999999993407 0.05 +199 0.1 0.8571428571424804 0.05 +200 0.1 0.8214285714281004 0.05 +201 0.1 0.9285714285712401 0.05 +202 0.1 0.8928571428568602 0.05 +203 0.1 0.96428571428562 0.0500000000000758 +204 0.05 0.07142857142842932 0 +205 0.0500000000000758 0.03571428571421742 0 +206 0.05 0.1428571428568666 0 +207 0.05 0.1071428571426604 0 +208 0.05 0.2142857142852295 0 +209 0.05 0.1785714285710481 0 +210 0.05 0.2857142857135924 0 +211 0.05 0.249999999999411 0 +212 0.05 0.3571428571419553 0 +213 0.05 0.3214285714277739 0 +214 0.05 0.4285714285703183 0 +215 0.05 0.3928571428561368 0 +216 0.05 0.4999999999986921 0 +217 0.05 0.4642857142845052 0 +218 0.05 0.5714285714274411 0 +219 0.05 0.5357142857130666 0 +220 0.05 0.6428571428562009 0 +221 0.05 0.6071428571418211 0 +222 0.05 0.7142857142849607 0 +223 0.05 0.6785714285705808 0 +224 0.05 0.7857142857137205 0 +225 0.05 0.7499999999993407 0 +226 0.05 0.8571428571424804 0 +227 0.05 0.8214285714281004 0 +228 0.05 0.9285714285712401 0 +229 0.05 0.8928571428568602 0 +230 0.0500000000000758 0.96428571428562 0 +231 0 0.07142857142842932 0.05 +232 0 0.03571428571421742 0.04999999999992763 +233 0 0.1428571428568666 0.05 +234 0 0.1071428571426604 0.05 +235 0 0.2142857142852295 0.05 +236 0 0.1785714285710481 0.05 +237 0 0.2857142857135924 0.05 +238 0 0.249999999999411 0.05 +239 0 0.3571428571419553 0.05 +240 0 0.3214285714277739 0.05 +241 0 0.4285714285703183 0.05 +242 0 0.3928571428561368 0.05 +243 0 0.4999999999986921 0.05 +244 0 0.4642857142845052 0.05 +245 0 0.5714285714274411 0.05 +246 0 0.5357142857130666 0.05 +247 0 0.6428571428562009 0.05 +248 0 0.6071428571418211 0.05 +249 0 0.7142857142849607 0.05 +250 0 0.6785714285705808 0.05 +251 0 0.7857142857137205 0.05 +252 0 0.7499999999993407 0.05 +253 0 0.8571428571424804 0.05 +254 0 0.8214285714281004 0.05 +255 0 0.9285714285712401 0.05 +256 0 0.8928571428568602 0.05 +257 0 0.96428571428562 0.04999999999992763 +258 0.05000000000000342 1 0.05000000000000342 +259 0.04999999999985525 1.05 0.1 +260 0.1 1.05 0.05000000000015159 +261 0.05000000000015159 1.05 0 +262 0 1.05 0.04999999999985525 +263 0.05000000000000342 1.1 0.05000000000000342 +264 0.04999999999985525 -0.04999999999985525 0.1 +265 0.1 -0.04999999999985525 0.05000000000015159 +266 0.05000000000015159 -0.04999999999985525 0 +267 0 -0.04999999999985525 0.04999999999985525 +268 0.05000000000000342 -0.1 0.05000000000000342 +269 0.05 0.07142857142842932 0.05 +270 0.05000000000000171 0.03571428571421742 0.05000000000000171 +271 0.05 0.07142857142842932 0.05 +272 0.05 0.1428571428568666 0.05 +273 0.05 0.1071428571426603 0.04999999999999999 +274 0.05 0.1428571428568666 0.05 +275 0.05 0.2142857142852295 0.05 +276 0.05 0.1785714285710481 0.04999999999999999 +277 0.05 0.2142857142852295 0.05 +278 0.05 0.2857142857135924 0.05 +279 0.05 0.249999999999411 0.04999999999999999 +280 0.05 0.2857142857135924 0.05 +281 0.05 0.3571428571419553 0.05 +282 0.05 0.3214285714277738 0.04999999999999999 +283 0.05 0.3571428571419553 0.05 +284 0.05 0.4285714285703183 0.05 +285 0.05 0.3928571428561369 0.04999999999999999 +286 0.05 0.4285714285703183 0.05 +287 0.05 0.4999999999986921 0.05 +288 0.05 0.4642857142845052 0.04999999999999999 +289 0.05 0.4999999999986921 0.05 +290 0.05 0.5714285714274411 0.05 +291 0.05 0.5357142857130667 0.04999999999999999 +292 0.05 0.5714285714274411 0.05 +293 0.05 0.6428571428562009 0.05 +294 0.05 0.6071428571418211 0.04999999999999999 +295 0.05 0.6428571428562009 0.05 +296 0.05 0.7142857142849607 0.05 +297 0.05 0.6785714285705808 0.04999999999999999 +298 0.05 0.7142857142849607 0.05 +299 0.05 0.7857142857137205 0.05 +300 0.05 0.7499999999993403 0.04999999999999999 +301 0.05 0.7857142857137205 0.05 +302 0.05 0.8571428571424804 0.05 +303 0.05 0.8214285714281009 0.04999999999999999 +304 0.05 0.8571428571424804 0.05 +305 0.05 0.9285714285712401 0.05 +306 0.05 0.8928571428568598 0.04999999999999999 +307 0.05 0.9285714285712401 0.05 +308 0.05000000000000171 0.9642857142856203 0.0500000000000017 +309 0.05000000000000342 1.05 0.05000000000000342 +310 0.05000000000000341 -0.04999999999985526 0.05000000000000342 +$EndNodes +$Elements +58 +1 8 2 75 18 2 79 92 +2 8 2 75 18 79 80 93 +3 8 2 75 18 80 81 94 +4 8 2 75 18 81 82 95 +5 8 2 75 18 82 83 96 +6 8 2 75 18 83 84 97 +7 8 2 75 18 84 85 98 +8 8 2 75 18 85 86 99 +9 8 2 75 18 86 87 100 +10 8 2 75 18 87 88 101 +11 8 2 75 18 88 89 102 +12 8 2 75 18 89 90 103 +13 8 2 75 18 90 91 104 +14 8 2 75 18 91 7 105 +15 10 4 73 19 1 1 3 2 79 52 18 92 177 65 178 +16 10 4 73 19 1 1 52 79 80 53 177 93 179 66 180 +17 10 4 73 19 1 1 53 80 81 54 179 94 181 67 182 +18 10 4 73 19 1 2 54 81 82 55 181 95 183 68 184 +19 10 4 73 19 1 2 55 82 83 56 183 96 185 69 186 +20 10 4 73 19 1 2 56 83 84 57 185 97 187 70 188 +21 10 4 73 19 1 2 57 84 85 58 187 98 189 71 190 +22 10 4 73 19 1 3 58 85 86 59 189 99 191 72 192 +23 10 4 73 19 1 3 59 86 87 60 191 100 193 73 194 +24 10 4 73 19 1 3 60 87 88 61 193 101 195 74 196 +25 10 4 73 19 1 3 61 88 89 62 195 102 197 75 198 +26 10 4 73 19 1 4 62 89 90 63 197 103 199 76 200 +27 10 4 73 19 1 4 63 90 91 64 199 104 201 77 202 +28 10 4 73 19 1 4 64 91 7 6 201 105 22 78 203 +29 10 4 74 27 1 1 1 4 25 106 20 38 231 119 232 +30 10 4 74 27 1 1 106 25 26 107 231 39 233 120 234 +31 10 4 74 27 1 1 107 26 27 108 233 40 235 121 236 +32 10 4 74 27 1 2 108 27 28 109 235 41 237 122 238 +33 10 4 74 27 1 2 109 28 29 110 237 42 239 123 240 +34 10 4 74 27 1 2 110 29 30 111 239 43 241 124 242 +35 10 4 74 27 1 2 111 30 31 112 241 44 243 125 244 +36 10 4 74 27 1 3 112 31 32 113 243 45 245 126 246 +37 10 4 74 27 1 3 113 32 33 114 245 46 247 127 248 +38 10 4 74 27 1 3 114 33 34 115 247 47 249 128 250 +39 10 4 74 27 1 3 115 34 35 116 249 48 251 129 252 +40 10 4 74 27 1 4 116 35 36 117 251 49 253 130 254 +41 10 4 74 27 1 4 117 36 37 118 253 50 255 131 256 +42 10 4 74 27 1 4 118 37 5 8 255 51 24 132 257 +43 12 4 1 1 1 1 4 3 2 1 25 52 79 106 17 20 38 18 65 19 92 119 150 231 177 204 149 151 232 178 205 269 270 +44 12 4 1 1 1 1 25 52 79 106 26 53 80 107 150 231 39 177 66 204 93 120 152 233 179 206 271 153 234 180 207 272 273 +45 12 5 1 1 2 1 -2 26 53 80 107 27 54 81 108 152 233 40 179 67 206 94 121 154 235 181 208 274 155 236 182 209 275 276 +46 12 5 1 1 2 2 -1 27 54 81 108 28 55 82 109 154 235 41 181 68 208 95 122 156 237 183 210 277 157 238 184 211 278 279 +47 12 4 1 1 1 2 28 55 82 109 29 56 83 110 156 237 42 183 69 210 96 123 158 239 185 212 280 159 240 186 213 281 282 +48 12 4 1 1 1 2 29 56 83 110 30 57 84 111 158 239 43 185 70 212 97 124 160 241 187 214 283 161 242 188 215 284 285 +49 12 5 1 1 2 2 -3 30 57 84 111 31 58 85 112 160 241 44 187 71 214 98 125 162 243 189 216 286 163 244 190 217 287 288 +50 12 5 1 1 2 3 -2 31 58 85 112 32 59 86 113 162 243 45 189 72 216 99 126 164 245 191 218 289 165 246 192 219 290 291 +51 12 4 1 1 1 3 32 59 86 113 33 60 87 114 164 245 46 191 73 218 100 127 166 247 193 220 292 167 248 194 221 293 294 +52 12 4 1 1 1 3 33 60 87 114 34 61 88 115 166 247 47 193 74 220 101 128 168 249 195 222 295 169 250 196 223 296 297 +53 12 5 1 1 2 3 -4 34 61 88 115 35 62 89 116 168 249 48 195 75 222 102 129 170 251 197 224 298 171 252 198 225 299 300 +54 12 5 1 1 2 4 -3 35 62 89 116 36 63 90 117 170 251 49 197 76 224 103 130 172 253 199 226 301 173 254 200 227 302 303 +55 12 4 1 1 1 4 36 63 90 117 37 64 91 118 172 253 50 199 77 226 104 131 174 255 201 228 304 175 256 202 229 305 306 +56 12 4 1 1 1 4 37 64 91 118 5 6 7 8 174 255 51 201 78 228 105 132 21 24 22 23 307 176 257 203 230 258 308 +57 12 4 2 2 1 4 5 6 7 8 9 10 11 12 21 24 137 22 138 23 139 140 133 136 134 135 258 259 262 260 261 263 309 +58 12 4 3 3 1 1 2 3 4 1 15 14 13 16 18 19 147 17 146 20 145 148 142 143 141 144 149 265 266 264 267 268 310 +$EndElements diff --git a/dG3D/benchmarks/smpT22Mechanism2/CMakeLists.txt b/dG3D/benchmarks/smpT22Mechanism2/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..0467dd68cafcd6d70ffc74955662359e2d2175ec --- /dev/null +++ b/dG3D/benchmarks/smpT22Mechanism2/CMakeLists.txt @@ -0,0 +1,12 @@ +# test file + +set(PYFILE SMP.py) + +set(FILES2DELETE + cube.msh + *.csv + disp* + stress* +) + +add_cm3python_mpi_test(3 ${PYFILE} "${FILES2DELETE}") diff --git a/dG3D/benchmarks/smpT22Mechanism2/SMP.py b/dG3D/benchmarks/smpT22Mechanism2/SMP.py new file mode 100644 index 0000000000000000000000000000000000000000..f6e74ae3db43c7d8a6d2d2dac1fb2a1c772386ec --- /dev/null +++ b/dG3D/benchmarks/smpT22Mechanism2/SMP.py @@ -0,0 +1,192 @@ +#coding-Utf-8-*- +from gmshpy import * + +#from dG3DpyDebug import* +from dG3Dpy import * + + +#script to launch beam problem with a python script + +# material law +lawnum= 1 # unique number of law +rho = 1020. +#young =Ex=Ey=Ez =2.1e11 +#nu =Vxy=Vxz=Vyz= 0.3 +#MUxy=MUxz=MUyz=Ex/(2.*(1.+Vxy)) +cv=1. +#Kx=Ky=Kz=51.9 +Kx=Ky=Kz=0.5 +#alphax=alphay=alphaz=12.e-6 + +mu_groundState3=0.75e6 +Im3=5. +pi=3.14159 + +tinitial = 273+22 +#tinitial = 273+58#58 50 +Tr=310 +Nmu_groundState2= 0.045 +mu_groundState2=1.38e6 +Im2=6.3 +Sgl2=58.e6 +Sr2=3.e2 +Delta=2.6 +m2=0.19 +epsilonr=5.2e-4 +n=2.1 +epsilonp02=5.2e-4 +alphar1=25.e-5 +alphagl1=13.e-5 +Ggl1=156.e6 +Gr1=13.4e6 +Mgl1=7.4e6 +Mr1=0.168e6 +Mugl1=0.35 +Mur1=0.49 +epsilon01=1.73e13 +Qgl1=1.4e-19 +Qr1=0.2e-21 +epsygl1=0.14 +#epsyr1=0. +d1=0.015 +Kb=1.3806488e-23 +m1=0.17 +V1=2.16e-27 +alphap=0.058 +Sa0=0. +ha1=230. +b1=5850e6 +g1=5.8 +phai01=0. +Z1=0.083 +r1=1.3 +s1=0.005 +Sb01=0. +Hgl1=1.56e6 +Lgl1=0.44e6 +Hr1=0.76e6 +Lr1=0.006e6 +l1=0.5 +be1=0.5 +#kb=1.3806488e-23 +v=0.6 +c0=1710.*rho +c1=4.1*rho + +# geometry +geofile="cube.geo" # name of mesh file +meshfile="cube.msh" # name of mesh file + +# solver +sol = 2 # Gmm=0 (default) Taucs=1 PETsc=2 +soltype = 1 # StaticLinear=0 (default) StaticNonLinear=1 +nstep =500# number of step (used only if soltype=1)#640 +ftime1 =630 # Final time (used only if soltype=1)22 = t= 630 +ftime =640 # Final time (used only if soltype=1)22 t = 680 +#ftime =360#58 330. +#ftime =308. # Final time (used only if soltype=1) +tol=1.e-4 # relative tolerance for NR scheme (used only if soltype=1) +nstepArch=1 # Number of step between 2 archiving (used only if soltype=1) +fullDg = True #O = CG, 1 = DG +space1 = 0 # function space (Lagrange=0) +beta1 = 40. + +alpha = beta=gamma=0. +#Tangent2 + +# compute solution and BC (given directly to the solver +# creation of law + +#law1 = SMPDG3DMaterialLaw( lawnum,rho,Ex, Ey, Ez,Vxy,Vxz,Vyz,MUxy,MUxz,MUyz,alpha,beta,gamma,cv,t0,Kx,Ky,Kz,alphax,alphay,alphaz,mu_groundState3,Im3,pi, +#Tr,Nmu_groundState2, mu_groundState2, Im2,Sgl2, Sr2, Delta, m2,epsilonr,n,epsilonp02) +law1 = SMPDG3DMaterialLaw( lawnum,rho,alpha,beta,gamma,tinitial,Kx,Ky,Kz,mu_groundState3,Im3,pi, +Tr,Nmu_groundState2, mu_groundState2, Im2,Sgl2, Sr2, Delta, m2,epsilonr,n,epsilonp02, alphar1, alphagl1, Ggl1, Gr1, Mgl1, Mr1, Mugl1, Mur1, epsilon01, Qgl1, + Qr1, epsygl1 , d1, m1, V1, alphap, Sa0, ha1, b1, g1, phai01, Z1,r1, s1, Sb01, Hgl1, Lgl1, Hr1, Lr1, l1, Kb, be1,c0,v,c1) + +law1.setStrainOrder(-1) +law1.setMechanism2(True); + +# creation of ElasticField +nfield = 10 # number of the field (physical number of surface) +#myfield1 = dG3DDomain(1000,nfield,space1,lawnum,fullDg) + +myfield1 = ThermoMechanicsDG3DDomain(1000,nfield,space1,lawnum,fullDg,1.e10) + +myfield1.matrixByPerturbation(0,0,0,1e-8) +#myfield1.matrixByPerturbation(1,1,1,1e-8) +myfield1.stabilityParameters(beta1) +myfield1.ThermoMechanicsStabilityParameters(beta1,fullDg) +# creation of Solver +mysolver = nonLinearMechSolver(1000) +mysolver.createModel(geofile,meshfile,3,1) +mysolver.addDomain(myfield1) +mysolver.addMaterialLaw(law1) +mysolver.Scheme(soltype) +mysolver.Solver(sol) +mysolver.snlData(nstep,0.1*ftime,tol) +mysolver.snlManageTimeStep(25, 3, 2, 10) +mysolver.stepBetweenArchiving(nstepArch) +# BC + +#mechanical BC + +cyclicFunctionDisp=cycleFunctionTime(0., 0, ftime1, -0.000628, ftime , -0.00056);#22 working +#cyclicFunctionDisp=cycleFunctionTime(0., 0, ftime/2., -0.000314, ftime , 0.); +#cyclicFunctionDisp=cycleFunctionTime(0., 0, ftime1, -0.000315, ftime, -0.00028);#22 +#cyclicFunctionDisp=cycleFunctionTime(0., 0, ftime1, -0.0004, ftime, -0.00044);#22 +#cyclicFunctionDisp=cycleFunctionTime(0., 0, ftime/2., -0.000613, ftime , 0.);#58 -0.000613 + + +mysolver.displacementBC("Face",1234,2,0.) +mysolver.displacementBC("Face",2376,0,0.) +mysolver.displacementBC("Face",1265,1,0.) +mysolver.displacementBC("Face",5678,2,cyclicFunctionDisp) +#mysolver.displacementBC("Volume",nfield,0,0)#when the michenisms terms dosen t have pressure +#mysolver.displacementBC("Volume",nfield,1,0)#when the mechnisms terms dosen t have pressure + + +#thermal BC +cyclicFunctionTemp=cycleFunctionTime(0., tinitial, ftime, tinitial); +mysolver.displacementBC("Face",1234,3,cyclicFunctionTemp) +mysolver.displacementBC("Face",5678,3,cyclicFunctionTemp) +mysolver.displacementBC("Face",2376,3,cyclicFunctionTemp) +mysolver.displacementBC("Face",1265,3,cyclicFunctionTemp) +#mysolver.initialBC("Volume","Position",nfield,3,tinitial) +mysolver.displacementBC("Volume",nfield,3,cyclicFunctionTemp) + +#electrical BC +cyclicFunctionvolt=cycleFunctionTime(0., 0.0, ftime,0.0); +mysolver.initialBC("Volume","Position",nfield,4,cyclicFunctionvolt) +mysolver.displacementBC("Volume",nfield,4,cyclicFunctionvolt) + +mysolver.internalPointBuildView("svm",IPField.SVM, 1, 1) +mysolver.internalPointBuildView("sig_xx",IPField.SIG_XX, 1, 1) +mysolver.internalPointBuildView("sig_yy",IPField.SIG_YY, 1, 1) +mysolver.internalPointBuildView("sig_zz",IPField.SIG_ZZ, 1, 1) +mysolver.internalPointBuildView("sig_xy",IPField.SIG_XY, 1, 1) +mysolver.internalPointBuildView("sig_yz",IPField.SIG_YZ, 1, 1) +mysolver.internalPointBuildView("sig_xz",IPField.SIG_XZ, 1, 1) +mysolver.internalPointBuildView("temperature",IPField.TEMPERATURE, 1, 1) +mysolver.internalPointBuildView("qx",IPField.THERMALFLUX_X, 1, 1) +mysolver.internalPointBuildView("qy",IPField.THERMALFLUX_Y, 1, 1) +mysolver.internalPointBuildView("qz",IPField.THERMALFLUX_Z, 1, 1) + +mysolver.internalPointBuildView("voltage",IPField.VOLTAGE, 1, 1) +mysolver.internalPointBuildView("qx",IPField.ELECTRICALFLUX_X, 1, 1) +mysolver.internalPointBuildView("qy",IPField.ELECTRICALFLUX_Y, 1, 1) +mysolver.internalPointBuildView("qz",IPField.ELECTRICALFLUX_Z, 1, 1) + +mysolver.archivingForceOnPhysicalGroup("Face", 1234, 2) +mysolver.archivingForceOnPhysicalGroup("Face", 5678, 2) +mysolver.archivingForceOnPhysicalGroup("Face", 1234, 3) +mysolver.archivingForceOnPhysicalGroup("Face", 5678, 3) +mysolver.archivingIPOnPhysicalGroup("Volume",nfield, IPField.SIG_ZZ,IPField.MEAN_VALUE); +mysolver.archivingIPOnPhysicalGroup("Volume",nfield, IPField.STRAIN_ZZ,IPField.MEAN_VALUE); +mysolver.archivingIPOnPhysicalGroup("Volume",nfield, IPField.TEMPERATURE,IPField.MEAN_VALUE); + + +mysolver.solve() + +check = TestCheck() +check.equal(2.543514e+01,mysolver.getArchivedForceOnPhysicalGroup("Face", 1234, 2),1.e-4) + diff --git a/dG3D/benchmarks/smpT22Mechanism2/cube.geo b/dG3D/benchmarks/smpT22Mechanism2/cube.geo new file mode 100644 index 0000000000000000000000000000000000000000..0dbaad1fcfd2bed978ed031e84a0bff5b2fe240c --- /dev/null +++ b/dG3D/benchmarks/smpT22Mechanism2/cube.geo @@ -0,0 +1,97 @@ +// Test case a SCB with a vertical load at its free extremity +// Size + +//definition of unit +mm = 1e-03; + +// volum fraction + +x=1*mm; +y=1*mm; +z=1*mm; + +// Characteristic length +Lc1=z/2.5; + +// definition of points +Point(1) = { 0.0 , 0.0 , 0.0 , Lc1}; +Point(2) = { x , 0.0 , 0.0 , Lc1}; +Point(3) = { x , y , 0.0 , Lc1}; +Point(4) = { 0.0 , y , 0.0 , Lc1}; +Point(5) = { 0.0 , 0.0 , z , Lc1}; +Point(6) = { x , 0.0 , z , Lc1}; +Point(7) = { x , y , z , Lc1}; +Point(8) = { 0.0 , y , z , Lc1}; + +// Line between points +Line(1) = {1,2}; +Line(2) = {2,3}; +Line(3) = {3,4}; +Line(4) = {4,1}; +Line(5) = {5,6}; +Line(6) = {6,7}; +Line(7) = {7,8}; +Line(8) = {8,5}; +Line(9) = {1,5}; +Line(10)= {2,6}; +Line(11)= {3,7}; +Line(12)= {4,8}; + +// Surface definition +Line Loop(1) = {1,2,3,4}; +Line Loop(2) = {5,6,7,8}; +Line Loop(3) = {1,10,-5,-9}; +Line Loop(4) = {2,11,-6,-10}; +Line Loop(5) = {3,12,-7,-11}; +Line Loop(6) = {4,9,-8,-12}; + +Plane Surface(1) = {1}; +Plane Surface(2) = {2}; +Plane Surface(3) = {3}; +Plane Surface(4) = {4}; +Plane Surface(5) = {5}; +Plane Surface(6) = {6}; + +//VOlume + +Surface Loop(7) = {1,2,3,4,5,6}; +Volume(1) = {7}; + +// Physical objects to applied BC and material +Physical Surface(1234) = {1}; +Physical Surface(5678) = {2}; +Physical Surface(1265) = {3}; +Physical Surface(2376) = {4}; +Physical Surface(3487) = {5}; +Physical Surface(4158) = {6}; +Physical Line(12) = {1}; +Physical Line(23) = {2}; +Physical Line(34) = {3}; +Physical Line(41) = {4}; +Physical Line(56) = {5}; +Physical Line(67) = {6}; +Physical Line(78) = {7}; +Physical Line(85) = {8}; +Physical Line(15) = {9}; +Physical Line(26) = {10}; +Physical Line(37) = {11}; +Physical Line(48) = {12}; + +Physical Point(1) ={1}; +Physical Point(2) ={2}; +Physical Point(3) ={3}; +Physical Point(4) ={4}; +Physical Point(5) ={5}; +Physical Point(6) ={6}; +Physical Point(7) ={7}; +Physical Point(8) ={8}; + +Physical Volume(10) ={1}; + +// define transfinite mesh +Transfinite Line {1,2,3,4,5,6,7,8} = 3; +Transfinite Line {9,10,11,12} =3; +Transfinite Surface {1,2,3,4,5,6} ; +Recombine Surface {1,2,3,4,5,6} ; +Transfinite Volume {1}; + diff --git a/dG3D/benchmarks/smpT58/SMP.py b/dG3D/benchmarks/smpT58/SMP.py index bf415199ab18a3bd85e1e8a7fa4d2ca2aa242fcd..2f3b1235577e56843e5e319ef8aca05c0bc2fc31 100644 --- a/dG3D/benchmarks/smpT58/SMP.py +++ b/dG3D/benchmarks/smpT58/SMP.py @@ -186,5 +186,5 @@ mysolver.archivingIPOnPhysicalGroup("Volume",nfield, IPField.TEMPERATURE,IPField mysolver.solve() check = TestCheck() -check.equal(6.767888e-01,mysolver.getArchivedForceOnPhysicalGroup("Face", 1234, 2),1.e-5) +check.equal(6.767600e-01,mysolver.getArchivedForceOnPhysicalGroup("Face", 1234, 2),1.e-5) diff --git a/dG3D/src/FractureCohesiveDG3DMaterialLaw.cpp b/dG3D/src/FractureCohesiveDG3DMaterialLaw.cpp index 6bb2ebd375922073b5b3b7f6b8eaabb8a06df961..5125250159715f9211b701d88f5de101ac719142 100644 --- a/dG3D/src/FractureCohesiveDG3DMaterialLaw.cpp +++ b/dG3D/src/FractureCohesiveDG3DMaterialLaw.cpp @@ -132,10 +132,13 @@ void FractureByCohesive3DLaw::initialBroken(IPStateBase *ips) const ipvfcur->broken(); ipvfinit->broken(); ipvfprev->broken(); - STensor3 cauchy; - SVector3 f0; - SVector3 du; - SVector3 normDir = ipvfprev->getConstRefToCurrentOutwardNormal(); + static STensor3 cauchy; + static SVector3 f0; + static SVector3 du; + static SVector3 normDir; + normDir = ipvfprev->getConstRefToCurrentOutwardNormal(); + normDir.normalize(); + ipvfcur->initializeFracture(du,_mfrac->getSigmac(),_mfrac->getSigmac(),0.,_mfrac->getGc(),_mfrac->getBeta(),true,cauchy, _mfrac->getKp(),normDir,f0,ipvfcur->getIPvBulk()); ipvfprev->initializeFracture(du,_mfrac->getSigmac(),_mfrac->getSigmac(),0.,_mfrac->getGc(),_mfrac->getBeta(),true,cauchy, diff --git a/dG3D/src/axisymmetricDG3DDomain.cpp b/dG3D/src/axisymmetricDG3DDomain.cpp index 8f6819f7a9bce06ce1e011f2802cf9a2e2be859b..fd25276a927c0a2e25aa00f209fe9d02095b95c1 100644 --- a/dG3D/src/axisymmetricDG3DDomain.cpp +++ b/dG3D/src/axisymmetricDG3DDomain.cpp @@ -49,9 +49,7 @@ void axisymmetricDG3DDomain::computeStrain(MElement *e, const int npts_bulk, Int const std::vector<TensorialTraits<double>::GradType> &Grads = ipv->gradf(_space,e,GP[j]); //x y z STensor3& F = ipv->getRefToDeformationGradient(); - F(0,0) = 1.; F(0,1) = 0.; F(0,2) = 0.; - F(1,1) = 1.; F(1,0) = 0.; F(1,2) = 0.; - F(2,2) = 1.; F(2,0) = 0.; F(2,1) = 0.; + STensorOperation::unity(F); SPoint3 p; e->pnt(GP[j].pt[0],GP[j].pt[1],GP[j].pt[2],p); @@ -303,9 +301,7 @@ void axisymmetricNonLocalDamageDG3DDomain::computeStrain(MElement *e, const int const std::vector<TensorialTraits<double>::GradType> &Grads = ipv->gradf(_space,e,GP[j]); //x y z STensor3& F = ipv->getRefToDeformationGradient(); - F(0,0) = 1.; F(0,1) = 0.; F(0,2) = 0.; - F(1,1) = 1.; F(1,0) = 0.; F(1,2) = 0.; - F(2,2) = 1.; F(2,0) = 0.; F(2,1) = 0.; + STensorOperation::unity(F); SPoint3 p; e->pnt(GP[j].pt[0],GP[j].pt[1],GP[j].pt[2],p); @@ -323,13 +319,12 @@ void axisymmetricNonLocalDamageDG3DDomain::computeStrain(MElement *e, const int } if(STensorOperation::determinantSTensor3(F) < 1.e-15) Msg::Error("Negative Jacobian"); - // non local var for (int nl = 0; nl < ipv->getNumberNonLocalVariable(); nl++){ double& nonLocalVar = ipv->getRefToNonLocalVariable(nl); SVector3& gradNonlocalVar = ipv->getRefToGradNonLocalVariable()[nl]; nonLocalVar = 0.; - gradNonlocalVar=(0.); + STensorOperation::zero(gradNonlocalVar); for (int i = 0; i < nbFF; i++){ nonLocalVar += Vals[i+3*nbFF+nl*nbFF]*disp(i+3*nbFF+nl*nbFF); gradNonlocalVar(0) += Grads[i+3*nbFF+nl*nbFF][0]*disp(i+3*nbFF+nl*nbFF); diff --git a/dG3D/src/axisymmetricDG3DTerms.cpp b/dG3D/src/axisymmetricDG3DTerms.cpp index c3963bb89e2aa42ebd181244337f32b574e035bd..5a5094deaac57941eb722bf5d5d29885d4bcea90 100644 --- a/dG3D/src/axisymmetricDG3DTerms.cpp +++ b/dG3D/src/axisymmetricDG3DTerms.cpp @@ -70,7 +70,8 @@ void axisymmetricDG3DStiffnessBulk::get(MElement *ele,int npts,IntPt *GP,fullMat std::vector<TensorialTraits<double>::ValType> &Vals = vipv[i]->f(&space1,ele,GP[i]); std::vector<TensorialTraits<double>::GradType> &Grads = vipv[i]->gradf(&space1,ele,GP[i]); - fullMatrix<double> dFdq(9,3*nbFF); + static fullMatrix<double> dFdq; + dFdq.resize(9,3*nbFF); dFdq.setAll(0.); for (int j=0; j< nbFF; j++){ @@ -267,7 +268,8 @@ void axisymmetricNonLocalDG3DStiffnessBulk::get(MElement *ele,int npts,IntPt *GP const int threeTimesNbFF = 3*nbFF; const nonLocalDamageDG3DIPVariableBase* ipvNonlocal = static_cast<const nonLocalDamageDG3DIPVariableBase*>(vipv[i]); - fullMatrix<double> dFdq(9,3*nbFF); + static fullMatrix<double> dFdq; + dFdq.resize(9,3*nbFF); dFdq.setAll(0.); for (int j=0; j< nbFF; j++){ diff --git a/dG3D/src/dG3DCohesiveMaterialLaw.cpp b/dG3D/src/dG3DCohesiveMaterialLaw.cpp index 589c5127244f0878d35560d17388e53106a15da9..0fa3b172adaca3312f19c2c7ade43bfa9a295668 100644 --- a/dG3D/src/dG3DCohesiveMaterialLaw.cpp +++ b/dG3D/src/dG3DCohesiveMaterialLaw.cpp @@ -987,21 +987,6 @@ void BulkFollwedCohesive3DLaw::createIPVariable(IPVariable* &ipv,const MElement ipv = new BulkFollowedCohesive3DIPVariable(); } -bool BulkFollwedCohesive3DLaw::brokenCheck(IPVariable* ipv) const{ - dG3DIPVariableBase* dgip = dynamic_cast<dG3DIPVariableBase*>(ipv); - if (dgip != NULL){ - const STensor43& L = dgip->getConstRefToTangentModuli(); - static SVector3 dir; - dir*=0.; - double cr; - FailureDetection::getLostSolutionUniquenessCriterion(getMacroSolver()->getDim() ,L,dir,cr); - if (cr <= 0) return true; - else return false; - } - else - return false; -}; - void BulkFollwedCohesive3DLaw::checkCohesiveInsertion(IPStateBase* ipsm, IPStateBase* ipsp, const bool forcedInsert) const{ // check failure onset from both negative and postive IPStates FractureCohesive3DIPVariable* fMinusCur = dynamic_cast<FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::current)); @@ -1042,10 +1027,8 @@ void BulkFollwedCohesive3DLaw::checkCohesiveInsertion(IPStateBase* ipsm, IPState fPlusCur->broken(); // broken is checked via bulk terial law, see function stress // initialize cohesive law in negative part - static SVector3 zeroVec; - zeroVec*=0.; - static STensor3 zeroTen; - zeroTen*=0.; + static SVector3 zeroVec(0.); + static STensor3 zeroTen(0.); if (getMacroSolver()->withFailureBasedOnPreviousState()){ // check current state diff --git a/dG3D/src/dG3DCohesiveMaterialLaw.h b/dG3D/src/dG3DCohesiveMaterialLaw.h index 49aff4da87ae1414f057d19e5fdbac04121e33d5..86205a1cb43761348fd850818e34dc21923423be 100644 --- a/dG3D/src/dG3DCohesiveMaterialLaw.h +++ b/dG3D/src/dG3DCohesiveMaterialLaw.h @@ -57,6 +57,7 @@ class Cohesive3DLaw : public materialLaw{ virtual double getCharacteristicLength() const {return 1.;}; virtual materialLaw* clone() const = 0; virtual bool withEnergyDissipation() const {return true;} + virtual bool brokenCheck(const IPVariable* ipv) const { return false;} // alway false #endif }; @@ -305,7 +306,6 @@ class GeneralBulkFollwedCohesive3DLaw : public Cohesive3DLaw{ virtual void stress(IPVariable* ipv, const IPVariable* ipvprev, const bool stiff=true, const bool checkfrac=true) = 0; virtual void checkCohesiveInsertion(IPStateBase* ipsm, IPStateBase* ipsp, const bool forcedInsert= false) const = 0; virtual void transferInterfaceDataToBulk(IPVariable* ipv, const IPVariable* ipvprev, const bool stiff) const = 0; - virtual bool brokenCheck(IPVariable* ipv) const =0; virtual materialLaw* clone() const = 0; double getLostSolutionUniquenssTolerance() const {return _lostSolutionUniquenssTolerance;}; #endif // SWIG @@ -326,7 +326,6 @@ class BulkFollwedCohesive3DLaw : public GeneralBulkFollwedCohesive3DLaw{ virtual void stress(IPVariable* ipv, const IPVariable* ipvprev, const bool stiff=true, const bool checkfrac=true); virtual void checkCohesiveInsertion(IPStateBase* ipsm, IPStateBase* ipsp, const bool forcedInsert= false) const; virtual void transferInterfaceDataToBulk(IPVariable* ipv, const IPVariable* ipvprev, const bool stiff) const; - virtual bool brokenCheck(IPVariable* ipv) const; virtual materialLaw* clone() const{return new BulkFollwedCohesive3DLaw(*this);}; #endif // SWIG }; diff --git a/dG3D/src/dG3DContactFunctionSpace.h b/dG3D/src/dG3DContactFunctionSpace.h index fcfb9856d343ff549506db70707e5ded36fec2fc..331c7695ffc2f156d39e4573f570fe484e4f3fee 100644 --- a/dG3D/src/dG3DContactFunctionSpace.h +++ b/dG3D/src/dG3DContactFunctionSpace.h @@ -24,7 +24,7 @@ class dG3DRigidContactSpace : public rigidContactSpaceBase{ dG3DRigidContactSpace(const int id, FunctionSpace<double> *sp, MVertex *ver, const int comp1, const int comp2 = -1, const int comp3 =-1) : rigidContactSpaceBase(id,sp,ver,comp1,comp2,comp3){} virtual ~dG3DRigidContactSpace(){} - virtual void getKeys(MElement *ele,std::vector<Dof> &keys){ + virtual void getKeys(MElement *ele,std::vector<Dof> &keys) const{ if(ele->getDim() > 0){ // if dim 0 return the key of gravity center only !! _space->getKeys(ele,keys); } @@ -32,18 +32,18 @@ class dG3DRigidContactSpace : public rigidContactSpaceBase{ keys.push_back(Dof(_gc->getNum(),dG3DDof3IntType::createTypeWithThreeInts(_comp[i],_id))); } } - virtual int getNumKeys(MElement *ele){ + virtual int getNumKeys(MElement *ele) const{ int nkeysele = _space->getNumKeys(ele); return nkeysele + _comp.size(); } - virtual void getKeysOfGravityCenter(std::vector<Dof> &keys){ + virtual void getKeysOfGravityCenter(std::vector<Dof> &keys) const{ for(int i=0;i<_comp.size(); i++) keys.push_back(Dof(_gc->getNum(),dG3DDof3IntType::createTypeWithThreeInts(_comp[i],_id))); } - virtual int getNumKeysOfGravityCenter(){ + virtual int getNumKeysOfGravityCenter() const{ return _comp.size(); } - virtual void getKeys(MElement *ele, const int ind, std::vector<Dof> &keys){ + virtual void getKeys(MElement *ele, const int ind, std::vector<Dof> &keys) const{ // generate keys of element and select the good ones after LAGRANGE OK ?? CHANGE THIS HOW TODO std::vector<Dof> tkeys; this->getKeys(ele,tkeys); @@ -54,7 +54,7 @@ class dG3DRigidContactSpace : public rigidContactSpaceBase{ keys.push_back(tkeys[ind+i*nbver]); this->getKeysOfGravityCenter(keys); } - virtual int getNumKeys(MElement *ele, int ind){ + virtual int getNumKeys(MElement *ele, int ind) const{ return 2*_comp.size(); } }; diff --git a/dG3D/src/dG3DDomain.cpp b/dG3D/src/dG3DDomain.cpp index cd0a9b67e6fc2c6c308be31b9833d8fc6069eca6..5392b8ceb870957ec3d66bc2f13e1e71b225415a 100644 --- a/dG3D/src/dG3DDomain.cpp +++ b/dG3D/src/dG3DDomain.cpp @@ -26,12 +26,6 @@ #include "dG3DHomogenizedTangentTerms.h" #include "FractureCohesiveDG3DMaterialLaw.h" -static double determinantSTensor3(const STensor3 &a) -{ - return (a(0,0) * (a(1,1) * a(2,2) - a(1,2) * a(2,1)) - - a(0,1) * (a(1,0) * a(2,2) - a(1,2) * a(2,0)) + - a(0,2) * (a(1,0) * a(2,1) - a(1,1) * a(2,0))); -} dG3DDomain::dG3DDomain (const int tag,const int phys, const int ws, const int lnum, const int fdg, const int dim) : dgPartDomain(tag,phys,ws,fdg), _lnum(lnum), @@ -159,10 +153,7 @@ void dG3DDomain::setImposedCrack(const bool flag){ void dG3DDomain::imposeCrack(const int em, const int ep){ printf("add crack between %d and %d \n",em,ep); - - int size = _imposedInterfaceCrack.size(); - std::pair<int,int> pa(em,ep); - _imposedInterfaceCrack.insert(std::pair<int,std::pair<int,int> >(size,pa)); + _imposedInterfaceCrack.insert(TwoNum(em,ep)); }; @@ -670,26 +661,23 @@ void dG3DDomain::computeStrain(MElement *e, const int npts_bulk, IntPt *GP, // get grad of shape function from Gauss point const std::vector<TensorialTraits<double>::GradType> &Grads = ipv->gradf(_space,e,GP[j]); //x y z - STensor3 *deformationGradient = &(ipv->getRefToDeformationGradient()); - deformationGradient->operator=(0.); - deformationGradient->operator()(0,0) = 1.; - deformationGradient->operator()(1,1) = 1.; - deformationGradient->operator()(2,2) = 1.; + STensor3 &F = ipv->getRefToDeformationGradient(); + STensorOperation::unity(F); for (int i = 0; i < nbFF; i++) { //x y z: take compoenent x arbitrarily // xx yy zz xy xz yz - deformationGradient->operator()(0,0) += Grads[i+0*nbFF][0]*disp(i); - deformationGradient->operator()(0,1) += Grads[i+0*nbFF][1]*disp(i); - deformationGradient->operator()(0,2) += Grads[i+0*nbFF][2]*disp(i); - deformationGradient->operator()(1,0) += Grads[i+0*nbFF][0]*disp(i+nbFF); - deformationGradient->operator()(1,1) += Grads[i+0*nbFF][1]*disp(i+nbFF); - deformationGradient->operator()(1,2) += Grads[i+0*nbFF][2]*disp(i+nbFF); - deformationGradient->operator()(2,0) += Grads[i+0*nbFF][0]*disp(i+2*nbFF); - deformationGradient->operator()(2,1) += Grads[i+0*nbFF][1]*disp(i+2*nbFF); - deformationGradient->operator()(2,2) += Grads[i+0*nbFF][2]*disp(i+2*nbFF); + F(0,0) += Grads[i+0*nbFF][0]*disp(i); + F(0,1) += Grads[i+0*nbFF][1]*disp(i); + F(0,2) += Grads[i+0*nbFF][2]*disp(i); + F(1,0) += Grads[i+0*nbFF][0]*disp(i+nbFF); + F(1,1) += Grads[i+0*nbFF][1]*disp(i+nbFF); + F(1,2) += Grads[i+0*nbFF][2]*disp(i+nbFF); + F(2,0) += Grads[i+0*nbFF][0]*disp(i+2*nbFF); + F(2,1) += Grads[i+0*nbFF][1]*disp(i+2*nbFF); + F(2,2) += Grads[i+0*nbFF][2]*disp(i+2*nbFF); } - if(determinantSTensor3(*deformationGradient) < 1.e-15) Msg::Error("Negative Jacobian"); + if(STensorOperation::determinantSTensor3(F) < 1.e-15) Msg::Error("Negative Jacobian"); } } void dG3DDomain::computeIpv(AllIPState *aips,MElement *e, IPStateBase::whichState ws, @@ -863,69 +851,65 @@ void dG3DDomain::computeStrain(AllIPState *aips,MInterfaceElement *ie, IntPt *GP const dG3DIPVariableBase* ipvmprev = static_cast<const dG3DIPVariableBase*>(ipsm->getState(IPStateBase::previous)); const dG3DIPVariableBase* ipvpprev = static_cast<const dG3DIPVariableBase*>(ipsp->getState(IPStateBase::previous)); - - // get shape function gradients const std::vector<TensorialTraits<double>::GradType> &Gradm = ipvm->gradf(_spaceminus,em,GPm[j]); const std::vector<TensorialTraits<double>::GradType> &Gradp = ipvp->gradf(_spaceplus,ep,GPp[j]); - STensor3 *deformationGradientm = &(ipvm->getRefToDeformationGradient()); - deformationGradientm->operator=(0); - deformationGradientm->operator()(0,0) = 1.; - deformationGradientm->operator()(1,1) = 1.; - deformationGradientm->operator()(2,2) = 1.; + STensor3& Fm = ipvm->getRefToDeformationGradient(); + STensorOperation::unity(Fm); for (int i = 0; i < nbFFm; i++) { //x y z: take compoenent x arbitrarily // xx yy zz xy xz yz - deformationGradientm->operator()(0,0) += Gradm[i+0*nbFFm][0]*dispm(i); - deformationGradientm->operator()(0,1) += Gradm[i+0*nbFFm][1]*dispm(i); - deformationGradientm->operator()(0,2) += Gradm[i+0*nbFFm][2]*dispm(i); - deformationGradientm->operator()(1,0) += Gradm[i+0*nbFFm][0]*dispm(i+nbFFm); - deformationGradientm->operator()(1,1) += Gradm[i+0*nbFFm][1]*dispm(i+nbFFm); - deformationGradientm->operator()(1,2) += Gradm[i+0*nbFFm][2]*dispm(i+nbFFm); - deformationGradientm->operator()(2,0) += Gradm[i+0*nbFFm][0]*dispm(i+2*nbFFm); - deformationGradientm->operator()(2,1) += Gradm[i+0*nbFFm][1]*dispm(i+2*nbFFm); - deformationGradientm->operator()(2,2) += Gradm[i+0*nbFFm][2]*dispm(i+2*nbFFm); + Fm(0,0) += Gradm[i+0*nbFFm][0]*dispm(i); + Fm(0,1) += Gradm[i+0*nbFFm][1]*dispm(i); + Fm(0,2) += Gradm[i+0*nbFFm][2]*dispm(i); + Fm(1,0) += Gradm[i+0*nbFFm][0]*dispm(i+nbFFm); + Fm(1,1) += Gradm[i+0*nbFFm][1]*dispm(i+nbFFm); + Fm(1,2) += Gradm[i+0*nbFFm][2]*dispm(i+nbFFm); + Fm(2,0) += Gradm[i+0*nbFFm][0]*dispm(i+2*nbFFm); + Fm(2,1) += Gradm[i+0*nbFFm][1]*dispm(i+2*nbFFm); + Fm(2,2) += Gradm[i+0*nbFFm][2]*dispm(i+2*nbFFm); } - if(determinantSTensor3(*deformationGradientm) < 1.e-15) Msg::Error("Negative Jacobian"); - STensor3 *deformationGradientp = &(ipvp->getRefToDeformationGradient()); - deformationGradientp->operator=(0); - deformationGradientp->operator()(0,0) = 1.; - deformationGradientp->operator()(1,1) = 1.; - deformationGradientp->operator()(2,2) = 1.; + if(STensorOperation::determinantSTensor3(Fm) < 1.e-15) Msg::Error("Negative Jacobian Fm"); + + STensor3& Fp = ipvp->getRefToDeformationGradient(); + STensorOperation::unity(Fp); for (int i = 0; i < nbFFp; i++) { //x y z: take compoenent x arbitrarily // xx yy zz xy xz yz - deformationGradientp->operator()(0,0) += Gradp[i+0*nbFFp][0]*dispp(i); - deformationGradientp->operator()(0,1) += Gradp[i+0*nbFFp][1]*dispp(i); - deformationGradientp->operator()(0,2) += Gradp[i+0*nbFFp][2]*dispp(i); - deformationGradientp->operator()(1,0) += Gradp[i+0*nbFFp][0]*dispp(i+nbFFp); - deformationGradientp->operator()(1,1) += Gradp[i+0*nbFFp][1]*dispp(i+nbFFp); - deformationGradientp->operator()(1,2) += Gradp[i+0*nbFFp][2]*dispp(i+nbFFp); - deformationGradientp->operator()(2,0) += Gradp[i+0*nbFFp][0]*dispp(i+2*nbFFp); - deformationGradientp->operator()(2,1) += Gradp[i+0*nbFFp][1]*dispp(i+2*nbFFp); - deformationGradientp->operator()(2,2) += Gradp[i+0*nbFFp][2]*dispp(i+2*nbFFp); + Fp(0,0) += Gradp[i+0*nbFFp][0]*dispp(i); + Fp(0,1) += Gradp[i+0*nbFFp][1]*dispp(i); + Fp(0,2) += Gradp[i+0*nbFFp][2]*dispp(i); + Fp(1,0) += Gradp[i+0*nbFFp][0]*dispp(i+nbFFp); + Fp(1,1) += Gradp[i+0*nbFFp][1]*dispp(i+nbFFp); + Fp(1,2) += Gradp[i+0*nbFFp][2]*dispp(i+nbFFp); + Fp(2,0) += Gradp[i+0*nbFFp][0]*dispp(i+2*nbFFp); + Fp(2,1) += Gradp[i+0*nbFFp][1]*dispp(i+2*nbFFp); + Fp(2,2) += Gradp[i+0*nbFFp][2]*dispp(i+2*nbFFp); } - if(determinantSTensor3(*deformationGradientp) < 1.e-15) Msg::Error("Negative Jacobian"); + if(STensorOperation::determinantSTensor3(Fp) < 1.e-15) Msg::Error("Negative Jacobian Fp"); if (_averageStrainBased and (efMinus->getMaterialLaw()->getNum() == efPlus->getMaterialLaw()->getNum())){ - static STensor3 Fmean; - Fmean=*deformationGradientm; - Fmean += (*deformationGradientp); - Fmean *= (0.5); - - (*deformationGradientm) = Fmean; - (*deformationGradientp) = Fmean; + // compute Fm as average 0.5*(Fm+Fp) + // assign Fp = Fm + Fm += Fp; + Fm *= (0.5); + Fp = Fm; } - const std::vector<TensorialTraits<double>::GradType> &Grads = vgrads[j]; // minus outward normal - SVector3 referencePhi0[2]; - SVector3 currentPhi0[2]; - + static SVector3 referencePhi0[2]; + static SVector3 currentPhi0[2]; + + // zero vector first + STensorOperation::zero(referencePhi0[0]); + STensorOperation::zero(referencePhi0[1]); + STensorOperation::zero(currentPhi0[0]); + STensorOperation::zero(currentPhi0[1]); + if (efMinus->getDim() == 3){ for(int k=0;k<nbvertexInter;k++) { @@ -958,8 +942,15 @@ void dG3DDomain::computeStrain(AllIPState *aips,MInterfaceElement *ie, IntPt *GP currentPhi0[0](2) += Grads[k+nbvertexInter+nbvertexInter](0)*(z+dispinter(k+2*nbvertexInter)); } - SVector3 phi0[2]; - SVector3 phi0Cur[2]; + static SVector3 phi0[2]; + static SVector3 phi0Cur[2]; + + STensorOperation::zero(phi0[0]); + STensorOperation::zero(phi0[1]); + + STensorOperation::zero(phi0Cur[0]); + STensorOperation::zero(phi0Cur[1]); + FunctionSpace<double>* spaceMinus = dynamic_cast<FunctionSpace<double>*> (_spaceminus); static std::vector<TensorialTraits<double>::GradType> gradmUVW; @@ -982,7 +973,6 @@ void dG3DDomain::computeStrain(AllIPState *aips,MInterfaceElement *ie, IntPt *GP } } - currentPhi0[1] = crossprod(phi0Cur[0],phi0Cur[1]); currentPhi0[1].normalize(); referencePhi0[1] = crossprod(phi0[0],phi0[1]); @@ -996,12 +986,11 @@ void dG3DDomain::computeStrain(AllIPState *aips,MInterfaceElement *ie, IntPt *GP (ipvp->getRefToCurrentOutwardNormal()) = crossprod(currentPhi0[0],currentPhi0[1]); (ipvp->getRefToReferenceOutwardNormal()) = crossprod(referencePhi0[0],referencePhi0[1]); - SVector3 ujump; const std::vector<TensorialTraits<double>::ValType> &Valm = ipvm->f(_spaceminus,em, GPm[j]); const std::vector<TensorialTraits<double>::ValType> &Valp = ipvp->f(_spaceplus,ep, GPp[j]); - + + SVector3& ujump = ipvm->getRefToJump(); computeJump(Valm,nbFFm,Valp,nbFFp,dispm,dispp,ujump); - ipvm->getRefToJump() = ujump; ipvp->getRefToJump() = ujump; FractureCohesive3DIPVariable *ipvfm = dynamic_cast<FractureCohesive3DIPVariable*>(ipvm); @@ -1013,8 +1002,8 @@ void dG3DDomain::computeStrain(AllIPState *aips,MInterfaceElement *ie, IntPt *GP Cohesive3DIPVariable* cohipvfp = ipvfp->getIPvFrac(); // store bulk deformation gradient at interface IP - ipvfm->setBulkDeformationGradient(*deformationGradientm); - ipvfp->setBulkDeformationGradient(*deformationGradientp); + ipvfm->setBulkDeformationGradient(Fm); + ipvfp->setBulkDeformationGradient(Fp); // Compute spatial gradient of jump on interface at interface IP @@ -1033,11 +1022,6 @@ void dG3DDomain::computeStrain(AllIPState *aips,MInterfaceElement *ie, IntPt *GP } ipvfp->getRefToJumpGradient() = Gradjumpm; - /* Older version for grad jump - ipvfm->getRefToJumpGradient() = (*deformationGradientp); // for IP + - ipvfm->getRefToJumpGradient() -= (*deformationGradientm); - ipvfp->getRefToJumpGradient() = ipvfm->getRefToJumpGradient(); // for IP- - */ if (cohipvfm->useLocalBasis()){ // for cohesiev band model @@ -1079,7 +1063,8 @@ void dG3DDomain::computeStrain(AllIPState *aips,MInterfaceElement *ie, IntPt *GP const std::vector<TensorialTraits<double>::HessType> &Hessp = ipvp->hessf(_spaceplus,ep,GPp[j]); STensor33& Gm = cohipvfm->getRefToEnhancedGradF(); - Gm*= 0.; + STensorOperation::zero(Gm); + for (int i = 0; i < nbFFm; i++){ for (int k=0; k<3; k++){ for (int l=0; l<3; l++){ @@ -1090,10 +1075,10 @@ void dG3DDomain::computeStrain(AllIPState *aips,MInterfaceElement *ie, IntPt *GP }; }; - Gm.print("gradF minus"); STensor33& Gp = cohipvfp->getRefToEnhancedGradF(); - Gp*= 0.; + STensorOperation::zero(Gp); + for (int i = 0; i < nbFFp; i++){ for (int k=0; k<3; k++){ for (int l=0; l<3; l++){ @@ -1104,27 +1089,22 @@ void dG3DDomain::computeStrain(AllIPState *aips,MInterfaceElement *ie, IntPt *GP }; }; - Gp.print("gradF plus"); + // if average-based strain is used if (_averageStrainBased and (efMinus->getMaterialLaw()->getNum() == efPlus->getMaterialLaw()->getNum())){ - static STensor33 Gmean; - Gmean=Gm; - Gmean += (Gp); - Gmean *= (0.5); - - Gm = Gmean; - Gp = Gmean; + Gm += Gp; + Gm *= (0.5); + Gp = Gm; } } } - if (IsMultipleFieldFormulation()){ const std::vector<TensorialTraits<double>::ValType>& Vals = ipvm->f(_extraSpace,ie,GP[j]); double hs = ie->getCharacteristicSize(); SVector3& iJump = ipvm->getRefToIncompatibleStrainVector(); - iJump *= 0.; + STensorOperation::zero(iJump); if (this->getEnrichedUnknownLocation() == partDomain::NODE){ for (int i=0; i< nbvertexInter; i++){ for (int id = 0; id < 3; id++){ @@ -1141,7 +1121,8 @@ void dG3DDomain::computeStrain(AllIPState *aips,MInterfaceElement *ie, IntPt *GP if (this->getMultipleFieldMethod() == 0){ // full two field - SVector3 refN = ipvm->getConstRefToReferenceOutwardNormal(); + static SVector3 refN; + refN = ipvm->getConstRefToReferenceOutwardNormal(); refN.normalize(); STensor3& Fm = ipvm->getRefToDeformationGradient(); STensor3& Fp = ipvp->getRefToDeformationGradient(); @@ -1230,6 +1211,7 @@ void dG3DDomain::computeIpv(AllIPState *aips,MInterfaceElement *ie, IntPt *GP,co const dG3DIPVariableBase* dgipvmprev = static_cast<const dG3DIPVariableBase*>(ipvmprev); // create a temporary ipv + // it cannot be static because different Ipv can be use with different domains IPVariable* ipvTemp = dgipvmprev->clone(); dG3DIPVariableBase* dgipvTemp = dynamic_cast<dG3DIPVariableBase*>(ipvTemp); if (dgipvTemp == NULL) Msg::Fatal("dG3DIPVariableBase::clone is not correctly defined"); @@ -1368,20 +1350,12 @@ int dG3DDomain::getStressDimension() const{ return stresDim; } - void dG3DDomain::checkFailure(AllIPState* aips){ + void dG3DDomain::checkFailure(IPField* ipf) const{ // check insertion of cohesive element const dG3DMaterialLaw *mlawminus = static_cast<const dG3DMaterialLaw*>(this->getMaterialLawMinus()); const dG3DMaterialLaw *mlawplus = static_cast<const dG3DMaterialLaw*>(this->getMaterialLawPlus()); - - #if defined(HAVE_MPI) - // get data in order to send to other procs - // only new block and broken ips are filled in the group - if (mlawminus->isNumeric() or mlawplus->isNumeric()){ - this->clearBlockDissipationIPs(); - this->clearBrokenIPs(); - } - #endif //MPI - + + // check failure if (_fullDg and (mlawminus->getType() == materialLaw::fracture or mlawplus->getType() == materialLaw::fracture)){ const FractureByCohesive3DLaw * flawMinus = static_cast<const FractureByCohesive3DLaw*>(mlawminus); const Cohesive3DLaw *mclaw = static_cast<const Cohesive3DLaw*>(flawMinus->getFractureLaw()); @@ -1394,182 +1368,185 @@ int dG3DDomain::getStressDimension() const{ // if only domain work only on rootranks for(groupOfElements::elementContainer::iterator it=gi->begin(); it!=gi->end(); ++it){ MInterfaceElement *ie = dynamic_cast<MInterfaceElement*>(*it); - bool interfaceElementBroken = false; // element broken flag (said element is broken if all Ip are already broken) - - std::map<int,std::pair<int,int> >::iterator itcrack = _imposedInterfaceCrack.end(); - bool checkHere = true; - if (_imposeCrackFlag){ - checkHere =false; - if (_imposedInterfaceCrack.size() > 0){ - for (itcrack = _imposedInterfaceCrack.begin(); itcrack!= _imposedInterfaceCrack.end(); itcrack++){ - std::pair<int,int>& twoNum = itcrack->second; - if (((ie->getElem(0)->getNum() == twoNum.first) and (ie->getElem(1)->getNum() == twoNum.second)) or - ((ie->getElem(1)->getNum() == twoNum.first) and (ie->getElem(0)->getNum() == twoNum.second))){ - checkHere = true; - printf("checking failure at interface between ele %d and ele %d \n",ie->getElem(0)->getNum(), ie->getElem(1)->getNum()); - break; - } - } - } - } - - if (checkHere){ - MElement *ele = dynamic_cast<MElement*>(ie); - IntPt* GP; - int npts=integBound->getIntPoints(ele,&GP); - int nbIpVBroken = 0; // Number of IPv broken at the interface element - bool OneIpvBroken = false; // Crack insertion flag (true if one Ipv broken at this time step) - - /* Check for cohesive insertion on ip's of the interface element */ - AllIPState::ipstateElementContainer *vips = aips->getIPstate(ie->getNum()); - for(int j=0;j<npts;j++){ - IPStateBase* ipsm = (*vips)[j]; - IPStateBase* ipsp = (*vips)[j+npts]; - - const FractureCohesive3DIPVariable *ipvfprevm = static_cast<const FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::previous)); - const FractureCohesive3DIPVariable *ipvfprevp = static_cast<const FractureCohesive3DIPVariable*>(ipsp->getState(IPStateBase::previous)); - FractureCohesive3DIPVariable *ipvfm = static_cast<FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::current)); - FractureCohesive3DIPVariable *ipvfp = static_cast<FractureCohesive3DIPVariable*>(ipsp->getState(IPStateBase::current)); - - // check for current state only - if (!ipvfm->isbroken()){ - mclaw->checkCohesiveInsertion(ipsm,ipsp); - // Flag OneIpvBroken set to true if we have crack insertion at this time step at least at one gauss point - if(ipvfm->isbroken()){ - OneIpvBroken = true; - #if defined(HAVE_MPI) - if (mlawminus->isNumeric() or mlawplus->isNumeric()){ - this->brokenIP(numericalMaterialBase::createTypeWithTwoInts(ele->getNum(),j)); - this->brokenIP(numericalMaterialBase::createTypeWithTwoInts(ele->getNum(),j+npts)); - } - #endif //HAVE_MPI - }; - } - // Count the number of currently broken ipv - if(ipvfm->isbroken()){nbIpVBroken++;}; - } + int numElMinus = ie->getElem(0)->getNum(); + int numElPlus = ie->getElem(1)->getNum(); + if (!(ipf->interfaceElementIsBroken(numElMinus,numElPlus))){ + // if element is not yet broken + bool willCheckFalue = true; + if (_imposeCrackFlag){ + willCheckFalue =false; + if (_imposedInterfaceCrack.size() > 0){ + TwoNum key(numElMinus, numElPlus); + if (_imposedInterfaceCrack.find(key) != _imposedInterfaceCrack.end()){ + willCheckFalue = true; + printf("checking failure at interface between ele %d and ele %d \n",numElMinus, numElPlus); + } + } + } + + if (willCheckFalue){ + bool interfaceElementBroken = false; // element broken flag (said element is broken if all Ip are already broken) + + MElement *ele = dynamic_cast<MElement*>(ie); + + IntPt* GP; + int npts=integBound->getIntPoints(ele,&GP); + int nbIpVBroken = 0; // Number of IPv broken at the interface element + + /* Check for cohesive insertion on ip's of the interface element */ + AllIPState::ipstateElementContainer *vips = ipf->getAips()->getIPstate(ie->getNum()); + for(int j=0;j<npts;j++){ + IPStateBase* ipsm = (*vips)[j]; + IPStateBase* ipsp = (*vips)[j+npts]; + + const FractureCohesive3DIPVariable *ipvfprevm = static_cast<const FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::previous)); + const FractureCohesive3DIPVariable *ipvfprevp = static_cast<const FractureCohesive3DIPVariable*>(ipsp->getState(IPStateBase::previous)); + FractureCohesive3DIPVariable *ipvfm = static_cast<FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::current)); + FractureCohesive3DIPVariable *ipvfp = static_cast<FractureCohesive3DIPVariable*>(ipsp->getState(IPStateBase::current)); + + // check for current state only + if (!ipvfm->isbroken()){ + // failure is check for both sides + mclaw->checkCohesiveInsertion(ipsm,ipsp); + if(ipvfm->isbroken()){ + #if defined(HAVE_MPI) + if (mlawminus->isNumeric() or mlawplus->isNumeric()){ + ipf->brokenIP(numericalMaterialBase::createTypeWithTwoInts(ele->getNum(),j)); + ipf->brokenIP(numericalMaterialBase::createTypeWithTwoInts(ele->getNum(),j+npts)); + } + #endif //HAVE_MPI + }; + } + // Count the number of currently broken ipv + if(ipvfm->isbroken()){nbIpVBroken++;}; + } - /* Force cohesive insertion and block bulk damage evolution if needed */ - // only carried out during cohesive insertion process if we have crack insertion at this time step at least at one gauss point - if (OneIpvBroken) - { - if (nbIpVBroken ==npts) // all GP are broken - { - interfaceElementBroken = true; // interfaceElement is naturally broken - } + + if (nbIpVBroken ==npts) // all GP are broken + { + interfaceElementBroken = true; // interfaceElement is naturally broken + } - // Check if forcing is alowed and not already done - if (_forceInterfaceElementBroken and !interfaceElementBroken) - { - // Determine the needed number of broken ipv before forcing - int nptsToBreakInterfaceElement(0); - if (_failureIPRatio <= 0.) - { - // break interface element when cohesive IP is inserted in first IP - nptsToBreakInterfaceElement = 1; - } - else if (_failureIPRatio >= 1.) - { - // break interface element when cohesive IPs are inserted in all IP - nptsToBreakInterfaceElement = npts; - } - else - { - // break interface element when cohesive IPs are inserted in agiven number of IPs - nptsToBreakInterfaceElement = npts*_failureIPRatio; - if (nptsToBreakInterfaceElement < 1) nptsToBreakInterfaceElement = 1; - } + // Check if forcing is alowed and not already done + if (_forceInterfaceElementBroken and !interfaceElementBroken) + { + // Determine the needed number of broken ipv before forcing + int nptsToBreakInterfaceElement(0); + if (_failureIPRatio <= 0.) + { + // break interface element when cohesive IP is inserted in first IP + nptsToBreakInterfaceElement = 1; + } + else if (_failureIPRatio >= 1.) + { + // break interface element when cohesive IPs are inserted in all IP + nptsToBreakInterfaceElement = npts; + } + else + { + // break interface element when cohesive IPs are inserted in agiven number of IPs + nptsToBreakInterfaceElement = npts*_failureIPRatio; + if (nptsToBreakInterfaceElement < 1) nptsToBreakInterfaceElement = 1; + } - // Check if a sufficient number of IP's are broken - if(nbIpVBroken >= nptsToBreakInterfaceElement) - { - interfaceElementBroken = true; // element is force to break - // Force cohesive insertion at all cohesive ipv if not already broken - for(int j=0;j<npts;j++) - { - // Get Ipstate - IPStateBase* ipsm = (*vips)[j]; - IPStateBase* ipsp = (*vips)[j+npts]; - // Check if failure already detected and force insertion if needed - FractureCohesive3DIPVariable *ipvfm = static_cast<FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::current)); - if(!ipvfm->isbroken()) - { - mclaw->checkCohesiveInsertion(ipsm,ipsp,true); - #if defined(HAVE_MPI) - if (mlawminus->isNumeric() or mlawplus->isNumeric()){ - this->brokenIP(numericalMaterialBase::createTypeWithTwoInts(ele->getNum(),j)); - this->brokenIP(numericalMaterialBase::createTypeWithTwoInts(ele->getNum(),j+npts)); - } - #endif //HAVE_MPI - } - } - } - } + // Check if a sufficient number of IP's are broken + if(nbIpVBroken >= nptsToBreakInterfaceElement) + { + interfaceElementBroken = true; // element is force to break + // Force cohesive insertion at all cohesive ipv if not already broken + for(int j=0;j<npts;j++) + { + // Get Ipstate + IPStateBase* ipsm = (*vips)[j]; + IPStateBase* ipsp = (*vips)[j+npts]; + // Check if failure already detected and force insertion if needed + FractureCohesive3DIPVariable *ipvfm = static_cast<FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::current)); + if(!ipvfm->isbroken()) + { + // force broken all remaining IPVs + mclaw->checkCohesiveInsertion(ipsm,ipsp,true); + #if defined(HAVE_MPI) + if (mlawminus->isNumeric() or mlawplus->isNumeric()){ + ipf->brokenIP(numericalMaterialBase::createTypeWithTwoInts(ele->getNum(),j)); + ipf->brokenIP(numericalMaterialBase::createTypeWithTwoInts(ele->getNum(),j+npts)); + } + #endif //HAVE_MPI + } + } + } + } + + if (interfaceElementBroken){ + // add to the list of failure elements + ipf->brokenInterfaceElement(numElMinus,numElPlus); + } - // Control damage blocking inside bulk elements in terms of chosen method - bool blockBulkDamage = false; // true if damage is blocked in bulk elements - if (_bulkDamageBlockMethod == 0) - { - // block damage when cohesive crack is inserted in first IP - if (nbIpVBroken > 0) blockBulkDamage = true; - } - else if (_bulkDamageBlockMethod == 1) - { - // block damage when cohesive crack is interface element is broken - if (interfaceElementBroken) blockBulkDamage = true; - } - else{ - // no block damage in bulk ips + // Control damage blocking inside bulk elements in terms of chosen method + bool blockBulkDamage = false; // true if damage is blocked in bulk elements + if (_bulkDamageBlockMethod == 0) + { + // block damage when cohesive crack is inserted in first IP + if (nbIpVBroken > 0) blockBulkDamage = true; + } + else if (_bulkDamageBlockMethod == 1) + { + // block damage when cohesive crack is interface element is broken + if (interfaceElementBroken) blockBulkDamage = true; + } + else{ + // no block damage in bulk ips blockBulkDamage = false; - } + } - // Block damage in bulk in Plus and Minus bulk elements when using - // bulk material with damage if needed - if (blockBulkDamage){ - if (bulkLawMinus->withEnergyDissipation()){ - // Get bulk element and check if it exists - const partDomain* dom = this->getMinusDomain(); - MElement* em = ie->getElem(0); - if(dom->g_find(em)){ - // Loop on bulk ipv of the element - int npts_bulk = dom->getBulkGaussIntegrationRule()->getIntPoints(em,&GP); - AllIPState::ipstateElementContainer *vips_bulk = aips->getIPstate(em->getNum()); - for(int k=0;k<npts_bulk;k++) - { - // Update critical damage and flag in bulk ipv's - IPStateBase* ips_bulk = (*vips_bulk)[k]; - dG3DIPVariableBase *ipv_bulk = static_cast<dG3DIPVariableBase*>(ips_bulk->getState(IPStateBase::current)); - const dG3DIPVariableBase* ipv_bulkPrev = static_cast<const dG3DIPVariableBase*>(ips_bulk->getState(IPStateBase::previous)); + // Block damage in bulk in Plus and Minus bulk elements when using + // bulk material with damage if needed + if (blockBulkDamage){ + if (bulkLawMinus->withEnergyDissipation()){ + // Get bulk element and check if it exists + const partDomain* dom = this->getMinusDomain(); + MElement* em = ie->getElem(0); + if(dom->g_find(em) and (!ipf->dissipationIsBlockedBulkElement(em->getNum()))){ + ipf->blockDissipationBulkElement(em->getNum()); + // Loop on bulk ipv of the element + int npts_bulk = dom->getBulkGaussIntegrationRule()->getIntPoints(em,&GP); + AllIPState::ipstateElementContainer *vips_bulk = ipf->getAips()->getIPstate(em->getNum()); + for(int k=0;k<npts_bulk;k++) + { + // Update critical damage and flag in bulk ipv's + IPStateBase* ips_bulk = (*vips_bulk)[k]; + dG3DIPVariableBase *ipv_bulk = static_cast<dG3DIPVariableBase*>(ips_bulk->getState(IPStateBase::current)); + const dG3DIPVariableBase* ipv_bulkPrev = static_cast<const dG3DIPVariableBase*>(ips_bulk->getState(IPStateBase::previous)); if (!ipv_bulk->dissipationIsBlocked()){ ipv_bulk->setBulkCriticalDamage(ipv_bulk->getBulkCriticalDamage()); ipv_bulk->blockDissipation(true); #if defined(HAVE_MPI) if (bulkLawMinus->isNumeric()){ - this->blockDissipationIP(numericalMaterialBase::createTypeWithTwoInts(em->getNum(),k)); + ipf->blockDissipationIP(numericalMaterialBase::createTypeWithTwoInts(em->getNum(),k)); } #endif //HAVE_MPI } - } - } - } + } + } + } - if (bulkLawPlus->withEnergyDissipation()) - { - const partDomain* dom = this->getPlusDomain(); - MElement* ep = ie->getElem(1); - if(dom->g_find(ep)) - { - // Loop on bulk ipv of the element - int npts_bulk = dom->getBulkGaussIntegrationRule()->getIntPoints(ep,&GP); - AllIPState::ipstateElementContainer *vips_bulk = aips->getIPstate(ep->getNum()); - for(int k=0;k<npts_bulk;k++) - { - // Update critical damage and flag in bulk ipv's - IPStateBase* ips_bulk = (*vips_bulk)[k]; - dG3DIPVariableBase *ipv_bulk = static_cast<dG3DIPVariableBase*>(ips_bulk->getState(IPStateBase::current)); - const dG3DIPVariableBase* ipv_bulkPrev = static_cast<const dG3DIPVariableBase*>(ips_bulk->getState(IPStateBase::previous)); + if (bulkLawPlus->withEnergyDissipation()) + { + const partDomain* dom = this->getPlusDomain(); + MElement* ep = ie->getElem(1); + if(dom->g_find(ep) and (!ipf->dissipationIsBlockedBulkElement(ep->getNum()))) + { + ipf->blockDissipationBulkElement(ep->getNum()); + // Loop on bulk ipv of the element + int npts_bulk = dom->getBulkGaussIntegrationRule()->getIntPoints(ep,&GP); + AllIPState::ipstateElementContainer *vips_bulk = ipf->getAips()->getIPstate(ep->getNum()); + for(int k=0;k<npts_bulk;k++) + { + // Update critical damage and flag in bulk ipv's + IPStateBase* ips_bulk = (*vips_bulk)[k]; + dG3DIPVariableBase *ipv_bulk = static_cast<dG3DIPVariableBase*>(ips_bulk->getState(IPStateBase::current)); + const dG3DIPVariableBase* ipv_bulkPrev = static_cast<const dG3DIPVariableBase*>(ips_bulk->getState(IPStateBase::previous)); if (!ipv_bulk->dissipationIsBlocked()){ ipv_bulk->setBulkCriticalDamage(ipv_bulk->getBulkCriticalDamage()); @@ -1577,98 +1554,63 @@ int dG3DDomain::getStressDimension() const{ #if defined(HAVE_MPI) if (bulkLawPlus->isNumeric()){ - this->blockDissipationIP(numericalMaterialBase::createTypeWithTwoInts(ep->getNum(),k)); + ipf->blockDissipationIP(numericalMaterialBase::createTypeWithTwoInts(ep->getNum(),k)); } #endif //HAVE_MPI } - } - } - } - } - } - } - - if (_imposeCrackFlag){ - if (interfaceElementBroken and itcrack != _imposedInterfaceCrack.end()){ - printf("element %d is fully broken\n", ie->getNum()); - _imposedInterfaceCrack.erase(itcrack); + } + } + } + } } + } - } + #ifdef _DEBUG + else{ + printf("element %d with negative %d, positive %d is fully broken\n", ie->getNum(),numElMinus,numElPlus); + } + #endif //_DEBUG + } } // block damage in elements which are not related to crack mouth if (this->groupOfElementsSize() > 0 and (_bulkDamageBlockMethod >=0)){ - materialLaw* mlaw = this->getMaterialLaw(); - - static std::vector<materialLaw*> allFailureLaw; - allFailureLaw.clear(); - if (mlaw->getType() == materialLaw::fracture){ - allFailureLaw.push_back(mlaw); + const materialLaw* mlaw = this->getMaterialLaw(); + IntPt* GP; + for (groupOfElements::elementContainer::iterator ite = this->g_cbegin(); ite!= this->g_cend(); ite++){ + MElement* ele = *ite; + + if (!ipf->dissipationIsBlockedBulkElement(ele->getNum())){ + int npts_bulk = this->getBulkGaussIntegrationRule()->getIntPoints(ele,&GP); + AllIPState::ipstateElementContainer *vips_bulk = ipf->getAips()->getIPstate(ele->getNum()); + + // if one IP is broken, block all element + bool willBlock = false; + for(int k=0;k<npts_bulk;k++){ + IPStateBase* ips_bulk = (*vips_bulk)[k]; + dG3DIPVariableBase *ipv_bulk = static_cast<dG3DIPVariableBase*>(ips_bulk->getState(IPStateBase::current)); + if (mlaw->brokenCheck(ipv_bulk)){ + willBlock = true; + break; + } + } + if (willBlock){ + ipf->blockDissipationBulkElement(ele->getNum()); + // block all IP + for(int k=0;k<npts_bulk;k++){ + IPStateBase* ips_bulk = (*vips_bulk)[k]; + dG3DIPVariableBase *ipv_bulk = static_cast<dG3DIPVariableBase*>(ips_bulk->getState(IPStateBase::current)); + if (!ipv_bulk->dissipationIsBlocked()){ + ipv_bulk->blockDissipation(true); + #if defined(HAVE_MPI) + ipf->blockDissipationIP(numericalMaterialBase::createTypeWithTwoInts(ele->getNum(),k)); + #endif + } + } + } + } + } - - const std::vector<partDomain*>* domainVector = &(aips->getDomainVector()); - for (int jdom =0; jdom < domainVector->size(); jdom++){ - dgPartDomain* dgdom = dynamic_cast<dgPartDomain*>((*domainVector)[jdom]); - if (dgdom != NULL){ - // if this dgdom is purely interfacial - if (dgdom->getMinusDomain()->getPhysical() != dgdom->getPlusDomain()->getPhysical()){ - if ((dgdom->getMinusDomain()->getPhysical() == this->getPhysical()) and - (dgdom->getMaterialLawMinus()->getType() == materialLaw::fracture)){ - allFailureLaw.push_back(dgdom->getMaterialLawMinus()); - } - else if ((dgdom->getPlusDomain()->getPhysical() == this->getPhysical()) and - (dgdom->getMaterialLawPlus()->getType() == materialLaw::fracture)){ - allFailureLaw.push_back(dgdom->getMaterialLawPlus()); - } - } - } - } - - if (allFailureLaw.size() > 0){ - IntPt* GP; - for (groupOfElements::elementContainer::iterator ite = this->g_cbegin(); ite!= this->g_cend(); ite++){ - MElement* ele = *ite; - int npts_bulk = this->getBulkGaussIntegrationRule()->getIntPoints(ele,&GP); - AllIPState::ipstateElementContainer *vips_bulk = aips->getIPstate(ele->getNum()); - int numFailureIP = 0; - int numBlockedIP = 0; - for(int k=0;k<npts_bulk;k++){ - IPStateBase* ips_bulk = (*vips_bulk)[k]; - dG3DIPVariableBase *ipv_bulk = static_cast<dG3DIPVariableBase*>(ips_bulk->getState(IPStateBase::current)); - if (ipv_bulk->dissipationIsBlocked()){ - numBlockedIP++; - numFailureIP++; - } - else{ - bool broken = false; - for (int ilaw = 0; ilaw < allFailureLaw.size(); ilaw++){ - if (allFailureLaw[ilaw]->brokenCheck(ipv_bulk)){ - broken = true; - break; - }; - } - if (broken){ - numFailureIP++; - } - } - } - //printf("rank %d numBlockedIP %d numFailureIP %d \n",Msg::GetCommRank(),numBlockedIP,numFailureIP); - if ((numFailureIP <= npts_bulk) and (numFailureIP>0) and (numBlockedIP < npts_bulk )){ - // block all IP - for(int k=0;k<npts_bulk;k++){ - IPStateBase* ips_bulk = (*vips_bulk)[k]; - dG3DIPVariableBase *ipv_bulk = static_cast<dG3DIPVariableBase*>(ips_bulk->getState(IPStateBase::current)); - if (!ipv_bulk->dissipationIsBlocked()){ - ipv_bulk->blockDissipation(true); - #if defined(HAVE_MPI) - this->blockDissipationIP(numericalMaterialBase::createTypeWithTwoInts(ele->getNum(),k)); - #endif - } - } - } - } - } } }; @@ -1753,8 +1695,15 @@ void dG3DDomain::initialIPVariable(AllIPState *aips,const unknownField *ufield, dG3DIPVariableBase* ipvp = static_cast<dG3DIPVariableBase*>(ipsp->getState(ws)); // minus outward normal - SVector3 referencePhi0[2]; - SVector3 currentPhi0[2]; + static SVector3 referencePhi0[2]; + static SVector3 currentPhi0[2]; + + STensorOperation::zero(referencePhi0[0]); + STensorOperation::zero(referencePhi0[1]); + + STensorOperation::zero(currentPhi0[0]); + STensorOperation::zero(currentPhi0[1]); + if (this->getMinusDomain()->getDim() == 3){ for(int k=0;k<nbvertexInter;k++) { @@ -1787,8 +1736,15 @@ void dG3DDomain::initialIPVariable(AllIPState *aips,const unknownField *ufield, currentPhi0[0](2) += Grads[k+nbvertexInter+nbvertexInter](0)*(z+unknowns_inter(k+2*nbvertexInter)); } - SVector3 phi0[2]; - SVector3 phi0Cur[2]; + static SVector3 phi0[2]; + static SVector3 phi0Cur[2]; + + STensorOperation::zero(phi0[0]); + STensorOperation::zero(phi0[1]); + + STensorOperation::zero(phi0Cur[0]); + STensorOperation::zero(phi0Cur[1]); + FunctionSpace<double>* spaceMinus = dynamic_cast<FunctionSpace<double>*> (this->getMinusDomain()->getFunctionSpace()); static std::vector<TensorialTraits<double>::GradType> gradmUVW; @@ -3902,21 +3858,19 @@ void nonLocalDamageDG3DDomain::computeStrain(MElement *e, const int npts_bulk, I const nonLocalDamageDG3DIPVariableBase *ipvprev = static_cast<const nonLocalDamageDG3DIPVariableBase*>(ips->getState(IPStateBase::previous)); for (int nl = 0; nl < ipv->getNumberNonLocalVariable(); nl++){ - double *effectivePlasticStrain = &(ipv->getRefToNonLocalVariable(nl)); - SVector3 *gradepl = &(ipv->getRefToGradNonLocalVariable()[nl]); - *effectivePlasticStrain = 0.; - gradepl->operator=(0.); + double& nonlocalVar = ipv->getRefToNonLocalVariable(nl); + SVector3& gradNonlocalVar = ipv->getRefToGradNonLocalVariable()[nl]; + + nonlocalVar = 0.; + STensorOperation::zero(gradNonlocalVar); for (int i = 0; i < nbFF; i++) { - double ptilde = disp(i+3*nbFF+nl*nbFF); - //epsbar: take compoenent epsbar - *effectivePlasticStrain += Vals[i+3*nbFF+nl*nbFF]*ptilde; - gradepl->operator()(0) += Grads[i+3*nbFF+nl*nbFF][0]*ptilde; - gradepl->operator()(1) += Grads[i+3*nbFF+nl*nbFF][1]*ptilde; - gradepl->operator()(2) += Grads[i+3*nbFF+nl*nbFF][2]*ptilde; + nonlocalVar += Vals[i+3*nbFF+nl*nbFF]*disp(i+3*nbFF+nl*nbFF); + gradNonlocalVar(0) += Grads[i+3*nbFF+nl*nbFF][0]*disp(i+3*nbFF+nl*nbFF); + gradNonlocalVar(1) += Grads[i+3*nbFF+nl*nbFF][1]*disp(i+3*nbFF+nl*nbFF); + gradNonlocalVar(2) += Grads[i+3*nbFF+nl*nbFF][2]*disp(i+3*nbFF+nl*nbFF); } } - } } @@ -3984,16 +3938,14 @@ void nonLocalDamageDG3DDomain::computeStrain(AllIPState *aips,MInterfaceElement IPStateBase* ipsm = (*vips)[j]; IPStateBase* ipsp = (*vips)[j+npts]; - nonLocalDamageDG3DIPVariableBase* ipvm; //= static_cast<nonLocalDamageDG3DIPVariable*>(ipsm->getState(ws)); - nonLocalDamageDG3DIPVariableBase* ipvp; //= static_cast<nonLocalDamageDG3DIPVariable*>(ipsp->getState(ws)); -// nonLocalDamageDG3DIPVariable* ipvmprev = static_cast<nonLocalDamageDG3DIPVariable*>(ipsm->getState(IPStateBase::previous)); -// nonLocalDamageDG3DIPVariable* ipvpprev = static_cast<nonLocalDamageDG3DIPVariable*>(ipsp->getState(IPStateBase::previous)); - // check if fracture or not via minus if true for minus --> true for plus too + nonLocalDamageDG3DIPVariableBase* ipvm = NULL; + nonLocalDamageDG3DIPVariableBase* ipvp = NULL; + FractureCohesive3DIPVariable *fipvm = dynamic_cast<FractureCohesive3DIPVariable*>(ipsm->getState(ws)); - FractureCohesive3DIPVariable *fipvp = dynamic_cast<FractureCohesive3DIPVariable*>(ipsp->getState(ws)); if(fipvm!=NULL) { ipvm = static_cast<nonLocalDamageDG3DIPVariableBase*>(fipvm->getIPvBulk()); + FractureCohesive3DIPVariable *fipvp = dynamic_cast<FractureCohesive3DIPVariable*>(ipsp->getState(ws)); ipvp = static_cast<nonLocalDamageDG3DIPVariableBase*>(fipvp->getIPvBulk()); } else @@ -4005,50 +3957,46 @@ void nonLocalDamageDG3DDomain::computeStrain(AllIPState *aips,MInterfaceElement // for minus part for (int nlm = 0; nlm < ipvm->getNumberNonLocalVariable(); nlm++){ - double *effectivePlasticStrainm = &(ipvm->getRefToNonLocalVariable(nlm)); - *effectivePlasticStrainm = 0.; - - SVector3 *gradeplm = &(ipvm->getRefToGradNonLocalVariable()[nlm]); - gradeplm->operator=(0.); + double& nonlocalVarm = ipvm->getRefToNonLocalVariable(nlm); + nonlocalVarm = 0.; + + SVector3& gradNonlocalVarm = ipvm->getRefToGradNonLocalVariable()[nlm]; + STensorOperation::zero(gradNonlocalVarm); + for (int i = 0; i < nbFFm; i++) { - double ptilde = dispm(i+3*nbFFm+nlm*nbFFm); //epsbar: take compoenent epsbar - *effectivePlasticStrainm += Valsm[i+3*nbFFm+nlm*nbFFm]*ptilde; - gradeplm->operator()(0) += Gradsm[i+3*nbFFm+nlm*nbFFm][0]*ptilde; - gradeplm->operator()(1) += Gradsm[i+3*nbFFm+nlm*nbFFm][1]*ptilde; - gradeplm->operator()(2) += Gradsm[i+3*nbFFm+nlm*nbFFm][2]*ptilde; + nonlocalVarm += Valsm[i+3*nbFFm+nlm*nbFFm]*dispm(i+3*nbFFm+nlm*nbFFm); + gradNonlocalVarm(0) += Gradsm[i+3*nbFFm+nlm*nbFFm][0]*dispm(i+3*nbFFm+nlm*nbFFm); + gradNonlocalVarm(1) += Gradsm[i+3*nbFFm+nlm*nbFFm][1]*dispm(i+3*nbFFm+nlm*nbFFm); + gradNonlocalVarm(2) += Gradsm[i+3*nbFFm+nlm*nbFFm][2]*dispm(i+3*nbFFm+nlm*nbFFm); } } // for plus part for (int nlp = 0; nlp < ipvp->getNumberNonLocalVariable(); nlp++){ - double *effectivePlasticStrainp = &(ipvp->getRefToNonLocalVariable(nlp)); - *effectivePlasticStrainp = 0.; - SVector3 *gradeplp = &(ipvp->getRefToGradNonLocalVariable()[nlp]); - gradeplp->operator=(0.); + double& nonlocalVarp = ipvp->getRefToNonLocalVariable(nlp); + nonlocalVarp = 0.; + SVector3& gradNonlocalVarp = ipvp->getRefToGradNonLocalVariable()[nlp]; + STensorOperation::zero(gradNonlocalVarp); for (int i = 0; i < nbFFp; i++) { - double ptilde = dispp(i+3*nbFFp+nlp*nbFFp); - //epsbar: take compoenent epsbar - *effectivePlasticStrainp += Valsp[i+3*nbFFp+nlp*nbFFp]*ptilde; - gradeplp->operator()(0) += Gradsp[i+3*nbFFp+nlp*nbFFp][0]*ptilde; - gradeplp->operator()(1) += Gradsp[i+3*nbFFp+nlp*nbFFp][1]*ptilde; - gradeplp->operator()(2) += Gradsp[i+3*nbFFp+nlp*nbFFp][2]*ptilde; + nonlocalVarp += Valsp[i+3*nbFFp+nlp*nbFFp]*dispp(i+3*nbFFp+nlp*nbFFp); + gradNonlocalVarp(0) += Gradsp[i+3*nbFFp+nlp*nbFFp][0]*dispp(i+3*nbFFp+nlp*nbFFp); + gradNonlocalVarp(1) += Gradsp[i+3*nbFFp+nlp*nbFFp][1]*dispp(i+3*nbFFp+nlp*nbFFp); + gradNonlocalVarp(2) += Gradsp[i+3*nbFFp+nlp*nbFFp][2]*dispp(i+3*nbFFp+nlp*nbFFp); } } + // compute the jump for (int nl = 0; nl < ipvp->getNumberNonLocalVariable(); nl++){ - double epsjump=0.; - // compute the jump + double& epsjump= ipvm->getRefToNonLocalJump()(nl); computeNonLocalJump(Valsm,nbFFm,Valsp,nbFFp,dispm,dispp,epsjump,nl); - ipvm->getRefToNonLocalJump()(nl) = epsjump; ipvp->getRefToNonLocalJump()(nl) = epsjump; - } // mean part @@ -4057,23 +4005,17 @@ void nonLocalDamageDG3DDomain::computeStrain(AllIPState *aips,MInterfaceElement for (int nlv = 0; nlv < ipvm->getNumberNonLocalVariable(); nlv++){ // value averge - double valAverage = ipvm->getConstRefToNonLocalVariable(nlv); - valAverage += ipvp->getConstRefToNonLocalVariable(nlv); - valAverage *= 0.5; - - ipvm->getRefToNonLocalVariable(nlv) = valAverage; - ipvp->getRefToNonLocalVariable(nlv) = valAverage; + double& valm = ipvm->getRefToNonLocalVariable(nlv); + valm += ipvp->getConstRefToNonLocalVariable(nlv); + valm *= 0.5; + ipvp->getRefToNonLocalVariable(nlv) = valm; // grad average - SVector3 gradAverage = ipvm->getConstRefToGradNonLocalVariable()[nlv]; - gradAverage += ipvp->getConstRefToGradNonLocalVariable()[nlv]; - gradAverage *= 0.5; - - ipvm->getRefToGradNonLocalVariable()[nlv] = gradAverage; - ipvp->getRefToGradNonLocalVariable()[nlv] = gradAverage; - + SVector3& gradValm = ipvm->getRefToGradNonLocalVariable()[nlv]; + gradValm += ipvp->getConstRefToGradNonLocalVariable()[nlv]; + gradValm *= 0.5; + ipvp->getRefToGradNonLocalVariable()[nlv] = gradValm; }; - } } @@ -4430,18 +4372,18 @@ void ExtraDofDiffusionDG3DDomain::computeStrain(MElement *e, const int npts_bulk IPStateBase* ips = (*vips)[j]; ExtraDofDiffusionDG3DIPVariableBase *ipv = static_cast<ExtraDofDiffusionDG3DIPVariableBase*>(ips->getState(ws)); const ExtraDofDiffusionDG3DIPVariableBase *ipvprev = static_cast<const ExtraDofDiffusionDG3DIPVariableBase*>(ips->getState(IPStateBase::previous)); - double *temperature = &(ipv->getRefToField()); - SVector3 *gradT = &(ipv->getRefToGradField()); - *temperature= 0.; - gradT->operator=(0.); + + double& T = ipv->getRefToField(); + SVector3& gradT = ipv->getRefToGradField(); + T = 0.; + STensorOperation::zero(gradT); + for (int i = 0; i < nbFF; i++) { - double temp = disp(i+3*nbFF); - //epsbar: take compoenent epsbar - *temperature += Vals[i+3*nbFF]*temp; - gradT->operator()(0) += Grads[i+3*nbFF][0]*temp; - gradT->operator()(1) += Grads[i+3*nbFF][1]*temp; - gradT->operator()(2) += Grads[i+3*nbFF][2]*temp; + T += Vals[i+3*nbFF]*disp(i+3*nbFF); + gradT(0) += Grads[i+3*nbFF][0]*disp(i+3*nbFF); + gradT(1) += Grads[i+3*nbFF][1]*disp(i+3*nbFF); + gradT(2) += Grads[i+3*nbFF][2]*disp(i+3*nbFF); } } } @@ -4493,10 +4435,8 @@ void ExtraDofDiffusionDG3DDomain::computeStrain(AllIPState *aips,MInterfaceEleme IPStateBase* ipsm = (*vips)[j]; IPStateBase* ipsp = (*vips)[j+npts]; - ExtraDofDiffusionDG3DIPVariableBase* ipvm; //= static_cast<nonLocalDamageDG3DIPVariable*>(ipsm->getState(ws)); - ExtraDofDiffusionDG3DIPVariableBase* ipvp; //= static_cast<nonLocalDamageDG3DIPVariable*>(ipsp->getState(ws)); -// nonLocalDamageDG3DIPVariable* ipvmprev = static_cast<nonLocalDamageDG3DIPVariable*>(ipsm->getState(IPStateBase::previous)); -// nonLocalDamageDG3DIPVariable* ipvpprev = static_cast<nonLocalDamageDG3DIPVariable*>(ipsp->getState(IPStateBase::previous)); + ExtraDofDiffusionDG3DIPVariableBase* ipvm = NULL; + ExtraDofDiffusionDG3DIPVariableBase* ipvp = NULL; // check if fracture or not via minus if true for minus --> true for plus too FractureCohesive3DIPVariable *ipvtmp = dynamic_cast<FractureCohesive3DIPVariable*>(ipsm->getState(ws)); if(ipvtmp!=NULL) @@ -4510,56 +4450,50 @@ void ExtraDofDiffusionDG3DDomain::computeStrain(AllIPState *aips,MInterfaceEleme ipvm = static_cast<ExtraDofDiffusionDG3DIPVariableBase*>(ipsm->getState(ws)); ipvp = static_cast<ExtraDofDiffusionDG3DIPVariableBase*>(ipsp->getState(ws)); } - double *temperaturem = &(ipvm->getRefToField()); - *temperaturem = 0.; - - SVector3 *gradTm = &(ipvm->getRefToGradField()); - gradTm->operator=(0.); - + + double& Tm = ipvm->getRefToField(); + Tm = 0.; + + SVector3& gradTm = ipvm->getRefToGradField(); + STensorOperation::zero(gradTm); + for (int i = 0; i < nbFFm; i++) - { - double temp = dispm(i+3*nbFFm); - //epsbar: take compoenent epsbar - *temperaturem += Valsm[i+3*nbFFm]*temp; - gradTm->operator()(0) += Gradsm[i+3*nbFFm][0]*temp; - gradTm->operator()(1) += Gradsm[i+3*nbFFm][1]*temp; - gradTm->operator()(2) += Gradsm[i+3*nbFFm][2]*temp; - } - double *temperaturep = &(ipvp->getRefToField()); - *temperaturep = 0.; - SVector3 *gradTp = &(ipvp->getRefToGradField()); - gradTp->operator=(0.); - + { + Tm += Valsm[i+3*nbFFm]*dispm(i+3*nbFFm); + gradTm(0) += Gradsm[i+3*nbFFm][0]*dispm(i+3*nbFFm); + gradTm(1) += Gradsm[i+3*nbFFm][1]*dispm(i+3*nbFFm); + gradTm(2) += Gradsm[i+3*nbFFm][2]*dispm(i+3*nbFFm); + } + + double& Tp = ipvp->getRefToField(); + Tp = 0.; + SVector3& gradTp = ipvp->getRefToGradField(); + STensorOperation::zero(gradTp); + for (int i = 0; i < nbFFp; i++) { - double temp = dispp(i+3*nbFFp); - - //epsbar: take compoenent epsbar - *temperaturep += Valsp[i+3*nbFFp]*temp; - gradTp->operator()(0) += Gradsp[i+3*nbFFp][0]*temp; - gradTp->operator()(1) += Gradsp[i+3*nbFFp][1]*temp; - gradTp->operator()(2) += Gradsp[i+3*nbFFp][2]*temp; + Tp += Valsp[i+3*nbFFp]*dispp(i+3*nbFFp); + gradTp(0) += Gradsp[i+3*nbFFp][0]*dispp(i+3*nbFFp); + gradTp(1) += Gradsp[i+3*nbFFp][1]*dispp(i+3*nbFFp); + gradTp(2) += Gradsp[i+3*nbFFp][2]*dispp(i+3*nbFFp); } - double tempjump=0.; + + double& tempjump= ipvm->getRefToFieldJump(); // compute the jump computeExtraFieldJump(3,Valsm,nbFFm,Valsp,nbFFp,dispm,dispp,tempjump); - //Msg::Error("Temperature jump: %e",tempjump); - ipvm->getRefToFieldJump() = tempjump; ipvp->getRefToFieldJump() = tempjump; // compute 1/T jump to be energetically consistent - if(getUseOneOverJump()==true) - { - double ftjump=0.; double dftjumpdTp=0.; double dftjumpdTm=0.; - computeftjump(3,Valsm,nbFFm,Valsp,nbFFp,dispm,dispp,ftjump,dftjumpdTp,dftjumpdTm); - ipvm->getRefToOneOverFieldJump() = ftjump; - ipvp->getRefToOneOverFieldJump() = ftjump; + if(getUseOneOverJump()){ + double& ftjump= ipvm->getRefToOneOverFieldJump(); + double& dftjumpdTp = ipvp->getRefTodOneOverFieldJumpdFieldp(); + double& dftjumpdTm = ipvm->getRefTodOneOverFieldJumpdFieldm(); + computeftjump(3,Valsm,nbFFm,Valsp,nbFFp,dispm,dispp,ftjump,dftjumpdTp,dftjumpdTm); - ipvm->getRefTodOneOverFieldJumpdFieldm() = dftjumpdTm; - ipvm->getRefTodOneOverFieldJumpdFieldp() = dftjumpdTp; - ipvp->getRefTodOneOverFieldJumpdFieldm() = dftjumpdTm; - ipvp->getRefTodOneOverFieldJumpdFieldp() = dftjumpdTp; + ipvp->getRefToOneOverFieldJump() = ftjump; + ipvm->getRefTodOneOverFieldJumpdFieldp() = dftjumpdTp; + ipvp->getRefTodOneOverFieldJumpdFieldm() = dftjumpdTm; } } @@ -4930,145 +4864,140 @@ void ElecTherMechDG3DDomain::computeStrain(MElement *e, const int npts_bulk, Int const ElecTherMechDG3DIPVariableBase *ipvprev = static_cast<const ElecTherMechDG3DIPVariableBase*>(ips->getState(IPStateBase::previous)); - if(getUseFtFv()==true) + if(getUseFtFv()) + { + double *fT = &(ipv->getRefTofT()); + SVector3 *gradfT = &(ipv->getRefToGradfT()); + *fT= 0.; + STensorOperation::zero(*gradfT); + + for (int i = 0; i < nbFF; i++) { - double *fT = &(ipv->getRefTofT()); - SVector3 *gradfT = &(ipv->getRefToGradfT()); - *fT= 0.; - gradfT->operator=(0.); - for (int i = 0; i < nbFF; i++) - { - double ftemp = disp(i+3*nbFF); - //epsbar: take compoenent epsbar - *fT += Vals[i+3*nbFF]*ftemp; - gradfT->operator()(0) += Grads[i+3*nbFF][0]*ftemp; - gradfT->operator()(1) += Grads[i+3*nbFF][1]*ftemp; - gradfT->operator()(2) += Grads[i+3*nbFF][2]*ftemp; - } - - - double *fV = &(ipv->getRefTofV()); - SVector3 *gradfV = &(ipv->getRefToGradfV()); - *fV= 0.; - gradfV->operator=(0.); - for (int i = 0; i < nbFF; i++) - { - double fvolt = disp(i+4*nbFF); - //epsbar: take compoenent epsbar - *fV += Vals[i+4*nbFF]*fvolt; - gradfV->operator()(0) += Grads[i+4*nbFF][0]*fvolt; - gradfV->operator()(1) += Grads[i+4*nbFF][1]*fvolt; - gradfV->operator()(2) += Grads[i+4*nbFF][2]*fvolt; - } - SVector3 *gradT = &(ipv->getRefToGradT()); - SVector3 *gradV = &(ipv->getRefToGradV()); - - double *T = &(ipv->getRefToTemperature()); - double *V = &(ipv->getRefToVoltage()); - *V = -1*(*fV)/(*fT); - *T = 1/(*fT); - - //gradV->operator=(0.); - gradV->operator()(0)= -1/(*fT)*(gradfV->operator()(0))+(*fV)/(pow(*fT,2))*(gradfT->operator()(0)); - gradV->operator()(1)= -1/(*fT)*(gradfV->operator()(1))+(*fV)/(pow(*fT,2))*(gradfT->operator()(1)); - gradV->operator()(2)= -1/(*fT)*(gradfV->operator()(2))+(*fV)/(pow(*fT,2))*(gradfT->operator()(2)); - - //gradT->operator=(0.); - gradT->operator()(0)=-1/(pow(*fT,2))*(gradfT->operator()(0)); - gradT->operator()(1)=-1/(pow(*fT,2))*(gradfT->operator()(1)); - gradT->operator()(2)=-1/(pow(*fT,2))*(gradfT->operator()(2)); - - STensor3 *dgardVdgradfV=&(ipv->getRefTodgradVdgradfV()); - STensor3 *dgardVdgradfT=&(ipv->getRefTodgradVdgradfT()); - STensor3 *dgardTdgradfT=&(ipv->getRefTodgradTdgradfT()); - STensor3 *dgardTdgradfV=&(ipv->getRefTodgradTdgradfV()); - - - SVector3 *dgradVdfV=&(ipv->getRefTodgradVdfV()); - SVector3 *dgradVdfT=&(ipv->getRefTodgradVdfT()); - SVector3 *dgradTdfT=&(ipv->getRefTodgradTdfT()); - SVector3 *dgradTdfV=&(ipv->getRefTodgradTdfV()); - - double *dVdfV=&(ipv->getRefTodVdfV()); - double *dVdfT=&(ipv->getRefTodVdfT()); - double *dTdfT=&(ipv->getRefTodTdfT()); - double *dTdfV=&(ipv->getRefTodTdfV()); - - dgardVdgradfV->operator=(0.); - dgardVdgradfV->operator()(0,0) =-1./(*fT); - dgardVdgradfV->operator()(1,1) =-1./(*fT); - dgardVdgradfV->operator()(2,2) =-1./(*fT); - - dgardVdgradfT->operator=(0.); - dgardVdgradfT->operator()(0,0) =(*fV)/(*fT)/(*fT); - dgardVdgradfT->operator()(1,1) =(*fV)/(*fT)/(*fT); - dgardVdgradfT->operator()(2,2) =(*fV)/(*fT)/(*fT); - - dgardTdgradfT->operator=(0.); - dgardTdgradfT->operator()(0,0) =-1./(*fT)/(*fT); - dgardTdgradfT->operator()(1,1) =-1./(*fT)/(*fT); - dgardTdgradfT->operator()(2,2) =-1./(*fT)/(*fT); - - dgardTdgradfV->operator=(0.); - - *dVdfV=-1./(*fT); - *dVdfT=(*fV)/(*fT)/(*fT); - *dTdfT=-1./(*fT)/(*fT); - *dTdfV=0.; - - dgradVdfV->operator()(0)=1./(*fT)/(*fT)*(gradfT->operator()(0)); - dgradVdfV->operator()(1)=1./(*fT)/(*fT)*(gradfT->operator()(1)); - dgradVdfV->operator()(2)=1./(*fT)/(*fT)*(gradfT->operator()(2)); - - dgradVdfT->operator()(0)=1./(*fT)/(*fT)*(gradfV->operator()(0))-2*(*fV)/(*fT)/(*fT)/(*fT)*(gradfT->operator()(0)); - dgradVdfT->operator()(1)=1./(*fT)/(*fT)*(gradfV->operator()(1))-2*(*fV)/(*fT)/(*fT)/(*fT)*(gradfT->operator()(1)); - dgradVdfT->operator()(2)=1./(*fT)/(*fT)*(gradfV->operator()(2))-2*(*fV)/(*fT)/(*fT)/(*fT)*(gradfT->operator()(2)); + const double& ftemp = disp(i+3*nbFF); + *fT += Vals[i+3*nbFF]*ftemp; + gradfT->operator()(0) += Grads[i+3*nbFF][0]*ftemp; + gradfT->operator()(1) += Grads[i+3*nbFF][1]*ftemp; + gradfT->operator()(2) += Grads[i+3*nbFF][2]*ftemp; + } - dgradTdfT->operator()(0)=2/(*fT)/(*fT)/(*fT)*(gradfT->operator()(0)); - dgradTdfT->operator()(1)=2/(*fT)/(*fT)/(*fT)*(gradfT->operator()(1)); - dgradTdfT->operator()(2)=2/(*fT)/(*fT)/(*fT)*(gradfT->operator()(2)); - dgradTdfV->operator()(0)=0.; - dgradTdfV->operator()(1)=0.; - dgradTdfV->operator()(2)=0.; + double *fV = &(ipv->getRefTofV()); + SVector3 *gradfV = &(ipv->getRefToGradfV()); + *fV= 0.; + STensorOperation::zero(*gradfV); + for (int i = 0; i < nbFF; i++) + { + const double& fvolt = disp(i+4*nbFF); + *fV += Vals[i+4*nbFF]*fvolt; + gradfV->operator()(0) += Grads[i+4*nbFF][0]*fvolt; + gradfV->operator()(1) += Grads[i+4*nbFF][1]*fvolt; + gradfV->operator()(2) += Grads[i+4*nbFF][2]*fvolt; } + SVector3 *gradT = &(ipv->getRefToGradT()); + SVector3 *gradV = &(ipv->getRefToGradV()); - else + double *T = &(ipv->getRefToTemperature()); + double *V = &(ipv->getRefToVoltage()); + *V = -1*(*fV)/(*fT); + *T = 1/(*fT); + + + gradV->operator()(0)= -1/(*fT)*(gradfV->operator()(0))+(*fV)/(pow(*fT,2))*(gradfT->operator()(0)); + gradV->operator()(1)= -1/(*fT)*(gradfV->operator()(1))+(*fV)/(pow(*fT,2))*(gradfT->operator()(1)); + gradV->operator()(2)= -1/(*fT)*(gradfV->operator()(2))+(*fV)/(pow(*fT,2))*(gradfT->operator()(2)); + + + gradT->operator()(0)=-1/(pow(*fT,2))*(gradfT->operator()(0)); + gradT->operator()(1)=-1/(pow(*fT,2))*(gradfT->operator()(1)); + gradT->operator()(2)=-1/(pow(*fT,2))*(gradfT->operator()(2)); + + STensor3 *dgardVdgradfV=&(ipv->getRefTodgradVdgradfV()); + STensor3 *dgardVdgradfT=&(ipv->getRefTodgradVdgradfT()); + STensor3 *dgardTdgradfT=&(ipv->getRefTodgradTdgradfT()); + STensor3 *dgardTdgradfV=&(ipv->getRefTodgradTdgradfV()); + + + SVector3 *dgradVdfV=&(ipv->getRefTodgradVdfV()); + SVector3 *dgradVdfT=&(ipv->getRefTodgradVdfT()); + SVector3 *dgradTdfT=&(ipv->getRefTodgradTdfT()); + SVector3 *dgradTdfV=&(ipv->getRefTodgradTdfV()); + + double *dVdfV=&(ipv->getRefTodVdfV()); + double *dVdfT=&(ipv->getRefTodVdfT()); + double *dTdfT=&(ipv->getRefTodTdfT()); + double *dTdfV=&(ipv->getRefTodTdfV()); + + + STensorOperation::zero(*dgardVdgradfV); + dgardVdgradfV->operator()(0,0) =-1./(*fT); + dgardVdgradfV->operator()(1,1) =-1./(*fT); + dgardVdgradfV->operator()(2,2) =-1./(*fT); + + STensorOperation::zero(*dgardVdgradfT); + dgardVdgradfT->operator()(0,0) =(*fV)/(*fT)/(*fT); + dgardVdgradfT->operator()(1,1) =(*fV)/(*fT)/(*fT); + dgardVdgradfT->operator()(2,2) =(*fV)/(*fT)/(*fT); + + STensorOperation::zero(*dgardTdgradfT); + dgardTdgradfT->operator()(0,0) =-1./(*fT)/(*fT); + dgardTdgradfT->operator()(1,1) =-1./(*fT)/(*fT); + dgardTdgradfT->operator()(2,2) =-1./(*fT)/(*fT); + + STensorOperation::zero(*dgardTdgradfV); + *dVdfV=-1./(*fT); + *dVdfT=(*fV)/(*fT)/(*fT); + *dTdfT=-1./(*fT)/(*fT); + *dTdfV=0.; + + dgradVdfV->operator()(0)=1./(*fT)/(*fT)*(gradfT->operator()(0)); + dgradVdfV->operator()(1)=1./(*fT)/(*fT)*(gradfT->operator()(1)); + dgradVdfV->operator()(2)=1./(*fT)/(*fT)*(gradfT->operator()(2)); + + dgradVdfT->operator()(0)=1./(*fT)/(*fT)*(gradfV->operator()(0))-2*(*fV)/(*fT)/(*fT)/(*fT)*(gradfT->operator()(0)); + dgradVdfT->operator()(1)=1./(*fT)/(*fT)*(gradfV->operator()(1))-2*(*fV)/(*fT)/(*fT)/(*fT)*(gradfT->operator()(1)); + dgradVdfT->operator()(2)=1./(*fT)/(*fT)*(gradfV->operator()(2))-2*(*fV)/(*fT)/(*fT)/(*fT)*(gradfT->operator()(2)); + + dgradTdfT->operator()(0)=2/(*fT)/(*fT)/(*fT)*(gradfT->operator()(0)); + dgradTdfT->operator()(1)=2/(*fT)/(*fT)/(*fT)*(gradfT->operator()(1)); + dgradTdfT->operator()(2)=2/(*fT)/(*fT)/(*fT)*(gradfT->operator()(2)); + + dgradTdfV->operator()(0)=0.; + dgradTdfV->operator()(1)=0.; + dgradTdfV->operator()(2)=0.; + } + else + { + double *temperature = &(ipv->getRefToTemperature()); + SVector3 *gradT = &(ipv->getRefToGradT()); + *temperature= 0.; + STensorOperation::zero(*gradT); + + for (int i = 0; i < nbFF; i++) { - double *temperature = &(ipv->getRefToTemperature()); - SVector3 *gradT = &(ipv->getRefToGradT()); - *temperature= 0.; - gradT->operator=(0.); - for (int i = 0; i < nbFF; i++) - { - double temp = disp(i+3*nbFF); - //epsbar: take compoenent epsbar - *temperature += Vals[i+3*nbFF]*temp; - gradT->operator()(0) += Grads[i+3*nbFF][0]*temp; - gradT->operator()(1) += Grads[i+3*nbFF][1]*temp; - gradT->operator()(2) += Grads[i+3*nbFF][2]*temp; - } + const double& temp = disp(i+3*nbFF); + *temperature += Vals[i+3*nbFF]*temp; + gradT->operator()(0) += Grads[i+3*nbFF][0]*temp; + gradT->operator()(1) += Grads[i+3*nbFF][1]*temp; + gradT->operator()(2) += Grads[i+3*nbFF][2]*temp; + } - double *Voltage = &(ipv->getRefToVoltage()); - SVector3 *gradV = &(ipv->getRefToGradV()); - *Voltage= 0.; - gradV->operator=(0.); - for (int i = 0; i < nbFF; i++) - { - double volt = disp(i+4*nbFF); - //epsbar: take compoenent epsbar - *Voltage += Vals[i+4*nbFF]*volt; - gradV->operator()(0) += Grads[i+4*nbFF][0]*volt; - gradV->operator()(1) += Grads[i+4*nbFF][1]*volt; - gradV->operator()(2) += Grads[i+4*nbFF][2]*volt; - } + double *Voltage = &(ipv->getRefToVoltage()); + SVector3 *gradV = &(ipv->getRefToGradV()); + *Voltage= 0.; + STensorOperation::zero(*gradV); + + for (int i = 0; i < nbFF; i++) + { + const double& volt = disp(i+4*nbFF); + *Voltage += Vals[i+4*nbFF]*volt; + gradV->operator()(0) += Grads[i+4*nbFF][0]*volt; + gradV->operator()(1) += Grads[i+4*nbFF][1]*volt; + gradV->operator()(2) += Grads[i+4*nbFF][2]*volt; } - } - - -} + } +}; void ElecTherMechDG3DDomain::computeStrain(AllIPState *aips,MInterfaceElement *ie, IntPt *GP,const IPStateBase::whichState ws, @@ -5115,10 +5044,8 @@ void ElecTherMechDG3DDomain::computeStrain(AllIPState *aips,MInterfaceElement *i IPStateBase* ipsm = (*vips)[j]; IPStateBase* ipsp = (*vips)[j+npts]; - ElecTherMechDG3DIPVariableBase* ipvm; //= static_cast<nonLocalDamageDG3DIPVariable*>(ipsm->getState(ws)); - ElecTherMechDG3DIPVariableBase* ipvp; //= static_cast<nonLocalDamageDG3DIPVariable*>(ipsp->getState(ws)); -// nonLocalDamageDG3DIPVariable* ipvmprev = static_cast<nonLocalDamageDG3DIPVariable*>(ipsm->getState(IPStateBase::previous)); -// nonLocalDamageDG3DIPVariable* ipvpprev = static_cast<nonLocalDamageDG3DIPVariable*>(ipsp->getState(IPStateBase::previous)); + ElecTherMechDG3DIPVariableBase* ipvm = NULL; + ElecTherMechDG3DIPVariableBase* ipvp = NULL; // check if fracture or not via minus if true for minus --> true for plus too FractureCohesive3DIPVariable *ipvtmp = dynamic_cast<FractureCohesive3DIPVariable*>(ipsm->getState(ws)); if(ipvtmp!=NULL) @@ -5133,329 +5060,291 @@ void ElecTherMechDG3DDomain::computeStrain(AllIPState *aips,MInterfaceElement *i ipvp = static_cast<ElecTherMechDG3DIPVariableBase*>(ipsp->getState(ws)); } - if(getUseFtFv()==true) + if(getUseFtFv()) { - double *fTm = &(ipvm->getRefTofT()); - *fTm = 0.; + double *fTm = &(ipvm->getRefTofT()); + *fTm = 0.; - SVector3 *gradfTm = &(ipvm->getRefToGradfT()); - gradfTm->operator=(0.); + SVector3 *gradfTm = &(ipvm->getRefToGradfT()); + STensorOperation::zero(*gradfTm); for (int i = 0; i < nbFFm; i++) { - double ftemp = dispm(i+3*nbFFm); - //epsbar: take compoenent epsbar - *fTm += Valsm[i+3*nbFFm]*ftemp; - gradfTm->operator()(0) += Gradsm[i+3*nbFFm][0]*ftemp; - gradfTm->operator()(1) += Gradsm[i+3*nbFFm][1]*ftemp; - gradfTm->operator()(2) += Gradsm[i+3*nbFFm][2]*ftemp; - } - double *fTp = &(ipvp->getRefTofT()); - *fTp = 0.; - SVector3 *gradfTp = &(ipvp->getRefToGradfT()); - gradfTp->operator=(0.); - - for (int i = 0; i < nbFFp; i++) - { - double ftemp = dispp(i+3*nbFFp); - - //epsbar: take compoenent epsbar - *fTp += Valsp[i+3*nbFFp]*ftemp; - gradfTp->operator()(0) += Gradsp[i+3*nbFFp][0]*ftemp; - gradfTp->operator()(1) += Gradsp[i+3*nbFFp][1]*ftemp; - gradfTp->operator()(2) += Gradsp[i+3*nbFFp][2]*ftemp; - } - double fTjump=0.; - // compute the jump - computeExtraFieldJump(3,Valsm,nbFFm,Valsp,nbFFp,dispm,dispp,fTjump); - //Msg::Error("Temperature jump: %e",tempjump); - ipvm->getRefTofTJump() = fTjump; - ipvp->getRefTofTJump() = fTjump; - - - double *fVm = &(ipvm->getRefTofV()); - *fVm = 0.; - - SVector3 *gradfVm = &(ipvm->getRefToGradfV()); - gradfVm->operator=(0.); - - for (int i = 0; i < nbFFm; i++) - { - double fvolt = dispm(i+4*nbFFm); - //epsbar: take compoenent epsbar - *fVm += Valsm[i+4*nbFFm]*fvolt; - gradfVm->operator()(0) += Gradsm[i+4*nbFFm][0]*fvolt; - gradfVm->operator()(1) += Gradsm[i+4*nbFFm][1]*fvolt; - gradfVm->operator()(2) += Gradsm[i+4*nbFFm][2]*fvolt; - } - double *fVp = &(ipvp->getRefTofV()); - *fVp = 0.; - SVector3 *gradfVp = &(ipvp->getRefToGradfV()); - gradfVp->operator=(0.); - - for (int i = 0; i < nbFFp; i++) - { - double fvolt = dispp(i+4*nbFFp); - - //epsbar: take compoenent epsbar - *fVp += Valsp[i+4*nbFFp]*fvolt; - gradfVp->operator()(0) += Gradsp[i+4*nbFFp][0]*fvolt; - gradfVp->operator()(1) += Gradsp[i+4*nbFFp][1]*fvolt; - gradfVp->operator()(2) += Gradsp[i+4*nbFFp][2]*fvolt; - } + const double& ftemp = dispm(i+3*nbFFm); + *fTm += Valsm[i+3*nbFFm]*ftemp; + gradfTm->operator()(0) += Gradsm[i+3*nbFFm][0]*ftemp; + gradfTm->operator()(1) += Gradsm[i+3*nbFFm][1]*ftemp; + gradfTm->operator()(2) += Gradsm[i+3*nbFFm][2]*ftemp; + } + + double *fTp = &(ipvp->getRefTofT()); + *fTp = 0.; + SVector3 *gradfTp = &(ipvp->getRefToGradfT()); + STensorOperation::zero(*gradfTp); + + for (int i = 0; i < nbFFp; i++) + { + const double& ftemp = dispp(i+3*nbFFp); + *fTp += Valsp[i+3*nbFFp]*ftemp; + gradfTp->operator()(0) += Gradsp[i+3*nbFFp][0]*ftemp; + gradfTp->operator()(1) += Gradsp[i+3*nbFFp][1]*ftemp; + gradfTp->operator()(2) += Gradsp[i+3*nbFFp][2]*ftemp; + } + + double& fTjump=ipvm->getRefTofTJump(); + // compute the jump + computeExtraFieldJump(3,Valsm,nbFFm,Valsp,nbFFp,dispm,dispp,fTjump); + //Msg::Error("Temperature jump: %e",tempjump); + ipvp->getRefTofTJump() = fTjump; + + + double *fVm = &(ipvm->getRefTofV()); + *fVm = 0.; + + SVector3 *gradfVm = &(ipvm->getRefToGradfV()); + STensorOperation::zero(*gradfVm); + + for (int i = 0; i < nbFFm; i++) + { + const double& fvolt = dispm(i+4*nbFFm); + *fVm += Valsm[i+4*nbFFm]*fvolt; + gradfVm->operator()(0) += Gradsm[i+4*nbFFm][0]*fvolt; + gradfVm->operator()(1) += Gradsm[i+4*nbFFm][1]*fvolt; + gradfVm->operator()(2) += Gradsm[i+4*nbFFm][2]*fvolt; + } + + double *fVp = &(ipvp->getRefTofV()); + *fVp = 0.; + SVector3 *gradfVp = &(ipvp->getRefToGradfV()); + STensorOperation::zero(*gradfVp); + + for (int i = 0; i < nbFFp; i++) + { + const double& fvolt = dispp(i+4*nbFFp); + *fVp += Valsp[i+4*nbFFp]*fvolt; + gradfVp->operator()(0) += Gradsp[i+4*nbFFp][0]*fvolt; + gradfVp->operator()(1) += Gradsp[i+4*nbFFp][1]*fvolt; + gradfVp->operator()(2) += Gradsp[i+4*nbFFp][2]*fvolt; + } + + double *Tm = &(ipvm->getRefToTemperature()); + double *Vm = &(ipvm->getRefToVoltage()); + *Vm = -1*(*fVm)/(*fTm); + *Tm = 1/(*fTm); + + double *Tp = &(ipvp->getRefToTemperature()); + double *Vp = &(ipvp->getRefToVoltage()); + *Vp = -1*(*fVp)/(*fTp); + *Tp = 1/(*fTp); + + double& fVjump= ipvm->getRefTofvJump(); + // compute the jump + computeExtraFieldJump(4,Valsm,nbFFm,Valsp,nbFFp,dispm,dispp,fVjump); + ipvp->getRefTofvJump() = fVjump; + + SVector3 &gradTm = ipvm->getRefToGradT(); + SVector3 &gradVm = ipvm->getRefToGradV(); + SVector3 &gradTp = ipvp->getRefToGradT(); + SVector3 &gradVp = ipvp->getRefToGradV(); + + gradVp(0)= -1/(*fTp)*(gradfVp->operator()(0))+(*fVp)/(pow(*fTp,2))*gradfTp->operator()(0); + gradVp(1)= -1/(*fTp)*(gradfVp->operator()(1))+(*fVp)/(pow(*fTp,2))*gradfTp->operator()(1); + gradVp(2)= -1/(*fTp)*(gradfVp->operator()(2))+(*fVp)/(pow(*fTp,2))*gradfTp->operator()(2); + + gradVm(0)= -1/(*fTm)*(gradfVm->operator()(0))+(*fVm)/(pow(*fTm,2))*gradfTm->operator()(0); + gradVm(1)= -1/(*fTm)*(gradfVm->operator()(1))+(*fVm)/(pow(*fTm,2))*gradfTm->operator()(1); + gradVm(2)= -1/(*fTm)*(gradfVm->operator()(2))+(*fVm)/(pow(*fTm,2))*gradfTm->operator()(2); + + gradTp(0)=-1/(pow(*fTp,2))*gradfTp->operator()(0); + gradTp(1)=-1/(pow(*fTp,2))*gradfTp->operator()(1); + gradTp(2)=-1/(pow(*fTp,2))*gradfTp->operator()(2); + + gradTm(0)=-1/(pow(*fTm,2))*gradfTm->operator()(0); + gradTm(1)=-1/(pow(*fTm,2))*gradfTm->operator()(1); + gradTm(2)=-1/(pow(*fTm,2))*gradfTm->operator()(2); + + STensor3 &dgardVdgradfVm=ipvm->getRefTodgradVdgradfV(); + STensor3 &dgardVdgradfTm=ipvm->getRefTodgradVdgradfT(); + STensor3 &dgardTdgradfTm=ipvm->getRefTodgradTdgradfT(); + STensor3 &dgardTdgradfVm=ipvm->getRefTodgradTdgradfV(); + + SVector3 &dgradVdfVm=ipvm->getRefTodgradVdfV(); + SVector3 &dgradVdfTm=ipvm->getRefTodgradVdfT(); + SVector3 &dgradTdfTm=ipvm->getRefTodgradTdfT(); + SVector3 &dgradTdfVm=ipvm->getRefTodgradTdfV(); + + double &dVdfVm=ipvm->getRefTodVdfV(); + double &dVdfTm=ipvm->getRefTodVdfT(); + double &dTdfTm=ipvm->getRefTodTdfT(); + double &dTdfVm=ipvm->getRefTodTdfV(); + + STensor3 &dgardVdgradfVp=ipvp->getRefTodgradVdgradfV(); + STensor3 &dgardVdgradfTp=ipvp->getRefTodgradVdgradfT(); + STensor3 &dgardTdgradfTp=ipvp->getRefTodgradTdgradfT(); + STensor3 &dgardTdgradfVp=ipvp->getRefTodgradTdgradfV(); + + SVector3 &dgradVdfVp=ipvp->getRefTodgradVdfV(); + SVector3 &dgradVdfTp=ipvp->getRefTodgradVdfT(); + SVector3 &dgradTdfTp=ipvp->getRefTodgradTdfT(); + SVector3 &dgradTdfVp=ipvp->getRefTodgradTdfV(); + + double &dVdfVp=ipvp->getRefTodVdfV(); + double &dVdfTp=ipvp->getRefTodVdfT(); + double &dTdfTp=ipvp->getRefTodTdfT(); + double &dTdfVp=ipvp->getRefTodTdfV(); + + + STensorOperation::diag(dgardVdgradfVm,-1./(*fTm)); + STensorOperation::diag(dgardVdgradfTm,*fVm/(*fTm)/(*fTm)); + STensorOperation::diag(dgardTdgradfTm,-1./(*fTm)/(*fTm)); + STensorOperation::zero(dgardTdgradfVm); + + STensorOperation::diag(dgardVdgradfVp,-1./(*fTp)); + STensorOperation::diag(dgardVdgradfTp,*fVp/(*fTp)/(*fTp)); + STensorOperation::diag(dgardTdgradfTp,-1./(*fTp)/(*fTp)); + STensorOperation::zero(dgardTdgradfVp); + + dVdfVm=-1./(*fTm); + dVdfTm=(*fVm)/(*fTm)/(*fTm); + dTdfTm=-1./(*fTm)/(*fTm); + dTdfVm=0.; + + dVdfVp=-1./(*fTp); + dVdfTp=(*fVp)/(*fTp)/(*fTp); + dTdfTp=-1./(*fTp)/(*fTp); + dTdfVp=0.; + + dgradVdfVm(0)=1./(*fTm)/(*fTm)*(gradfTm->operator()(0)); + dgradVdfVm(1)=1./(*fTm)/(*fTm)*(gradfTm->operator()(1)); + dgradVdfVm(2)=1./(*fTm)/(*fTm)*(gradfTm->operator()(2)); + + dgradVdfVp(0)=1./(*fTp)/(*fTp)*(gradfTp->operator()(0)); + dgradVdfVp(1)=1./(*fTp)/(*fTp)*(gradfTp->operator()(1)); + dgradVdfVp(2)=1./(*fTp)/(*fTp)*(gradfTp->operator()(2)); + + dgradVdfTm(0)=1./(*fTm)/(*fTm)*(gradfVm->operator()(0))-2*(*fVm)/(*fTm)/(*fTm)/(*fTm)*(gradfTm->operator()(0)); + dgradVdfTm(1)=1./(*fTm)/(*fTm)*(gradfVm->operator()(1))-2*(*fVm)/(*fTm)/(*fTm)/(*fTm)*(gradfTm->operator()(1)); + dgradVdfTm(2)=1./(*fTm)/(*fTm)*(gradfVm->operator()(2))-2*(*fVm)/(*fTm)/(*fTm)/(*fTm)*(gradfTm->operator()(2)); + + dgradVdfTp(0)=1./(*fTp)/(*fTp)*(gradfVp->operator()(0))-2*(*fVp)/(*fTp)/(*fTp)/(*fTp)*(gradfTp->operator()(0)); + dgradVdfTp(1)=1./(*fTp)/(*fTp)*(gradfVp->operator()(1))-2*(*fVp)/(*fTp)/(*fTp)/(*fTp)*(gradfTp->operator()(1)); + dgradVdfTp(2)=1./(*fTp)/(*fTp)*(gradfVp->operator()(2))-2*(*fVp)/(*fTp)/(*fTp)/(*fTp)*(gradfTp->operator()(2)); + + dgradTdfTm(0)=2/(*fTm)/(*fTm)/(*fTm)*(gradfTm->operator()(0)); + dgradTdfTm(1)=2/(*fTm)/(*fTm)/(*fTm)*(gradfTm->operator()(1)); + dgradTdfTm(2)=2/(*fTm)/(*fTm)/(*fTm)*(gradfTm->operator()(2)); - double *Tm = &(ipvm->getRefToTemperature()); - double *Vm = &(ipvm->getRefToVoltage()); - *Vm = -1*(*fVm)/(*fTm); - *Tm = 1/(*fTm); - - double *Tp = &(ipvp->getRefToTemperature()); - double *Vp = &(ipvp->getRefToVoltage()); - *Vp = -1*(*fVp)/(*fTp); - *Tp = 1/(*fTp); - - double fVjump=0.; - // compute the jump - computeExtraFieldJump(4,Valsm,nbFFm,Valsp,nbFFp,dispm,dispp,fVjump); - ipvm->getRefTofvJump() = fVjump; - ipvp->getRefTofvJump() = fVjump; - - SVector3 &gradTm = ipvm->getRefToGradT(); - SVector3 &gradVm = ipvm->getRefToGradV(); - SVector3 &gradTp = ipvp->getRefToGradT(); - SVector3 &gradVp = ipvp->getRefToGradV(); - - gradVp(0)= -1/(*fTp)*(gradfVp->operator()(0))+(*fVp)/(pow(*fTp,2))*gradfTp->operator()(0); - gradVp(1)= -1/(*fTp)*(gradfVp->operator()(1))+(*fVp)/(pow(*fTp,2))*gradfTp->operator()(1); - gradVp(2)= -1/(*fTp)*(gradfVp->operator()(2))+(*fVp)/(pow(*fTp,2))*gradfTp->operator()(2); - - gradVm(0)= -1/(*fTm)*(gradfVm->operator()(0))+(*fVm)/(pow(*fTm,2))*gradfTm->operator()(0); - gradVm(1)= -1/(*fTm)*(gradfVm->operator()(1))+(*fVm)/(pow(*fTm,2))*gradfTm->operator()(1); - gradVm(2)= -1/(*fTm)*(gradfVm->operator()(2))+(*fVm)/(pow(*fTm,2))*gradfTm->operator()(2); - - gradTp(0)=-1/(pow(*fTp,2))*gradfTp->operator()(0); - gradTp(1)=-1/(pow(*fTp,2))*gradfTp->operator()(1); - gradTp(2)=-1/(pow(*fTp,2))*gradfTp->operator()(2); - - gradTm(0)=-1/(pow(*fTm,2))*gradfTm->operator()(0); - gradTm(1)=-1/(pow(*fTm,2))*gradfTm->operator()(1); - gradTm(2)=-1/(pow(*fTm,2))*gradfTm->operator()(2); - - STensor3 &dgardVdgradfVm=ipvm->getRefTodgradVdgradfV(); - STensor3 &dgardVdgradfTm=ipvm->getRefTodgradVdgradfT(); - STensor3 &dgardTdgradfTm=ipvm->getRefTodgradTdgradfT(); - STensor3 &dgardTdgradfVm=ipvm->getRefTodgradTdgradfV(); - - SVector3 &dgradVdfVm=ipvm->getRefTodgradVdfV(); - SVector3 &dgradVdfTm=ipvm->getRefTodgradVdfT(); - SVector3 &dgradTdfTm=ipvm->getRefTodgradTdfT(); - SVector3 &dgradTdfVm=ipvm->getRefTodgradTdfV(); - - double &dVdfVm=ipvm->getRefTodVdfV(); - double &dVdfTm=ipvm->getRefTodVdfT(); - double &dTdfTm=ipvm->getRefTodTdfT(); - double &dTdfVm=ipvm->getRefTodTdfV(); - - STensor3 &dgardVdgradfVp=ipvp->getRefTodgradVdgradfV(); - STensor3 &dgardVdgradfTp=ipvp->getRefTodgradVdgradfT(); - STensor3 &dgardTdgradfTp=ipvp->getRefTodgradTdgradfT(); - STensor3 &dgardTdgradfVp=ipvp->getRefTodgradTdgradfV(); - - SVector3 &dgradVdfVp=ipvp->getRefTodgradVdfV(); - SVector3 &dgradVdfTp=ipvp->getRefTodgradVdfT(); - SVector3 &dgradTdfTp=ipvp->getRefTodgradTdfT(); - SVector3 &dgradTdfVp=ipvp->getRefTodgradTdfV(); - - double &dVdfVp=ipvp->getRefTodVdfV(); - double &dVdfTp=ipvp->getRefTodVdfT(); - double &dTdfTp=ipvp->getRefTodTdfT(); - double &dTdfVp=ipvp->getRefTodTdfV(); - - dgardVdgradfVm*(0.); - dgardVdgradfVm(0,0)=-1./(*fTm); - dgardVdgradfVm(1,1)=-1./(*fTm); - dgardVdgradfVm(2,2)=-1./(*fTm); - - dgardVdgradfTm*=(0.); - dgardVdgradfTm(0,0)=*fVm/(*fTm)/(*fTm); - dgardVdgradfTm(1,1)=*fVm/(*fTm)/(*fTm); - dgardVdgradfTm(2,2)=*fVm/(*fTm)/(*fTm); - - dgardTdgradfTm*=(0.); - dgardTdgradfTm(0,0)=-1./(*fTm)/(*fTm); - dgardTdgradfTm(1,1)=-1./(*fTm)/(*fTm); - dgardTdgradfTm(2,2)=-1./(*fTm)/(*fTm); - - dgardTdgradfVm*=(0.); - - dgardVdgradfVp*=(0.); - dgardVdgradfVp(0,0)=-1./(*fTp); - dgardVdgradfVp(1,1)=-1./(*fTp); - dgardVdgradfVp(2,2)=-1./(*fTp); - - dgardVdgradfTp*=(0.); - dgardVdgradfTp(0,0)=*fVp/(*fTp)/(*fTp); - dgardVdgradfTp(1,1)=*fVp/(*fTp)/(*fTp); - dgardVdgradfTp(2,2)=*fVp/(*fTp)/(*fTp); - - dgardTdgradfTp*=(0.); - dgardTdgradfTp(0,0)=-1./(*fTp)/(*fTp); - dgardTdgradfTp(1,1)=-1./(*fTp)/(*fTp); - dgardTdgradfTp(2,2)=-1./(*fTp)/(*fTp); - - dgardTdgradfVp*=(0.); - - dVdfVm=-1./(*fTm); - dVdfTm=(*fVm)/(*fTm)/(*fTm); - dTdfTm=-1./(*fTm)/(*fTm); - dTdfVm=0.; - - dVdfVp=-1./(*fTp); - dVdfTp=(*fVp)/(*fTp)/(*fTp); - dTdfTp=-1./(*fTp)/(*fTp); - dTdfVp=0.; - - dgradVdfVm(0)=1./(*fTm)/(*fTm)*(gradfTm->operator()(0)); - dgradVdfVm(1)=1./(*fTm)/(*fTm)*(gradfTm->operator()(1)); - dgradVdfVm(2)=1./(*fTm)/(*fTm)*(gradfTm->operator()(2)); - - dgradVdfVp(0)=1./(*fTp)/(*fTp)*(gradfTp->operator()(0)); - dgradVdfVp(1)=1./(*fTp)/(*fTp)*(gradfTp->operator()(1)); - dgradVdfVp(2)=1./(*fTp)/(*fTp)*(gradfTp->operator()(2)); - - dgradVdfTm(0)=1./(*fTm)/(*fTm)*(gradfVm->operator()(0))-2*(*fVm)/(*fTm)/(*fTm)/(*fTm)*(gradfTm->operator()(0)); - dgradVdfTm(1)=1./(*fTm)/(*fTm)*(gradfVm->operator()(1))-2*(*fVm)/(*fTm)/(*fTm)/(*fTm)*(gradfTm->operator()(1)); - dgradVdfTm(2)=1./(*fTm)/(*fTm)*(gradfVm->operator()(2))-2*(*fVm)/(*fTm)/(*fTm)/(*fTm)*(gradfTm->operator()(2)); - - dgradVdfTp(0)=1./(*fTp)/(*fTp)*(gradfVp->operator()(0))-2*(*fVp)/(*fTp)/(*fTp)/(*fTp)*(gradfTp->operator()(0)); - dgradVdfTp(1)=1./(*fTp)/(*fTp)*(gradfVp->operator()(1))-2*(*fVp)/(*fTp)/(*fTp)/(*fTp)*(gradfTp->operator()(1)); - dgradVdfTp(2)=1./(*fTp)/(*fTp)*(gradfVp->operator()(2))-2*(*fVp)/(*fTp)/(*fTp)/(*fTp)*(gradfTp->operator()(2)); - - dgradTdfTm(0)=2/(*fTm)/(*fTm)/(*fTm)*(gradfTm->operator()(0)); - dgradTdfTm(1)=2/(*fTm)/(*fTm)/(*fTm)*(gradfTm->operator()(1)); - dgradTdfTm(2)=2/(*fTm)/(*fTm)/(*fTm)*(gradfTm->operator()(2)); - - dgradTdfTp(0)=2/(*fTp)/(*fTp)/(*fTp)*(gradfTp->operator()(0)); - dgradTdfTp(1)=2/(*fTp)/(*fTp)/(*fTp)*(gradfTp->operator()(1)); - dgradTdfTp(2)=2/(*fTp)/(*fTp)/(*fTp)*(gradfTp->operator()(2)); - - dgradTdfVm(0)=0.; - dgradTdfVm(1)=0.; - dgradTdfVm(2)=0.; - - dgradTdfVp(0)=0.; - dgradTdfVp(1)=0.; - dgradTdfVp(2)=0.; + dgradTdfTp(0)=2/(*fTp)/(*fTp)/(*fTp)*(gradfTp->operator()(0)); + dgradTdfTp(1)=2/(*fTp)/(*fTp)/(*fTp)*(gradfTp->operator()(1)); + dgradTdfTp(2)=2/(*fTp)/(*fTp)/(*fTp)*(gradfTp->operator()(2)); + dgradTdfVm(0)=0.; + dgradTdfVm(1)=0.; + dgradTdfVm(2)=0.; + + dgradTdfVp(0)=0.; + dgradTdfVp(1)=0.; + dgradTdfVp(2)=0.; } else { - double *temperaturem = &(ipvm->getRefToTemperature()); - *temperaturem = 0.; - - SVector3 *gradTm = &(ipvm->getRefToGradT()); - gradTm->operator=(0.); - - for (int i = 0; i < nbFFm; i++) - { - double temp = dispm(i+3*nbFFm); - //epsbar: take compoenent epsbar - *temperaturem += Valsm[i+3*nbFFm]*temp; - gradTm->operator()(0) += Gradsm[i+3*nbFFm][0]*temp; - gradTm->operator()(1) += Gradsm[i+3*nbFFm][1]*temp; - gradTm->operator()(2) += Gradsm[i+3*nbFFm][2]*temp; - } - double *temperaturep = &(ipvp->getRefToTemperature()); - *temperaturep = 0.; - SVector3 *gradTp = &(ipvp->getRefToGradT()); - gradTp->operator=(0.); - - for (int i = 0; i < nbFFp; i++) - { - double temp = dispp(i+3*nbFFp); - - //epsbar: take compoenent epsbar - *temperaturep += Valsp[i+3*nbFFp]*temp; - gradTp->operator()(0) += Gradsp[i+3*nbFFp][0]*temp; - gradTp->operator()(1) += Gradsp[i+3*nbFFp][1]*temp; - gradTp->operator()(2) += Gradsp[i+3*nbFFp][2]*temp; - } - double tempjump=0.; - // compute the jump - computeExtraFieldJump(3,Valsm,nbFFm,Valsp,nbFFp,dispm,dispp,tempjump); - //Msg::Error("Temperature jump: %e",tempjump); - ipvm->getRefToTemperatureJump() = tempjump; - ipvp->getRefToTemperatureJump() = tempjump; - - - double *voltagem = &(ipvm->getRefToVoltage()); - *voltagem = 0.; - - SVector3 *gradVm = &(ipvm->getRefToGradV()); - gradVm->operator=(0.); - - for (int i = 0; i < nbFFm; i++) - { - double volt = dispm(i+4*nbFFm); - //epsbar: take compoenent epsbar - *voltagem += Valsm[i+4*nbFFm]*volt; - gradVm->operator()(0) += Gradsm[i+4*nbFFm][0]*volt; - gradVm->operator()(1) += Gradsm[i+4*nbFFm][1]*volt; - gradVm->operator()(2) += Gradsm[i+4*nbFFm][2]*volt; - } - double *voltagep = &(ipvp->getRefToVoltage()); - *voltagep = 0.; - SVector3 *gradVp = &(ipvp->getRefToGradV()); - gradVp->operator=(0.); - - for (int i = 0; i < nbFFp; i++) - { - double volt = dispp(i+4*nbFFp); - - //epsbar: take compoenent epsbar - *voltagep += Valsp[i+4*nbFFp]*volt; - gradVp->operator()(0) += Gradsp[i+4*nbFFp][0]*volt; - gradVp->operator()(1) += Gradsp[i+4*nbFFp][1]*volt; - gradVp->operator()(2) += Gradsp[i+4*nbFFp][2]*volt; - } + double *temperaturem = &(ipvm->getRefToTemperature()); + *temperaturem = 0.; - double voltjump=0.; - // compute the jump - computeExtraFieldJump(4,Valsm,nbFFm,Valsp,nbFFp,dispm,dispp,voltjump); - ipvm->getRefToVoltageJump() = voltjump; - ipvp->getRefToVoltageJump() = voltjump; + SVector3 *gradTm = &(ipvm->getRefToGradT()); + STensorOperation::zero(*gradTm); + for (int i = 0; i < nbFFm; i++) + { + const double& temp = dispm(i+3*nbFFm); + *temperaturem += Valsm[i+3*nbFFm]*temp; + gradTm->operator()(0) += Gradsm[i+3*nbFFm][0]*temp; + gradTm->operator()(1) += Gradsm[i+3*nbFFm][1]*temp; + gradTm->operator()(2) += Gradsm[i+3*nbFFm][2]*temp; + } + + double *temperaturep = &(ipvp->getRefToTemperature()); + *temperaturep = 0.; + SVector3 *gradTp = &(ipvp->getRefToGradT()); + STensorOperation::zero(*gradTp); - double fvjump=0.;double ftjump=0.; - double dftjumpdTp=0.;double dftjumpdTm=0.; - double dfvjumpdvp, dfvjumpdvm,dfvjumpdTm,dfvjumpdTp; - dfvjumpdvp=0.; dfvjumpdvm=0.;dfvjumpdTm=0.;dfvjumpdTp=0.; + for (int i = 0; i < nbFFp; i++) + { + const double& temp = dispp(i+3*nbFFp); + *temperaturep += Valsp[i+3*nbFFp]*temp; + gradTp->operator()(0) += Gradsp[i+3*nbFFp][0]*temp; + gradTp->operator()(1) += Gradsp[i+3*nbFFp][1]*temp; + gradTp->operator()(2) += Gradsp[i+3*nbFFp][2]*temp; + } + + double& tempjump= ipvm->getRefToTemperatureJump(); + // compute the jump + computeExtraFieldJump(3,Valsm,nbFFm,Valsp,nbFFp,dispm,dispp,tempjump); + //Msg::Error("Temperature jump: %e",tempjump); + ipvp->getRefToTemperatureJump() = tempjump; - computeftjump(3,Valsm,nbFFm,Valsp,nbFFp,dispm,dispp,ftjump,dftjumpdTp,dftjumpdTm); - computefvjump(3,4,Valsm,nbFFm,Valsp,nbFFp,dispm,dispp,fvjump,dfvjumpdTp,dfvjumpdTm,dfvjumpdvp,dfvjumpdvm); - ipvm->getRefTofvJump() = fvjump; - ipvp->getRefTofvJump() = fvjump; + double *voltagem = &(ipvm->getRefToVoltage()); + *voltagem = 0.; + SVector3 *gradVm = &(ipvm->getRefToGradV()); + STensorOperation::zero(*gradVm); + + for (int i = 0; i < nbFFm; i++) + { + const double& volt = dispm(i+4*nbFFm); + *voltagem += Valsm[i+4*nbFFm]*volt; + gradVm->operator()(0) += Gradsm[i+4*nbFFm][0]*volt; + gradVm->operator()(1) += Gradsm[i+4*nbFFm][1]*volt; + gradVm->operator()(2) += Gradsm[i+4*nbFFm][2]*volt; + } + double *voltagep = &(ipvp->getRefToVoltage()); + *voltagep = 0.; + SVector3 *gradVp = &(ipvp->getRefToGradV()); + STensorOperation::zero(*gradVp); + + for (int i = 0; i < nbFFp; i++) + { + const double& volt = dispp(i+4*nbFFp); + *voltagep += Valsp[i+4*nbFFp]*volt; + gradVp->operator()(0) += Gradsp[i+4*nbFFp][0]*volt; + gradVp->operator()(1) += Gradsp[i+4*nbFFp][1]*volt; + gradVp->operator()(2) += Gradsp[i+4*nbFFp][2]*volt; + } + + double& voltjump= ipvm->getRefToVoltageJump(); + // compute the jump + computeExtraFieldJump(4,Valsm,nbFFm,Valsp,nbFFp,dispm,dispp,voltjump); + ipvp->getRefToVoltageJump() = voltjump; - ipvm->getRefTofTJump() = ftjump; - ipvp->getRefTofTJump() = ftjump; - ipvm->getRefTodfvjumpdvm() = dfvjumpdvm; - ipvp->getRefTodfvjumpdvp() = dfvjumpdvp; + double fvjump=0.;double ftjump=0.; + double dftjumpdTp=0.;double dftjumpdTm=0.; + double dfvjumpdvp, dfvjumpdvm,dfvjumpdTm,dfvjumpdTp; + dfvjumpdvp=0.; dfvjumpdvm=0.;dfvjumpdTm=0.;dfvjumpdTp=0.; - ipvm->getRefTodfvjumpdTm() = dfvjumpdTm; - ipvp->getRefTodfvjumpdTp() = dfvjumpdTp; + computeftjump(3,Valsm,nbFFm,Valsp,nbFFp,dispm,dispp,ftjump,dftjumpdTp,dftjumpdTm); + computefvjump(3,4,Valsm,nbFFm,Valsp,nbFFp,dispm,dispp,fvjump,dfvjumpdTp,dfvjumpdTm,dfvjumpdvp,dfvjumpdvm); - ipvm->getRefTodfTjumpdTm() = dftjumpdTm; - ipvp->getRefTodfTjumpdTp() = dftjumpdTp; + ipvm->getRefTofvJump() = fvjump; + ipvp->getRefTofvJump() = fvjump; + + ipvm->getRefTofTJump() = ftjump; + ipvp->getRefTofTJump() = ftjump; + + ipvm->getRefTodfvjumpdvm() = dfvjumpdvm; + ipvp->getRefTodfvjumpdvp() = dfvjumpdvp; + + ipvm->getRefTodfvjumpdTm() = dfvjumpdTm; + ipvp->getRefTodfvjumpdTp() = dfvjumpdTp; + + ipvm->getRefTodfTjumpdTm() = dftjumpdTm; + ipvp->getRefTodfTjumpdTp() = dftjumpdTp; } } - } - + } else { // Virtual interface element Msg::Error("No virtual interface for 3D"); - } } diff --git a/dG3D/src/dG3DDomain.h b/dG3D/src/dG3DDomain.h index 1a48e563b7419d4554291d2d840d7638260358fc..4fde36a4e7e0a793958ae20d1560e0e4e88c6e92 100644 --- a/dG3D/src/dG3DDomain.h +++ b/dG3D/src/dG3DDomain.h @@ -17,6 +17,7 @@ #include "dG3DIPVariable.h" #include "partDomain.h" #include "interfaceQuadrature.h" +#include "ipField.h" #endif class dG3DDomain : public dgPartDomain{ public : @@ -67,7 +68,7 @@ class dG3DDomain : public dgPartDomain{ // crack injection bool _imposeCrackFlag; - std::map<int, std::pair<int,int> > _imposedInterfaceCrack; // pair is positive and negative + std::set<TwoNum> _imposedInterfaceCrack; // pair is positive and negative bool _accountPathFollowing; @@ -97,7 +98,7 @@ class dG3DDomain : public dgPartDomain{ virtual int getStressDimension() const; - virtual void checkFailure(AllIPState* aips); + virtual void checkFailure(IPField* aips) const; virtual void initialIPVariable(AllIPState *aips,const unknownField *ufield,const IPStateBase::whichState ws, bool stiff); @@ -132,10 +133,14 @@ class dG3DDomain : public dgPartDomain{ const simpleFunctionTime<double>* f,const unknownField *uf, const IPField * ip, nonLinearBoundaryCondition::location onWhat) const; virtual double scaleTimeStep() const {return _sts;} - virtual FunctionSpaceBase* getFunctionSpace() const{return _space;} - virtual FunctionSpaceBase* getFunctionSpaceMinus() const{return _space;} - virtual FunctionSpaceBase* getFunctionSpacePlus() const{return _space;} - virtual FunctionSpaceBase* getInterfaceFunctionSpace() const {return _extraSpace;}; + virtual FunctionSpaceBase* getFunctionSpace(){return _space;} + virtual const FunctionSpaceBase* getFunctionSpace() const {return _space;} + virtual FunctionSpaceBase* getFunctionSpaceMinus() {return _space;} + virtual const FunctionSpaceBase* getFunctionSpaceMinus() const{return _space;} + virtual FunctionSpaceBase* getFunctionSpacePlus() {return _space;} + virtual const FunctionSpaceBase* getFunctionSpacePlus() const{return _space;} + virtual FunctionSpaceBase* getInterfaceFunctionSpace() {return _extraSpace;}; + virtual const FunctionSpaceBase* getInterfaceFunctionSpace() const {return _extraSpace;}; virtual const partDomain* getMinusDomain() const{return this;} virtual const partDomain* getPlusDomain() const{return this;} virtual partDomain* getMinusDomain() {return this;} @@ -274,8 +279,10 @@ class interDomainBetween3D : public interDomainBase, public dG3DDomain{ virtual int getPlusLawNum() const{return _domPlus->getLawNum();} virtual const partDomain* getMinusDomain() const{return _domMinus;} virtual const partDomain* getPlusDomain() const{return _domPlus;} - virtual FunctionSpaceBase* getFunctionSpaceMinus() const{return _spaceMinus;} - virtual FunctionSpaceBase* getFunctionSpacePlus() const{return _spacePlus;} + virtual FunctionSpaceBase* getFunctionSpaceMinus(){return _spaceMinus;} + virtual const FunctionSpaceBase* getFunctionSpaceMinus() const{return _spaceMinus;} + virtual FunctionSpaceBase* getFunctionSpacePlus(){return _spacePlus;} + virtual const FunctionSpaceBase* getFunctionSpacePlus() const{return _spacePlus;} virtual partDomain* getMinusDomain(){return _domMinus;} virtual partDomain* getPlusDomain() {return _domPlus;} void initializeTerms(unknownField *uf,IPField *ip); @@ -318,8 +325,10 @@ class nonLocalInterDomainBetween3D : public interDomainBase, public nonLocalDama virtual const partDomain* getPlusDomain() const{return _domPlus;} virtual partDomain* getMinusDomain(){return _domMinus;} virtual partDomain* getPlusDomain() {return _domPlus;} - virtual FunctionSpaceBase* getFunctionSpaceMinus() const{return _spaceMinus;} - virtual FunctionSpaceBase* getFunctionSpacePlus() const{return _spacePlus;} + virtual FunctionSpaceBase* getFunctionSpaceMinus(){return _spaceMinus;} + virtual const FunctionSpaceBase* getFunctionSpaceMinus() const{return _spaceMinus;} + virtual FunctionSpaceBase* getFunctionSpacePlus(){return _spacePlus;} + virtual const FunctionSpaceBase* getFunctionSpacePlus() const{return _spacePlus;} void initializeTerms(unknownField *uf,IPField *ip); virtual void createTerms(unknownField *uf,IPField*ip); @@ -423,8 +432,10 @@ class ExtraDofDiffusionInterDomainBetween3D : public interDomainBase, public Ext virtual const partDomain* getPlusDomain() const{return _domPlus;} virtual partDomain* getMinusDomain(){return _domMinus;} virtual partDomain* getPlusDomain() {return _domPlus;} - virtual FunctionSpaceBase* getFunctionSpaceMinus() const{return _spaceMinus;} - virtual FunctionSpaceBase* getFunctionSpacePlus() const{return _spacePlus;} + virtual FunctionSpaceBase* getFunctionSpaceMinus() {return _spaceMinus;} + virtual const FunctionSpaceBase* getFunctionSpaceMinus() const{return _spaceMinus;} + virtual FunctionSpaceBase* getFunctionSpacePlus() {return _spacePlus;} + virtual const FunctionSpaceBase* getFunctionSpacePlus() const{return _spacePlus;} void initializeTerms(unknownField *uf,IPField *ip); virtual void createTerms(unknownField *uf,IPField*ip)=0; @@ -596,8 +607,10 @@ class ElecTherMechInterDomainBetween3D : public interDomainBase, public ElecTher virtual const partDomain* getPlusDomain() const{return _domPlus;} virtual partDomain* getMinusDomain(){return _domMinus;} virtual partDomain* getPlusDomain() {return _domPlus;} - virtual FunctionSpaceBase* getFunctionSpaceMinus() const{return _spaceMinus;} - virtual FunctionSpaceBase* getFunctionSpacePlus() const{return _spacePlus;} + virtual FunctionSpaceBase* getFunctionSpaceMinus() {return _spaceMinus;} + virtual const FunctionSpaceBase* getFunctionSpaceMinus() const {return _spaceMinus;} + virtual FunctionSpaceBase* getFunctionSpacePlus(){return _spacePlus;} + virtual const FunctionSpaceBase* getFunctionSpacePlus() const{return _spacePlus;} void initializeTerms(unknownField *uf,IPField *ip); virtual void createTerms(unknownField *uf,IPField*ip); diff --git a/dG3D/src/dG3DEnhancedDomain.cpp b/dG3D/src/dG3DEnhancedDomain.cpp index 0384bbc942510cfb6e8d38a58b261168918639d3..fc4da1a38c5816ba5d42ac44d75b603d4db2392a 100644 --- a/dG3D/src/dG3DEnhancedDomain.cpp +++ b/dG3D/src/dG3DEnhancedDomain.cpp @@ -57,19 +57,18 @@ void dG3DEnhancedDomain::createTerms(unknownField *uf,IPField*ip) this->ltermVirtBound = new nonLinearTermVoid(); massterm = new mass3D(*dgspace,_mlaw); - - if (this->getMacroSolver()->getPathFollowingLocalIncrementType() == nonLinearMechSolver::DISSIPATION_ENERGY){ - scalarTermPF = new dG3DEnhancedStrainDissipationPathFollowingBulkScalarTerm(this,ip); + + if (this->getMacroSolver()->withPathFollowing() and _accountPathFollowing){ + scalarTermPF = new dG3DEnhancedStrainDissipationPathFollowingBulkScalarTerm(this,ip); linearTermPF = new dG3DEnhancedStrainDissipationPathFollowingBulkLinearTerm(this,ip); - } - else if (this->getMacroSolver()->getPathFollowingLocalIncrementType() == nonLinearMechSolver::DEFO_ENERGY){ - scalarTermPF = new dG3DEnhancedStrainElasticPathFollowingBulkScalarTerm(this,ip); - linearTermPF = new dG3DEnhancedStrainElasticPathFollowingBulkLinearTerm(this,ip); - } - else{ - Msg::Fatal("this->getMacroSolver()->getPathFollowingLocalIncrementType() is not defined %d",this->getMacroSolver()->getPathFollowingLocalIncrementType()); - } - + } + else{ + scalarTermPF = new nonLinearScalarTermVoid();; + linearTermPF = new nonLinearTermVoid();; + } + + scalarTermPFBound = new nonLinearScalarTermVoid();; + linearTermPFBound = new nonLinearTermVoid(); }; void dG3DEnhancedDomain::computeStrain(MElement *e, const int npts_bulk, IntPt* GP, @@ -88,11 +87,8 @@ void dG3DEnhancedDomain::computeStrain(MElement *e, const int npts_bulk, IntPt* // bulk strain std::vector<TensorialTraits<double>::GradType> &Grads = ipv->gradf(_space,e,GP[i]); STensor3& Fbulk = ipv->getRefToBulkDeformationGradient(); - Fbulk *= 0.; - - Fbulk(0,0) = 1.; - Fbulk(1,1) = 1.; - Fbulk(2,2) = 1.; + STensorOperation::unity(Fbulk); + for (int j = 0; j < nbFF; j++){ Fbulk(0,0) += Grads[j+0*nbFF][0]*disp(j); Fbulk(0,1) += Grads[j+0*nbFF][1]*disp(j); @@ -113,7 +109,7 @@ void dG3DEnhancedDomain::computeStrain(MElement *e, const int npts_bulk, IntPt* // enhanced strain std::vector<TensorialTraits<double>::ValType> &Vals = ipv->f(_space,e,GP[i]); STensor3& enF = ipv->getRefToEnhancedDeformationGradient(); - enF *= 0.; + STensorOperation::zero(enF); for (int j=0; j<nbFF; j++){ for (int k=0; k<3; k++){ diff --git a/dG3D/src/dG3DFunctionSpace.h b/dG3D/src/dG3DFunctionSpace.h index 98b8019ee747b874f78727998ae53cc061577bcc..a44b5d3ce43cafb14c0b2b74f921dbfa71d3cded 100644 --- a/dG3D/src/dG3DFunctionSpace.h +++ b/dG3D/src/dG3DFunctionSpace.h @@ -33,7 +33,7 @@ class g3DLagrangeFunctionSpace : public ThreeDLagrangeFunctionSpace{ virtual ~g3DLagrangeFunctionSpace(){}; protected : - virtual void getKeysOnElement(MElement *ele, std::vector<Dof> &keys) + virtual void getKeysOnElement(MElement *ele, std::vector<Dof> &keys) const { int nk=ele->getNumVertices(); // return the number of vertices // negative type in mpi if the Dof are not located on this partition @@ -104,7 +104,7 @@ class g3DLagrangeFunctionSpace : public ThreeDLagrangeFunctionSpace{ class dG3DLagrangeFunctionSpace : public ThreeDLagrangeFunctionSpace{ protected: - virtual void getKeysOnElement(MElement *ele, std::vector<Dof> &keys){ + virtual void getKeysOnElement(MElement *ele, std::vector<Dof> &keys) const{ int nk=ele->getNumVertices(); // return the number of vertices #if defined(HAVE_MPI) // small duplication to avoid multiple if in a loop if( (ele->getPartition() != 0)and (ele->getPartition() != Msg::GetCommRank() +1)) @@ -169,7 +169,7 @@ class g3DhoDGFunctionSpace : public ThreeDLagrangeFunctionSpace{ g3DhoDGFunctionSpace(int id, int ncomp, int comp1, int comp2, int comp3) : ThreeDLagrangeFunctionSpace(id,ncomp,comp1,comp2,comp3,true,true){}; virtual ~g3DhoDGFunctionSpace(){}; protected : - virtual void getKeysOnElement(MElement *ele, std::vector<Dof> &keys) + virtual void getKeysOnElement(MElement *ele, std::vector<Dof> &keys) const { int nk=ele->getNumVertices(); // return the number of vertices // negative type in mpi if the Dof are not located on this partition @@ -211,7 +211,7 @@ class dG3DhoDGFunctionSpace : public ThreeDLagrangeFunctionSpace{ virtual ~dG3DhoDGFunctionSpace(){}; protected: // avoid duplication of the following functions with dG3DLagrangeFunctionSpace HOW ?? - virtual void getKeysOnElement(MElement *ele, std::vector<Dof> &keys){ + virtual void getKeysOnElement(MElement *ele, std::vector<Dof> &keys) const{ int nk=ele->getNumVertices(); // return the number of vertices #if defined(HAVE_MPI) // small duplication to avoid multiple if in a loop if( (ele->getPartition() != 0)and (ele->getPartition() != Msg::GetCommRank() +1)) @@ -263,7 +263,7 @@ class g3DDirichletBoundaryConditionLagrangeFunctionSpace : public g3DLagrangeFun else return new g3DDirichletBoundaryConditionLagrangeFunctionSpace(id,_ncomp); } - virtual void getKeysOnElement(MElement *ele, std::vector<Dof> &keys) + virtual void getKeysOnElement(MElement *ele, std::vector<Dof> &keys) const { int nk=ele->getNumVertices(); // negative type in mpi if the Dof are not located on this partition @@ -349,7 +349,7 @@ class g3DNeumannBoundaryConditionLagrangeFunctionSpace : public g3DLagrangeFunct else return new g3DNeumannBoundaryConditionLagrangeFunctionSpace(id,_ncomp); } - virtual void getKeysOnElement(MElement *ele, std::vector<Dof> &keys) + virtual void getKeysOnElement(MElement *ele, std::vector<Dof> &keys) const { // For Neumann BC we sure that the BC is applied on element that are on this partition. // Indeed Neumann BC are never applied on ghost element @@ -381,7 +381,7 @@ class g3DDirichletBoundaryConditionLagrangeFunctionSpaceGhost : public g3DDirich } // be sure that the type is negative !! - virtual void getKeys(MElement *ele, std::vector<Dof> &keys){ + virtual void getKeys(MElement *ele, std::vector<Dof> &keys) const{ int nk=ele->getNumVertices(); if(ele->getPartition()!=0){ // Sure than it will match for (int j=0;j<_ncomp;++j) @@ -1509,15 +1509,15 @@ class dG3DBoundaryConditionLagrangeFunctionSpace : public dG3DLagrangeFunctionSp Msg::Fatal("dG3DBoundaryConditionLagrangeFunctionSpace::clone needs to be defined"); } - virtual void getKeys(MInterfaceElement *ielem, std::vector<Dof> &keys){ + virtual void getKeys(MInterfaceElement *ielem, std::vector<Dof> &keys) const{ Msg::Error("Impossible to get keys on interface element for a Dirichlet Boundary Conditions"); } - virtual void getKeys(MElement *e, std::vector<Dof> &keys) + virtual void getKeys(MElement *e, std::vector<Dof> &keys) const { - std::map<MElement*,std::pair<MElement*,MElement*> >::iterator itele=mapInter.find(e); + std::map<MElement*,std::pair<MElement*,MElement*> >::const_iterator itele=mapInter.find(e); MElement *ele1 = itele->second.first; MElement *ele2 = itele->second.second; - std::map<MElement*,std::pair<std::vector<int>,std::vector<int> > >::iterator itvec=mapLocalVertex.find(e); + std::map<MElement*,std::pair<std::vector<int>,std::vector<int> > >::const_iterator itvec=mapLocalVertex.find(e); int nbcomp=comp.size(); #if defined(HAVE_MPI) // small duplication to avoid multiple if in a loop if( (ele1->getPartition() != 0)and (ele1->getPartition() != Msg::GetCommRank() +1)) @@ -1566,7 +1566,7 @@ class dG3DLagrangeBetween2DomainsFunctionSpace : public ThreeDLagrangeFunctionSp protected: FunctionSpaceBase *spaceMinus; FunctionSpaceBase *spacePlus; - virtual void getKeysOnElement(MElement *ele, std::vector<Dof> &keys){ + virtual void getKeysOnElement(MElement *ele, std::vector<Dof> &keys) const{ Msg::Error("Impossible to get key for an element on a interface Domain"); } public: @@ -1578,18 +1578,23 @@ class dG3DLagrangeBetween2DomainsFunctionSpace : public ThreeDLagrangeFunctionSp return new dG3DLagrangeBetween2DomainsFunctionSpace(_ncomp,spaceMinus,spacePlus); } - virtual void getKeys(MInterfaceElement *iele, std::vector<Dof> &keys){ + virtual void getKeys(MInterfaceElement *iele, std::vector<Dof> &keys) const{ spaceMinus->getKeys(iele->getElem(0),keys); spacePlus->getKeys(iele->getElem(1),keys); } - virtual void getKeys(MElement *ele, std::vector<Dof> &keys){ + virtual void getKeys(MElement *ele, std::vector<Dof> &keys) const{ // As all element are interface element on an interface domain MInterfaceElement *iele = dynamic_cast<MInterfaceElement*>(ele); this->getKeys(iele,keys); } // special function of interFunctionSpace - virtual FunctionSpaceBase* getMinusSpace()const {return spaceMinus;} - virtual FunctionSpaceBase* getPlusSpace() const {return spacePlus;} + virtual FunctionSpaceBase* getMinusSpace() {return spaceMinus;} + virtual FunctionSpaceBase* getPlusSpace() {return spacePlus;} + + virtual const FunctionSpaceBase* getMinusSpace()const {return spaceMinus;} + virtual const FunctionSpaceBase* getPlusSpace() const {return spacePlus;} + + virtual void getNumKeys(MInterfaceElement *ele, int &numMinus, int &numPlus) const { numMinus = spaceMinus->getNumKeys(ele->getElem(0)); diff --git a/dG3D/src/dG3DHomogenizedTangentTerms.cpp b/dG3D/src/dG3DHomogenizedTangentTerms.cpp index af849fcbe46a9c06464d94049ba113354638af41..4e2aee0983727da4acf18a9c607e9abba339f587 100644 --- a/dG3D/src/dG3DHomogenizedTangentTerms.cpp +++ b/dG3D/src/dG3DHomogenizedTangentTerms.cpp @@ -13,7 +13,7 @@ #include "nonLinearMechSolver.h" void dG3DHomogenizedTangent::get(MElement *ele,int npts,IntPt *GP,fullMatrix<double> &m) const{ - FunctionSpaceBase* sp = _dom->getFunctionSpace(); + const FunctionSpaceBase* sp = _dom->getFunctionSpace(); int nbDof = sp->getNumKeys(ele); int nbFF = ele->getNumShapeFunctions(); @@ -21,7 +21,7 @@ void dG3DHomogenizedTangent::get(MElement *ele,int npts,IntPt *GP,fullMatrix<dou m.resize(stressDim,nbDof); m.setAll(0.); - AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ele->getNum()); + const AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ele->getNum()); for (int i = 0; i < npts; i++){ const IPStateBase *ips = (*vips)[i]; @@ -98,13 +98,13 @@ void dG3DNonLocalHomogenizedTangent::get(MElement *ele,int npts,IntPt *GP,fullMa // get mechanical parts dG3DHomogenizedTangent::get(ele,npts,GP,m); - FunctionSpaceBase* space = _dom->getFunctionSpace(); + const FunctionSpaceBase* space = _dom->getFunctionSpace(); int nbDof = space->getNumKeys(ele); int nbFF = ele->getNumShapeFunctions(); int stressDim = _dom->getStressDimension(); - AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ele->getNum()); + const AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ele->getNum()); // get derivatives of average strain on active damaging zone // over applied strain @@ -193,14 +193,14 @@ void dG3DNonLocalHomogenizedTangent::get(MElement *ele,int npts,IntPt *GP,fullMa void dG3DExtraDofHomogenizedTangent::get(MElement *ele,int npts,IntPt *GP,fullMatrix<double> &m) const{ dG3DHomogenizedTangent::get(ele,npts,GP,m); - FunctionSpaceBase* space = _dom->getFunctionSpace(); + const FunctionSpaceBase* space = _dom->getFunctionSpace(); int nbDof = space->getNumKeys(ele); int nbFF = ele->getNumShapeFunctions(); int numMDof =nbFF*3; - AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ele->getNum()); + const AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ele->getNum()); for (int i = 0; i < npts; i++){ const IPStateBase *ips = (*vips)[i]; diff --git a/dG3D/src/dG3DIPVariable.cpp b/dG3D/src/dG3DIPVariable.cpp index 3efa900ab2bc53ddeacb50bc3cfb4daeeff457d6..5f5a3f02428b108b73c0a472615981dd4878afba 100644 --- a/dG3D/src/dG3DIPVariable.cpp +++ b/dG3D/src/dG3DIPVariable.cpp @@ -77,27 +77,18 @@ dG3DIPVariable & dG3DIPVariable::operator = (const IPVariable &_source) double dG3DIPVariable::getJ() const { - double mat[3][3]; - for(int i = 0; i < 3; i++) - for(int j = 0; j < 3; j++) - mat[i][j] = getConstRefToDeformationGradient()(i,j); - return det3x3(mat); - + const STensor3& F = getConstRefToDeformationGradient(); + return STensorOperation::determinantSTensor3(F); } void dG3DIPVariable::getCauchyStress(STensor3 &cauchy) const { - - cauchy=0.; double detJ = getJ(); - if (detJ < 1.e-12) Msg::Error("Negative Jacobian"); - for (int i = 0; i< 3; i ++) - { - for (int j = 0; j< 3; j ++) - { - for(int k =0; k <3; k++) - { - cauchy(i,j) += getConstRefToFirstPiolaKirchhoffStress()(i,k)*getConstRefToDeformationGradient()(j,k)/detJ; - } + for (int i = 0; i< 3; i ++){ + for (int j = 0; j< 3; j ++){ + cauchy(i,j) = 0.; + for(int k =0; k <3; k++){ + cauchy(i,j) += getConstRefToFirstPiolaKirchhoffStress()(i,k)*getConstRefToDeformationGradient()(j,k)/detJ; + } } } } @@ -106,7 +97,6 @@ void dG3DIPVariable::getCauchyStress(STensor3 &cauchy) const double dG3DIPVariable::get(const int comp) const { static STensor3 cauchy; - cauchy*=0.; getCauchyStress(cauchy); const STensor3& F = this->getConstRefToDeformationGradient(); const STensor3& P = this->getConstRefToFirstPiolaKirchhoffStress(); @@ -200,20 +190,20 @@ double dG3DIPVariable::get(const int comp) const return (cauchy(0,0)+cauchy(1,1)+cauchy(2,2))/3.; } else if (comp == IPField::FIRST_PRINCIPAL_STRESS){ - fullMatrix<double> eigVec(3,3); - fullVector<double> eigVal(3); + static fullMatrix<double> eigVec(3,3); + static fullVector<double> eigVal(3); cauchy.eig(eigVec,eigVal,true); return eigVal(0); } else if (comp == IPField::SECOND_PRINCIPAL_STRESS){ - fullMatrix<double> eigVec(3,3); - fullVector<double> eigVal(3); + static fullMatrix<double> eigVec(3,3); + static fullVector<double> eigVal(3); cauchy.eig(eigVec,eigVal,true); return eigVal(1); } else if (comp == IPField::THIRD_PRINCIPAL_STRESS){ - fullMatrix<double> eigVec(3,3); - fullVector<double> eigVal(3); + static fullMatrix<double> eigVec(3,3); + static fullVector<double> eigVal(3); cauchy.eig(eigVec,eigVal,true); return eigVal(2); } @@ -277,13 +267,10 @@ double dG3DIPVariable::defoEnergy() const if (detJ < 1.e-12) Msg::Error("Negative Jacobian"); // default implementation for small deformations static STensor3 cauchy; - cauchy*=0.; getCauchyStress(cauchy); static STensor3 E; - for (int i = 0; i< 3; i ++) - { - for (int j = 0; j< 3; j ++) - { + for (int i = 0; i< 3; i ++){ + for (int j = 0; j< 3; j ++){ E(i,j) = getConstRefToDeformationGradient()(i,j)/2.+getConstRefToDeformationGradient()(j,i)/2.; if(i == j) E(i,j)-=1.; } @@ -304,7 +291,6 @@ double dG3DIPVariable::plasticEnergy() const double dG3DIPVariable::vonMises() const { static STensor3 cauchy; - cauchy*=0.; getCauchyStress(cauchy); double svm= (cauchy(0,0)-cauchy(1,1))*(cauchy(0,0)-cauchy(1,1))+(cauchy(0,0)-cauchy(2,2))*(cauchy(0,0)-cauchy(2,2))+ (cauchy(2,2)-cauchy(1,1))*(cauchy(2,2)-cauchy(1,1)); @@ -1766,7 +1752,12 @@ double ThermoMechanicsDG3DIPVariableBase::get(const int i) const { return getFlux(2); } - + else if (i == IPField::FIELD_SOURCE){ + return getConstRefToFieldSource(); + } + else if (i == IPField::MECHANICAL_SOURCE){ + return getConstRefToMechanicalSource(); + } else { return dG3DIPVariable::get(i); diff --git a/dG3D/src/dG3DMaterialLaw.cpp b/dG3D/src/dG3DMaterialLaw.cpp index b152c4420cb4ca07e5a4c6619e8a996e8431bd19..d1f1677d8d5cdad2a0855caac8a62e3c638b8bfd 100644 --- a/dG3D/src/dG3DMaterialLaw.cpp +++ b/dG3D/src/dG3DMaterialLaw.cpp @@ -2828,6 +2828,9 @@ SMPDG3DMaterialLaw::SMPDG3DMaterialLaw(const SMPDG3DMaterialLaw &source) : void SMPDG3DMaterialLaw::setStrainOrder(const int order ){ _lawTMSMP->setStrainOrder(order); }; +void SMPDG3DMaterialLaw::setMechanism2(bool mechanism2) { + _lawTMSMP->setMechanism2(mechanism2); +}; double SMPDG3DMaterialLaw::getExtraDofStoredEnergyPerUnitField(double T) const { @@ -3358,3 +3361,12 @@ void mlawElecSMPDG3DMaterialLaw::stress(IPVariable* ipv, const IPVariable* ipvp, ipvcur->setRefToElasticTangentModuli(this->elasticStiffness); ipvcur->setRefToStiff_alphaDilatation(this->Stiff_alphaDilatation); } +void mlawElecSMPDG3DMaterialLaw::setStrainOrder(const int order ){ + _lawETMSMP->setStrainOrder(order); +}; +void mlawElecSMPDG3DMaterialLaw::setMechanism2(bool mechanism2) +{ + _lawETMSMP->setMechanism2(mechanism2); +}; + + diff --git a/dG3D/src/dG3DMaterialLaw.h b/dG3D/src/dG3DMaterialLaw.h index 07c2f879cb4962a6dc6ef66afe6f559dc4378182..2aa669cbb2007ab31968d489e30e37f9cd7b375d 100644 --- a/dG3D/src/dG3DMaterialLaw.h +++ b/dG3D/src/dG3DMaterialLaw.h @@ -1240,6 +1240,8 @@ class SMPDG3DMaterialLaw :public dG3DMaterialLaw // ,public mlawSMP const double Lr1,const double l1,const double Kb,const double be1,const double c0,const double wp,const double c1); void setStrainOrder(const int order); + virtual void setMechanism2(bool mechanism2); + #ifndef SWIG virtual ~SMPDG3DMaterialLaw() { if (_lawTMSMP !=NULL) {delete _lawTMSMP; _lawTMSMP = NULL;}; @@ -1398,6 +1400,8 @@ class mlawElecSMPDG3DMaterialLaw :public dG3DMaterialLaw ,const double Hgl1,const double Lgl1,const double Hr1,const double Lr1,const double l1,const double Kb,const double be1,const double c0,const double wp,const double c1 ,const double lx,const double ly,const double lz,const double seebeck,const double v0); + void setStrainOrder(const int order); + virtual void setMechanism2(bool mechanism2); #ifndef SWIG virtual ~mlawElecSMPDG3DMaterialLaw() { diff --git a/dG3D/src/dG3DMultiscaleMaterialLaw.cpp b/dG3D/src/dG3DMultiscaleMaterialLaw.cpp index 8ccded94341bae9729d84e7a6ac7ed0790dc70e5..084135079700f9317834bdb52b355eb7fe57ebd8 100644 --- a/dG3D/src/dG3DMultiscaleMaterialLaw.cpp +++ b/dG3D/src/dG3DMultiscaleMaterialLaw.cpp @@ -94,14 +94,15 @@ double dG3DElasticMultiscaleMaterialLaw::soundSpeed() const dG3DMultiscaleMaterialLaw::dG3DMultiscaleMaterialLaw(const int lnum, const int tag) : dG3DMultiscaleMaterialLawBase(lnum,tag), - _blockDamageAfterFailureOnset(false),_lostSolutionUniquenssTolerance(0.), + _blockDamageAfterFailureOnset(false),_lostSolutionUniquenssTolerance(-1.e10), _failureCrFollowingInterfaceNormal(true){}; void dG3DMultiscaleMaterialLaw::initLaws(const std::map<int,materialLaw*> &maplaw){ if (!_initialized){ this->fillElasticStiffness(_rho,elasticStiffness); - if (_blockDamageAfterFailureOnset and (_lostSolutionUniquenssTolerance<=0.)){ + if (_blockDamageAfterFailureOnset and (_lostSolutionUniquenssTolerance<0.)){ + // find a smallest tolerance _lostSolutionUniquenssTolerance = 1e10; for (std::map<int,materialLaw*>::const_iterator it = maplaw.begin(); it != maplaw.end(); it++){ const GeneralBulkFollwedCohesive3DLaw* cohLaw = dynamic_cast<const GeneralBulkFollwedCohesive3DLaw*>(it->second); @@ -112,14 +113,17 @@ void dG3DMultiscaleMaterialLaw::initLaws(const std::map<int,materialLaw*> &mapla } } printf("tolerance of lost of ellipticity at bulk ip %f \n",_lostSolutionUniquenssTolerance); - } + + if (_lostSolutionUniquenssTolerance < 0){ + _lostSolutionUniquenssTolerance = 0.; + } _initialized = true; } }; -bool dG3DMultiscaleMaterialLaw::brokenCheck(IPVariable* ipv) const{ - dG3DMultiscaleIPVariable* mipv = dynamic_cast<dG3DMultiscaleIPVariable*>(ipv); +bool dG3DMultiscaleMaterialLaw::brokenCheck(const IPVariable* ipv) const{ + const dG3DMultiscaleIPVariable* mipv = dynamic_cast<const dG3DMultiscaleIPVariable*>(ipv); if (mipv != NULL){ return mipv->solverIsBroken(); } @@ -143,6 +147,11 @@ void dG3DMultiscaleMaterialLaw::createIPState(const bool isSolve, IPStateBase* & IPVariable* ipv2 = new dG3DMultiscaleIPVariable(oninter); if(ips != NULL) delete ips; ips = new IP3State(state,ipvi,ipv1,ipv2); + + // if a cohesive law is added, ipstate at interface is created based on combined fracture law + // otherwise, only blocked failure will be considered + // _blockDamageAfterFailureOnset is active for bulk homogenization + // and interface in case of fullDG formulation if (isSolve){ int el = ele->getNum(); @@ -201,14 +210,18 @@ void dG3DMultiscaleMaterialLaw::stress(IPVariable* ipv, const IPVariable* ipvpre solver->tangentAveragingFlag(stiff); // solve micro problem double time = solver->microSolve(); + // get homogenized properties form solved micro problem mipv->getRefToFirstPiolaKirchhoffStress() = solver->getHomogenizationState(IPStateBase::current)->getHomogenizedStress(); + mipv->getRefToDefoEnergy() = solver->getHomogenizationState(IPStateBase::current)->getDeformationEnergy(); mipv->getRefToPlasticEnergy() = solver->getHomogenizationState(IPStateBase::current)->getPlasticEnergy(); mipv->getRefToIrreversibleEnergy() = solver->getHomogenizationState(IPStateBase::current)->getIrreversibleEnergy(); if (solver->checkFailureOnset()){ + // if check failure onset if (mipv->isInterface()){ + // at interface if (_failureCrFollowingInterfaceNormal){ solver->checkFailureOnset_withNormalVector(); } @@ -217,12 +230,13 @@ void dG3DMultiscaleMaterialLaw::stress(IPVariable* ipv, const IPVariable* ipvpre } } else{ + // at bulk element solver->checkFailureOnset_withoutNormalVector(); } - mipv->getRefToLostEllipticityCriterion() = solver->getHomogenizationState(IPStateBase::current)->getLostOfSolutionUniquenessCriterion(); } - + mipv->getRefToLostEllipticityCriterion() = solver->getHomogenizationState(IPStateBase::current)->getLostOfSolutionUniquenessCriterion(); mipv->getRefToSolverBrokenFlag() = solver->getHomogenizationState(IPStateBase::current)->getBrokenFlag(); + if (!(this->getMacroSolver()->withFailureBasedOnPreviousState())){ // when checking failure on the fly // if current state is broken @@ -274,7 +288,7 @@ void MultiscaleFractureByCohesive3DLaw::initLaws(const std::map<int,materialLaw* _nummat = dynamic_cast<numericalMaterialBase*>(bulkLaw); - if (_nummat == NULL) Msg::Error("bulk law is not a multiscale one"); + if (_nummat == NULL) Msg::Error("bulk law is not a multiscale one in MultiscaleFractureByCohesive3DLaw::initLaws"); } }; @@ -326,14 +340,18 @@ void MultiscaleFractureByCohesive3DLaw::createIPState(const bool isSolve, IPStat // if bulk law is a multiscale law int el = ele->getNum(); nonLinearMechSolver* solver = this->createMicroSolver(el,gpt); + const GeneralMultiscaleBulkFollwedCohesive3DLaw* interfaceLaw = dynamic_cast<const GeneralMultiscaleBulkFollwedCohesive3DLaw*>(_mfrac); if (interfaceLaw != NULL){ + solver->setCheckFailureOnset(true); // set check failure onset solver->setLostSolutionUniquenssTolerance(interfaceLaw->getLostSolutionUniquenssTolerance()); + + // stress location if (interfaceLaw->getLocationForStressExtraction()>=0){ solver->setLocationForStressExtraction(interfaceLaw->getLocationForStressExtraction()); } - solver->setCheckFailureOnset(true); // set check failure onset - + + // if extracting cohesive law if (interfaceLaw->isDamageToCohesiveJump()){ printf("rank %d : extract cohesive law at element %d ip %d \n",Msg::GetCommRank(),el,gpt); solver->setExtractCohesiveLawFromMicroDamage(true); @@ -361,6 +379,7 @@ void MultiscaleFractureByCohesive3DLaw::createIPState(const bool isSolve, IPStat solver->rotateModel(n,t,b); } + // update microbc with local basis nonLinearMicroBC* mbc = solver->getMicroBC(); if (mbc->getType() == nonLinearMicroBC::OrthogonalDirectionalMixedBC){ printf("set pbc %d n = %f %f %f t= %f %f %f",Msg::GetCommRank(),n[0],n[1],n[2],t[0],t[1],t[2]); @@ -412,6 +431,9 @@ void MultiscaleFractureByCohesive3DLaw::createIPState(const bool isSolve, IPStat } } + else{ + Msg::Fatal("GeneralMultiscaleBulkFollwedCohesive3DLaw must be used in MultiscaleFractureByCohesive3DLaw::createIPState"); + } solver->initMicroSolver(); ips->setSolver(solver); } @@ -498,15 +520,6 @@ dG3DMultiscaleCohesiveLaw::dG3DMultiscaleCohesiveLaw(const int num, const double dG3DMultiscaleCohesiveLaw::dG3DMultiscaleCohesiveLaw(const dG3DMultiscaleCohesiveLaw& src): GeneralMultiscaleBulkFollwedCohesive3DLaw(src),_withNormalPart(src._withNormalPart),_fixedCrackFace(src._fixedCrackFace),_fixedCrackFaceFlag(src._fixedCrackFaceFlag){} -bool dG3DMultiscaleCohesiveLaw::brokenCheck(IPVariable* ipv) const{ - dG3DMultiscaleIPVariable* mipv = dynamic_cast<dG3DMultiscaleIPVariable*>(ipv); - if (mipv != NULL){ - return mipv->solverIsBroken(); - } - else{ - return false; - } -}; void dG3DMultiscaleCohesiveLaw::checkCohesiveInsertion(IPStateBase* ipsm, IPStateBase* ipsp, const bool forcedInsert) const{ // check failure onset from both negative and postive IPStates @@ -535,10 +548,11 @@ void dG3DMultiscaleCohesiveLaw::checkCohesiveInsertion(IPStateBase* ipsm, IPStat fPlusCur->broken(); // broken is checked via bulk terial law, see function stress // initialize cohesive law in negative part - SVector3 zeroVec; - STensor3 zeroTen; + static SVector3 zeroVec; + static STensor3 zeroTen; - SVector3 normDir = fPlusCur->getConstRefToCurrentOutwardNormal(); + static SVector3 normDir; + normDir = fPlusCur->getConstRefToCurrentOutwardNormal(); normDir.normalize(); if (this->getMacroSolver()->withFailureBasedOnPreviousState()){ @@ -604,15 +618,16 @@ void dG3DMultiscaleCohesiveLaw::transferInterfaceDataToBulk(IPVariable* ipv, con const homogenizedData* homoData = solver->getHomogenizationState(IPStateBase::current); const homogenizedData* homoDataPrev = solver->getHomogenizationState(IPStateBase::previous); - SVector3 refN = fipv->getConstRefToReferenceOutwardNormal(); + static SVector3 refN; + refN = fipv->getConstRefToReferenceOutwardNormal(); refN.normalize(); - SVector3 curN = fipvprev->getConstRefToCurrentOutwardNormal(); - curN.normalize(); - - double beta = (homoData->getActiveDissipationVolume() + _voidPartInLocalizationBand)/(_surfaceReductionRatio*solver->getRVEVolume()); + + double beta = 0.; if (!_withNormalPart){ - SVector3 normdF(0.); + beta = (homoData->getActiveDissipationVolume() + _voidPartInLocalizationBand)/(_surfaceReductionRatio*solver->getRVEVolume()); + static SVector3 normdF; for (int i=0; i<3; i++){ + normdF(i) = 0.; for (int j=0; j<3; j++){ normdF(i) += (Fb(i,j) - Fb0(i,j))*refN(j); } @@ -648,9 +663,10 @@ void dG3DMultiscaleCohesiveLaw::transferInterfaceDataToBulk(IPVariable* ipv, con if (stiff){ STensor43& dFinterfacedF = fipv->getRefToDInterfaceDeformationGradientDDeformationGradient(); STensor33& dFinterfacedJump = fipv->getRefToDInterfaceDeformationGradientDJump(); - - dFinterfacedF *= 0.; - dFinterfacedJump *= 0.; + + STensorOperation::zero(dFinterfacedF); + STensorOperation::zero(dFinterfacedJump); + static STensor3 I(1.); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ @@ -689,15 +705,18 @@ void dG3DMultiscaleCohesiveLaw::stress(IPVariable* ipv, const IPVariable* ipvpre const homogenizedData* homoDataPrev = solver->getHomogenizationState(IPStateBase::previous); - SVector3 refN = fipv->getConstRefToReferenceOutwardNormal(); + static SVector3 refN; + refN = fipv->getConstRefToReferenceOutwardNormal(); refN.normalize(); - SVector3 curN = fipvprev->getConstRefToCurrentOutwardNormal(); + + static SVector3 curN; + curN = fipvprev->getConstRefToCurrentOutwardNormal(); curN.normalize(); const STensor3& P = fipv->getConstRefToFirstPiolaKirchhoffStress(); SVector3& T = fipv->getRefToInterfaceForce(); - T *= 0.; for (int i=0; i<3; i++) { + T(i) = 0.; for (int j=0; j<3; j++){ T(i) += P(i,j)*refN(j); } @@ -724,10 +743,9 @@ void dG3DMultiscaleCohesiveLaw::stress(IPVariable* ipv, const IPVariable* ipvpre const STensor43& dPdFinf = homoData->getHomogenizedTangentOperator_F_F(); STensor33& dTdF = fipv->getRefToDInterfaceForceDDeformationGradient(); STensor3& dTdjump = fipv->getRefToDInterfaceForceDjump(); - - dTdF *= 0.; - dTdjump *= 0.; - + + STensorOperation::zero(dTdF); + STensorOperation::zero(dTdjump); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ @@ -756,12 +774,11 @@ void dG3DMultiscaleCohesiveLaw::stress(IPVariable* ipv, const IPVariable* ipvpre STensor3& dirrEnergDF = fipv->getRefToDIrreversibleEnergyDDeformationGradient(); SVector3& dirrEnergDJump = fipv->getRefToDIrreversibleEnergyDJump(); - - dirrEnergDF *=0.; - dirrEnergDJump*=0.; - + + STensorOperation::zero(dirrEnergDF); + STensorOperation::zero(dirrEnergDJump); + const STensor3& dirrEnergdFinf = homoData->getHomogenizedTangentOperator_IrreversibleEnergy_F(); - for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ for (int k=0; k<3; k++){ @@ -828,7 +845,8 @@ void gradientEnhanceddG3DMultiscaleCohesiveLaw::transferInterfaceDataToBulk(IPVa static SVector3 refN; refN = fipv->getConstRefToReferenceOutwardNormal(); refN.normalize(); - SVector3 curN = fipvprev->getConstRefToCurrentOutwardNormal(); + static SVector3 curN; + curN = fipvprev->getConstRefToCurrentOutwardNormal(); curN.normalize(); @@ -836,16 +854,16 @@ void gradientEnhanceddG3DMultiscaleCohesiveLaw::transferInterfaceDataToBulk(IPVa const STensor3& Fb = fipv->getBulkDeformationGradient(); const SVector3& ujump = fipv->getConstRefToJump(); - const SVector3& ujump0 = fipvprev->getConstRefToJump(); - + const SVector3& ujump0 = fipvprev->getConstRefToJump(); + static SVector3 dJump; dJump = ujump; dJump -= ujump0; static STensor3 DdJumpDujump; - DdJumpDujump*=0.; DdJumpDujump(0,0)=1.; DdJumpDujump(1,1)=1.; DdJumpDujump(2,2)=1.; + STensorOperation::unity(DdJumpDujump); - double dJumpNormal = dot(dJump,curN); + double dJumpNormal = dot(ujump,curN); if (dJumpNormal < 0){ cohIpv->setTensionFlag(false); // eliminate nonphysical normal jump @@ -885,9 +903,10 @@ void gradientEnhanceddG3DMultiscaleCohesiveLaw::transferInterfaceDataToBulk(IPVa if (stiff){ STensor43& dFinterfacedF = fipv->getRefToDInterfaceDeformationGradientDDeformationGradient(); STensor33& dFinterfacedJump = fipv->getRefToDInterfaceDeformationGradientDJump(); - - dFinterfacedF *= 0.; - dFinterfacedJump *= 0.; + + STensorOperation::zero(dFinterfacedF); + STensorOperation::zero(dFinterfacedJump); + static STensor3 I(1.); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ @@ -930,7 +949,6 @@ void gradientEnhanceddG3DMultiscaleCohesiveLaw::stress(IPVariable* ipv, const IP curN.normalize(); - const STensor3& P = fipv->getConstRefToFirstPiolaKirchhoffStress(); SVector3& T = fipv->getRefToInterfaceForce(); T *= 0.; @@ -948,7 +966,7 @@ void gradientEnhanceddG3DMultiscaleCohesiveLaw::stress(IPVariable* ipv, const IP dJump -= ujump0; static STensor3 DdJumpDujump; - DdJumpDujump*=0.; DdJumpDujump(0,0)=1.; DdJumpDujump(1,1)=1.; DdJumpDujump(2,2)=1.; + STensorOperation::unity(DdJumpDujump); // add penalty to avoid penetration double dJumpNormal = dot(dJump,curN); @@ -971,9 +989,9 @@ void gradientEnhanceddG3DMultiscaleCohesiveLaw::stress(IPVariable* ipv, const IP STensor33& dTdF = fipv->getRefToDInterfaceForceDDeformationGradient(); STensor3& dTdjump = fipv->getRefToDInterfaceForceDjump(); - dTdF *= 0.; - dTdjump *= 0.; + STensorOperation::zero(dTdF); + STensorOperation::zero(dTdjump); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ @@ -1002,9 +1020,9 @@ void gradientEnhanceddG3DMultiscaleCohesiveLaw::stress(IPVariable* ipv, const IP STensor3& dirrEnergDF = fipv->getRefToDIrreversibleEnergyDDeformationGradient(); SVector3& dirrEnergDJump = fipv->getRefToDIrreversibleEnergyDJump(); - - dirrEnergDF *=0.; - dirrEnergDJump*=0.; + + STensorOperation::zero(dirrEnergDF); + STensorOperation::zero(dirrEnergDJump); const STensor3& dirrEnergdFinf = homoData->getHomogenizedTangentOperator_IrreversibleEnergy_F(); @@ -1070,7 +1088,8 @@ void TwoFieldMultiscaleCohesive3DLaw::transferInterfaceDataToBulk(IPVariable* ip const homogenizedData* homoData = solver->getHomogenizationState(IPStateBase::current); const homogenizedData* homoDataPrev = solver->getHomogenizationState(IPStateBase::previous); - SVector3 refN = fipv->getConstRefToReferenceOutwardNormal(); + static SVector3 refN; + refN = fipv->getConstRefToReferenceOutwardNormal(); refN.normalize(); @@ -1089,10 +1108,10 @@ void TwoFieldMultiscaleCohesive3DLaw::transferInterfaceDataToBulk(IPVariable* ip STensor43& dFinterfacedF = fipv->getRefToDInterfaceDeformationGradientDDeformationGradient(); STensor33& dFinterfacedJump = fipv->getRefToDInterfaceDeformationGradientDJump(); STensor33& dFinterfacedInstrain = fipv->getRefToDInterfaceDeformationGradientDIncompatibleStrainVector(); + STensorOperation::zero(dFinterfacedF); + STensorOperation::zero(dFinterfacedJump); + STensorOperation::zero(dFinterfacedInstrain); - dFinterfacedF *= 0.; - dFinterfacedJump *= 0.; - dFinterfacedInstrain *= 0.; static STensor3 I(1.); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ @@ -1110,15 +1129,6 @@ void TwoFieldMultiscaleCohesive3DLaw::transferInterfaceDataToBulk(IPVariable* ip } }; -bool TwoFieldMultiscaleCohesive3DLaw::brokenCheck(IPVariable* ipv) const{ - dG3DMultiscaleIPVariable* mipv = dynamic_cast<dG3DMultiscaleIPVariable*>(ipv); - if (mipv != NULL){ - return mipv->solverIsBroken(); - } - else{ - return false; - } -}; void TwoFieldMultiscaleCohesive3DLaw::stress(IPVariable* ipv, const IPVariable* ipvprev, const bool stiff, const bool checkfrac){ FractureCohesive3DIPVariable *fipv = static_cast < FractureCohesive3DIPVariable *> (ipv); @@ -1180,11 +1190,10 @@ void TwoFieldMultiscaleCohesive3DLaw::stress(IPVariable* ipv, const IPVariable* STensor33& dTdF = fipv->getRefToDInterfaceForceDDeformationGradient(); STensor3& dTdjump = fipv->getRefToDInterfaceForceDjump(); STensor3& dTdinstrain = fipv->getRefToDInterfaceForceDIncompatibleStrainVector(); - - dTdF *= 0.; - dTdjump *= 0.; - dTdinstrain*= 0.; - + + STensorOperation::zero(dTdF); + STensorOperation::zero(dTdjump); + STensorOperation::zero(dTdinstrain); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ @@ -1207,9 +1216,12 @@ void TwoFieldMultiscaleCohesive3DLaw::stress(IPVariable* ipv, const IPVariable* STensor33& dcjumpDF = fipv->getRefToDCohesiveJumpDDeformationGradient(); STensor3& dcjumpDJump = fipv->getRefToDCohesiveJumpDJump(); STensor3& dcjumpDinStrain = fipv->getRefToDCohesiveJumpDIncompatibleStrainVector(); - STensor33 dcjumpdFinfNew(dcjumpdFinf); + static STensor33 dcjumpdFinfNew; + dcjumpdFinfNew = (dcjumpdFinf); if (normalPart < 0){ - STensor3 INN(1.); + static STensor3 INN; + STensorOperation::unity(INN); + for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ INN(i,j) -= refN(i)*refN(j); @@ -1227,10 +1239,10 @@ void TwoFieldMultiscaleCohesive3DLaw::stress(IPVariable* ipv, const IPVariable* } - - dcjumpDF *= 0.; - dcjumpDJump*= 0.; - dcjumpDinStrain *= 0.; + STensorOperation::zero(dcjumpDF); + STensorOperation::zero(dcjumpDJump); + STensorOperation::zero(dcjumpDinStrain); + for (int i=0; i<3; i++){ for (int p=0; p<3; p++){ for (int q=0; q<3; q++){ @@ -1249,10 +1261,10 @@ void TwoFieldMultiscaleCohesive3DLaw::stress(IPVariable* ipv, const IPVariable* STensor3& dirrEnergDF = fipv->getRefToDIrreversibleEnergyDDeformationGradient(); SVector3& dirrEnergDJump = fipv->getRefToDIrreversibleEnergyDJump(); SVector3& dirrEnergDinStrain = fipv->getRefToDIrreversibleEnergyDIncompatibleStrainVector(); - - dirrEnergDF *=0.; - dirrEnergDJump*=0.; - dirrEnergDinStrain *= 0.; + + STensorOperation::zero(dirrEnergDF); + STensorOperation::zero(dirrEnergDJump); + STensorOperation::zero(dirrEnergDinStrain); const STensor3& dirrEnergdFinf = homoData->getHomogenizedTangentOperator_IrreversibleEnergy_F(); @@ -1295,10 +1307,8 @@ void TwoFieldMultiscaleCohesive3DLaw::checkCohesiveInsertion(IPStateBase* ipsm, // broken is checked via bulk terial law, see function stress // initialize cohesive law in negative part - static SVector3 zeroVec; - zeroVec*=0.; - static STensor3 zeroTen; - zeroTen*=0.; + static SVector3 zeroVec(0.); + static STensor3 zeroTen(0.); static SVector3 normDir; normDir = fPlusCur->getConstRefToCurrentOutwardNormal(); @@ -1402,10 +1412,11 @@ void TwoFieldMultiscaleAdhesive3DLaw::transferInterfaceDataToBulk(IPVariable* ip STensor43& dFinterfacedF = fipv->getRefToDInterfaceDeformationGradientDDeformationGradient(); STensor33& dFinterfacedJump = fipv->getRefToDInterfaceDeformationGradientDJump(); STensor33& dFinterfacedInstrain = fipv->getRefToDInterfaceDeformationGradientDIncompatibleStrainVector(); - - dFinterfacedF *= 0.; - dFinterfacedJump *= 0.; - dFinterfacedInstrain *= 0.; + + STensorOperation::zero(dFinterfacedF); + STensorOperation::zero(dFinterfacedJump); + STensorOperation::zero(dFinterfacedInstrain); + static STensor3 I(1.); for (int i=0; i<3; i++){ @@ -1493,11 +1504,10 @@ void TwoFieldMultiscaleAdhesive3DLaw::stress(IPVariable* ipv, const IPVariable* STensor33& dcjumpDF = fipv->getRefToDCohesiveJumpDDeformationGradient(); STensor3& dcjumpDJump = fipv->getRefToDCohesiveJumpDJump(); STensor3& dcjumpDInstrain = fipv->getRefToDCohesiveJumpDIncompatibleStrainVector(); - - dcjumpDF*= 0.; - dcjumpDJump*= 0.; - dcjumpDInstrain*=0.; - + + STensorOperation::zero(dcjumpDF); + STensorOperation::zero(dcjumpDJump); + STensorOperation::zero(dcjumpDInstrain); for (int k=0; k<3; k++){ dcjumpDJump(k,k) = 1.; @@ -1520,10 +1530,10 @@ void TwoFieldMultiscaleAdhesive3DLaw::stress(IPVariable* ipv, const IPVariable* STensor33& dTdF = fipv->getRefToDInterfaceForceDDeformationGradient(); STensor3& dTdJump = fipv->getRefToDInterfaceForceDjump(); STensor3& dTdInStrain = fipv->getRefToDInterfaceForceDIncompatibleStrainVector(); - - dTdF *= 0.; - dTdJump*= 0.; - dTdInStrain*= 0.; + + STensorOperation::zero(dTdF); + STensorOperation::zero(dTdJump); + STensorOperation::zero(dTdInStrain); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ diff --git a/dG3D/src/dG3DMultiscaleMaterialLaw.h b/dG3D/src/dG3DMultiscaleMaterialLaw.h index 8a91dc7a6a8c0cbe84ebf8e47724a4c43155779f..6caa74f9970577458c7b75e094aec67b64e157c2 100644 --- a/dG3D/src/dG3DMultiscaleMaterialLaw.h +++ b/dG3D/src/dG3DMultiscaleMaterialLaw.h @@ -73,9 +73,9 @@ class dG3DElasticMultiscaleMaterialLaw : public dG3DMultiscaleMaterialLawBase{ class dG3DMultiscaleMaterialLaw : public dG3DMultiscaleMaterialLawBase{ protected: - bool _blockDamageAfterFailureOnset; - double _lostSolutionUniquenssTolerance; - bool _failureCrFollowingInterfaceNormal; + bool _blockDamageAfterFailureOnset; // true if failure is blocked after failure onset + double _lostSolutionUniquenssTolerance; + bool _failureCrFollowingInterfaceNormal; // true if failure is checked based on interface normal public: dG3DMultiscaleMaterialLaw(const int lnum, const int tag); @@ -110,7 +110,7 @@ class dG3DMultiscaleMaterialLaw : public dG3DMultiscaleMaterialLawBase{ virtual bool isNumeric() const{return true;} virtual void initialIPVariable(IPVariable* ipv, bool stiff); - virtual bool brokenCheck(IPVariable* ipv) const; + virtual bool brokenCheck(const IPVariable* ipv) const; virtual materialLaw* clone() const {return new dG3DMultiscaleMaterialLaw(*this);}; #endif // SWIG @@ -191,7 +191,6 @@ class GeneralMultiscaleBulkFollwedCohesive3DLaw : public GeneralBulkFollwedCohes GeneralMultiscaleBulkFollwedCohesive3DLaw(const int num, const bool init = true); GeneralMultiscaleBulkFollwedCohesive3DLaw(const GeneralMultiscaleBulkFollwedCohesive3DLaw& src); virtual ~GeneralMultiscaleBulkFollwedCohesive3DLaw(); - virtual bool brokenCheck(IPVariable* ipv) const = 0; virtual void initLaws(const std::map<int,materialLaw*> &maplaw){} // nothing to do for this law virtual void createIPState(IPStateBase* &ips,const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const = 0; virtual void createIPVariable(IPVariable* &ipv,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const = 0; @@ -222,7 +221,7 @@ class dG3DMultiscaleCohesiveLaw : public GeneralMultiscaleBulkFollwedCohesive3DL protected: bool _withNormalPart; bool _fixedCrackFaceFlag; // introduce a fixed crack length over RVE - bool _fixedCrackFace; + double _fixedCrackFace; public: dG3DMultiscaleCohesiveLaw(const int num, const double surfaceRatio=1., const bool normPart = true); void setFixedCrackFace(const double crackFace) {_fixedCrackFaceFlag = true; _fixedCrackFace = crackFace;}; @@ -232,7 +231,6 @@ class dG3DMultiscaleCohesiveLaw : public GeneralMultiscaleBulkFollwedCohesive3DL virtual void createIPState(IPStateBase* &ips,const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const; virtual void createIPVariable(IPVariable* &ipv,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const; - virtual bool brokenCheck(IPVariable* ipv) const; virtual void stress(IPVariable* ipv, const IPVariable* ipvprev, const bool stiff=true, const bool checkfrac=true); virtual void checkCohesiveInsertion(IPStateBase* ipsm, IPStateBase* ipsp, const bool forcedInsert= false) const; virtual void transferInterfaceDataToBulk(IPVariable* ipv, const IPVariable* ipvprev, const bool stiff) const; @@ -269,7 +267,6 @@ class TwoFieldMultiscaleCohesive3DLaw : public GeneralMultiscaleBulkFollwedCohes virtual void createIPState(IPStateBase* &ips,const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const; virtual void createIPVariable(IPVariable* &ipv,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const; - virtual bool brokenCheck(IPVariable* ipv) const; virtual void stress(IPVariable* ipv, const IPVariable* ipvprev, const bool stiff=true, const bool checkfrac=true); virtual void checkCohesiveInsertion(IPStateBase* ipsm, IPStateBase* ipsp, const bool forcedInsert= false) const; virtual void transferInterfaceDataToBulk(IPVariable* ipv, const IPVariable* ipvprev, const bool stiff) const; @@ -290,7 +287,6 @@ class TwoFieldMultiscaleAdhesive3DLaw : public GeneralMultiscaleBulkFollwedCohes virtual void createIPState(IPStateBase* &ips,const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const; virtual void createIPVariable(IPVariable* &ipv,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const; - virtual bool brokenCheck(IPVariable* ipv) const {return false;}; virtual void stress(IPVariable* ipv, const IPVariable* ipvprev, const bool stiff=true, const bool checkfrac=true); virtual void checkCohesiveInsertion(IPStateBase* ipsm, IPStateBase* ipsp, const bool forcedInsert= false) const; virtual void transferInterfaceDataToBulk(IPVariable* ipv, const IPVariable* ipvprev, const bool stiff) const; diff --git a/dG3D/src/dG3DTerms.cpp b/dG3D/src/dG3DTerms.cpp index f22bf5e80d471211329312d4714a58999b5aa758..05233e7312f22184b59a615b3a19c7137cee4575 100644 --- a/dG3D/src/dG3DTerms.cpp +++ b/dG3D/src/dG3DTerms.cpp @@ -21,33 +21,25 @@ void dG3DForceBulk::get(MElement *ele,int npts,IntPt *GP,fullVector<double> &vFo int nbFF = ele->getNumShapeFunctions(); vFor.resize(nbdof); vFor.scale(0.); - SVector3 BT; + + static SVector3 BT; // get gauss' point data _ipf->getIPv(ele,vipv,vipvprev); - // grads value - //nlsFunctionSpaceXYZ<double>* sp1 = static_cast<nlsFunctionSpaceXYZ<double>*>(&(this->space1)); - //std::vector<GaussPointSpaceValues<double>*> vall; - //sp1->get(ele,npts,GP,vall); double averagePressure = 0.; if((ele->getTypeForMSH() == MSH_HEX_8 or ele->getTypeForMSH() == MSH_QUA_4) and !_fullDg) //not correct in large deformations { for (int i = 0; i < npts; i++) { - const STensor3 *PK1 = &(vipv[i]->getConstRefToFirstPiolaKirchhoffStress()); - - double pres = (PK1->operator()(0,0)+PK1->operator()(1,1)+PK1->operator()(2,2))/3.; + const STensor3 *PK1 = &(vipv[i]->getConstRefToFirstPiolaKirchhoffStress()); + double pres = (PK1->operator()(0,0)+PK1->operator()(1,1)+PK1->operator()(2,2))/3.; averagePressure += pres/npts; } } for (int i = 0; i < npts; i++) { -// double u = GP[i].pt[0]; double v = GP[i].pt[1]; double w = GP[i].pt[2]; - // Weight of Gauss' point i double weight = GP[i].weight; - // double detJ = ele->getJacobian(u, v, w, jac); - // double detJ = vall[i]->_detJ; double & detJ = vipv[i]->getJacobianDeterminant(ele,GP[i]); const STensor3 *PK1 = &(vipv[i]->getConstRefToFirstPiolaKirchhoffStress()); @@ -55,10 +47,6 @@ void dG3DForceBulk::get(MElement *ele,int npts,IntPt *GP,fullVector<double> &vFo double ratio = detJ*weight; double pres = (PK1->operator()(0,0)+PK1->operator()(1,1)+PK1->operator()(2,2))/3.; -// Grads.clear(); -// space1.gradf(ele,u, v, w, Grads); // a optimiser - - // std::vector<TensorialTraits<double>::GradType> &Grads = vall[i]->_vgrads; std::vector<TensorialTraits<double>::GradType> &Grads = vipv[i]->gradf(&space1,ele,GP[i]); for(int j=0;j<nbFF; j++) { @@ -72,7 +60,7 @@ void dG3DForceBulk::get(MElement *ele,int npts,IntPt *GP,fullVector<double> &vFo { for(int m=0; m<3; m++) { - vFor(j+kk*nbFF) += ratio*(BT(m)*(PK1->operator()(kk,m))); + vFor(j+kk*nbFF) += ratio*(BT(m)*(PK1->operator()(kk,m))); } vFor(j+kk*nbFF) -= ratio*(BT(kk)*(pres-averagePressure)); } @@ -98,40 +86,28 @@ void dG3DStiffnessBulk::get(MElement *ele,int npts,IntPt *GP,fullMatrix<double> int nbdof = BilinearTerm<double,double>::space1.getNumKeys(ele); int nbFF = ele->getNumShapeFunctions(); mStiff.resize(nbdof, nbdof,true); // true --> setAll(0.) -// mStiff.setAll(0.); // done by resize! // get ipvariables _ipf->getIPv(ele,vipv); - // Value of grad and _detJ at all Gauss points - //nlsFunctionSpaceXYZ<double>* sp1 = static_cast<nlsFunctionSpaceXYZ<double>*>(&(this->space1)); - //std::vector<GaussPointSpaceValues<double>*> vall; - //sp1->get(ele,npts,GP,vall); // sum on Gauss' points static SVector3 B; - B*=0.; static SVector3 BT; - BT*=0.; + static SVector3 Bipg; + static std::vector<SVector3> HBaverage; HBaverage.clear(); - static SVector3 Bipg; - Bipg*=0.; if((ele->getTypeForMSH() == MSH_HEX_8 or ele->getTypeForMSH() == MSH_QUA_4) and !_fullDg) { HBaverage.resize(nbFF); for (int ipg = 0; ipg < npts; ipg++) { - //double uipg = GP[ipg].pt[0]; double vipg = GP[ipg].pt[1]; double wipg = GP[ipg].pt[2]; - //Gradsipg.clear(); - //space1.gradf(ele,uipg,vipg,wipg,Gradsipg); - //std::vector<TensorialTraits<double>::GradType> &Gradsipg = vall[ipg]->_vgrads; const std::vector<TensorialTraits<double>::GradType>& Gradsipg = vipv[ipg]->gradf(&space1,ele,GP[ipg]); - const STensor43 *Hipg =&vipv[ipg]->getConstRefToTangentModuli(); for(int k=0;k<nbFF;k++){ static SVector3 HBaverageTmp; - HBaverageTmp*=0.; + STensorOperation::zero(HBaverageTmp); Bipg(0) = Gradsipg[k][0]; Bipg(1) = Gradsipg[k][1]; Bipg(2) = Gradsipg[k][2]; @@ -148,57 +124,49 @@ void dG3DStiffnessBulk::get(MElement *ele,int npts,IntPt *GP,fullMatrix<double> } for (int i = 0; i < npts; i++) { - // Coordonate of Gauss' point i -// double u = GP[i].pt[0]; double v = GP[i].pt[1]; double w = GP[i].pt[2]; - // Weight of Gauss' point i double weight = GP[i].weight; -// double detJ = ele->getJacobian(u, v, w, jac); -// double detJ = vall[i]->_detJ; double& detJ = vipv[i]->getJacobianDeterminant(ele,GP[i]); double ratio = detJ*weight; // x, y, z const STensor43 *H =&vipv[i]->getConstRefToTangentModuli(); -// Grads.clear(); -// space1.gradf(ele,u,v,w,Grads); - // std::vector<TensorialTraits<double>::GradType> &Grads = vall[i]->_vgrads; const std::vector<TensorialTraits<double>::GradType> &Grads = vipv[i]->gradf(&space1,ele,GP[i]); for(int j=0;j<nbFF; j++) { BT(0) = Grads[j][0]; BT(1) = Grads[j][1]; BT(2) = Grads[j][2]; - for(int k=0;k<nbFF;k++){ - // x y z + for(int k=0;k<nbFF;k++){ + // x y z B(0) = Grads[k][0]; B(1) = Grads[k][1]; B(2) = Grads[k][2]; for(int kk=0;kk<3;kk++) { - for(int ll=0; ll<3; ll++) - { - if((ele->getTypeForMSH() == MSH_HEX_8 or ele->getTypeForMSH() == MSH_QUA_4) and !_fullDg) - { - for(int m=0; m<3; m++) - { - for(int n=0; n<3; n++) - { - mStiff(j+kk*nbFF,k+ll*nbFF) += ratio*(BT(m)*H->operator()(kk,m,ll,n)*B(n)); - } - mStiff(j+kk*nbFF,k+ll*nbFF) -= ratio*(BT(kk)*(H->operator()(0,0,ll,m)+H->operator()(1,1,ll,m)+H->operator()(2,2,ll,m))*B(m))/3.; - } - mStiff(j+kk*nbFF,k+ll*nbFF) += ratio*(BT(kk)*HBaverage[k](ll)); - } - else - { - for(int m=0; m<3; m++) - { - for(int n=0; n<3; n++) - { - mStiff(j+kk*nbFF,k+ll*nbFF) += ratio*(BT(m)*H->operator()(kk,m,ll,n)*B(n)); - } - } - } + for(int ll=0; ll<3; ll++) + { + if((ele->getTypeForMSH() == MSH_HEX_8 or ele->getTypeForMSH() == MSH_QUA_4) and !_fullDg) + { + for(int m=0; m<3; m++) + { + for(int n=0; n<3; n++) + { + mStiff(j+kk*nbFF,k+ll*nbFF) += ratio*(BT(m)*H->operator()(kk,m,ll,n)*B(n)); + } + mStiff(j+kk*nbFF,k+ll*nbFF) -= ratio*(BT(kk)*(H->operator()(0,0,ll,m)+H->operator()(1,1,ll,m)+H->operator()(2,2,ll,m))*B(m))/3.; + } + mStiff(j+kk*nbFF,k+ll*nbFF) += ratio*(BT(kk)*HBaverage[k](ll)); + } + else + { + for(int m=0; m<3; m++) + { + for(int n=0; n<3; n++) + { + mStiff(j+kk*nbFF,k+ll*nbFF) += ratio*(BT(m)*H->operator()(kk,m,ll,n)*B(n)); + } + } + } } } } @@ -227,57 +195,33 @@ void dG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fullVector<double> const double b1hs = _beta1/hs; // get value at gauss's point - AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); + const AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); // Values on minus and plus elements IntPt *GPm; IntPt *GPp; _interQuad->getIntPoints(ie,GP,&GPm,&GPp); - // val grads and detJ at all Gauss points - //std::vector<std::vector<TensorialTraits<double>::GradType> > vgradsuvw; - //std::vector<GaussPointSpaceValues<double>*> vallm; - //std::vector<GaussPointSpaceValues<double>*> vallp; - //_minusSpace->getgradfuvw(ele,npts,GP,vgradsuvw); //use a special functional space ?? - //_minusSpace->get(ie->getElem(0),npts,GPm,vallm); - //_plusSpace->get(ie->getElem(1),npts,GPp,vallp); - - double jac[3][3]; // loop on Gauss Point for(int i=0;i<npts; i++) { - // Coordonate of Gauss' point i - const double u = GP[i].pt[0]; const double v = GP[i].pt[1]; const double w = GP[i].pt[2]; - // Weight of Gauss' point i and Jacobian's value at this point - const double weight = GP[i].weight; - double detJ = ele->getJacobian(u, v, w, jac); - // double detJ = ele->getJacobian(vgradsuvw[i], jac); - // IP const IPStateBase *ipsm = (*vips)[i]; const dG3DIPVariableBase *ipvm = static_cast<const dG3DIPVariableBase*>(ipsm->getState(IPStateBase::current)); const dG3DIPVariableBase *ipvmprev = static_cast<const dG3DIPVariableBase*>(ipsm->getState(IPStateBase::previous)); - const dG3DIPVariableBase *ipvm0 = static_cast<const dG3DIPVariableBase*>(ipsm->getState(IPStateBase::initial)); const SVector3 &referenceOutwardNormalm = ipvm->getConstRefToReferenceOutwardNormal(); const IPStateBase *ipsp = (*vips)[i+npts]; const dG3DIPVariableBase *ipvp = static_cast<const dG3DIPVariableBase*>(ipsp->getState(IPStateBase::current)); - const dG3DIPVariableBase *ipvp0 = static_cast<const dG3DIPVariableBase*>(ipsp->getState(IPStateBase::initial)); + const dG3DIPVariableBase *ipvpprev = static_cast<const dG3DIPVariableBase*>(ipsp->getState(IPStateBase::previous)); const SVector3 &referenceOutwardNormalp = ipvp->getConstRefToReferenceOutwardNormal(); const SVector3 &jump = ipvp->getConstRefToJump(); + // Weight of Gauss' point i and Jacobian's value at this point + const double weight = GP[i].weight; + const double& detJ = ipvm->getJacobianDeterminant(ie,GP[i]); + const double wJ = detJ* weight; - // Compute of Hessian of SF. Each component of the vector is link to a shape function. -// Gradsm.resize(0); Gradsp.resize(0); -// double uem = GPm[i].pt[0]; double vem = GPm[i].pt[1]; double wem = GPm[i].pt[2]; -// double uep = GPp[i].pt[0]; double vep = GPp[i].pt[1]; double wep = GPp[i].pt[2]; - //Msg::Error("New metho u %e %e v %e %e w %e %e\n",uem, uep, vem, vep, wem, wep); - //ie->getuvwOnElem(u,v,uem,vem,wem,uep,vep,wep); - //Msg::Error("Old metho u %e %e v %e %e w %e %e\n",uem, uep, vem, vep, wem, wep); -// _minusSpace->gradf(ie->getElem(0),uem, vem, wem, Gradsm); -// _plusSpace->gradf(ie->getElem(1),uep, vep, wep, Gradsp); - // std::vector<TensorialTraits<double>::GradType> &Gradsm = vallm[i]->_vgrads; - // std::vector<TensorialTraits<double>::GradType> &Gradsp = vallp[i]->_vgrads; const std::vector<TensorialTraits<double>::GradType> &Gradsm = ipvm->gradf(_minusSpace,ie->getElem(0),GPm[i]); const std::vector<TensorialTraits<double>::GradType> &Gradsp = ipvp->gradf(_plusSpace,ie->getElem(1),GPp[i]); @@ -285,52 +229,42 @@ void dG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fullVector<double> bool broken = false; if(_mlawMinus->getType() == materialLaw::fracture ) { - // when if failure is checked at the convergence state, previous or current is not important + // when if failure is checked at the convergence state, previous or current is not important // but when failure is checked on the fly, current must be used // this corresponds to a more general case - Van Dung const FractureCohesive3DIPVariable *ipvwf = static_cast<const FractureCohesive3DIPVariable*>(ipvm); // broken via minus (OK broken on both sides) broken = ipvwf->isbroken(); - //const FractureCohesive3DIPVariable *ipvwfprev = static_cast<const FractureCohesive3DIPVariable*>(ipvmprev); - //broken = ipvwfprev->isbroken(); // use continuity principle at fracture initialization to avoid instability } - const double wJ = detJ* weight; + if(!broken) { static SVector3 nu; nu = referenceOutwardNormalm; nu*=(1./referenceOutwardNormalm.norm()); - // shape functions (no rotation ?) -// Valsm.clear(); Valsp.clear(); -// _minusSpace->fuvw(ie->getElem(0),uem, vem, wem, Valsm); -// _plusSpace->fuvw(ie->getElem(1),uep, vep, wep, Valsp); - // std::vector<TensorialTraits<double>::ValType> &Valsm = vallm[i]->_vvals; - // std::vector<TensorialTraits<double>::ValType> &Valsp = vallp[i]->_vvals; const std::vector<TensorialTraits<double>::ValType> &Valsm = ipvm->f(_minusSpace,ie->getElem(0),GPm[i]); const std::vector<TensorialTraits<double>::ValType> &Valsp = ipvp->f(_plusSpace,ie->getElem(1),GPp[i]); // consistency \mean{P} static SVector3 meanPN; - meanPN*=0.; for(int k =0; k<3; k++) { + meanPN[k] = 0.; for(int l =0; l<3; l++) { - meanPN[k] += (ipvp->getConstRefToFirstPiolaKirchhoffStress()(k,l)+ipvm->getConstRefToFirstPiolaKirchhoffStress()(k,l))*(nu(l)/2.); - - //----------------------------- use 1st piola b4 AV -------------------// - -// meanPN[k] += (ipvp->getConstRefToFirstPiolaKirchhoffStressb4AV()(k,l)+ipvm->getConstRefToFirstPiolaKirchhoffStressb4AV()(k,l))*(nu(l)/2.); + meanPN[k] += (ipvp->getConstRefToFirstPiolaKirchhoffStress()(k,l)+ipvm->getConstRefToFirstPiolaKirchhoffStress()(k,l))*(nu(l)/2.); } } // Stability N \mean{H} (jump N) - static SVector3 NMeanHJumpNBetasc; - NMeanHJumpNBetasc*=0.; + static STensor43 meanH; meanH = ipvp->getConstRefToElasticTangentModuli(); meanH+= ipvm->getConstRefToElasticTangentModuli(); - meanH*=(1./2.); + meanH*=(0.5); + + static SVector3 NMeanHJumpNBetasc; for(int k = 0; k <3; k++) { + NMeanHJumpNBetasc(k) = 0.; for(int l = 0; l <3; l++) { for(int m = 0; m <3; m++) @@ -355,13 +289,14 @@ void dG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fullVector<double> } // compatibility membrane (4 terms to assembly) static STensor3 HmJumpN; - HmJumpN*=0.; static STensor3 HpJumpN; - HpJumpN*=0.; + for(int k = 0; k <3; k++) { for(int l = 0; l <3; l++) { + HmJumpN(k,l) = 0.; + HpJumpN(k,l) = 0.; for(int m = 0; m <3; m++) { for(int n = 0; n <3; n++) @@ -396,19 +331,14 @@ void dG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fullVector<double> } else //broken case { - const FractureCohesive3DIPVariable *ipvmf = static_cast<const FractureCohesive3DIPVariable*>(ipvm); - const FractureCohesive3DIPVariable *ipvpf = static_cast<const FractureCohesive3DIPVariable*>(ipvp); - + const FractureCohesive3DIPVariable *ipvmf = static_cast<const FractureCohesive3DIPVariable*>(ipvm); + const FractureCohesive3DIPVariable *ipvpf = static_cast<const FractureCohesive3DIPVariable*>(ipvp); + static SVector3 interfaceForce; interfaceForce = ipvmf->getConstRefToInterfaceForce(); interfaceForce += ipvpf->getConstRefToInterfaceForce(); interfaceForce*= 0.5; -// Valsm.clear(); Valsp.clear(); -// _minusSpace->fuvw(ie->getElem(0),uem, vem, wem, Valsm); -// _plusSpace->fuvw(ie->getElem(1),uep, vep, wep, Valsp); -// std::vector<TensorialTraits<double>::ValType> &Valsm = vallm[i]->_vvals; -// std::vector<TensorialTraits<double>::ValType> &Valsp = vallp[i]->_vvals; const std::vector<TensorialTraits<double>::ValType> &Valsm = ipvm->f(_minusSpace,ie->getElem(0),GPm[i]); const std::vector<TensorialTraits<double>::ValType> &Valsp = ipvp->f(_plusSpace,ie->getElem(1),GPp[i]); @@ -445,30 +375,13 @@ void dG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMatrix<double> const double b1hs = _beta1/hs; // get value at gauss's point - AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); + const AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); // Values on minus and plus elements IntPt *GPm; IntPt *GPp; _interQuad->getIntPoints(ie,GP,&GPm,&GPp); - // val grad and detJ - //std::vector<std::vector<TensorialTraits<double>::GradType> >vgradsuvw; - //std::vector<GaussPointSpaceValues<double>*> vallm; - //std::vector<GaussPointSpaceValues<double>*> vallp; - //_minusSpace->getgradfuvw(ele,npts,GP,vgradsuvw); // create a specific functional space ?? - //_minusSpace->get(ie->getElem(0),npts,GPm,vallm); - //_plusSpace->get(ie->getElem(1),npts,GPp,vallp); - -// double jac[3][3]; - // loop on Gauss Point for(int i=0;i<npts; i++) { - // Coordonate of Gauss' point i - const double u = GP[i].pt[0]; const double v = GP[i].pt[1]; const double w = GP[i].pt[2]; - // Weight of Gauss' point i and Jacobian's value at this point - const double weight = GP[i].weight; - double detJ = ele->getJacobian(u, v, w, jac); -// double detJ = ele->getJacobian(vgradsuvw[i], jac); - // IP const IPStateBase *ipsm = (*vips)[i]; const dG3DIPVariableBase *ipvm = static_cast<const dG3DIPVariableBase*>(ipsm->getState(IPStateBase::current)); @@ -484,16 +397,11 @@ void dG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMatrix<double> const SVector3 &referenceOutwardNormalp = ipvp->getConstRefToReferenceOutwardNormal(); const SVector3 &jump = ipvp->getConstRefToJump(); + // Weight of Gauss' point i and Jacobian's value at this point + const double weight = GP[i].weight; + const double& detJ = ipvm->getJacobianDeterminant(ie,GP[i]); + const double wJ = detJ* weight; - // Compute of Hessian of SF. Each component of the vector is link to a shape function. -// Gradsm.resize(0); Gradsp.resize(0); -// double uem = GPm[i].pt[0]; double vem = GPm[i].pt[1]; double wem = GPm[i].pt[2]; -// double uep = GPp[i].pt[0]; double vep = GPp[i].pt[1]; double wep = GPp[i].pt[2]; - //ie->getuvwOnElem(u,v,uem,vem,wem,uep,vep,wep); -// _minusSpace->gradf(ie->getElem(0),uem, vem, wem, Gradsm); -// _plusSpace->gradf(ie->getElem(1),uep, vep, wep, Gradsp); -// std::vector<TensorialTraits<double>::GradType> &Gradsm = vallm[i]->_vgrads; -// std::vector<TensorialTraits<double>::GradType> &Gradsp = vallp[i]->_vgrads; const std::vector<TensorialTraits<double>::GradType> &Gradsm = ipvm->gradf(_minusSpace,ie->getElem(0),GPm[i]); const std::vector<TensorialTraits<double>::GradType> &Gradsp = ipvp->gradf(_plusSpace,ie->getElem(1),GPp[i]); @@ -505,21 +413,12 @@ void dG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMatrix<double> { const FractureCohesive3DIPVariable *ipvwf = static_cast<const FractureCohesive3DIPVariable*>(ipvm); // broken via minus (OK broken on both sides) broken = ipvwf->isbroken(); - //const FractureCohesive3DIPVariable *ipvwfprev = static_cast<const FractureCohesive3DIPVariable*>(ipvmprev); - //broken = ipvwfprev->isbroken(); // use continuity principle at fracture initialization to avoid instability -// prevbroken = false; //ipvwfprev->broken(); } - const double wJ = detJ* weight; + static SVector3 nu; nu = referenceOutwardNormalm; - nu*= (1./referenceOutwardNormalm.norm()); - - // shape functions (no rotation ?) -// Valsm.clear(); Valsp.clear(); -// _minusSpace->fuvw(ie->getElem(0),uem, vem, wem, Valsm); -// _plusSpace->fuvw(ie->getElem(1),uep, vep, wep, Valsp); - // std::vector<TensorialTraits<double>::ValType> &Valsm = vallm[i]->_vvals; - // std::vector<TensorialTraits<double>::ValType> &Valsp = vallp[i]->_vvals; + nu.normalize(); + const std::vector<TensorialTraits<double>::ValType> &Valsm = ipvm->f(_minusSpace,ie->getElem(0),GPm[i]); const std::vector<TensorialTraits<double>::ValType> &Valsp = ipvp->f(_plusSpace,ie->getElem(1),GPp[i]); @@ -527,7 +426,7 @@ void dG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMatrix<double> { const FractureCohesive3DIPVariable *ipvmf = static_cast<const FractureCohesive3DIPVariable*>(ipvm); const FractureCohesive3DIPVariable *ipvpf = static_cast<const FractureCohesive3DIPVariable*>(ipvp); - + static STensor3 DInterfaceForceDjump; DInterfaceForceDjump = ipvmf->getConstRefToDInterfaceForceDjump(); DInterfaceForceDjump += ipvpf->getConstRefToDInterfaceForceDjump(); @@ -620,7 +519,7 @@ void dG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMatrix<double> const STensor43& DInterfaceForceDGp = ipvpf->getConstRefToDInterfaceForceDenhancedGradF(); const std::vector<TensorialTraits<double>::HessType> &Hessm = ipvm->hessf(_minusSpace,ie->getElem(0),GPm[i]); const std::vector<TensorialTraits<double>::HessType> &Hessp = ipvp->hessf(_plusSpace,ie->getElem(1),GPp[i]); - + for(int j=0;j<nbFFm;j++){ for(int k=0;k<3;k++){ for(int l=0;l<nbFFm;l++){ @@ -798,12 +697,12 @@ void dG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMatrix<double> // Stability N \mean{H} (N) static STensor3 NMeanHNBetasc; - NMeanHNBetasc*=0.; for(int k = 0; k <3; k++) { - for(int l = 0; l <3; l++) + for(int m = 0; m <3; m++) { - for(int m = 0; m <3; m++) + NMeanHNBetasc(k,m) = 0.; + for(int l = 0; l <3; l++) { for(int n = 0; n <3; n++) { @@ -855,13 +754,14 @@ void dG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMatrix<double> } // compatibility membrane (4 terms to assembly) static STensor3 HmJumpN; - HmJumpN*=0.; static STensor3 HpJumpN; - HpJumpN*=0.; + for(int k = 0; k <3; k++) { for(int l = 0; l <3; l++) { + HmJumpN(k,l) = 0.; + HpJumpN(k,l) = 0.; for(int m = 0; m <3; m++) { for(int n = 0; n <3; n++) @@ -1008,32 +908,15 @@ void nonLocalDG3DStiffnessBulk::get(MElement *ele,int npts,IntPt *GP,fullMatrix< // Initialization of some data int nbdof = BilinearTerm<double,double>::space1.getNumKeys(ele); int nbFF = ele->getNumShapeFunctions(); - // get ipvariables _ipf->getIPv(ele,vipv); - // val, grad and detJ at all Gauss points - //nlsFunctionSpaceXYZ<double> *sp1 = static_cast<nlsFunctionSpaceXYZ<double>*>(&(this->space1)); - //std::vector<GaussPointSpaceValues<double>*> vall; - //sp1->get(ele,npts,GP,vall); - // sum on Gauss' points -// double jac[3][3]; - /* - SVector3 Bepsbar(3); - SVector3 BTepsbar(3); - SVector3 newB,newBT; - */ for (int i = 0; i < npts; i++) { - // Coordonate of Gauss' point i -// double u = GP[i].pt[0]; double v = GP[i].pt[1]; double w = GP[i].pt[2]; - // Weight of Gauss' point i + double weight = GP[i].weight; -// double detJ = ele->getJacobian(u, v, w, jac); -// double detJ = vall[i]->_detJ; double &detJ = vipv[i]->getJacobianDeterminant(ele,GP[i]); double ratio = detJ*weight; - //double length = _mlaw->getLength(); double eqRatio = _nonLocalEqRatio; //by Wu Ling std::vector<TensorialTraits<double>::GradType> &Grads = vipv[i]->gradf(&space1,ele,GP[i]); @@ -1041,7 +924,6 @@ void nonLocalDG3DStiffnessBulk::get(MElement *ele,int npts,IntPt *GP,fullMatrix< const int threeTimesNbFF = 3*nbFF; - const nonLocalDamageDG3DIPVariableBase* ipvNonlocal = static_cast<const nonLocalDamageDG3DIPVariableBase*>(vipv[i]); for (int nlk = 0; nlk < ipvNonlocal->getNumberNonLocalVariable(); nlk++){ @@ -1049,7 +931,7 @@ void nonLocalDG3DStiffnessBulk::get(MElement *ele,int npts,IntPt *GP,fullMatrix< const STensor3 *dsdp = &ipvNonlocal->getConstRefToDStressDNonLocalVariable()[nlk]; const STensor3 *cg = &ipvNonlocal->getConstRefToCharacteristicLengthMatrix(nlk); // by Wu Ling double SpBar = ipvNonlocal->getConstRefToDLocalVariableDNonLocalVariable()(nlk,nlk); - + for(int j=0;j<nbFF; j++){ for(int k=0;k<nbFF;k++){ // principal term @@ -1061,7 +943,7 @@ void nonLocalDG3DStiffnessBulk::get(MElement *ele,int npts,IntPt *GP,fullMatrix< } mStiff(j+nlk*nbFF+threeTimesNbFF,k+nlk*nbFF+threeTimesNbFF) += eqRatio*ratio*(Vals[j+nlk*nbFF+threeTimesNbFF]*Vals[k+nlk*nbFF+threeTimesNbFF]*(1-SpBar)+ BtB); - + // cross terms to check for(int kk=0;kk<3;kk++) { @@ -1086,13 +968,11 @@ void nonLocalDG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fullVector< if (_localForceInter != NULL) _localForceInter->get(ele, npts, GP,m); - const fullVector<double> &datafield = *_data; MInterfaceElement *ie = dynamic_cast<MInterfaceElement*>(ele); const int nbFFm = ie->getElem(0)->getNumVertices(); const int nbFFp = ie->getElem(1)->getNumVertices(); const int nbdofm = _minusSpace->getNumKeys(ie->getElem(0)); const int nbdofp = _plusSpace->getNumKeys(ie->getElem(1)); - double jac[3][3]; if(_fullDg) { // characteristic size @@ -1101,30 +981,14 @@ void nonLocalDG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fullVector< if( _continuity) { // get value at gauss's point - AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); + const AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); // value on minus and plus elements IntPt *GPm; IntPt *GPp; _interQuad->getIntPoints(ie,GP,&GPm,&GPp); - // Val, grad and detJ at all Gauss points - static std::vector<std::vector<TensorialTraits<double>::GradType> >vgradsuvw; - vgradsuvw.clear(); - //std::vector<GaussPointSpaceValues<double>*> vallm; - //std::vector<GaussPointSpaceValues<double>*> vallp; - _minusSpace->getgradfuvw(ele,npts,GP,vgradsuvw); // create a special function space ?? - //_minusSpace->get(ie->getElem(0),npts,GPm,vallm); - //_plusSpace->get(ie->getElem(1),npts,GPp,vallp); -// double jac[3][3]; // loop on Gauss Point for(int i=0;i<npts; i++) { - // Coordonate of Gauss' point i -// const double u = GP[i].pt[0]; const double v = GP[i].pt[1]; const double w = GP[i].pt[2]; - // Weight of Gauss' point i and Jacobian's value at this point - const double weight = GP[i].weight; -// double detJ = ele->getJacobian(u, v, w, jac); - double detJ = ele->getJacobian(vgradsuvw[i], jac); - // IP const IPStateBase *ipsm = (*vips)[i]; const IPStateBase *ipsp = (*vips)[i+npts]; @@ -1132,10 +996,10 @@ void nonLocalDG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fullVector< const nonLocalDamageDG3DIPVariableBase *ipvp; if(_mlawMinus->getType() == materialLaw::fracture ) { - FractureCohesive3DIPVariable* ipvtmp = static_cast<FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::current)); - ipvm = static_cast<nonLocalDamageDG3DIPVariableBase*>(ipvtmp->getIPvBulk()); - ipvtmp = static_cast<FractureCohesive3DIPVariable*>(ipsp->getState(IPStateBase::current)); - ipvp = static_cast<nonLocalDamageDG3DIPVariableBase*>(ipvtmp->getIPvBulk()); + const FractureCohesive3DIPVariable* ipvtmp = static_cast<const FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::current)); + ipvm = static_cast<const nonLocalDamageDG3DIPVariableBase*>(ipvtmp->getIPvBulk()); + ipvtmp = static_cast<const FractureCohesive3DIPVariable*>(ipsp->getState(IPStateBase::current)); + ipvp = static_cast<const nonLocalDamageDG3DIPVariableBase*>(ipvtmp->getIPvBulk()); } else { @@ -1143,16 +1007,16 @@ void nonLocalDG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fullVector< ipvp = static_cast<const nonLocalDamageDG3DIPVariableBase*>(ipsp->getState(IPStateBase::current)); } -// const nonLocalDamageDG3DIPVariable *ipvmprev = static_cast<const nonLocalDamageDG3DIPVariable*>(ipsm->getState(IPStateBase::previous)); -// const nonLocalDamageDG3DIPVariable *ipvm0 = static_cast<const nonLocalDamageDG3DIPVariable*>(ipsm->getState(IPStateBase::initial)); + const double weight = GP[i].weight; + double detJ = ipvm->getJacobianDeterminant(ie,GP[i]); + double eqRatio = _nonLocalEqRatio; + + double wJ = detJ* weight; + wJ*=eqRatio; const SVector3 &referenceOutwardNormalm = ipvm->getConstRefToReferenceOutwardNormal(); - - //double length = _mlaw->getLength(); - double eqRatio = _nonLocalEqRatio; //by Wu Ling - //std::vector<TensorialTraits<double>::GradType> &Gradsm = vallm[i]->_vgrads; - //std::vector<TensorialTraits<double>::GradType> &Gradsp = vallp[i]->_vgrads; + //by Wu Ling const std::vector<TensorialTraits<double>::GradType> &Gradsm = ipvm->gradf(_minusSpace,ie->getElem(0),GPm[i]); const std::vector<TensorialTraits<double>::GradType> &Gradsp = ipvp->gradf(_plusSpace,ie->getElem(1),GPp[i]); @@ -1162,102 +1026,21 @@ void nonLocalDG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fullVector< { const FractureCohesive3DIPVariable *ipvwf = static_cast<const FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::current)); // broken via minus (OK broken on both sides) broken = ipvwf->isbroken(); - //const FractureCohesive3DIPVariable *ipvwfprev = static_cast<const FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::previous)); - //broken = ipvwfprev->isbroken(); // use continuity principle at fracture initialization to avoid instability } - double wJ = detJ* weight; - wJ*=eqRatio; - // const nonLocalDamageDG3DIPVariable *ipvp0 = static_cast<const nonLocalDamageDG3DIPVariable*>(ipsp->getState(IPStateBase::initial)); - const SVector3 &referenceOutwardNormalp = ipvp->getConstRefToReferenceOutwardNormal(); - /* - const double &epljump = ipvp->getConstRefToNonLocalJump(); - const STensor3 *cgm = &(ipvm->getConstRefToCharacteristicLengthMatrix()); // by Wu Ling - const STensor3 *cgp = &(ipvp->getConstRefToCharacteristicLengthMatrix()); // by Wu Ling - const SVector3 *gradm = &(ipvm->getConstRefToGradNonLocalPlasticStrain()); - const SVector3 *gradp = &(ipvp->getConstRefToGradNonLocalPlasticStrain()); - - SVector3 cgGradm(0.); - SVector3 cgGradp(0.); - for(int k =0; k<3; k++) - { - for(int l =0; l<3; l++) - { - cgGradm[k] += cgm->operator()(k,l)*gradm->operator()(l); - cgGradp[k] += cgp->operator()(k,l)*gradp->operator()(l); - } - } - */ if(!broken) { static SVector3 nu; nu = referenceOutwardNormalm; - nu*= (1./referenceOutwardNormalm.norm()); - - // shape functions (no rotation ?) - //std::vector<TensorialTraits<double>::ValType> &Valsm = vallm[i]->_vvals; - //std::vector<TensorialTraits<double>::ValType> &Valsp = vallp[i]->_vvals; + nu.normalize(); const std::vector<TensorialTraits<double>::ValType> &Valsm = ipvm->f(_minusSpace,ie->getElem(0),GPm[i]); const std::vector<TensorialTraits<double>::ValType> &Valsp = ipvp->f(_plusSpace,ie->getElem(1),GPp[i]); - /* - // consistency \mean{cg*grad eps} - double meanCgGradN =0.; - for(int k =0; k<3; k++) - { - meanCgGradN += (cgGradm(k)+cgGradp(k))*(nu(k)/2.); - } - // Stability N \mean{H} (jump N) - double NMeanCgJumpNBetasc = 0.; - STensor3 meanCg = ((*cgm)+(*cgp))*(1./2.); - for(int l = 0; l <3; l++) - { - for(int n = 0; n <3; n++) - { - NMeanCgJumpNBetasc += meanCg(l,n)*epljump*nu(n)*nbetahs*nu(l); - } - } - // Assembly consistency + stability (if not broken) - for(int j=0;j<nbFFm;j++) - { - m(j+3*nbFFm) -= (meanCgGradN+NMeanCgJumpNBetasc)*(Valsm[j+3*nbFFm]*wJ); - } - for(int j=0;j<nbFFp;j++) - { - m(j+3*nbFFp+nbdofm) += (meanCgGradN+NMeanCgJumpNBetasc)*(Valsp[j+3*nbFFp]*wJ); - } - // compatibility membrane (4 terms to assembly) - SVector3 CgmJumpN(0.); - SVector3 CgpJumpN(0.); - for(int k = 0; k <3; k++) - { - for(int m = 0; m <3; m++) - { - CgmJumpN(k) += cgm->operator()(k,m)*epljump*nu(m); - CgpJumpN(k) += cgp->operator()(k,m)*epljump*nu(m); - } - } - // Assembly (loop on shape function) - for(int j=0;j<nbFFm;j++) - { - for(int l=0;l<3;l++) - { - m(j+3*nbFFm) += (CgmJumpN(l)*Gradsm[j+3*nbFFm][l])*(wJ/2.); - } - } - for(int j=0;j<nbFFm;j++) - { - for(int l=0;l<3;l++) - { - m(j+3*nbFFp+nbdofm) += (CgpJumpN(l)*Gradsp[j+3*nbFFp][l])*(wJ/2.); - } - } - */ for (int nlk = 0; nlk< ipvp->getNumberNonLocalVariable(); nlk++){ const double &epljump = ipvp->getConstRefToNonLocalJump()(nlk); @@ -1267,11 +1050,12 @@ void nonLocalDG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fullVector< const SVector3 *gradp = &(ipvp->getConstRefToGradNonLocalVariable()[nlk]); static SVector3 cgGradm; - cgGradm*=(0.); static SVector3 cgGradp; - cgGradp*=(0.); + for(int k =0; k<3; k++) { + cgGradm[k] = 0.; + cgGradp[k] = 0.; for(int l =0; l<3; l++) { cgGradm[k] += cgm->operator()(k,l)*gradm->operator()(l); @@ -1309,11 +1093,12 @@ void nonLocalDG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fullVector< } // compatibility membrane (4 terms to assembly) static SVector3 CgmJumpN; - CgmJumpN*=(0.); static SVector3 CgpJumpN; - CgpJumpN*=(0.); + for(int k = 0; k <3; k++) { + CgmJumpN(k) = 0.; + CgpJumpN(k) = 0.; for(int m = 0; m <3; m++) { CgmJumpN(k) += cgm->operator()(k,m)*epljump*nu(m); @@ -1364,42 +1149,25 @@ void nonLocalDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMatrix if( _continuity) { // get value at gauss's point - AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); + const AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); // values of Gauss points on minus and plus elements IntPt *GPm; IntPt *GPp; _interQuad->getIntPoints(ie,GP,&GPm,&GPp); - // val, grad and detJ at all Gauss points - static std::vector<std::vector<TensorialTraits<double>::GradType> >vgradsuvw; - vgradsuvw.clear(); - //std::vector<GaussPointSpaceValues<double>*> vallm; - //std::vector<GaussPointSpaceValues<double>*> vallp; - _minusSpace->getgradfuvw(ele,npts,GP,vgradsuvw); // do a special function space ?? - //_minusSpace->get(ie->getElem(0),npts,GPm,vallm); - //_plusSpace->get(ie->getElem(1),npts,GPp,vallp); - - double jac[3][3]; // loop on Gauss Point for(int i=0;i<npts; i++) { - // Coordonate of Gauss' point i -// const double u = GP[i].pt[0]; const double v = GP[i].pt[1]; const double w = GP[i].pt[2]; - // Weight of Gauss' point i and Jacobian's value at this point - const double weight = GP[i].weight; -// double detJ = ele->getJacobian(u, v, w, jac); - double detJ = ele->getJacobian(vgradsuvw[i], jac); - // IP const IPStateBase *ipsm = (*vips)[i]; const IPStateBase *ipsp = (*vips)[i+npts]; - const nonLocalDamageDG3DIPVariableBase *ipvm; //= static_cast<const nonLocalDamageDG3DIPVariable*>(ipsm->getState(IPStateBase::current)); - const nonLocalDamageDG3DIPVariableBase *ipvp; // = static_cast<const nonLocalDamageDG3DIPVariable*>(ipsp->getState(IPStateBase::current)); + const nonLocalDamageDG3DIPVariableBase *ipvm = NULL; + const nonLocalDamageDG3DIPVariableBase *ipvp = NULL; if(_mlawMinus->getType() == materialLaw::fracture ) { - FractureCohesive3DIPVariable* ipvtmp = static_cast<FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::current)); - ipvm = static_cast<nonLocalDamageDG3DIPVariableBase*>(ipvtmp->getIPvBulk()); - ipvtmp = static_cast<FractureCohesive3DIPVariable*>(ipsp->getState(IPStateBase::current)); - ipvp = static_cast<nonLocalDamageDG3DIPVariableBase*>(ipvtmp->getIPvBulk()); + const FractureCohesive3DIPVariable* ipvtmp = static_cast<const FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::current)); + ipvm = static_cast<const nonLocalDamageDG3DIPVariableBase*>(ipvtmp->getIPvBulk()); + ipvtmp = static_cast<const FractureCohesive3DIPVariable*>(ipsp->getState(IPStateBase::current)); + ipvp = static_cast<const nonLocalDamageDG3DIPVariableBase*>(ipvtmp->getIPvBulk()); } else { @@ -1407,20 +1175,17 @@ void nonLocalDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMatrix ipvp = static_cast<const nonLocalDamageDG3DIPVariableBase*>(ipsp->getState(IPStateBase::current)); } -// const nonLocalDamageDG3DIPVariable *ipvmprev = static_cast<const nonLocalDamageDG3DIPVariable*>(ipsm->getState(IPStateBase::previous)); -// const nonLocalDamageDG3DIPVariable *ipvm0 = static_cast<const nonLocalDamageDG3DIPVariable*>(ipsm->getState(IPStateBase::initial)); - - const SVector3 &referenceOutwardNormalm = ipvm->getConstRefToReferenceOutwardNormal(); - - + const double weight = GP[i].weight; + double detJ = ipvm->getJacobianDeterminant(ie,GP[i]); + double wJ = detJ* weight; + double eqRatio = _nonLocalEqRatio; //by Wu Ling + wJ*=eqRatio; -// const nonLocalDamageDG3DIPVariable *ipvp0 = static_cast<const nonLocalDamageDG3DIPVariable*>(ipsp->getState(IPStateBase::initial)); + const SVector3 &referenceOutwardNormalm = ipvm->getConstRefToReferenceOutwardNormal(); const SVector3 &referenceOutwardNormalp = ipvp->getConstRefToReferenceOutwardNormal(); - const SVector3 &jump = ipvp->getConstRefToJump(); - //std::vector<TensorialTraits<double>::GradType> &Gradsm = vallm[i]->_vgrads; - //std::vector<TensorialTraits<double>::GradType> &Gradsp = vallp[i]->_vgrads; + const SVector3 &jump = ipvp->getConstRefToJump(); const std::vector<TensorialTraits<double>::GradType> &Gradsm = ipvm->gradf(_minusSpace,ie->getElem(0),GPm[i]); const std::vector<TensorialTraits<double>::GradType> &Gradsp = ipvp->gradf(_plusSpace,ie->getElem(1),GPp[i]); @@ -1431,27 +1196,15 @@ void nonLocalDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMatrix { const FractureCohesive3DIPVariable *ipvwf = static_cast<const FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::current)); // broken via minus (OK broken on both sides) broken = ipvwf->isbroken(); - //const FractureCohesive3DIPVariable *ipvwfprev = static_cast<const FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::previous)); - //broken = ipvwfprev->isbroken(); // use continuity principle at fracture initialization to avoid instability } - double wJ = detJ* weight; - //double length = _mlaw->getLength(); - double eqRatio = _nonLocalEqRatio; //by Wu Ling - wJ*=eqRatio; static SVector3 nu; nu = referenceOutwardNormalm; - nu*=(1./referenceOutwardNormalm.norm()); - - - - //std::vector<TensorialTraits<double>::ValType> &Valsm = vallm[i]->_vvals; - //std::vector<TensorialTraits<double>::ValType> &Valsp = vallp[i]->_vvals; + nu.normalize(); const std::vector<TensorialTraits<double>::ValType> &Valsm = ipvm->f(_minusSpace,ie->getElem(0),GPm[i]); const std::vector<TensorialTraits<double>::ValType> &Valsp = ipvp->f(_plusSpace,ie->getElem(1),GPp[i]); - if(broken) { @@ -1591,17 +1344,6 @@ void nonLocalDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMatrix stiff(j+nlk*nbFFp+3*nbFFp+nbdofm,l+nlk*nbFFp+3*nbFFp+nbdofm) += NMeanCgNBetasc*(Valsp[j+nlk*nbFFp+3*nbFFp]*Valsp[l+nlk*nbFFp+3*nbFFp]*wJ); } } - // compatibility membrane (4 terms to assembly) - //SVector3 cgmJumpN; - //SVector3 cgpJumpN; - //for(int k = 0; k <3; k++) - //{ - // for(int m = 0; m <3; m++) - //{ - // cgmJumpN(k) += cgm->operator()(k,m)*epljump*nu(m); - //cgpJumpN(k) += cgp->operator()(k,m)*epljump*nu(m); - //} - //} // Assembly (loop on shape function) for(int j=0;j<nbFFm;j++) { @@ -1679,11 +1421,7 @@ void ExtraDofDiffusionDG3DForceBulk::get(MElement *ele,int npts,IntPt *GP,fullVe int nbdof = this->space1.getNumKeys(ele); int nbFF = ele->getNumShapeFunctions(); -// double jac[3][3]; static SVector3 BTepsbar; - BTepsbar*=0.; - static SVector3 Bepsbar; - Bepsbar*=0.; // get gauss' point data _ipf->getIPv(ele,vipv,vipvprev); @@ -1694,19 +1432,16 @@ void ExtraDofDiffusionDG3DForceBulk::get(MElement *ele,int npts,IntPt *GP,fullVe double weight = GP[i].weight; double &detJ = vipv[i]->getJacobianDeterminant(ele,GP[i]); - - // CHANGE FROMM HERE - const STensor3 *PK1 = &(vipv[i]->getConstRefToFirstPiolaKirchhoffStress()); double ratio = detJ*weight; double eqRatio = _ExtraDofDiffusionEqRatio; //by Wu Ling - + const ExtraDofDiffusionDG3DIPVariableBase * extraIPv = dynamic_cast <const ExtraDofDiffusionDG3DIPVariableBase * > (vipv[i]); - + const std::vector<TensorialTraits<double>::GradType> &Grads = vipv[i]->gradf(&space1,ele,GP[i]); const std::vector<TensorialTraits<double>::ValType> &Vals = vipv[i]->f(&space1,ele,GP[i]); - + const SVector3 &flux = extraIPv-> getConstRefToFlux(); double w = 0.; if (_accountFieldSource){ @@ -1745,14 +1480,9 @@ void ExtraDofDiffusionDG3DStiffnessBulk::get(MElement *ele,int npts,IntPt *GP,fu _ipf->getIPv(ele,vipv); static SVector3 Bepsbar; - Bepsbar*=0.; static SVector3 BTepsbar; - BTepsbar*=0.; static SVector3 newB; - newB*=0.; static SVector3 newBT; - newBT*=0.; - for (int i = 0; i < npts; i++) { @@ -1760,14 +1490,14 @@ void ExtraDofDiffusionDG3DStiffnessBulk::get(MElement *ele,int npts,IntPt *GP,fu double weight = GP[i].weight; double &detJ = vipv[i]->getJacobianDeterminant(ele,GP[i]); - + const ExtraDofDiffusionDG3DIPVariableBase * extraIpv = dynamic_cast<const ExtraDofDiffusionDG3DIPVariableBase *>(vipv[i]); // x, y, z const STensor3 &dFluxdGradField = extraIpv->getConstRefTodFluxdGradField(); //in reference conf const SVector3 &dFluxdField = extraIpv->getConstRefTodFluxdField(); //in reference conf const STensor33 &dFluxdF = extraIpv->getConstRefTodFluxdF(); //in reference conf const STensor3 &dPdField = extraIpv->getConstRefTodPdField(); - + double dwdt = 0.; static STensor3 dwdf; dwdf*=0.; @@ -1823,9 +1553,9 @@ void ExtraDofDiffusionDG3DStiffnessBulk::get(MElement *ele,int npts,IntPt *GP,fu { mStiff(j+kk*nbFF,k+threeTimesNbFF) += ratio*(newBT(m)*dPdField.operator()(kk,m)*Vals[k+threeTimesNbFF]); for(int n=3; n<3; n++) - { + { mStiff(j+threeTimesNbFF,k+kk*nbFF) += eqRatio*ratio*(BTepsbar(m)*dFluxdF.operator()(m,kk,n)*newB(n)); - } + } mStiff(j+threeTimesNbFF,k+kk*nbFF)+=eqRatio*ratio*(newB(m)*dwdf.operator()(kk,m)*Vals[j+threeTimesNbFF]); // related to cp } } @@ -1842,13 +1572,13 @@ void ExtraDofDiffusionDG3DStiffnessBulk::get(MElement *ele,int npts,IntPt *GP,fu void ExtraDofDiffusionDG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fullVector<double> &m)const { dG3DForceInter::get(ele, npts, GP,m); - const fullVector<double> &datafield = *_data; + MInterfaceElement *ie = dynamic_cast<MInterfaceElement*>(ele); const int nbFFm = ie->getElem(0)->getNumVertices(); const int nbFFp = ie->getElem(1)->getNumVertices(); const int nbdofm = _minusSpace->getNumKeys(ie->getElem(0)); const int nbdofp = _plusSpace->getNumKeys(ie->getElem(1)); - double jac[3][3]; + #define gamma 0 if(_fullDg) { @@ -1858,7 +1588,7 @@ void ExtraDofDiffusionDG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fu if( _continuity) { // get value at gauss's point - AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); + const AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); // value on minus and plus elements IntPt *GPm; IntPt *GPp; _interQuad->getIntPoints(ie,GP,&GPm,&GPp); @@ -1871,9 +1601,6 @@ void ExtraDofDiffusionDG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fu for(int i=0;i<npts; i++) { - const double weight = GP[i].weight; - - double detJ = ele->getJacobian(vgradsuvw[i], jac); // IP const IPStateBase *ipsm = (*vips)[i]; const IPStateBase *ipsp = (*vips)[i+npts]; @@ -1881,10 +1608,10 @@ void ExtraDofDiffusionDG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fu const ExtraDofDiffusionDG3DIPVariableBase *ipvp; if(_mlawMinus->getType() == materialLaw::fracture ) { - FractureCohesive3DIPVariable* ipvtmp = static_cast<FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::current)); - ipvm = static_cast<ExtraDofDiffusionDG3DIPVariableBase*>(ipvtmp->getIPvBulk()); - ipvtmp = static_cast<FractureCohesive3DIPVariable*>(ipsp->getState(IPStateBase::current)); - ipvp = static_cast<ExtraDofDiffusionDG3DIPVariableBase*>(ipvtmp->getIPvBulk()); + const FractureCohesive3DIPVariable* ipvtmp = static_cast<const FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::current)); + ipvm = static_cast<const ExtraDofDiffusionDG3DIPVariableBase*>(ipvtmp->getIPvBulk()); + ipvtmp = static_cast<const FractureCohesive3DIPVariable*>(ipsp->getState(IPStateBase::current)); + ipvp = static_cast<const ExtraDofDiffusionDG3DIPVariableBase*>(ipvtmp->getIPvBulk()); } else { @@ -1892,6 +1619,9 @@ void ExtraDofDiffusionDG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fu ipvp = static_cast<const ExtraDofDiffusionDG3DIPVariableBase*>(ipsp->getState(IPStateBase::current)); } + const double weight = GP[i].weight; + double detJ = ipvm->getJacobianDeterminant(ie,GP[i]); + const SVector3 &referenceOutwardNormalm = ipvm->getConstRefToReferenceOutwardNormal(); @@ -1902,7 +1632,7 @@ void ExtraDofDiffusionDG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fu const double &fieldm = ipvm->getConstRefToField(); const double &oneOverFieldJump = ipvp->getConstRefToOneOverFieldJump(); - const SVector3 &jump = ipvp->getConstRefToJump(); + const SVector3 &jump = ipvp->getConstRefToJump(); static STensor3 k0m; @@ -1910,20 +1640,20 @@ void ExtraDofDiffusionDG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fu static STensor3 k0p; k0p = (ipvp->getConstRefTolinearK()); - static STensor3 Stiff_alphadialitationm; + static STensor3 Stiff_alphadialitationm; Stiff_alphadialitationm = ipvm->getConstRefToLinearSymmetrizationCoupling(); - static STensor3 Stiff_alphadialitationp; + static STensor3 Stiff_alphadialitationp; Stiff_alphadialitationp = ipvp->getConstRefToLinearSymmetrizationCoupling(); if(_useOneOverJump) { k0m*=(-1.)*fieldm*fieldm; k0p*=(-1.)*fieldp*fieldp; fieldJump=oneOverFieldJump; - Stiff_alphadialitationm*= (-1.)*fieldm*fieldm; - Stiff_alphadialitationp*= (-1.)*fieldp*fieldp; + Stiff_alphadialitationm*= (-1.)*fieldm*fieldm; + Stiff_alphadialitationp*= (-1.)*fieldp*fieldp; } - const SVector3 &fluxm = (ipvm->getConstRefToFlux()); + const SVector3 &fluxm = (ipvm->getConstRefToFlux()); const SVector3 &fluxp = (ipvp->getConstRefToFlux()); //double length = _mlaw->getLength(); @@ -1976,14 +1706,14 @@ void ExtraDofDiffusionDG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fu double Stiff_alphadialitationp_JumpN=0.; double Stiff_alphadialitationm_JumpN=0.; - for(int k = 0; k <3; k++) - { + for(int k = 0; k <3; k++) + { for(int m = 0; m <3; m++) { - Stiff_alphadialitationp_JumpN += Stiff_alphadialitationp(k,m)*jump(k)*nu(m); - Stiff_alphadialitationm_JumpN += Stiff_alphadialitationm(k,m)*jump(k)*nu(m); - } - } + Stiff_alphadialitationp_JumpN += Stiff_alphadialitationp(k,m)*jump(k)*nu(m); + Stiff_alphadialitationm_JumpN += Stiff_alphadialitationm(k,m)*jump(k)*nu(m); + } + } for(int j=0;j<nbFFm;j++) @@ -2068,31 +1798,14 @@ void ExtraDofDiffusionDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,f if( _continuity) { // get value at gauss's point - AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); + const AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); // values of Gauss points on minus and plus elements IntPt *GPm; IntPt *GPp; _interQuad->getIntPoints(ie,GP,&GPm,&GPp); - // val, grad and detJ at all Gauss points - static std::vector<std::vector<TensorialTraits<double>::GradType> >vgradsuvw; - vgradsuvw.clear(); - //std::vector<GaussPointSpaceValues<double>*> vallm; - //std::vector<GaussPointSpaceValues<double>*> vallp; - _minusSpace->getgradfuvw(ele,npts,GP,vgradsuvw); // do a special function space ?? - //_minusSpace->get(ie->getElem(0),npts,GPm,vallm); - //_plusSpace->get(ie->getElem(1),npts,GPp,vallp); - - double jac[3][3]; // loop on Gauss Point for(int i=0;i<npts; i++) { - // Coordonate of Gauss' point i -// const double u = GP[i].pt[0]; const double v = GP[i].pt[1]; const double w = GP[i].pt[2]; - // Weight of Gauss' point i and Jacobian's value at this point - const double weight = GP[i].weight; -// double detJ = ele->getJacobian(u, v, w, jac); - double detJ = ele->getJacobian(vgradsuvw[i], jac); - // IP const IPStateBase *ipsm = (*vips)[i]; const IPStateBase *ipsp = (*vips)[i+npts]; @@ -2100,10 +1813,10 @@ void ExtraDofDiffusionDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,f const ExtraDofDiffusionDG3DIPVariableBase *ipvp; // = static_cast<const nonLocalDamageDG3DIPVariable*>(ipsp->getState(IPStateBase::current)); if(_mlawMinus->getType() == materialLaw::fracture ) { - FractureCohesive3DIPVariable* ipvtmp = static_cast<FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::current)); - ipvm = static_cast<ExtraDofDiffusionDG3DIPVariableBase*>(ipvtmp->getIPvBulk()); - ipvtmp = static_cast<FractureCohesive3DIPVariable*>(ipsp->getState(IPStateBase::current)); - ipvp = static_cast<ExtraDofDiffusionDG3DIPVariableBase*>(ipvtmp->getIPvBulk()); + const FractureCohesive3DIPVariable* ipvtmp = static_cast<const FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::current)); + ipvm = static_cast<const ExtraDofDiffusionDG3DIPVariableBase*>(ipvtmp->getIPvBulk()); + ipvtmp = static_cast<const FractureCohesive3DIPVariable*>(ipsp->getState(IPStateBase::current)); + ipvp = static_cast<const ExtraDofDiffusionDG3DIPVariableBase*>(ipvtmp->getIPvBulk()); } else { @@ -2111,20 +1824,14 @@ void ExtraDofDiffusionDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,f ipvp = static_cast<const ExtraDofDiffusionDG3DIPVariableBase*>(ipsp->getState(IPStateBase::current)); } -// const nonLocalDamageDG3DIPVariable *ipvmprev = static_cast<const nonLocalDamageDG3DIPVariable*>(ipsm->getState(IPStateBase::previous)); -// const nonLocalDamageDG3DIPVariable *ipvm0 = static_cast<const nonLocalDamageDG3DIPVariable*>(ipsm->getState(IPStateBase::initial)); - - const SVector3 &referenceOutwardNormalm = ipvm->getConstRefToReferenceOutwardNormal(); - - + const double weight = GP[i].weight; + double detJ = ipvm->getJacobianDeterminant(ie,GP[i]); -// const nonLocalDamageDG3DIPVariable *ipvp0 = static_cast<const nonLocalDamageDG3DIPVariable*>(ipsp->getState(IPStateBase::initial)); + const SVector3 &referenceOutwardNormalm = ipvm->getConstRefToReferenceOutwardNormal(); const SVector3 &referenceOutwardNormalp = ipvp->getConstRefToReferenceOutwardNormal(); - double fieldJump = ipvp->getConstRefToFieldJump(); - //std::vector<TensorialTraits<double>::GradType> &Gradsm = vallm[i]->_vgrads; - //std::vector<TensorialTraits<double>::GradType> &Gradsp = vallp[i]->_vgrads; + double fieldJump = ipvp->getConstRefToFieldJump(); const std::vector<TensorialTraits<double>::GradType> &Gradsm = ipvm->gradf(_minusSpace,ie->getElem(0),GPm[i]); const std::vector<TensorialTraits<double>::GradType> &Gradsp = ipvp->gradf(_plusSpace,ie->getElem(1),GPp[i]); @@ -2135,17 +1842,12 @@ void ExtraDofDiffusionDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,f { const FractureCohesive3DIPVariable *ipvwf = static_cast<const FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::current)); // broken via minus (OK broken on both sides) broken = ipvwf->isbroken(); - //const FractureCohesive3DIPVariable *ipvwfprev = static_cast<const FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::previous)); - //broken = ipvwfprev->isbroken(); // use continuity principle at fracture initialization to avoid instability } double wJ = detJ* weight; static SVector3 nu; nu = referenceOutwardNormalm; nu*=(1./referenceOutwardNormalm.norm()); - //std::vector<TensorialTraits<double>::ValType> &Valsm = vallm[i]->_vvals; - //std::vector<TensorialTraits<double>::ValType> &Valsp = vallp[i]->_vvals; - const std::vector<TensorialTraits<double>::ValType> &Valsm = ipvm->f(_minusSpace,ie->getElem(0),GPm[i]); const std::vector<TensorialTraits<double>::ValType> &Valsp = ipvp->f(_plusSpace,ie->getElem(1),GPp[i]); @@ -2170,23 +1872,23 @@ void ExtraDofDiffusionDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,f const double &oneOverFieldJump = ipvp->getConstRefToOneOverFieldJump(); double dfieldJumpdFieldp = 1.; double dfieldJumpdFieldm = -1.; - const SVector3 &jump = ipvp->getConstRefToJump(); + const SVector3 &jump = ipvp->getConstRefToJump(); static STensor3 k0m; k0m = (ipvm->getConstRefTolinearK()); static STensor3 k0p; k0p = (ipvp->getConstRefTolinearK()); - static STensor3 Stiff_alphadialitationm; + static STensor3 Stiff_alphadialitationm; Stiff_alphadialitationm = (ipvm->getConstRefToLinearSymmetrizationCoupling()); - static STensor3 Stiff_alphadialitationp; + static STensor3 Stiff_alphadialitationp; Stiff_alphadialitationp = (ipvp->getConstRefToLinearSymmetrizationCoupling()); static STensor3 dk0mdFieldm; dk0mdFieldm*=(0.); static STensor3 dk0pdFieldp; dk0pdFieldp*=(0.); - static STensor3 dStiff_alphadialitationmdFieldm; + static STensor3 dStiff_alphadialitationmdFieldm; dStiff_alphadialitationmdFieldm*=(0.); - static STensor3 dStiff_alphadialitationpdFieldp; + static STensor3 dStiff_alphadialitationpdFieldp; dStiff_alphadialitationpdFieldp*=(0.); if(_useOneOverJump) { @@ -2199,12 +1901,12 @@ void ExtraDofDiffusionDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,f dk0mdFieldm*=(1.)*2./fieldm;//the - is removed dk0pdFieldp=k0p; dk0pdFieldp*=(1.)*2./fieldp;//the - is removed - Stiff_alphadialitationm*=(-1.)*fieldm*fieldm; - Stiff_alphadialitationp*=(-1.)*fieldp*fieldp; - dStiff_alphadialitationmdFieldm=Stiff_alphadialitationm;//the - is removed - dStiff_alphadialitationmdFieldm*=(1.)*2./fieldm; - dStiff_alphadialitationpdFieldp*=Stiff_alphadialitationp;//the - is removed - dStiff_alphadialitationpdFieldp*=(1.)*2./fieldp; + Stiff_alphadialitationm*=(-1.)*fieldm*fieldm; + Stiff_alphadialitationp*=(-1.)*fieldp*fieldp; + dStiff_alphadialitationmdFieldm=Stiff_alphadialitationm;//the - is removed + dStiff_alphadialitationmdFieldm*=(1.)*2./fieldm; + dStiff_alphadialitationpdFieldp*=Stiff_alphadialitationp;//the - is removed + dStiff_alphadialitationpdFieldp*=(1.)*2./fieldp; } double eqRatio = _ExtraDofDiffusionEqRatio; @@ -2460,90 +2162,88 @@ void ExtraDofDiffusionDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,f //new related to dialetation - for(int j=0;j<nbFFm;j++) - { - for(int k=0;k<3;k++) - { - for(int l=0;l<nbFFm;l++) + for(int j=0;j<nbFFm;j++) + { + for(int k=0;k<3;k++) { - for(int p =0; p < 3; p++) + for(int l=0;l<nbFFm;l++) { + for(int p =0; p < 3; p++) + { stiff(j+3*nbFFm,l+k*nbFFm) -= gamma*(Stiff_alphadialitationm(k,p)*Valsm[j+3*nbFFm])*(nu(p)*wJ/2.*Valsm[l+0*nbFFm])/eqRatio*(-1.); + } } - } - for(int l=0;l<nbFFp;l++) - { - for(int p =0; p < 3; p++) + for(int l=0;l<nbFFp;l++) { + for(int p =0; p < 3; p++) + { stiff(j+3*nbFFm,l+k*nbFFp+nbdofm) += gamma*(Stiff_alphadialitationm(k,p)*Valsm[j+3*nbFFm])*(nu(p)*wJ/2.*Valsp[l+0*nbFFp])/eqRatio*(-1.); + } } } - } } for(int j=0;j<nbFFp;j++) { - for(int k=0;k<3;k++) - { - for(int l=0;l<nbFFm;l++) + for(int k=0;k<3;k++) { - for(int p =0; p < 3; p++) + for(int l=0;l<nbFFm;l++) { + for(int p =0; p < 3; p++) + { stiff(j+3*nbFFp+nbdofm,l+k*nbFFm) -= gamma*(Stiff_alphadialitationp(k,p)*Valsp[j+3*nbFFp])*(nu(p)*wJ/2.*Valsm[l+0*nbFFm])/eqRatio*(-1.); + } } - } - for(int l=0;l<nbFFp;l++) - { - for(int p =0; p < 3; p++) + for(int l=0;l<nbFFp;l++) { + for(int p =0; p < 3; p++) + { stiff(j+3*nbFFp+nbdofm,l+k*nbFFp+nbdofm) += gamma*(Stiff_alphadialitationp(k,p)*Valsp[j+3*nbFFp])*(nu(p)*wJ/2.*Valsp[l+0*nbFFp])/eqRatio*(-1.); + } } } - } - } - if(_useOneOverJump) - { - for(int j=0;j<nbFFm;j++) + } + + if(_useOneOverJump) { - for(int l=0;l<nbFFm;l++) + for(int j=0;j<nbFFm;j++) { - for(int k =0; k < 3; k++) + for(int l=0;l<nbFFm;l++) { - for(int p =0; p < 3; p++) - {; + for(int k =0; k < 3; k++) + { + for(int p =0; p < 3; p++) + { - // stiff(j+3*nbFFm,l+3*nbFFm) += jump(k)*(Stiff_alphadialitationm(k,p)*(2./fieldm)*Valsm[j+3*nbFFm])*nu(p)*Valsm[l+3*nbFFm]*wJ/2.*(-1.)/eqRatio; - stiff(j+3*nbFFm,l+3*nbFFm) += gamma*jump(k)*(dStiff_alphadialitationmdFieldm(k,p)*Valsm[j+3*nbFFm])*nu(p)*Valsm[l+3*nbFFm]*wJ/2.*(-1.)/eqRatio; + // stiff(j+3*nbFFm,l+3*nbFFm) += jump(k)*(Stiff_alphadialitationm(k,p)*(2./fieldm)*Valsm[j+3*nbFFm])*nu(p)*Valsm[l+3*nbFFm]*wJ/2.*(-1.)/eqRatio; + stiff(j+3*nbFFm,l+3*nbFFm) += gamma*jump(k)*(dStiff_alphadialitationmdFieldm(k,p)*Valsm[j+3*nbFFm])*nu(p)*Valsm[l+3*nbFFm]*wJ/2.*(-1.)/eqRatio; + } } } } - } - for(int j=0;j<nbFFp;j++) - { - for(int l=0;l<nbFFp;l++) + for(int j=0;j<nbFFp;j++) { - for(int k =0; k < 3; k++) + for(int l=0;l<nbFFp;l++) { - for(int p =0; p< 3; p++) + for(int k =0; k < 3; k++) { + for(int p =0; p< 3; p++) + { - // stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += jump(k)*(Stiff_alphadialitationp(k,p)*(2./fieldp)*Valsp[j+3*nbFFp])*nu(p)*Valsp[l+3*nbFFp]*wJ/2.*(-1.)/eqRatio; - stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += gamma*jump(k)*(dStiff_alphadialitationpdFieldp(k,p)*Valsp[j+3*nbFFp])*nu(p)*Valsp[l+3*nbFFp]*wJ/2.*(-1.)/eqRatio; + // stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += jump(k)*(Stiff_alphadialitationp(k,p)*(2./fieldp)*Valsp[j+3*nbFFp])*nu(p)*Valsp[l+3*nbFFp]*wJ/2.*(-1.)/eqRatio; + stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += gamma*jump(k)*(dStiff_alphadialitationpdFieldp(k,p)*Valsp[j+3*nbFFp])*nu(p)*Valsp[l+3*nbFFp]*wJ/2.*(-1.)/eqRatio; + } } } } } - } - - } } } } //stiff.print("dginter"); - - } +}; void ElecTherMechMassG3D::get(MElement *ele,int npts,IntPt *GP,fullMatrix<double> &m) const @@ -2563,9 +2263,8 @@ void ElecTherMechDG3DForceBulk::get(MElement *ele,int npts,IntPt *GP,fullVector< int nbFF = ele->getNumShapeFunctions(); // double jac[3][3]; - static SVector3 ATepsbar3,ATepsbar4; - ATepsbar3*=0.; ATepsbar4*=0.; - // SVector3 Bepsbar3,Bepsbar4; + static SVector3 ATepsbar3; + static SVector3 ATepsbar4; // get gauss' point data _ipf->getIPv(ele,vipv,vipvprev); @@ -2605,49 +2304,45 @@ void ElecTherMechDG3DForceBulk::get(MElement *ele,int npts,IntPt *GP,fullVector< ATepsbar4(2) = Grads[j+fourTimesNbFF][2]; - // if(_useFtFv==true)//fvft=1 - { - - for(int m=0; m<3; m++) - { - vFor(j+3*nbFF) += eqRatio*ratio*(ATepsbar3(m)*fluxjy(m)); - } - - vFor(j+3*nbFF) += eqRatio*ratio*(w*Vals[j+threeTimesNbFF]); // related to cp - - for(int m=0; m<3; m++) + //if(_useFtFv==true)//fvft=1 { - vFor(j+4*nbFF) += eqRatio*ratio*(ATepsbar4(m)*fluxV(m)); - } + for(int m=0; m<3; m++) + { + vFor(j+3*nbFF) += eqRatio*ratio*(ATepsbar3(m)*fluxjy(m)); + } - } + vFor(j+3*nbFF) += eqRatio*ratio*(w*Vals[j+threeTimesNbFF]); // related to cp - /* else - { for(int m=0; m<3; m++) - { - vFor(j+3*nbFF) += eqRatio*ratio*(ATepsbar3(m)*fluxjy(m)); + { + vFor(j+4*nbFF) += eqRatio*ratio*(ATepsbar4(m)*fluxV(m)); + } } - for(int m=0; m<3; m++) + /* else { - // vFor(j+3*nbFF) -= eqRatio*ratio*(gradV(m)*fluxV(m))*Vals[j+threeTimesNbFF]; //before combining - } - vFor(j+3*nbFF) += eqRatio*ratio*(w*Vals[j+threeTimesNbFF]); // related to cp + for(int m=0; m<3; m++) + { + vFor(j+3*nbFF) += eqRatio*ratio*(ATepsbar3(m)*fluxjy(m)); + } for(int m=0; m<3; m++) - { - vFor(j+4*nbFF) += eqRatio*ratio*(ATepsbar4(m)*fluxV(m)); - } + { + // vFor(j+3*nbFF) -= eqRatio*ratio*(gradV(m)*fluxV(m))*Vals[j+threeTimesNbFF]; //before combining + } + vFor(j+3*nbFF) += eqRatio*ratio*(w*Vals[j+threeTimesNbFF]); // related to cp + + for(int m=0; m<3; m++) + { + vFor(j+4*nbFF) += eqRatio*ratio*(ATepsbar4(m)*fluxV(m)); + } - }*/ + }*/ } } - - // vFor.print("interF"); -} +}; void ElecTherMechDG3DStiffnessBulk::get(MElement *ele,int npts,IntPt *GP,fullMatrix<double> &mStiff) const @@ -2662,330 +2357,327 @@ void ElecTherMechDG3DStiffnessBulk::get(MElement *ele,int npts,IntPt *GP,fullMat // get ipvariables _ipf->getIPv(ele,vipv); - static SVector3 Bepsbar4,Bepsbar3; - Bepsbar4*=0.; Bepsbar3*=0.; - static SVector3 Aepsbar4,Aepsbar3; - Aepsbar4*=0.; Aepsbar3*=0.; - static SVector3 newB,newA; - newB*=0.; newA*=0.; - - if(_useFtFv==true) - { - for (int i = 0; i < npts; i++) - { - double weight = GP[i].weight; - - double &detJ = vipv[i]->getJacobianDeterminant(ele,GP[i]); - // x, y, z - const STensor3 &dFluxVdGradV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxVdGradV()); - const SVector3 &dFluxVdV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxVdV()); - const STensor3 &dFluxVdGradT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxVdGradT()); - const SVector3 &dFluxVdT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxVdT()); - const SVector3 &dFluxTdT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxTdT()); - const STensor3 &dFluxTdGradT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxTdGradT()); - const SVector3 &dFluxTdV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxTdV()); - const STensor3 &dFluxTdGradV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxTdGradV()); - const STensor3 &dPdV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodPdV()); - const STensor3 &dPdT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodPdT()); - const SVector3 &gradV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefToGradV()); - const SVector3 &FluxV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefToFluxV()); - const STensor33 &dFluxTdF = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxTdF()); - const STensor33 &dFluxVdF = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxVdF()); - const double w = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefToThermalSource()); - const double dwdt = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodThermalSourcedT()); - const STensor3 &dwdF = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodThermalSourcedF()); - /*const double dwdV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodThermalSourcedV()); - const SVector3 &dwdGradT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodThermalSourcedGradT()); - const SVector3 &dwdGradV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodThermalSourcedGradV());*/ - - const STensor33 &djydF = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxEnergydF()); - const STensor3 &djydGradT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxEnergydGradT()); - const SVector3 &djydT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxEnergydT()); - const STensor3 &djydGradV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxEnergydGradV()); - const SVector3 &djydV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxEnergydV()); - const SVector3 &fluxjy = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefToFluxEnergy()); - - const STensor3 &dgardVdgradfV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodgradVdgradfV()); - const STensor3 &dgardVdgradfT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodgradVdgradfT()); - const STensor3 &dgardTdgradfT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodgradTdgradfT()); - const STensor3 &dgardTdgradfV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodgradTdgradfV()); - - const double dVdfV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodVdfV()); - const double dVdfT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodVdfT()); - const double dTdfT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodTdfT()); - const double dTdfV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodTdfV()); - - const SVector3 &dgradVdfV=((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodgradVdfV()); - const SVector3 &dgradVdfT=((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodgradVdfT()); - const SVector3 &dgradTdfT=((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodgradTdfT()); - const SVector3 &dgradTdfV=((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodgradTdfV()); - - double eqRatio = _ElecTherMechEqRatio; - - const std::vector<TensorialTraits<double>::GradType> &Grads = vipv[i]->gradf(&space1,ele,GP[i]); - const std::vector<TensorialTraits<double>::ValType> &Vals = vipv[i]->f(&space1,ele,GP[i]); + static SVector3 Bepsbar4; + static SVector3 Bepsbar3; + static SVector3 Aepsbar4; + static SVector3 Aepsbar3; + static SVector3 newB; + static SVector3 newA; - const int threeTimesNbFF = 3*nbFF; - const int fourTimesNbFF = 4*nbFF; - for(int j=0;j<nbFF; j++) - { - newA(0) = Grads[j][0]; - newA(1) = Grads[j][1]; - newA(2) = Grads[j][2]; - - Aepsbar4(0) = Grads[j+fourTimesNbFF][0]; - Aepsbar4(1) = Grads[j+fourTimesNbFF][1]; - Aepsbar4(2) = Grads[j+fourTimesNbFF][2]; - - Aepsbar3(0) = Grads[j+threeTimesNbFF][0]; - Aepsbar3(1) = Grads[j+threeTimesNbFF][1]; - Aepsbar3(2) = Grads[j+threeTimesNbFF][2]; - - for(int k=0;k<nbFF;k++){ - double ratio = detJ*weight; - // x y z - newB(0) = Grads[k][0]; - newB(1) = Grads[k][1]; - newB(2) = Grads[k][2]; - - Bepsbar4(0) = Grads[k+fourTimesNbFF][0]; - Bepsbar4(1) = Grads[k+fourTimesNbFF][1]; - Bepsbar4(2) = Grads[k+fourTimesNbFF][2]; - - Bepsbar3(0) = Grads[k+threeTimesNbFF][0]; - Bepsbar3(1) = Grads[k+threeTimesNbFF][1]; - Bepsbar3(2) = Grads[k+threeTimesNbFF][2]; - - // pure thermal dfint dt - for(int m=0; m<3; m++) - { - mStiff(j+threeTimesNbFF,k+threeTimesNbFF)+=eqRatio*ratio*Aepsbar3(m)*(djydT.operator()(m)*dTdfT+djydV.operator()(m)*dVdfT)*Vals[k+threeTimesNbFF]; - for(int n=0; n<3; n++) - { - mStiff(j+threeTimesNbFF,k+threeTimesNbFF)+=eqRatio*ratio*Aepsbar3(m)*(djydGradT.operator()(m,n)*dgradTdfT.operator()(n) - +djydGradV.operator()(m,n)*dgradVdfT.operator()(n))*Vals[k+threeTimesNbFF]; - for(int p=0; p<3; p++) - { - mStiff(j+threeTimesNbFF,k+threeTimesNbFF)+=eqRatio*ratio*Aepsbar3(m)*(djydGradT.operator()(m,p)*dgardTdgradfT.operator()(p,n)+ - djydGradV.operator()(m,p)*dgardVdgradfT.operator()(p,n))*Bepsbar3(n); - } - } - } - mStiff(j+threeTimesNbFF,k+threeTimesNbFF)+=eqRatio*ratio*dwdt*dTdfT*Vals[j+threeTimesNbFF]*Vals[k+threeTimesNbFF];// related to cp - - - //dfintdv!! - for(int m=0; m<3; m++) - { - mStiff(j+threeTimesNbFF,k+fourTimesNbFF)+=eqRatio*ratio*Aepsbar3(m)*(djydT.operator()(m)*dTdfV+djydV.operator()(m)*dVdfV)*Vals[k+fourTimesNbFF]; - for(int n=0; n<3; n++) - { - mStiff(j+threeTimesNbFF,k+fourTimesNbFF)+=eqRatio*ratio*Aepsbar3(m)*(djydGradT.operator()(m,n)*dgradTdfV.operator()(n) - +djydGradV.operator()(m,n)*dgradVdfV.operator()(n))*Vals[k+fourTimesNbFF]; - for(int p=0; p<3; p++) - { - mStiff(j+threeTimesNbFF,k+fourTimesNbFF)+=eqRatio*ratio*Aepsbar3(m)*(djydGradV.operator()(m,p)*dgardVdgradfV.operator()(p,n) - +djydGradT.operator()(m,p)*dgardTdgradfV.operator()(p,n))*Bepsbar4(n); - } - } - } - - // pure electrical dfinvdv!! - for(int m=0; m<3; m++) - { - mStiff(j+fourTimesNbFF,k+fourTimesNbFF)+=eqRatio*ratio*Aepsbar4(m)*(dFluxVdV.operator()(m)*dVdfV+ - dFluxVdT.operator()(m)*dTdfV)*Vals[k+fourTimesNbFF]; - for(int n=0; n<3; n++) - { - mStiff(j+fourTimesNbFF,k+fourTimesNbFF)+=eqRatio*ratio*Aepsbar4(m)*(dFluxVdGradV.operator()(m,n)*dgradVdfV.operator()(n)+ - dFluxVdGradT.operator()(m,n)*dgradTdfV.operator()(n))*Vals[k+fourTimesNbFF]; - for(int p=0; p<3; p++) - { - mStiff(j+fourTimesNbFF,k+fourTimesNbFF)+=eqRatio*ratio*Aepsbar4(m)*(dFluxVdGradV.operator()(m,p)*dgardVdgradfV.operator()(p,n)+ - dFluxVdGradT.operator()(m,p)*dgardTdgradfV.operator()(p,n))*Bepsbar4(n); - } - } - } - //dfinvdt - for(int m=0; m<3; m++) - { - mStiff(j+fourTimesNbFF,k+threeTimesNbFF)+=eqRatio*ratio*Aepsbar4(m)*(dFluxVdT.operator()(m)*dTdfT+ - dFluxVdV.operator()(m)*dVdfT)*Vals[k+threeTimesNbFF]; - for(int n=0; n<3; n++) - { - mStiff(j+fourTimesNbFF,k+threeTimesNbFF)+=eqRatio*ratio*Aepsbar4(m)*(dFluxVdGradT.operator()(m,n)*dgradTdfT.operator()(n)+ - dFluxVdGradV.operator()(m,n)*dgradVdfT.operator()(n))*Vals[k+threeTimesNbFF]; - - for(int p=0; p<3; p++) - { - mStiff(j+fourTimesNbFF,k+threeTimesNbFF)+=eqRatio*ratio*Aepsbar4(m)*(dFluxVdGradT.operator()(m,p)*dgardTdgradfT.operator()(p,n)+ - dFluxVdGradV.operator()(m,p)*dgardVdgradfT.operator()(p,n))*Bepsbar3(n); - } - } - } + if(_useFtFv==true) + { + for (int i = 0; i < npts; i++) + { + double weight = GP[i].weight; + double &detJ = vipv[i]->getJacobianDeterminant(ele,GP[i]); + // x, y, z + const STensor3 &dFluxVdGradV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxVdGradV()); + const SVector3 &dFluxVdV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxVdV()); + const STensor3 &dFluxVdGradT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxVdGradT()); + const SVector3 &dFluxVdT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxVdT()); + const SVector3 &dFluxTdT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxTdT()); + const STensor3 &dFluxTdGradT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxTdGradT()); + const SVector3 &dFluxTdV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxTdV()); + const STensor3 &dFluxTdGradV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxTdGradV()); + const STensor3 &dPdV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodPdV()); + const STensor3 &dPdT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodPdT()); + const SVector3 &gradV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefToGradV()); + const SVector3 &FluxV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefToFluxV()); + const STensor33 &dFluxTdF = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxTdF()); + const STensor33 &dFluxVdF = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxVdF()); + const double w = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefToThermalSource()); + const double dwdt = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodThermalSourcedT()); + const STensor3 &dwdF = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodThermalSourcedF()); + /*const double dwdV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodThermalSourcedV()); + const SVector3 &dwdGradT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodThermalSourcedGradT()); + const SVector3 &dwdGradV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodThermalSourcedGradV());*/ + + const STensor33 &djydF = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxEnergydF()); + const STensor3 &djydGradT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxEnergydGradT()); + const SVector3 &djydT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxEnergydT()); + const STensor3 &djydGradV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxEnergydGradV()); + const SVector3 &djydV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxEnergydV()); + const SVector3 &fluxjy = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefToFluxEnergy()); + + const STensor3 &dgardVdgradfV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodgradVdgradfV()); + const STensor3 &dgardVdgradfT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodgradVdgradfT()); + const STensor3 &dgardTdgradfT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodgradTdgradfT()); + const STensor3 &dgardTdgradfV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodgradTdgradfV()); + + const double dVdfV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodVdfV()); + const double dVdfT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodVdfT()); + const double dTdfT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodTdfT()); + const double dTdfV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodTdfV()); + + const SVector3 &dgradVdfV=((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodgradVdfV()); + const SVector3 &dgradVdfT=((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodgradVdfT()); + const SVector3 &dgradTdfT=((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodgradTdfT()); + const SVector3 &dgradTdfV=((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodgradTdfV()); - // cross terms - for(int kk=0;kk<3;kk++) - { + double eqRatio = _ElecTherMechEqRatio; + + const std::vector<TensorialTraits<double>::GradType> &Grads = vipv[i]->gradf(&space1,ele,GP[i]); + const std::vector<TensorialTraits<double>::ValType> &Vals = vipv[i]->f(&space1,ele,GP[i]); + + const int threeTimesNbFF = 3*nbFF; + const int fourTimesNbFF = 4*nbFF; + for(int j=0;j<nbFF; j++) + { + newA(0) = Grads[j][0]; + newA(1) = Grads[j][1]; + newA(2) = Grads[j][2]; + + Aepsbar4(0) = Grads[j+fourTimesNbFF][0]; + Aepsbar4(1) = Grads[j+fourTimesNbFF][1]; + Aepsbar4(2) = Grads[j+fourTimesNbFF][2]; + + Aepsbar3(0) = Grads[j+threeTimesNbFF][0]; + Aepsbar3(1) = Grads[j+threeTimesNbFF][1]; + Aepsbar3(2) = Grads[j+threeTimesNbFF][2]; + + for(int k=0;k<nbFF;k++){ + double ratio = detJ*weight; + // x y z + newB(0) = Grads[k][0]; + newB(1) = Grads[k][1]; + newB(2) = Grads[k][2]; + + Bepsbar4(0) = Grads[k+fourTimesNbFF][0]; + Bepsbar4(1) = Grads[k+fourTimesNbFF][1]; + Bepsbar4(2) = Grads[k+fourTimesNbFF][2]; + + Bepsbar3(0) = Grads[k+threeTimesNbFF][0]; + Bepsbar3(1) = Grads[k+threeTimesNbFF][1]; + Bepsbar3(2) = Grads[k+threeTimesNbFF][2]; + + // pure thermal dfint dt + for(int m=0; m<3; m++) + { + mStiff(j+threeTimesNbFF,k+threeTimesNbFF)+=eqRatio*ratio*Aepsbar3(m)*(djydT.operator()(m)*dTdfT+djydV.operator()(m)*dVdfT)*Vals[k+threeTimesNbFF]; + for(int n=0; n<3; n++) + { + mStiff(j+threeTimesNbFF,k+threeTimesNbFF)+=eqRatio*ratio*Aepsbar3(m)*(djydGradT.operator()(m,n)*dgradTdfT.operator()(n) + +djydGradV.operator()(m,n)*dgradVdfT.operator()(n))*Vals[k+threeTimesNbFF]; + for(int p=0; p<3; p++) + { + mStiff(j+threeTimesNbFF,k+threeTimesNbFF)+=eqRatio*ratio*Aepsbar3(m)*(djydGradT.operator()(m,p)*dgardTdgradfT.operator()(p,n)+ + djydGradV.operator()(m,p)*dgardVdgradfT.operator()(p,n))*Bepsbar3(n); + } + } + } + mStiff(j+threeTimesNbFF,k+threeTimesNbFF)+=eqRatio*ratio*dwdt*dTdfT*Vals[j+threeTimesNbFF]*Vals[k+threeTimesNbFF];// related to cp + + + //dfintdv!! for(int m=0; m<3; m++) { - mStiff(j+kk*nbFF,k+fourTimesNbFF) += ratio*(newA(m)*(dPdV.operator()(kk,m)*dVdfV+dPdT.operator()(kk,m)*dTdfV)*Vals[k+fourTimesNbFF]); //dpdv - mStiff(j+kk*nbFF,k+threeTimesNbFF) += ratio*(newA(m)*(dPdT.operator()(kk,m)*dTdfT+dPdV.operator()(kk,m)*dVdfT)*Vals[k+threeTimesNbFF]); //dpdT + mStiff(j+threeTimesNbFF,k+fourTimesNbFF)+=eqRatio*ratio*Aepsbar3(m)*(djydT.operator()(m)*dTdfV+djydV.operator()(m)*dVdfV)*Vals[k+fourTimesNbFF]; + for(int n=0; n<3; n++) + { + mStiff(j+threeTimesNbFF,k+fourTimesNbFF)+=eqRatio*ratio*Aepsbar3(m)*(djydGradT.operator()(m,n)*dgradTdfV.operator()(n) + +djydGradV.operator()(m,n)*dgradVdfV.operator()(n))*Vals[k+fourTimesNbFF]; + for(int p=0; p<3; p++) + { + mStiff(j+threeTimesNbFF,k+fourTimesNbFF)+=eqRatio*ratio*Aepsbar3(m)*(djydGradV.operator()(m,p)*dgardVdgradfV.operator()(p,n) + +djydGradT.operator()(m,p)*dgardTdgradfV.operator()(p,n))*Bepsbar4(n); + } + } + } + // pure electrical dfinvdv!! + for(int m=0; m<3; m++) + { + mStiff(j+fourTimesNbFF,k+fourTimesNbFF)+=eqRatio*ratio*Aepsbar4(m)*(dFluxVdV.operator()(m)*dVdfV+ + dFluxVdT.operator()(m)*dTdfV)*Vals[k+fourTimesNbFF]; + for(int n=0; n<3; n++) + { + mStiff(j+fourTimesNbFF,k+fourTimesNbFF)+=eqRatio*ratio*Aepsbar4(m)*(dFluxVdGradV.operator()(m,n)*dgradVdfV.operator()(n)+ + dFluxVdGradT.operator()(m,n)*dgradTdfV.operator()(n))*Vals[k+fourTimesNbFF]; + for(int p=0; p<3; p++) + { + mStiff(j+fourTimesNbFF,k+fourTimesNbFF)+=eqRatio*ratio*Aepsbar4(m)*(dFluxVdGradV.operator()(m,p)*dgardVdgradfV.operator()(p,n)+ + dFluxVdGradT.operator()(m,p)*dgardTdgradfV.operator()(p,n))*Bepsbar4(n); + } + } + } + //dfinvdt + for(int m=0; m<3; m++) + { + mStiff(j+fourTimesNbFF,k+threeTimesNbFF)+=eqRatio*ratio*Aepsbar4(m)*(dFluxVdT.operator()(m)*dTdfT+ + dFluxVdV.operator()(m)*dVdfT)*Vals[k+threeTimesNbFF]; for(int n=0; n<3; n++) - { - mStiff(j+fourTimesNbFF,k+kk*nbFF) += eqRatio*ratio*(Aepsbar4(m)*dFluxVdF.operator()(m,kk,n)*newB(n)); - mStiff(j+threeTimesNbFF,k+kk*nbFF) += eqRatio*ratio*(Aepsbar3(m)*djydF.operator()(m,kk,n)*newB(n)); - // mStiff(j+threeTimesNbFF,k+kk*nbFF) -= eqRatio*ratio*(gradV(m)*dFluxVdF.operator()(m,kk,n)*newB(n)*Vals[j+threeTimesNbFF]); //before combining with w - } - mStiff(j+threeTimesNbFF,k+kk*nbFF) += eqRatio*ratio*(newB(m)*dwdF.operator()(kk,m)*Vals[j+threeTimesNbFF]); // related to cp + { + mStiff(j+fourTimesNbFF,k+threeTimesNbFF)+=eqRatio*ratio*Aepsbar4(m)*(dFluxVdGradT.operator()(m,n)*dgradTdfT.operator()(n)+ + dFluxVdGradV.operator()(m,n)*dgradVdfT.operator()(n))*Vals[k+threeTimesNbFF]; + + for(int p=0; p<3; p++) + { + mStiff(j+fourTimesNbFF,k+threeTimesNbFF)+=eqRatio*ratio*Aepsbar4(m)*(dFluxVdGradT.operator()(m,p)*dgardTdgradfT.operator()(p,n)+ + dFluxVdGradV.operator()(m,p)*dgardVdgradfT.operator()(p,n))*Bepsbar3(n); + } + } + } + + // cross terms + for(int kk=0;kk<3;kk++) + { + for(int m=0; m<3; m++) + { + mStiff(j+kk*nbFF,k+fourTimesNbFF) += ratio*(newA(m)*(dPdV.operator()(kk,m)*dVdfV+dPdT.operator()(kk,m)*dTdfV)*Vals[k+fourTimesNbFF]); //dpdv + mStiff(j+kk*nbFF,k+threeTimesNbFF) += ratio*(newA(m)*(dPdT.operator()(kk,m)*dTdfT+dPdV.operator()(kk,m)*dVdfT)*Vals[k+threeTimesNbFF]); //dpdT + + for(int n=0; n<3; n++) + { + mStiff(j+fourTimesNbFF,k+kk*nbFF) += eqRatio*ratio*(Aepsbar4(m)*dFluxVdF.operator()(m,kk,n)*newB(n)); + mStiff(j+threeTimesNbFF,k+kk*nbFF) += eqRatio*ratio*(Aepsbar3(m)*djydF.operator()(m,kk,n)*newB(n)); + // mStiff(j+threeTimesNbFF,k+kk*nbFF) -= eqRatio*ratio*(gradV(m)*dFluxVdF.operator()(m,kk,n)*newB(n)*Vals[j+threeTimesNbFF]); //before combining with w + } + mStiff(j+threeTimesNbFF,k+kk*nbFF) += eqRatio*ratio*(newB(m)*dwdF.operator()(kk,m)*Vals[j+threeTimesNbFF]); // related to cp + } } } } } } + else + { + for (int i = 0; i < npts; i++) + { + double weight = GP[i].weight; + double &detJ = vipv[i]->getJacobianDeterminant(ele,GP[i]); + // x, y, z + const STensor3 &dFluxVdGradV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxVdGradV()); + const SVector3 &dFluxVdV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxVdV()); + const STensor3 &dFluxVdGradT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxVdGradT()); + const SVector3 &dFluxVdT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxVdT()); + const STensor3 &dPdV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodPdV()); + const STensor3 &dPdT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodPdT()); + const SVector3 &gradV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefToGradV()); + const SVector3 &FluxV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefToFluxV()); + const STensor33 &dFluxVdF = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxVdF()); + const double w = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefToThermalSource()); + const double dwdt = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodThermalSourcedT()); + const STensor3 &dwdF = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodThermalSourcedF()); + const STensor33 &djydF = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxEnergydF()); + const STensor3 &djydGradT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxEnergydGradT()); + const SVector3 &djydT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxEnergydT()); + const STensor3 &djydGradV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxEnergydGradV()); + const SVector3 &djydV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxEnergydV()); + const SVector3 &fluxjy = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefToFluxEnergy()); - } - else - { - for (int i = 0; i < npts; i++) - { - double weight = GP[i].weight; - - double &detJ = vipv[i]->getJacobianDeterminant(ele,GP[i]); - // x, y, z - const STensor3 &dFluxVdGradV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxVdGradV()); - const SVector3 &dFluxVdV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxVdV()); - const STensor3 &dFluxVdGradT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxVdGradT()); - const SVector3 &dFluxVdT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxVdT()); - const STensor3 &dPdV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodPdV()); - const STensor3 &dPdT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodPdT()); - const SVector3 &gradV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefToGradV()); - const SVector3 &FluxV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefToFluxV()); - const STensor33 &dFluxVdF = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxVdF()); - const double w = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefToThermalSource()); - const double dwdt = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodThermalSourcedT()); - const STensor3 &dwdF = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodThermalSourcedF()); - const STensor33 &djydF = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxEnergydF()); - const STensor3 &djydGradT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxEnergydGradT()); - const SVector3 &djydT = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxEnergydT()); - const STensor3 &djydGradV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxEnergydGradV()); - const SVector3 &djydV = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefTodFluxEnergydV()); - const SVector3 &fluxjy = ((static_cast <const ElecTherMechDG3DIPVariableBase * > (vipv[i]))->getConstRefToFluxEnergy()); - - double eqRatio = _ElecTherMechEqRatio; - - const std::vector<TensorialTraits<double>::GradType> &Grads = vipv[i]->gradf(&space1,ele,GP[i]); - const std::vector<TensorialTraits<double>::ValType> &Vals = vipv[i]->f(&space1,ele,GP[i]); + double eqRatio = _ElecTherMechEqRatio; - const int threeTimesNbFF = 3*nbFF; - const int fourTimesNbFF = 4*nbFF; - for(int j=0;j<nbFF; j++) - { - newA(0) = Grads[j][0]; - newA(1) = Grads[j][1]; - newA(2) = Grads[j][2]; - - Aepsbar4(0) = Grads[j+fourTimesNbFF][0]; - Aepsbar4(1) = Grads[j+fourTimesNbFF][1]; - Aepsbar4(2) = Grads[j+fourTimesNbFF][2]; - - Aepsbar3(0) = Grads[j+threeTimesNbFF][0]; - Aepsbar3(1) = Grads[j+threeTimesNbFF][1]; - Aepsbar3(2) = Grads[j+threeTimesNbFF][2]; - - for(int k=0;k<nbFF;k++){ - double ratio = detJ*weight; - // x y z - newB(0) = Grads[k][0]; - newB(1) = Grads[k][1]; - newB(2) = Grads[k][2]; - - Bepsbar4(0) = Grads[k+fourTimesNbFF][0]; - Bepsbar4(1) = Grads[k+fourTimesNbFF][1]; - Bepsbar4(2) = Grads[k+fourTimesNbFF][2]; - - Bepsbar3(0) = Grads[k+threeTimesNbFF][0]; - Bepsbar3(1) = Grads[k+threeTimesNbFF][1]; - Bepsbar3(2) = Grads[k+threeTimesNbFF][2]; - - // pure thermal dfint dt - for(int m=0; m<3; m++) - { - mStiff(j+threeTimesNbFF,k+threeTimesNbFF)+=eqRatio*ratio*(Aepsbar3(m)*djydT.operator()(m)*Vals[k+threeTimesNbFF]); - for(int n=0; n<3; n++) - { - mStiff(j+threeTimesNbFF,k+threeTimesNbFF)+=eqRatio*ratio*(Aepsbar3(m)*djydGradT.operator()(m,n)*Bepsbar3(n)); - } - } - mStiff(j+threeTimesNbFF,k+threeTimesNbFF)+=eqRatio*ratio*dwdt*Vals[j+threeTimesNbFF]*Vals[k+threeTimesNbFF];// related to cp - - - /* for(int n=0; n<3; n++) - { - mStiff(j+threeTimesNbFF,k+threeTimesNbFF)+=eqRatio*ratio*(dwdGradT.operator()(n)*Bepsbar3(n))*Vals[j+threeTimesNbFF]; // new related to w - }*/ - - - //dfintdv - for(int m=0; m<3; m++) - { - mStiff(j+threeTimesNbFF,k+fourTimesNbFF)+=eqRatio*ratio*(Aepsbar3(m)*djydV.operator()(m)*Vals[k+fourTimesNbFF]); - for(int n=0; n<3; n++) - { - mStiff(j+threeTimesNbFF,k+fourTimesNbFF)+=eqRatio*ratio*(Aepsbar3(m)*djydGradV.operator()(m,n)*Bepsbar4(n)); - } - } - - /* for(int m=0; m<3; m++) - { - mStiff(j+threeTimesNbFF,k+fourTimesNbFF)+=eqRatio*ratio*(dwdV*Vals[k+fourTimesNbFF]*Vals[j+threeTimesNbFF]);//new related to w - for(int n=0; n<3; n++) - { - mStiff(j+threeTimesNbFF,k+fourTimesNbFF)+=eqRatio*ratio*(dwdGradV.operator()(n)*Bepsbar4(n)*Vals[j+threeTimesNbFF]);//new related to w - } - }*/ - - - // pure electrical dfintvdv - for(int m=0; m<3; m++) - { - mStiff(j+fourTimesNbFF,k+fourTimesNbFF)+=eqRatio*ratio*(Aepsbar4(m)*dFluxVdV.operator()(m)*Vals[k+fourTimesNbFF]); - for(int n=0; n<3; n++) - { - mStiff(j+fourTimesNbFF,k+fourTimesNbFF)+=eqRatio*ratio*(Aepsbar4(m)*dFluxVdGradV.operator()(m,n)*Bepsbar4(n)); - } - } - //dfintvdt + const std::vector<TensorialTraits<double>::GradType> &Grads = vipv[i]->gradf(&space1,ele,GP[i]); + const std::vector<TensorialTraits<double>::ValType> &Vals = vipv[i]->f(&space1,ele,GP[i]); + + const int threeTimesNbFF = 3*nbFF; + const int fourTimesNbFF = 4*nbFF; + for(int j=0;j<nbFF; j++) + { + newA(0) = Grads[j][0]; + newA(1) = Grads[j][1]; + newA(2) = Grads[j][2]; + + Aepsbar4(0) = Grads[j+fourTimesNbFF][0]; + Aepsbar4(1) = Grads[j+fourTimesNbFF][1]; + Aepsbar4(2) = Grads[j+fourTimesNbFF][2]; + + Aepsbar3(0) = Grads[j+threeTimesNbFF][0]; + Aepsbar3(1) = Grads[j+threeTimesNbFF][1]; + Aepsbar3(2) = Grads[j+threeTimesNbFF][2]; + + for(int k=0;k<nbFF;k++){ + double ratio = detJ*weight; + // x y z + newB(0) = Grads[k][0]; + newB(1) = Grads[k][1]; + newB(2) = Grads[k][2]; + + Bepsbar4(0) = Grads[k+fourTimesNbFF][0]; + Bepsbar4(1) = Grads[k+fourTimesNbFF][1]; + Bepsbar4(2) = Grads[k+fourTimesNbFF][2]; + + Bepsbar3(0) = Grads[k+threeTimesNbFF][0]; + Bepsbar3(1) = Grads[k+threeTimesNbFF][1]; + Bepsbar3(2) = Grads[k+threeTimesNbFF][2]; + + // pure thermal dfint dt for(int m=0; m<3; m++) - { - mStiff(j+fourTimesNbFF,k+threeTimesNbFF)+=eqRatio*ratio*(Aepsbar4(m)*dFluxVdT.operator()(m)*Vals[k+threeTimesNbFF]); - for(int n=0; n<3; n++) - { - mStiff(j+fourTimesNbFF,k+threeTimesNbFF)+=eqRatio*ratio*(Aepsbar4(m)*dFluxVdGradT.operator()(m,n)*Bepsbar3(n)); - } - } - // cross terms - for(int kk=0;kk<3;kk++) - { - for(int m=0; m<3; m++) - { - mStiff(j+kk*nbFF,k+fourTimesNbFF) += ratio*(newA(m)*dPdV.operator()(kk,m)*Vals[k+fourTimesNbFF]); - mStiff(j+kk*nbFF,k+threeTimesNbFF) += ratio*(newA(m)*dPdT.operator()(kk,m)*Vals[k+threeTimesNbFF]); - - for(int n=0; n<3; n++) - { - mStiff(j+fourTimesNbFF,k+kk*nbFF) += eqRatio*ratio*(Aepsbar4(m)*dFluxVdF.operator()(m,kk,n)*newB(n)); - mStiff(j+threeTimesNbFF,k+kk*nbFF) += eqRatio*ratio*(Aepsbar3(m)*djydF.operator()(m,kk,n)*newB(n)); - //mStiff(j+threeTimesNbFF,k+kk*nbFF) -= eqRatio*ratio*(gradV(m)*dFluxVdF.operator()(m,kk,n)*newB(n)*Vals[j+threeTimesNbFF]); //before combining with w - } - mStiff(j+threeTimesNbFF,k+kk*nbFF)+=eqRatio*ratio*(newB(m)*dwdF.operator()(kk,m)*Vals[j+threeTimesNbFF]); // related to cp - } - } - } - } - } - } + { + mStiff(j+threeTimesNbFF,k+threeTimesNbFF)+=eqRatio*ratio*(Aepsbar3(m)*djydT.operator()(m)*Vals[k+threeTimesNbFF]); + for(int n=0; n<3; n++) + { + mStiff(j+threeTimesNbFF,k+threeTimesNbFF)+=eqRatio*ratio*(Aepsbar3(m)*djydGradT.operator()(m,n)*Bepsbar3(n)); + } + } + mStiff(j+threeTimesNbFF,k+threeTimesNbFF)+=eqRatio*ratio*dwdt*Vals[j+threeTimesNbFF]*Vals[k+threeTimesNbFF];// related to cp + + + /* for(int n=0; n<3; n++) + { + mStiff(j+threeTimesNbFF,k+threeTimesNbFF)+=eqRatio*ratio*(dwdGradT.operator()(n)*Bepsbar3(n))*Vals[j+threeTimesNbFF]; // new related to w + }*/ + + + //dfintdv + for(int m=0; m<3; m++) + { + mStiff(j+threeTimesNbFF,k+fourTimesNbFF)+=eqRatio*ratio*(Aepsbar3(m)*djydV.operator()(m)*Vals[k+fourTimesNbFF]); + for(int n=0; n<3; n++) + { + mStiff(j+threeTimesNbFF,k+fourTimesNbFF)+=eqRatio*ratio*(Aepsbar3(m)*djydGradV.operator()(m,n)*Bepsbar4(n)); + } + } + + /* for(int m=0; m<3; m++) + { + mStiff(j+threeTimesNbFF,k+fourTimesNbFF)+=eqRatio*ratio*(dwdV*Vals[k+fourTimesNbFF]*Vals[j+threeTimesNbFF]);//new related to w + for(int n=0; n<3; n++) + { + mStiff(j+threeTimesNbFF,k+fourTimesNbFF)+=eqRatio*ratio*(dwdGradV.operator()(n)*Bepsbar4(n)*Vals[j+threeTimesNbFF]);//new related to w + } + }*/ + + + // pure electrical dfintvdv + for(int m=0; m<3; m++) + { + mStiff(j+fourTimesNbFF,k+fourTimesNbFF)+=eqRatio*ratio*(Aepsbar4(m)*dFluxVdV.operator()(m)*Vals[k+fourTimesNbFF]); + for(int n=0; n<3; n++) + { + mStiff(j+fourTimesNbFF,k+fourTimesNbFF)+=eqRatio*ratio*(Aepsbar4(m)*dFluxVdGradV.operator()(m,n)*Bepsbar4(n)); + } + } + //dfintvdt + for(int m=0; m<3; m++) + { + mStiff(j+fourTimesNbFF,k+threeTimesNbFF)+=eqRatio*ratio*(Aepsbar4(m)*dFluxVdT.operator()(m)*Vals[k+threeTimesNbFF]); + for(int n=0; n<3; n++) + { + mStiff(j+fourTimesNbFF,k+threeTimesNbFF)+=eqRatio*ratio*(Aepsbar4(m)*dFluxVdGradT.operator()(m,n)*Bepsbar3(n)); + } + } + // cross terms + for(int kk=0;kk<3;kk++) + { + for(int m=0; m<3; m++) + { + mStiff(j+kk*nbFF,k+fourTimesNbFF) += ratio*(newA(m)*dPdV.operator()(kk,m)*Vals[k+fourTimesNbFF]); + mStiff(j+kk*nbFF,k+threeTimesNbFF) += ratio*(newA(m)*dPdT.operator()(kk,m)*Vals[k+threeTimesNbFF]); + + for(int n=0; n<3; n++) + { + mStiff(j+fourTimesNbFF,k+kk*nbFF) += eqRatio*ratio*(Aepsbar4(m)*dFluxVdF.operator()(m,kk,n)*newB(n)); + mStiff(j+threeTimesNbFF,k+kk*nbFF) += eqRatio*ratio*(Aepsbar3(m)*djydF.operator()(m,kk,n)*newB(n)); + //mStiff(j+threeTimesNbFF,k+kk*nbFF) -= eqRatio*ratio*(gradV(m)*dFluxVdF.operator()(m,kk,n)*newB(n)*Vals[j+threeTimesNbFF]); //before combining with w + } + mStiff(j+threeTimesNbFF,k+kk*nbFF)+=eqRatio*ratio*(newB(m)*dwdF.operator()(kk,m)*Vals[j+threeTimesNbFF]); // related to cp + } + } + } + } + } + } //mStiff.print("bulk"); } else @@ -3013,21 +2705,13 @@ void ElecTherMechDG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fullVec if( _continuity) { // get value at gauss's point - AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); + const AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); // value on minus and plus elements IntPt *GPm; IntPt *GPp; _interQuad->getIntPoints(ie,GP,&GPm,&GPp); - // Val, grad and detJ at all Gauss points - std::vector<std::vector<TensorialTraits<double>::GradType> >vgradsuvw; - - _minusSpace->getgradfuvw(ele,npts,GP,vgradsuvw); // create a special function space ?? // loop on Gauss Point for(int i=0;i<npts; i++) { - - const double weight = GP[i].weight; - - double detJ = ele->getJacobian(vgradsuvw[i], jac); // IP const IPStateBase *ipsm = (*vips)[i]; const IPStateBase *ipsp = (*vips)[i+npts]; @@ -3035,10 +2719,10 @@ void ElecTherMechDG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fullVec const ElecTherMechDG3DIPVariableBase *ipvp; if(_mlawMinus->getType() == materialLaw::fracture ) { - FractureCohesive3DIPVariable* ipvtmp = static_cast<FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::current)); - ipvm = static_cast<ElecTherMechDG3DIPVariableBase*>(ipvtmp->getIPvBulk()); - ipvtmp = static_cast<FractureCohesive3DIPVariable*>(ipsp->getState(IPStateBase::current)); - ipvp = static_cast<ElecTherMechDG3DIPVariableBase*>(ipvtmp->getIPvBulk()); + const FractureCohesive3DIPVariable* ipvtmp = static_cast<const FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::current)); + ipvm = static_cast<const ElecTherMechDG3DIPVariableBase*>(ipvtmp->getIPvBulk()); + ipvtmp = static_cast<const FractureCohesive3DIPVariable*>(ipsp->getState(IPStateBase::current)); + ipvp = static_cast<const ElecTherMechDG3DIPVariableBase*>(ipvtmp->getIPvBulk()); } else { @@ -3047,99 +2731,100 @@ void ElecTherMechDG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fullVec } - if(_useFtFv==true) - { - - const SVector3 &referenceOutwardNormalm = ipvm->getConstRefToReferenceOutwardNormal(); - //const SVector3 &CurrentOutwardNormalm = ipvm->getConstRefToCurrentOutwardNormal(); + const double weight = GP[i].weight; + double detJ = ipvm->getJacobianDeterminant(ie,GP[i]); - const SVector3 &referenceOutwardNormalp = ipvp->getConstRefToReferenceOutwardNormal(); - const double &ftJump =ipvp->getConstRefTofTJump(); - const double &fvJump =ipvp->getConstRefTofvJump(); - const STensor3 &l10m = (ipvm->getConstRefToElecConductivity()); - const STensor3 &l10p = (ipvp->getConstRefToElecConductivity()); + if(_useFtFv) + { - const STensor3 &l20m = (ipvm->getConstRefToCrossElecConductivity()); - const STensor3 &l20p = (ipvp->getConstRefToCrossElecConductivity()); + const SVector3 &referenceOutwardNormalm = ipvm->getConstRefToReferenceOutwardNormal(); + const SVector3 &referenceOutwardNormalp = ipvp->getConstRefToReferenceOutwardNormal(); - const SVector3 &fluxVm = (ipvm->getConstRefToFluxV()); - const SVector3 &fluxVp = (ipvp->getConstRefToFluxV()); + const double &ftJump =ipvp->getConstRefTofTJump(); + const double &fvJump =ipvp->getConstRefTofvJump(); - const STensor3 &jy1m = (ipvm->getConstRefToEnergyConductivity()); - const STensor3 &jy1p = (ipvp->getConstRefToEnergyConductivity()); - const SVector3 &fluxjym= (ipvm->getConstRefToFluxEnergy()); - const SVector3 &fluxjyp= (ipvp->getConstRefToFluxEnergy()); + const STensor3 &l10m = (ipvm->getConstRefToElecConductivity()); + const STensor3 &l10p = (ipvp->getConstRefToElecConductivity()); + const STensor3 &l20m = (ipvm->getConstRefToCrossElecConductivity()); + const STensor3 &l20p = (ipvp->getConstRefToCrossElecConductivity()); + const SVector3 &fluxVm = (ipvm->getConstRefToFluxV()); + const SVector3 &fluxVp = (ipvp->getConstRefToFluxV()); - static STensor3 Stiff_alphadialitationm; - Stiff_alphadialitationm = ipvm->getConstRefToStiff_alphaDilatation(); - static STensor3 Stiff_alphadialitationp; - Stiff_alphadialitationp = ipvp->getConstRefToStiff_alphaDilatation(); + const STensor3 &jy1m = (ipvm->getConstRefToEnergyConductivity()); + const STensor3 &jy1p = (ipvp->getConstRefToEnergyConductivity()); + const SVector3 &fluxjym= (ipvm->getConstRefToFluxEnergy()); + const SVector3 &fluxjyp= (ipvp->getConstRefToFluxEnergy()); - const double &fTp = ipvp->getConstRefTofT(); - const double &fTm = ipvm->getConstRefTofT(); - Stiff_alphadialitationm*= (-1.)/(fTm*fTm); - Stiff_alphadialitationp*= (-1.)/(fTp*fTp); - const SVector3 &jump = ipvp->getConstRefToJump(); + static STensor3 Stiff_alphadialitationm; + Stiff_alphadialitationm = ipvm->getConstRefToStiff_alphaDilatation(); + static STensor3 Stiff_alphadialitationp; + Stiff_alphadialitationp = ipvp->getConstRefToStiff_alphaDilatation(); - //double length = _mlaw->getLength(); - double eqRatio = _ElecTherMechEqRatio; + const double &fTp = ipvp->getConstRefTofT(); + const double &fTm = ipvm->getConstRefTofT(); - const std::vector<TensorialTraits<double>::GradType> &Gradsm = ipvm->gradf(_minusSpace,ie->getElem(0),GPm[i]); - const std::vector<TensorialTraits<double>::GradType> &Gradsp = ipvp->gradf(_plusSpace,ie->getElem(1),GPp[i]); + Stiff_alphadialitationm*= (-1.)/(fTm*fTm); + Stiff_alphadialitationp*= (-1.)/(fTp*fTp); + const SVector3 &jump = ipvp->getConstRefToJump(); - // possibility of fracture - bool broken = false; - if(_mlawMinus->getType() == materialLaw::fracture ) - { - const FractureCohesive3DIPVariable *ipvwf = static_cast<const FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::current)); // broken via minus (OK broken on both sides) - broken = ipvwf->isbroken(); - //const FractureCohesive3DIPVariable *ipvwfprev = static_cast<const FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::previous)); - //broken = ipvwfprev->isbroken(); // use continuity principle at fracture initialization to avoid instability - } - double wJ = detJ* weight; - wJ*=eqRatio; - if(!broken) - { - static SVector3 nu; - nu = referenceOutwardNormalm; - nu*=(1./referenceOutwardNormalm.norm()); + double eqRatio = _ElecTherMechEqRatio; - const std::vector<TensorialTraits<double>::ValType> &Valsm = ipvm->f(_minusSpace,ie->getElem(0),GPm[i]); - const std::vector<TensorialTraits<double>::ValType> &Valsp = ipvp->f(_plusSpace,ie->getElem(1),GPp[i]); + const std::vector<TensorialTraits<double>::GradType> &Gradsm = ipvm->gradf(_minusSpace,ie->getElem(0),GPm[i]); + const std::vector<TensorialTraits<double>::GradType> &Gradsp = ipvp->gradf(_plusSpace,ie->getElem(1),GPp[i]); - // consistency \mean{cg*grad eps} - double meantfluxV =0.; - for(int k =0; k<3; k++) + // possibility of fracture + bool broken = false; + if(_mlawMinus->getType() == materialLaw::fracture ) { - meantfluxV += (fluxVm(k)+fluxVp(k))*(nu(k)/2.); + const FractureCohesive3DIPVariable *ipvwf = static_cast<const FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::current)); // broken via minus (OK broken on both sides) + broken = ipvwf->isbroken(); } - double meantfluxjy =0.; - for(int k =0; k<3; k++) + double wJ = detJ* weight; + wJ*=eqRatio; + + if(!broken) { - meantfluxjy += (fluxjym(k)+fluxjyp(k))*(nu(k)/2.); - } + static SVector3 nu; + nu = referenceOutwardNormalm; + nu*=(1./referenceOutwardNormalm.norm()); + + + const std::vector<TensorialTraits<double>::ValType> &Valsm = ipvm->f(_minusSpace,ie->getElem(0),GPm[i]); + const std::vector<TensorialTraits<double>::ValType> &Valsp = ipvp->f(_plusSpace,ie->getElem(1),GPp[i]); + + // consistency \mean{cg*grad eps} + double meantfluxV =0.; + for(int k =0; k<3; k++) + { + meantfluxV += (fluxVm(k)+fluxVp(k))*(nu(k)/2.); + } + double meantfluxjy =0.; + for(int k =0; k<3; k++) + { + meantfluxjy += (fluxjym(k)+fluxjyp(k))*(nu(k)/2.); + } double NMeanjy1JumpNBetasc = 0.; - double NMeanl10JumpNBetasc = 0.; - double NMeanl20fvJumpNBetasc = 0.; - double NMeanl20ftJumpNBetasc = 0.; + double NMeanl10JumpNBetasc = 0.; + double NMeanl20fvJumpNBetasc = 0.; + double NMeanl20ftJumpNBetasc = 0.; - static STensor3 meanjy1; + static STensor3 meanjy1; meanjy1 = (jy1m); meanjy1+= (jy1p); meanjy1*= (1./2.); - static STensor3 meanl10; + static STensor3 meanl10; meanl10 = (l10m); meanl10+= (l10p); meanl10*= (1./2.); - static STensor3 meanl20; + static STensor3 meanl20; meanl20 = (l20m); meanl20+= (l20p); meanl20*= (1./2.); @@ -3149,69 +2834,73 @@ void ElecTherMechDG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fullVec for(int n = 0; n <3; n++) { NMeanjy1JumpNBetasc += meanjy1(l,n)*ftJump*nu(n)*nbetahs*nu(l); - NMeanl10JumpNBetasc += meanl10(l,n)*fvJump*nu(n)*nbetahs*nu(l); - NMeanl20fvJumpNBetasc += meanl20(l,n)*fvJump*nu(n)*nbetahs*nu(l); - NMeanl20ftJumpNBetasc += meanl20(l,n)*ftJump*nu(n)*nbetahs*nu(l); + NMeanl10JumpNBetasc += meanl10(l,n)*fvJump*nu(n)*nbetahs*nu(l); + NMeanl20fvJumpNBetasc += meanl20(l,n)*fvJump*nu(n)*nbetahs*nu(l); + NMeanl20ftJumpNBetasc += meanl20(l,n)*ftJump*nu(n)*nbetahs*nu(l); } } double Stiff_alphadialitationp_JumpN=0.;double Stiff_alphadialitationm_JumpN=0.; - for(int k = 0; k <3; k++) - { + for(int k = 0; k <3; k++) + { for(int m = 0; m <3; m++) { - Stiff_alphadialitationp_JumpN += Stiff_alphadialitationp(k,m)*jump(k)*nu(m); - Stiff_alphadialitationm_JumpN += Stiff_alphadialitationm(k,m)*jump(k)*nu(m); - } - } + Stiff_alphadialitationp_JumpN += Stiff_alphadialitationp(k,m)*jump(k)*nu(m); + Stiff_alphadialitationm_JumpN += Stiff_alphadialitationm(k,m)*jump(k)*nu(m); + } + } //fIt (consistency + stability) - for(int j=0;j<nbFFm;j++) - { - m(j+3*nbFFm) -= (meantfluxjy+NMeanjy1JumpNBetasc)*Valsm[j+3*nbFFm]*wJ; - } - for(int j=0;j<nbFFm;j++) - { - m(j+3*nbFFm) -= (NMeanl20fvJumpNBetasc*Valsm[j+3*nbFFm])*wJ; - } - - for(int j=0;j<nbFFp;j++) - { - m(j+3*nbFFp+nbdofm) += (meantfluxjy+NMeanjy1JumpNBetasc)*Valsp[j+3*nbFFp]*wJ; - } - for(int j=0;j<nbFFp;j++) - { - m(j+3*nbFFp+nbdofm) += (NMeanl20fvJumpNBetasc*Valsp[j+3*nbFFp])*wJ; - } + for(int j=0;j<nbFFm;j++) + { + m(j+3*nbFFm) -= (meantfluxjy+NMeanjy1JumpNBetasc)*Valsm[j+3*nbFFm]*wJ; + } + for(int j=0;j<nbFFm;j++) + { + m(j+3*nbFFm) -= (NMeanl20fvJumpNBetasc*Valsm[j+3*nbFFm])*wJ; + } + + for(int j=0;j<nbFFp;j++) + { + m(j+3*nbFFp+nbdofm) += (meantfluxjy+NMeanjy1JumpNBetasc)*Valsp[j+3*nbFFp]*wJ; + } + for(int j=0;j<nbFFp;j++) + { + m(j+3*nbFFp+nbdofm) += (NMeanl20fvJumpNBetasc*Valsp[j+3*nbFFp])*wJ; + } //fIv - for(int j=0;j<nbFFm;j++) - { - m(j+4*nbFFm) -= (meantfluxV+NMeanl10JumpNBetasc)*Valsm[j+4*nbFFm]*wJ; + for(int j=0;j<nbFFm;j++) + { + m(j+4*nbFFm) -= (meantfluxV+NMeanl10JumpNBetasc)*Valsm[j+4*nbFFm]*wJ; } for(int j=0;j<nbFFm;j++) - { - m(j+4*nbFFm) -= NMeanl20ftJumpNBetasc*Valsm[j+4*nbFFm]*wJ; + { + m(j+4*nbFFm) -= NMeanl20ftJumpNBetasc*Valsm[j+4*nbFFm]*wJ; } for(int j=0;j<nbFFp;j++) { - m(j+4*nbFFp+nbdofm) += (meantfluxV+NMeanl10JumpNBetasc)*Valsp[j+4*nbFFp]*wJ; + m(j+4*nbFFp+nbdofm) += (meantfluxV+NMeanl10JumpNBetasc)*Valsp[j+4*nbFFp]*wJ; } - for(int j=0;j<nbFFp;j++) + for(int j=0;j<nbFFp;j++) { m(j+4*nbFFp+nbdofm) += (NMeanl20ftJumpNBetasc*Valsp[j+4*nbFFp])*wJ; } static SVector3 jy1pJumpN, jy1mJumpN; - jy1pJumpN*=0.; jy1mJumpN*=0.; - static SVector3 l10pJumpN, l10mJumpN; - l10pJumpN*=0.; l10mJumpN*=0.; + static SVector3 l10pJumpN, l10mJumpN; static SVector3 l20pfvJumpN, l20mfvJumpN; - l20pfvJumpN*=0.; l20mfvJumpN*=0.; static SVector3 l20pftJumpN, l20mftJumpN; - l20pftJumpN*=0., l20mftJumpN*=0.; for(int k = 0; k <3; k++) { + jy1mJumpN(k) = 0.; + jy1pJumpN(k) = 0.; + l10pJumpN(k) = 0.; + l10mJumpN(k) = 0.; + l20pfvJumpN(k) = 0.; + l20mfvJumpN(k) = 0.; + l20pftJumpN(k) = 0.; + l20mftJumpN(k) = 0.; for(int m = 0; m <3; m++) { jy1mJumpN(k) += jy1m(k,m)*ftJump*nu(m); @@ -3219,9 +2908,9 @@ void ElecTherMechDG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fullVec l10mJumpN(k) += l10m(k,m)*fvJump*nu(m); l10pJumpN(k) += l10p(k,m)*fvJump*nu(m); - l20mfvJumpN(k) += l20m(k,m)*fvJump*nu(m); + l20mfvJumpN(k) += l20m(k,m)*fvJump*nu(m); l20pfvJumpN(k) += l20p(k,m)*fvJump*nu(m); - l20mftJumpN(k) += l20m(k,m)*ftJump*nu(m); + l20mftJumpN(k) += l20m(k,m)*ftJump*nu(m); l20pftJumpN(k) += l20p(k,m)*ftJump*nu(m); } } @@ -3233,7 +2922,7 @@ void ElecTherMechDG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fullVec for(int l=0;l<3;l++) { m(j+3*nbFFm) += ( jy1mJumpN(l)*Gradsm[j+3*nbFFm][l])*(wJ/2.); - m(j+3*nbFFm) += ( l20mfvJumpN(l)*Gradsm[j+3*nbFFm][l])*(wJ/2.); + m(j+3*nbFFm) += ( l20mfvJumpN(l)*Gradsm[j+3*nbFFm][l])*(wJ/2.); } } @@ -3242,18 +2931,18 @@ void ElecTherMechDG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fullVec for(int l=0;l<3;l++) { m(j+3*nbFFp+nbdofm) += ( jy1pJumpN(l)*Gradsp[j+3*nbFFp][l])*(wJ/2.); - m(j+3*nbFFp+nbdofm) += ( l20pfvJumpN(l)*Gradsp[j+3*nbFFp][l])*(wJ/2.); + m(j+3*nbFFp+nbdofm) += ( l20pfvJumpN(l)*Gradsp[j+3*nbFFp][l])*(wJ/2.); } } //new alphadialitation for(int j=0;j<nbFFm;j++) { - m(j+3*nbFFm) += gamma*( Stiff_alphadialitationm_JumpN*Valsm[j+3*nbFFm])*(wJ/2.)/eqRatio*(-1.); + m(j+3*nbFFm) += gamma*( Stiff_alphadialitationm_JumpN*Valsm[j+3*nbFFm])*(wJ/2.)/eqRatio*(-1.); } for(int j=0;j<nbFFp;j++) { - m(j+3*nbFFp+nbdofm) += gamma*( Stiff_alphadialitationp_JumpN*Valsp[j+3*nbFFp])*(wJ/2.)/eqRatio*(-1.); + m(j+3*nbFFp+nbdofm) += gamma*( Stiff_alphadialitationp_JumpN*Valsp[j+3*nbFFp])*(wJ/2.)/eqRatio*(-1.); } //fIv2 @@ -3262,7 +2951,7 @@ void ElecTherMechDG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fullVec for(int l=0;l<3;l++) { m(j+4*nbFFm) += ( l10mJumpN(l)*Gradsm[j+4*nbFFm][l])*(wJ/2.); - m(j+4*nbFFm) += ( l20mftJumpN(l)*Gradsm[j+4*nbFFm][l])*(wJ/2.); + m(j+4*nbFFm) += ( l20mftJumpN(l)*Gradsm[j+4*nbFFm][l])*(wJ/2.); } } for(int j=0;j<nbFFp;j++) @@ -3270,259 +2959,251 @@ void ElecTherMechDG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fullVec for(int l=0;l<3;l++) { m(j+4*nbFFp+nbdofm) += ( l10pJumpN(l)*Gradsp[j+4*nbFFp][l])*(wJ/2.); - m(j+4*nbFFp+nbdofm) += ( l20pftJumpN(l)*Gradsp[j+4*nbFFp][l])*(wJ/2.); + m(j+4*nbFFp+nbdofm) += ( l20pftJumpN(l)*Gradsp[j+4*nbFFp][l])*(wJ/2.); } } - } - + } else //broken case { } - } - - - + } else{ - const SVector3 &referenceOutwardNormalm = ipvm->getConstRefToReferenceOutwardNormal(); - //const SVector3 &CurrentOutwardNormalm = ipvm->getConstRefToCurrentOutwardNormal(); + const SVector3 &referenceOutwardNormalm = ipvm->getConstRefToReferenceOutwardNormal(); + //const SVector3 &CurrentOutwardNormalm = ipvm->getConstRefToCurrentOutwardNormal(); - const SVector3 &referenceOutwardNormalp = ipvp->getConstRefToReferenceOutwardNormal(); + const SVector3 &referenceOutwardNormalp = ipvp->getConstRefToReferenceOutwardNormal(); - const double &ftJump =ipvp->getConstRefTofTJump(); - const double &fvJump =ipvp->getConstRefTofvJump(); + const double &ftJump =ipvp->getConstRefTofTJump(); + const double &fvJump =ipvp->getConstRefTofvJump(); - const STensor3 &l10m = (ipvm->getConstRefToElecConductivity()); - const STensor3 &l10p = (ipvp->getConstRefToElecConductivity()); + const STensor3 &l10m = (ipvm->getConstRefToElecConductivity()); + const STensor3 &l10p = (ipvp->getConstRefToElecConductivity()); - const STensor3 &l20m = (ipvm->getConstRefToCrossElecConductivity()); - const STensor3 &l20p = (ipvp->getConstRefToCrossElecConductivity()); + const STensor3 &l20m = (ipvm->getConstRefToCrossElecConductivity()); + const STensor3 &l20p = (ipvp->getConstRefToCrossElecConductivity()); - const SVector3 &fluxVm = (ipvm->getConstRefToFluxV()); - const SVector3 &fluxVp = (ipvp->getConstRefToFluxV()); + const SVector3 &fluxVm = (ipvm->getConstRefToFluxV()); + const SVector3 &fluxVp = (ipvp->getConstRefToFluxV()); - const STensor3 &jy1m = (ipvm->getConstRefToEnergyConductivity()); - const STensor3 &jy1p = (ipvp->getConstRefToEnergyConductivity()); - const SVector3 &fluxjym= (ipvm->getConstRefToFluxEnergy()); - const SVector3 &fluxjyp= (ipvp->getConstRefToFluxEnergy()); + const STensor3 &jy1m = (ipvm->getConstRefToEnergyConductivity()); + const STensor3 &jy1p = (ipvp->getConstRefToEnergyConductivity()); + const SVector3 &fluxjym= (ipvm->getConstRefToFluxEnergy()); + const SVector3 &fluxjyp= (ipvp->getConstRefToFluxEnergy()); - static STensor3 Stiff_alphadialitationm; - Stiff_alphadialitationm = ipvm->getConstRefToStiff_alphaDilatation(); - static STensor3 Stiff_alphadialitationp; - Stiff_alphadialitationp = ipvp->getConstRefToStiff_alphaDilatation(); + static STensor3 Stiff_alphadialitationm; + Stiff_alphadialitationm = ipvm->getConstRefToStiff_alphaDilatation(); + static STensor3 Stiff_alphadialitationp; + Stiff_alphadialitationp = ipvp->getConstRefToStiff_alphaDilatation(); - const double &fTp = ipvp->getConstRefTofT(); - const double &fTm = ipvm->getConstRefTofT(); + const double &fTp = ipvp->getConstRefTofT(); + const double &fTm = ipvm->getConstRefTofT(); - Stiff_alphadialitationm*= (-1.)/(fTm*fTm); - Stiff_alphadialitationp*= (-1.)/(fTp*fTp); - const SVector3 &jump = ipvp->getConstRefToJump(); + Stiff_alphadialitationm*= (-1.)/(fTm*fTm); + Stiff_alphadialitationp*= (-1.)/(fTp*fTp); + const SVector3 &jump = ipvp->getConstRefToJump(); + //double length = _mlaw->getLength(); + double eqRatio = _ElecTherMechEqRatio; + const std::vector<TensorialTraits<double>::GradType> &Gradsm = ipvm->gradf(_minusSpace,ie->getElem(0),GPm[i]); + const std::vector<TensorialTraits<double>::GradType> &Gradsp = ipvp->gradf(_plusSpace,ie->getElem(1),GPp[i]); + // possibility of fracture + bool broken = false; + if(_mlawMinus->getType() == materialLaw::fracture ) + { + const FractureCohesive3DIPVariable *ipvwf = static_cast<const FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::current)); // broken via minus (OK broken on both sides) + broken = ipvwf->isbroken(); + } + double wJ = detJ* weight; + wJ*=eqRatio; + if(!broken) + { + static SVector3 nu; + nu = referenceOutwardNormalm; + nu*=(1./referenceOutwardNormalm.norm()); - //double length = _mlaw->getLength(); - double eqRatio = _ElecTherMechEqRatio; + const std::vector<TensorialTraits<double>::ValType> &Valsm = ipvm->f(_minusSpace,ie->getElem(0),GPm[i]); + const std::vector<TensorialTraits<double>::ValType> &Valsp = ipvp->f(_plusSpace,ie->getElem(1),GPp[i]); - const std::vector<TensorialTraits<double>::GradType> &Gradsm = ipvm->gradf(_minusSpace,ie->getElem(0),GPm[i]); - const std::vector<TensorialTraits<double>::GradType> &Gradsp = ipvp->gradf(_plusSpace,ie->getElem(1),GPp[i]); - - // possibility of fracture - bool broken = false; - if(_mlawMinus->getType() == materialLaw::fracture ) - { - const FractureCohesive3DIPVariable *ipvwf = static_cast<const FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::current)); // broken via minus (OK broken on both sides) - broken = ipvwf->isbroken(); - //const FractureCohesive3DIPVariable *ipvwfprev = static_cast<const FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::previous)); - //broken = ipvwfprev->isbroken(); // use continuity principle at fracture initialization to avoid instability - } - double wJ = detJ* weight; - wJ*=eqRatio; - if(!broken) - { - static SVector3 nu; - nu = referenceOutwardNormalm; - nu*=(1./referenceOutwardNormalm.norm()); - - const std::vector<TensorialTraits<double>::ValType> &Valsm = ipvm->f(_minusSpace,ie->getElem(0),GPm[i]); - const std::vector<TensorialTraits<double>::ValType> &Valsp = ipvp->f(_plusSpace,ie->getElem(1),GPp[i]); - - // consistency \mean{cg*grad eps} - double meantfluxV =0.; - for(int k =0; k<3; k++) - { - meantfluxV += (fluxVm(k)+fluxVp(k))*(nu(k)/2.); - } - double meantfluxjy =0.; - for(int k =0; k<3; k++) - { - meantfluxjy += (fluxjym(k)+fluxjyp(k))*(nu(k)/2.); - } + // consistency \mean{cg*grad eps} + double meantfluxV =0.; + for(int k =0; k<3; k++) + { + meantfluxV += (fluxVm(k)+fluxVp(k))*(nu(k)/2.); + } + double meantfluxjy =0.; + for(int k =0; k<3; k++) + { + meantfluxjy += (fluxjym(k)+fluxjyp(k))*(nu(k)/2.); + } - double NMeanjy1JumpNBetasc = 0.; - double NMeanl10JumpNBetasc = 0.; - double NMeanl20fvJumpNBetasc = 0.; - double NMeanl20ftJumpNBetasc = 0.; + double NMeanjy1JumpNBetasc = 0.; + double NMeanl10JumpNBetasc = 0.; + double NMeanl20fvJumpNBetasc = 0.; + double NMeanl20ftJumpNBetasc = 0.; - static STensor3 meanjy1; - meanjy1 = (jy1m); - meanjy1+= (jy1p); - meanjy1*= (1./2.); - static STensor3 meanl10; - meanl10 = (l10m); - meanl10+= (l10p); - meanl10*= (1./2.); - static STensor3 meanl20; - meanl20 = (l20m); - meanl20+= (l20p); - meanl20*= (1./2.); + static STensor3 meanjy1; + meanjy1 = (jy1m); + meanjy1+= (jy1p); + meanjy1*= (1./2.); + static STensor3 meanl10; + meanl10 = (l10m); + meanl10+= (l10p); + meanl10*= (1./2.); + static STensor3 meanl20; + meanl20 = (l20m); + meanl20+= (l20p); + meanl20*= (1./2.); - for(int l = 0; l <3; l++) - { - for(int n = 0; n <3; n++) + for(int l = 0; l <3; l++) { - NMeanjy1JumpNBetasc += meanjy1(l,n)*ftJump*nu(n)*nbetahs*nu(l); - NMeanl10JumpNBetasc += meanl10(l,n)*fvJump*nu(n)*nbetahs*nu(l); - NMeanl20fvJumpNBetasc += meanl20(l,n)*fvJump*nu(n)*nbetahs*nu(l); - NMeanl20ftJumpNBetasc += meanl20(l,n)*ftJump*nu(n)*nbetahs*nu(l); + for(int n = 0; n <3; n++) + { + NMeanjy1JumpNBetasc += meanjy1(l,n)*ftJump*nu(n)*nbetahs*nu(l); + NMeanl10JumpNBetasc += meanl10(l,n)*fvJump*nu(n)*nbetahs*nu(l); + NMeanl20fvJumpNBetasc += meanl20(l,n)*fvJump*nu(n)*nbetahs*nu(l); + NMeanl20ftJumpNBetasc += meanl20(l,n)*ftJump*nu(n)*nbetahs*nu(l); + } } - } - double Stiff_alphadialitationp_JumpN=0.;double Stiff_alphadialitationm_JumpN=0.; - for(int k = 0; k <3; k++) - { - for(int m = 0; m <3; m++) + double Stiff_alphadialitationp_JumpN=0.;double Stiff_alphadialitationm_JumpN=0.; + for(int k = 0; k <3; k++) { - Stiff_alphadialitationp_JumpN += Stiff_alphadialitationp(k,m)*jump(k)*nu(m); - Stiff_alphadialitationm_JumpN += Stiff_alphadialitationm(k,m)*jump(k)*nu(m); - } - } - - //fIt1+3 consistency + stability - for(int j=0;j<nbFFm;j++) - { - m(j+3*nbFFm) -= (meantfluxjy+NMeanjy1JumpNBetasc)*Valsm[j+3*nbFFm]*wJ; - } - for(int j=0;j<nbFFm;j++) - { - m(j+3*nbFFm) -= NMeanl20fvJumpNBetasc*Valsm[j+3*nbFFm]*wJ; - } - - for(int j=0;j<nbFFp;j++) - { - m(j+3*nbFFp+nbdofm) += (meantfluxjy+NMeanjy1JumpNBetasc)*Valsp[j+3*nbFFp]*wJ; - } - for(int j=0;j<nbFFp;j++) - { - m(j+3*nbFFp+nbdofm) += (NMeanl20fvJumpNBetasc*Valsp[j+3*nbFFp])*wJ; - } + for(int m = 0; m <3; m++) + { + Stiff_alphadialitationp_JumpN += Stiff_alphadialitationp(k,m)*jump(k)*nu(m); + Stiff_alphadialitationm_JumpN += Stiff_alphadialitationm(k,m)*jump(k)*nu(m); + } + } + //fIt1+3 consistency + stability + for(int j=0;j<nbFFm;j++) + { + m(j+3*nbFFm) -= (meantfluxjy+NMeanjy1JumpNBetasc)*Valsm[j+3*nbFFm]*wJ; + } + for(int j=0;j<nbFFm;j++) + { + m(j+3*nbFFm) -= NMeanl20fvJumpNBetasc*Valsm[j+3*nbFFm]*wJ; + } - //fIv - for(int j=0;j<nbFFm;j++) - { - m(j+4*nbFFm) -= (meantfluxV+NMeanl10JumpNBetasc)*Valsm[j+4*nbFFm]*wJ; - } - for(int j=0;j<nbFFm;j++) - { - m(j+4*nbFFm) -= (NMeanl20ftJumpNBetasc*Valsm[j+4*nbFFm])*wJ; - } + for(int j=0;j<nbFFp;j++) + { + m(j+3*nbFFp+nbdofm) += (meantfluxjy+NMeanjy1JumpNBetasc)*Valsp[j+3*nbFFp]*wJ; + } + for(int j=0;j<nbFFp;j++) + { + m(j+3*nbFFp+nbdofm) += (NMeanl20fvJumpNBetasc*Valsp[j+3*nbFFp])*wJ; + } - for(int j=0;j<nbFFp;j++) - { - m(j+4*nbFFp+nbdofm) += (meantfluxV+NMeanl10JumpNBetasc)*Valsp[j+4*nbFFp]*wJ; - } - for(int j=0;j<nbFFp;j++) - { - m(j+4*nbFFp+nbdofm) += (NMeanl20ftJumpNBetasc*Valsp[j+4*nbFFp])*wJ; - } - static SVector3 jy1pJumpN, jy1mJumpN; - jy1pJumpN*=0.; jy1mJumpN*=0.; - static SVector3 k20pJumpN, k20mJumpN; - k20pJumpN*=0.; k20mJumpN*=0.; - static SVector3 l10pJumpN, l10mJumpN; - l10pJumpN*=0.; l10mJumpN*=0.; - static SVector3 l20pfvJumpN, l20mfvJumpN; - l20pfvJumpN*=0.; l20mfvJumpN*=0.; - static SVector3 l20pftJumpN, l20mftJumpN; - l20pftJumpN*=0.; l20mftJumpN*=0.; - for(int k = 0; k <3; k++) - { - for(int m = 0; m <3; m++) + //fIv + for(int j=0;j<nbFFm;j++) { - jy1mJumpN(k) += jy1m(k,m)*ftJump*nu(m); - jy1pJumpN(k) += jy1p(k,m)*ftJump*nu(m); + m(j+4*nbFFm) -= (meantfluxV+NMeanl10JumpNBetasc)*Valsm[j+4*nbFFm]*wJ; + } + for(int j=0;j<nbFFm;j++) + { + m(j+4*nbFFm) -= (NMeanl20ftJumpNBetasc*Valsm[j+4*nbFFm])*wJ; + } - l10mJumpN(k) += l10m(k,m)*fvJump*nu(m); - l10pJumpN(k) += l10p(k,m)*fvJump*nu(m); - l20mfvJumpN(k) += l20m(k,m)*fvJump*nu(m); - l20pfvJumpN(k) += l20p(k,m)*fvJump*nu(m); - l20mftJumpN(k) += l20m(k,m)*ftJump*nu(m); - l20pftJumpN(k) += l20p(k,m)*ftJump*nu(m); + for(int j=0;j<nbFFp;j++) + { + m(j+4*nbFFp+nbdofm) += (meantfluxV+NMeanl10JumpNBetasc)*Valsp[j+4*nbFFp]*wJ; } - } + for(int j=0;j<nbFFp;j++) + { + m(j+4*nbFFp+nbdofm) += (NMeanl20ftJumpNBetasc*Valsp[j+4*nbFFp])*wJ; + } + + static SVector3 jy1pJumpN, jy1mJumpN; + static SVector3 l10pJumpN, l10mJumpN; + static SVector3 l20pfvJumpN, l20mfvJumpN; + static SVector3 l20pftJumpN, l20mftJumpN; + for(int k = 0; k <3; k++) + { + jy1mJumpN(k) = 0.; + jy1pJumpN(k) = 0.; + l10mJumpN(k) = 0.; + l10pJumpN(k) = 0.; + l20mfvJumpN(k) = 0.; + l20pfvJumpN(k) = 0.; + l20mftJumpN(k) = 0.; + l20pftJumpN(k) = 0.; + for(int m = 0; m <3; m++) + { + jy1mJumpN(k) += jy1m(k,m)*ftJump*nu(m); + jy1pJumpN(k) += jy1p(k,m)*ftJump*nu(m); + l10mJumpN(k) += l10m(k,m)*fvJump*nu(m); + l10pJumpN(k) += l10p(k,m)*fvJump*nu(m); + l20mfvJumpN(k) += l20m(k,m)*fvJump*nu(m); + l20pfvJumpN(k) += l20p(k,m)*fvJump*nu(m); + l20mftJumpN(k) += l20m(k,m)*ftJump*nu(m); + l20pftJumpN(k) += l20p(k,m)*ftJump*nu(m); + } + } - // Assembly (loop on shape function) + // Assembly (loop on shape function) //fIt2 (compatibility) - for(int j=0;j<nbFFm;j++) - { - for(int l=0;l<3;l++) + for(int j=0;j<nbFFm;j++) { - m(j+3*nbFFm) += ( jy1mJumpN(l)*Gradsm[j+3*nbFFm][l])*(wJ/2.); - m(j+3*nbFFm) += ( l20mfvJumpN(l)*Gradsm[j+3*nbFFm][l])*(wJ/2.); + for(int l=0;l<3;l++) + { + m(j+3*nbFFm) += ( jy1mJumpN(l)*Gradsm[j+3*nbFFm][l])*(wJ/2.); + m(j+3*nbFFm) += ( l20mfvJumpN(l)*Gradsm[j+3*nbFFm][l])*(wJ/2.); + } } - } - for(int j=0;j<nbFFp;j++) - { - for(int l=0;l<3;l++) + for(int j=0;j<nbFFp;j++) { - m(j+3*nbFFp+nbdofm) += ( jy1pJumpN(l)*Gradsp[j+3*nbFFp][l])*(wJ/2.); - m(j+3*nbFFp+nbdofm) += ( l20pfvJumpN(l)*Gradsp[j+3*nbFFp][l])*(wJ/2.); + for(int l=0;l<3;l++) + { + m(j+3*nbFFp+nbdofm) += ( jy1pJumpN(l)*Gradsp[j+3*nbFFp][l])*(wJ/2.); + m(j+3*nbFFp+nbdofm) += ( l20pfvJumpN(l)*Gradsp[j+3*nbFFp][l])*(wJ/2.); + } } - } //new alphadialitation - for(int j=0;j<nbFFm;j++) - { + for(int j=0;j<nbFFm;j++) + { m(j+3*nbFFm) += gamma*( Stiff_alphadialitationm_JumpN*Valsm[j+3*nbFFm])*(wJ/2.)/eqRatio*(-1.); - } - for(int j=0;j<nbFFp;j++) - { + } + for(int j=0;j<nbFFp;j++) + { m(j+3*nbFFp+nbdofm) += gamma*( Stiff_alphadialitationp_JumpN*Valsp[j+3*nbFFp])*(wJ/2.)/eqRatio*(-1.); - } + } - //v - for(int j=0;j<nbFFm;j++) - { - for(int l=0;l<3;l++) + //v + for(int j=0;j<nbFFm;j++) { - m(j+4*nbFFm) += ( l10mJumpN(l)*Gradsm[j+4*nbFFm][l])*(wJ/2.); - m(j+4*nbFFm) += ( l20mftJumpN(l)*Gradsm[j+4*nbFFm][l])*(wJ/2.); + for(int l=0;l<3;l++) + { + m(j+4*nbFFm) += ( l10mJumpN(l)*Gradsm[j+4*nbFFm][l])*(wJ/2.); + m(j+4*nbFFm) += ( l20mftJumpN(l)*Gradsm[j+4*nbFFm][l])*(wJ/2.); + } } - } - for(int j=0;j<nbFFp;j++) - { - for(int l=0;l<3;l++) + for(int j=0;j<nbFFp;j++) { - m(j+4*nbFFp+nbdofm) += ( l10pJumpN(l)*Gradsp[j+4*nbFFp][l])*(wJ/2.); - m(j+4*nbFFp+nbdofm) += ( l20pftJumpN(l)*Gradsp[j+4*nbFFp][l])*(wJ/2.); + for(int l=0;l<3;l++) + { + m(j+4*nbFFp+nbdofm) += ( l10pJumpN(l)*Gradsp[j+4*nbFFp][l])*(wJ/2.); + m(j+4*nbFFp+nbdofm) += ( l20pftJumpN(l)*Gradsp[j+4*nbFFp][l])*(wJ/2.); + } } } - } - else //broken case - { + else //broken case + { + } } } } } - } } @@ -3544,31 +3225,14 @@ void ElecTherMechDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMa if( _continuity) { // get value at gauss's point - AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); + const AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); // values of Gauss points on minus and plus elements IntPt *GPm; IntPt *GPp; _interQuad->getIntPoints(ie,GP,&GPm,&GPp); - // val, grad and detJ at all Gauss points - static std::vector<std::vector<TensorialTraits<double>::GradType> >vgradsuvw; - vgradsuvw.clear(); - //std::vector<GaussPointSpaceValues<double>*> vallm; - //std::vector<GaussPointSpaceValues<double>*> vallp; - _minusSpace->getgradfuvw(ele,npts,GP,vgradsuvw); // do a special function space ?? - //_minusSpace->get(ie->getElem(0),npts,GPm,vallm); - //_plusSpace->get(ie->getElem(1),npts,GPp,vallp); - - double jac[3][3]; // loop on Gauss Point for(int i=0;i<npts; i++) { - // Coordonate of Gauss' point i -// const double u = GP[i].pt[0]; const double v = GP[i].pt[1]; const double w = GP[i].pt[2]; - // Weight of Gauss' point i and Jacobian's value at this point - const double weight = GP[i].weight; -// double detJ = ele->getJacobian(u, v, w, jac); - double detJ = ele->getJacobian(vgradsuvw[i], jac); - // IP const IPStateBase *ipsm = (*vips)[i]; const IPStateBase *ipsp = (*vips)[i+npts]; @@ -3576,868 +3240,859 @@ void ElecTherMechDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMa const ElecTherMechDG3DIPVariableBase *ipvp; // = static_cast<const nonLocalDamageDG3DIPVariable*>(ipsp->getState(IPStateBase::current)); if(_mlawMinus->getType() == materialLaw::fracture ) { - FractureCohesive3DIPVariable* ipvtmp = static_cast<FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::current)); - ipvm = static_cast<ElecTherMechDG3DIPVariableBase*>(ipvtmp->getIPvBulk()); - ipvtmp = static_cast<FractureCohesive3DIPVariable*>(ipsp->getState(IPStateBase::current)); - ipvp = static_cast<ElecTherMechDG3DIPVariableBase*>(ipvtmp->getIPvBulk()); + const FractureCohesive3DIPVariable* ipvtmp = static_cast<const FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::current)); + ipvm = static_cast<const ElecTherMechDG3DIPVariableBase*>(ipvtmp->getIPvBulk()); + ipvtmp = static_cast<const FractureCohesive3DIPVariable*>(ipsp->getState(IPStateBase::current)); + ipvp = static_cast<const ElecTherMechDG3DIPVariableBase*>(ipvtmp->getIPvBulk()); } else { ipvm = static_cast<const ElecTherMechDG3DIPVariableBase*>(ipsm->getState(IPStateBase::current)); ipvp = static_cast<const ElecTherMechDG3DIPVariableBase*>(ipsp->getState(IPStateBase::current)); } + const double weight = GP[i].weight; + double detJ = ipvm->getJacobianDeterminant(ie,GP[i]); + double wJ = detJ* weight; - // ipvm->getConstRefTodThermalSourcedGradT().print("Ok"); + const SVector3 &referenceOutwardNormalm = ipvm->getConstRefToReferenceOutwardNormal(); + const SVector3 &referenceOutwardNormalp = ipvp->getConstRefToReferenceOutwardNormal(); -// const nonLocalDamageDG3DIPVariable *ipvmprev = static_cast<const nonLocalDamageDG3DIPVariable*>(ipsm->getState(IPStateBase::previous)); -// const nonLocalDamageDG3DIPVariable *ipvm0 = static_cast<const nonLocalDamageDG3DIPVariable*>(ipsm->getState(IPStateBase::initial)); - const SVector3 &referenceOutwardNormalm = ipvm->getConstRefToReferenceOutwardNormal(); + if(_useFtFv) + { + const double &ftJump = ipvp->getConstRefTofTJump(); + const double &fvJump = ipvp->getConstRefTofvJump(); -// const nonLocalDamageDG3DIPVariable *ipvp0 = static_cast<const nonLocalDamageDG3DIPVariable*>(ipsp->getState(IPStateBase::initial)); + const std::vector<TensorialTraits<double>::GradType> &Gradsm = ipvm->gradf(_minusSpace,ie->getElem(0),GPm[i]); + const std::vector<TensorialTraits<double>::GradType> &Gradsp = ipvp->gradf(_plusSpace,ie->getElem(1),GPp[i]); - const SVector3 &referenceOutwardNormalp = ipvp->getConstRefToReferenceOutwardNormal(); + // possibility of fracture + bool broken = false; + if(_mlawMinus->getType() == materialLaw::fracture ) + { + const FractureCohesive3DIPVariable *ipvwf = static_cast<const FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::current)); // broken via minus (OK broken on both sides) + broken = ipvwf->isbroken(); + } - //const double &TemperatureJump = ipvp->getConstRefToTemperatureJump(); - //const double &VoltageJump = ipvp->getConstRefToVoltageJump(); - - if(_useFtFv==true) - { - const double &ftJump = ipvp->getConstRefTofTJump(); - const double &fvJump = ipvp->getConstRefTofvJump(); - //std::vector<TensorialTraits<double>::GradType> &Gradsm = vallm[i]->_vgrads; - //std::vector<TensorialTraits<double>::GradType> &Gradsp = vallp[i]->_vgrads; - - const std::vector<TensorialTraits<double>::GradType> &Gradsm = ipvm->gradf(_minusSpace,ie->getElem(0),GPm[i]); - const std::vector<TensorialTraits<double>::GradType> &Gradsp = ipvp->gradf(_plusSpace,ie->getElem(1),GPp[i]); - - // possibility of fracture - bool broken = false; - if(_mlawMinus->getType() == materialLaw::fracture ) - { - const FractureCohesive3DIPVariable *ipvwf = static_cast<const FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::current)); // broken via minus (OK broken on both sides) - broken = ipvwf->isbroken(); - //const FractureCohesive3DIPVariable *ipvwfprev = static_cast<const FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::previous)); - //broken = ipvwfprev->isbroken(); // use continuity principle at fracture initialization to avoid instability - } - double wJ = detJ* weight; - static SVector3 nu; + static SVector3 nu; nu = referenceOutwardNormalm; nu*=(1./referenceOutwardNormalm.norm()); - //std::vector<TensorialTraits<double>::ValType> &Valsm = vallm[i]->_vvals; - //std::vector<TensorialTraits<double>::ValType> &Valsp = vallp[i]->_vvals; - const std::vector<TensorialTraits<double>::ValType> &Valsm = ipvm->f(_minusSpace,ie->getElem(0),GPm[i]); - const std::vector<TensorialTraits<double>::ValType> &Valsp = ipvp->f(_plusSpace,ie->getElem(1),GPp[i]); + const std::vector<TensorialTraits<double>::ValType> &Valsm = ipvm->f(_minusSpace,ie->getElem(0),GPm[i]); + const std::vector<TensorialTraits<double>::ValType> &Valsp = ipvp->f(_plusSpace,ie->getElem(1),GPp[i]); - static STensor3 Stiff_alphadialitationm; + static STensor3 Stiff_alphadialitationm; Stiff_alphadialitationm = (ipvm->getConstRefToStiff_alphaDilatation()); - static STensor3 Stiff_alphadialitationp; + static STensor3 Stiff_alphadialitationp; Stiff_alphadialitationp = (ipvp->getConstRefToStiff_alphaDilatation()); const double &fTp = ipvp->getConstRefTofT(); const double &fTm = ipvm->getConstRefTofT(); - Stiff_alphadialitationm*= (-1.)/(fTm*fTm); - Stiff_alphadialitationp*= (-1.)/(fTp*fTp); - const SVector3 &jump = ipvp->getConstRefToJump(); - - if(broken) - { - - } - else - { - const STensor3 *dPdTm = &(ipvm->getConstRefTodPdT()); - const STensor3 *dPdTp = &(ipvp->getConstRefTodPdT()); - const STensor33 *djedFm = &(ipvm->getConstRefTodFluxVdF()); - const STensor33 *djedFp = &(ipvp->getConstRefTodFluxVdF()); - const STensor3 *dPdVm = &(ipvm->getConstRefTodPdV()); - const STensor3 *dPdVp = &(ipvp->getConstRefTodPdV()); - - const STensor3 *l10m = &(ipvm->getConstRefToElecConductivity()); - const STensor3 *l10p = &(ipvp->getConstRefToElecConductivity()); - const STensor3 *l20m = &(ipvm->getConstRefToCrossElecConductivity()); - const STensor3 *l20p = &(ipvp->getConstRefToCrossElecConductivity()); - - const STensor3 *dl10dTm = &(ipvm->getConstRefTodElecConductivitydT()); - const STensor3 *dl10dTp = &(ipvp->getConstRefTodElecConductivitydT()); - const STensor3 *dl20dTm = &(ipvm->getConstRefTodCrossElecConductivitydT()); - const STensor3 *dl20dTp = &(ipvp->getConstRefTodCrossElecConductivitydT()); - - const STensor3 *dl20dvm = &(ipvm->getConstRefTodCrossElecConductivitydv()); - const STensor3 *dl20dvp = &(ipvp->getConstRefTodCrossElecConductivitydv()); - - const STensor43 *dl10dFm = &(ipvm->getConstRefTodElecConductivitydF()); - const STensor43 *dl10dFp = &(ipvp->getConstRefTodElecConductivitydF()); - const STensor43 *dl20dFm = &(ipvm->getConstRefTodCrossElecConductivitydF()); - const STensor43 *dl20dFp = &(ipvp->getConstRefTodCrossElecConductivitydF()); - - const STensor3 *djedGradVm = &(ipvm->getConstRefTodFluxVdGradV()); - const STensor3 *djedGradVp = &(ipvp->getConstRefTodFluxVdGradV()); - const SVector3 *djedVm = &(ipvm->getConstRefTodFluxVdV()); - const SVector3 *djedVp = &(ipvp->getConstRefTodFluxVdV()); - const STensor3 *djedGradTm = &(ipvm->getConstRefTodFluxVdGradT()); - const STensor3 *djedGradTp = &(ipvp->getConstRefTodFluxVdGradT()); - const SVector3 *djedTm = &(ipvm->getConstRefTodFluxVdT()); - const SVector3 *djedTp = &(ipvp->getConstRefTodFluxVdT()); - - const STensor3 *dgardVdgradfVm = &(ipvm->getConstRefTodgradVdgradfV()); - const STensor3 *dgardVdgradfTm = &(ipvm->getConstRefTodgradVdgradfT()); - const STensor3 *dgardTdgradfTm = &(ipvm->getConstRefTodgradTdgradfT()); - const STensor3 *dgardTdgradfVm = &(ipvm->getConstRefTodgradTdgradfV()); - - const double &dVdfVm = (ipvm->getConstRefTodVdfV()); - const double &dVdfTm = (ipvm->getConstRefTodVdfT()); - const double &dTdfTm = (ipvm->getConstRefTodTdfT()); - const double &dTdfVm = (ipvm->getConstRefTodTdfV()); - - const SVector3 *dgradVdfVm = &(ipvm->getConstRefTodgradVdfV()); - const SVector3 *dgradVdfTm = &(ipvm->getConstRefTodgradVdfT()); - const SVector3 *dgradTdfTm = &(ipvm->getConstRefTodgradTdfT()); - const SVector3 *dgradTdfVm = &(ipvm->getConstRefTodgradTdfV()); - - const STensor3 *dgardVdgradfVp = &(ipvp->getConstRefTodgradVdgradfV()); - const STensor3 *dgardVdgradfTp = &(ipvp->getConstRefTodgradVdgradfT()); - const STensor3 *dgardTdgradfTp = &(ipvp->getConstRefTodgradTdgradfT()); - const STensor3 *dgardTdgradfVp = &(ipvp->getConstRefTodgradTdgradfV()); - - const double &dVdfVp = (ipvp->getConstRefTodVdfV()); - const double &dVdfTp = (ipvp->getConstRefTodVdfT()); - const double &dTdfVp = (ipvp->getConstRefTodTdfV()); - const double &dTdfTp = (ipvp->getConstRefTodTdfT()); - - const SVector3 *dgradVdfVp = &(ipvp->getConstRefTodgradVdfV()); - const SVector3 *dgradVdfTp = &(ipvp->getConstRefTodgradVdfT()); - const SVector3 *dgradTdfTp = &(ipvp->getConstRefTodgradTdfT()); - const SVector3 *dgradTdfVp = &(ipvp->getConstRefTodgradTdfV()); - - const STensor3 *jy1m = &(ipvm->getConstRefToEnergyConductivity()); - const STensor43 *djy1dFm = &(ipvm->getConstRefTodEnergyConductivitydF()); - const STensor3 *djy1dVm = &(ipvm->getConstRefTodEnergyConductivitydV()); - const STensor3 *djy1dTm = &(ipvm->getConstRefTodEnergyConductivitydT()); - - const STensor3 *jy1p = &(ipvp->getConstRefToEnergyConductivity()); - const STensor43 *djy1dFp = &(ipvp->getConstRefTodEnergyConductivitydF()); - const STensor3 *djy1dVp = &(ipvp->getConstRefTodEnergyConductivitydV()); - const STensor3 *djy1dTp = &(ipvp->getConstRefTodEnergyConductivitydT()); - - const STensor33 *djydFp = &(ipvp->getConstRefTodFluxEnergydF()); - const STensor3 *djydGradTp = &(ipvp->getConstRefTodFluxEnergydGradT()); - const SVector3 *djydTp = &(ipvp->getConstRefTodFluxEnergydT()); - const STensor3 *djydGradVp = &(ipvp->getConstRefTodFluxEnergydGradV()); - const SVector3 *djydVp = &(ipvp->getConstRefTodFluxEnergydV()); - const SVector3 *fluxjyp = &(ipvp->getConstRefToFluxEnergy()); - - const STensor33 *djydFm = &(ipvm->getConstRefTodFluxEnergydF()); - const STensor3 *djydGradTm = &(ipvm->getConstRefTodFluxEnergydGradT()); - const SVector3 *djydTm = &(ipvm->getConstRefTodFluxEnergydT()); - const STensor3 *djydGradVm = &(ipvm->getConstRefTodFluxEnergydGradV()); - const SVector3 *djydVm = &(ipvm->getConstRefTodFluxEnergydV()); - const SVector3 *fluxjym = &(ipvm->getConstRefToFluxEnergy()); - - - - - double eqRatio = _ElecTherMechEqRatio; - wJ*=eqRatio; - // Assembly consistency (from derivative of sigma with extra field) - for(int j=0;j<nbFFm;j++) - { - for(int k=0;k<3;k++) - { - for(int l=0;l<nbFFm;l++) - { - for(int q = 0; q< 3; q++) - { - stiff(j+k*nbFFm,l+3*nbFFm) -= (dPdTm->operator()(k,q)*dTdfTm+dPdVm->operator()(k,q)*dVdfTm)*(Valsm[l+3*nbFFm]*Valsm[j+0*nbFFm]*wJ/2.*nu(q)/eqRatio); - - stiff(j+k*nbFFm,l+4*nbFFm) -= (dPdVm->operator()(k,q)*dVdfVm+dPdTm->operator()(k,q)*dTdfVm)*(Valsm[l+4*nbFFm]*Valsm[j+0*nbFFm]*wJ/2.*nu(q)/eqRatio); - } - } - for(int l=0;l<nbFFp;l++) - { - for(int q = 0; q< 3; q++) - { - stiff(j+k*nbFFm,l+3*nbFFp+nbdofm) -= (dPdTp->operator()(k,q)*dTdfTp+dPdVp->operator()(k,q)*dVdfTp)*(Valsp[l+3*nbFFp]*Valsm[j+0*nbFFm]*wJ/2.*nu(q)/eqRatio); - - stiff(j+k*nbFFm,l+4*nbFFp+nbdofm) -= (dPdVp->operator()(k,q)*dVdfVp+dPdTp->operator()(k,q)*dTdfVp)*(Valsp[l+4*nbFFp]*Valsm[j+0*nbFFm]*wJ/2.*nu(q)/eqRatio); - } - } - } - } - for(int j=0;j<nbFFp;j++) - { - for(int k=0;k<3;k++) - { - for(int l=0;l<nbFFm;l++) - { - for(int q = 0; q< 3; q++) - { - stiff(j+k*nbFFp+nbdofm,l+3*nbFFm) += (dPdTm->operator()(k,q)*dTdfTm+dPdVm->operator()(k,q)*dVdfTm)*(Valsm[l+3*nbFFm]*Valsp[j+0*nbFFp]*wJ/2.*nu(q)/eqRatio); - - stiff(j+k*nbFFp+nbdofm,l+4*nbFFm) += (dPdVm->operator()(k,q)*dVdfVm+dPdTm->operator()(k,q)*dTdfVm)*(Valsm[l+4*nbFFm]*Valsp[j+0*nbFFp]*wJ/2.*nu(q)/eqRatio); - } - } - for(int l=0;l<nbFFp;l++) - { - for(int q = 0; q< 3; q++) - { - stiff(j+k*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += (dPdTp->operator()(k,q)*dTdfTp+dPdVp->operator()(k,q)*dVdfTp)*(Valsp[l+3*nbFFp]*Valsp[j+0*nbFFp]*wJ/2.*nu(q)/eqRatio); - - stiff(j+k*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += (dPdVp->operator()(k,q)*dVdfVp+dPdTp->operator()(k,q)*dTdfVp)*(Valsp[l+4*nbFFp]*Valsp[j+0*nbFFp]*wJ/2.*nu(q)/eqRatio); - } - } - } - } - - - // Assembly consistency (from derivative of flux with deformation gradient) - for(int j=0;j<nbFFm;j++) - { - for(int k=0;k<3;k++) - { - for(int l=0;l<nbFFm;l++) - { - for(int q = 0; q< 3; q++) - { - for(int N = 0; N< 3; N++) - { - stiff(j+3*nbFFm,l+k*nbFFm) -= djydFm->operator()(N,k,q)*(Gradsm[l+0*nbFFm][q]*Valsm[j+3*nbFFm]*wJ/2.*nu(N)); - } - } - } - for(int l=0;l<nbFFp;l++) - { - for(int q = 0; q< 3; q++) - { - for(int N = 0; N< 3; N++) - { - stiff(j+3*nbFFm,l+k*nbFFp+nbdofm) -= djydFp->operator()(N,k,q)*(Gradsp[l+0*nbFFp][q]*Valsm[j+3*nbFFm]*wJ/2.*nu(N)); - } - } - } - } - } - for(int j=0;j<nbFFp;j++) - { - for(int k=0;k<3;k++) - { - for(int l=0;l<nbFFm;l++) - { - for(int q = 0; q< 3; q++) - { - for(int N = 0; N< 3; N++) - { - stiff(j+3*nbFFp+nbdofm,l+k*nbFFm) += djydFm->operator()(N,k,q)*(Gradsm[l+0*nbFFm][q]*Valsp[j+3*nbFFp]*wJ/2.*nu(N)); - } - } - } - for(int l=0;l<nbFFp;l++) - { - for(int q = 0; q< 3; q++) - { - for(int N = 0; N< 3; N++) - { - stiff(j+3*nbFFp+nbdofm,l+k*nbFFp+nbdofm) += djydFp->operator()(N,k,q)*(Gradsp[l+0*nbFFp][q]*Valsp[j+3*nbFFp]*wJ/2.*nu(N)); - } - } - } - } - } - //djedf - for(int j=0;j<nbFFm;j++) - { - for(int k=0;k<3;k++) - { - for(int l=0;l<nbFFm;l++) - { - for(int q = 0; q< 3; q++) - { - for(int N = 0; N< 3; N++) - { - stiff(j+4*nbFFm,l+k*nbFFm) -= djedFm->operator()(N,k,q)*(Gradsm[l+0*nbFFm][q]*Valsm[j+4*nbFFm]*wJ/2.*nu(N)); - } - } - } - for(int l=0;l<nbFFp;l++) - { - for(int q = 0; q< 3; q++) - { - for(int N = 0; N< 3; N++) - { - stiff(j+4*nbFFm,l+k*nbFFp+nbdofm) -= djedFp->operator()(N,k,q)*(Gradsp[l+0*nbFFp][q]*Valsm[j+4*nbFFm]*wJ/2.*nu(N)); - } - } - } - } - } - for(int j=0;j<nbFFp;j++) - { - for(int k=0;k<3;k++) - { - for(int l=0;l<nbFFm;l++) - { - for(int q = 0; q< 3; q++) - { - for(int N = 0; N< 3; N++) - { - stiff(j+4*nbFFp+nbdofm,l+k*nbFFm) += djedFm->operator()(N,k,q)*(Gradsm[l+0*nbFFm][q]*Valsp[j+4*nbFFp]*wJ/2.*nu(N)); - } - } - } - for(int l=0;l<nbFFp;l++) - { - for(int q = 0; q< 3; q++) - { - for(int N = 0; N< 3; N++) - { - stiff(j+4*nbFFp+nbdofm,l+k*nbFFp+nbdofm) += djedFp->operator()(N,k,q)*(Gradsp[l+0*nbFFp][q]*Valsp[j+4*nbFFp]*wJ/2.*nu(N)); - } - } - } - } - } - - // consistency D\mean{q} DT - //dfI1tdft+dfI1tdfv - for(int j=0;j<nbFFm;j++) - { - for(int l=0;l<nbFFm;l++) - { - for(int p = 0; p< 3; p++) - { - stiff(j+3*nbFFm,l+3*nbFFm) -= (djydTm->operator()(p)*dTdfTm+djydVm->operator()(p)*dVdfTm)*(Valsm[l+3*nbFFm]*Valsm[j+3*nbFFm]*wJ/2.*nu(p)); - stiff(j+3*nbFFm,l+4*nbFFm) -= (djydVm->operator()(p)*dVdfVm+djydTm->operator()(p)*dTdfVm)*(Valsm[l+4*nbFFm]*Valsm[j+3*nbFFm]*wJ/2.*nu(p)); - for(int q = 0; q< 3; q++) - { - stiff(j+3*nbFFm,l+3*nbFFm) -=(djydGradTm->operator()(p,q)*dgradTdfTm->operator()(q)+djydGradVm->operator()(p,q)*dgradVdfTm->operator()(q)) - *(Valsm[l+3*nbFFm]*Valsm[j+3*nbFFm]*wJ/2.*nu(p)); - stiff(j+3*nbFFm,l+4*nbFFm) -=(djydGradTm->operator()(p,q)*dgradTdfVm->operator()(q)+djydGradVm->operator()(p,q)*dgradVdfVm->operator()(q)) - *(Valsm[j+3*nbFFm]*Valsm[l+4*nbFFm]*wJ/2.*nu(p)); - - for(int o = 0; o< 3; o++) - { - stiff(j+3*nbFFm,l+3*nbFFm) -= (djydGradTm->operator()(p,o)*dgardTdgradfTm->operator()(o,q)+djydGradVm->operator()(p,o)*dgardVdgradfTm->operator()(o,q)) - *Valsm[j+3*nbFFm]*(Gradsm[l+3*nbFFm][q]*wJ/2.*nu(p)); - stiff(j+3*nbFFm,l+4*nbFFm) -= (djydGradVm->operator()(p,o)*dgardVdgradfVm->operator()(o,q)+djydGradTm->operator()(p,o)*dgardTdgradfVm->operator()(o,q)) - *Valsm[j+3*nbFFm]*(Gradsm[l+4*nbFFm][q]*wJ/2.*nu(p)); - } - } - } - } - - for(int l=0;l<nbFFp;l++) - { - for(int p = 0; p< 3; p++) - { - stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) -= (djydTp->operator()(p)*dTdfTp+djydVp->operator()(p)*dVdfTp)*(Valsp[l+3*nbFFp]*Valsm[j+3*nbFFm]*wJ/2.*nu(p)); - stiff(j+3*nbFFm,l+4*nbFFp+nbdofm) -= (djydVp->operator()(p)*dVdfVp+djydTp->operator()(p)*dTdfVp)*(Valsp[l+4*nbFFp]*Valsm[j+3*nbFFm]*wJ/2.*nu(p)); - for(int q = 0; q< 3; q++) - { - stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) -= (djydGradTp->operator()(p,q)*dgradTdfTp->operator()(q)+djydGradVp->operator()(p,q)*dgradVdfTp->operator()(q)) - *Valsm[j+3*nbFFm]*(Valsp[l+3*nbFFp]*wJ/2.*nu(p)); - stiff(j+3*nbFFm,l+4*nbFFp+nbdofm) -= (djydGradTp->operator()(p,q)*dgradTdfVp->operator()(q)+djydGradVp->operator()(p,q)*dgradVdfVp->operator()(q)) - *Valsm[j+3*nbFFm]*(Valsp[l+4*nbFFp]*wJ/2.*nu(p)); - - for(int o = 0; o< 3; o++) - { - stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) -=(djydGradTp->operator()(p,o)*dgardTdgradfTp->operator()(o,q)+djydGradVp->operator()(p,o)*dgardVdgradfTp->operator()(o,q)) - *Valsm[j+3*nbFFm]*(Gradsp[l+3*nbFFp][q]*wJ/2.*nu(p)); - stiff(j+3*nbFFm,l+4*nbFFp+nbdofm) -=(djydGradVp->operator()(p,o)*dgardVdgradfVp->operator()(o,q)+djydGradTp->operator()(p,o)*dgardTdgradfVp->operator()(o,q)) - *Valsm[j+3*nbFFm]*(Gradsp[l+4*nbFFp][q]*wJ/2.*nu(p)); - } - } - } - } - } - - for(int j=0;j<nbFFp;j++) - { - for(int l=0;l<nbFFm;l++) - { - for(int p = 0; p< 3; p++) - { - stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) += (djydTm->operator()(p)*dTdfTm+djydVm->operator()(p)*dVdfTm)*(Valsm[l+3*nbFFm]*Valsp[j+3*nbFFp]*wJ/2.*nu(p)); - stiff(j+3*nbFFp+nbdofm,l+4*nbFFm) += (djydVm->operator()(p)*dVdfVm+djydTm->operator()(p)*dTdfVm)*(Valsm[l+4*nbFFm]*Valsp[j+3*nbFFp]*wJ/2.*nu(p)); - for(int q = 0; q< 3; q++) - { - stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) += (djydGradTm->operator()(p,q)*dgradTdfTm->operator()(q)+djydGradVm->operator()(p,q)*dgradVdfTm->operator()(q)) - *Valsp[j+3*nbFFp]*(Valsm[l+3*nbFFm]*wJ/2.*nu(p)); - stiff(j+3*nbFFp+nbdofm,l+4*nbFFm) += (djydGradTm->operator()(p,q)*dgradTdfVm->operator()(q)+djydGradVm->operator()(p,q)*dgradVdfVm->operator()(q)) - *Valsp[j+3*nbFFp]*(Valsm[l+4*nbFFm]*wJ/2.*nu(p)); - for(int o = 0; o< 3; o++) - { - stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) += (djydGradTm->operator()(p,o)*dgardTdgradfTm->operator()(o,q)+djydGradVm->operator()(p,o)*dgardVdgradfTm->operator()(o,q)) - *Valsp[j+3*nbFFp]*(Gradsm[l+3*nbFFm][q]*wJ/2.*nu(p)); - stiff(j+3*nbFFp+nbdofm,l+4*nbFFm) += (djydGradVm->operator()(p,o)*dgardVdgradfVm->operator()(o,q)+djydGradTm->operator()(p,o)*dgardTdgradfVm->operator()(o,q)) - *Valsp[j+3*nbFFp]*(Gradsm[l+4*nbFFm][q]*wJ/2.*nu(p)); - } - } - } - } - for(int l=0;l<nbFFp;l++) - { - for(int p = 0; p< 3; p++) - { - stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += (djydTp->operator()(p)*dTdfTp+djydVp->operator()(p)*dVdfTp)*(Valsp[l+3*nbFFp]*Valsp[j+3*nbFFp]*wJ/2.*nu(p)); - stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += (djydVp->operator()(p)*dVdfVp+djydTp->operator()(p)*dTdfVp)*(Valsp[l+4*nbFFp]*Valsp[j+3*nbFFp]*wJ/2.*nu(p)); - for(int q = 0; q< 3; q++) - { - stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += (djydGradTp->operator()(p,q)*dgradTdfTp->operator()(q)+djydGradVp->operator()(p,q)*dgradVdfTp->operator()(q)) - *Valsp[j+3*nbFFp]*(Valsp[l+3*nbFFp]*wJ/2.*nu(p)); - stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += (djydGradTp->operator()(p,q)*dgradTdfVp->operator()(q)+djydGradVp->operator()(p,q)*dgradVdfVp->operator()(q)) - *Valsp[j+3*nbFFp]*(Valsp[l+4*nbFFp]*wJ/2.*nu(p)); - for(int o = 0; o< 3; o++) - { - stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm)+=(djydGradTp->operator()(p,o)*dgardTdgradfTp->operator()(o,q)+djydGradVp->operator()(p,o)*dgardVdgradfTp->operator()(o,q)) - *Valsp[j+3*nbFFp]*(Gradsp[l+3*nbFFp][q]*wJ/2.*nu(p)); - stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm)+=(djydGradVp->operator()(p,o)*dgardVdgradfVp->operator()(o,q)+djydGradTp->operator()(p,o)*dgardTdgradfVp->operator()(o,q)) - *Valsp[j+3*nbFFp]*(Gradsp[l+4*nbFFp][q]*wJ/2.*nu(p)); - } - } - } - } - } - - - //dfI1vdv+dfI1vdt - for(int j=0;j<nbFFm;j++) - { - for(int l=0;l<nbFFm;l++) - { - for(int p = 0; p< 3; p++) - { - stiff(j+4*nbFFm,l+4*nbFFm) -= (djedVm->operator()(p)*dVdfVm+djedTm->operator()(p)*dTdfVm)*(Valsm[l+4*nbFFm]*Valsm[j+4*nbFFm]*wJ/2.*nu(p)); - stiff(j+4*nbFFm,l+3*nbFFm) -= (djedTm->operator()(p)*dTdfTm+djedVm->operator()(p)*dVdfTm)*(Valsm[l+3*nbFFm]*Valsm[j+4*nbFFm]*wJ/2.*nu(p)); - for(int q = 0; q< 3; q++) - { - stiff(j+4*nbFFm,l+4*nbFFm) -=(djedGradVm->operator()(p,q)*dgradVdfVm->operator()(q)+djedGradTm->operator()(p,q)*dgradTdfVm->operator()(q)) - *(Valsm[l+4*nbFFm]*Valsm[j+4*nbFFm]*wJ/2.*nu(p)); - stiff(j+4*nbFFm,l+3*nbFFm) -=(djedGradVm->operator()(p,q)*dgradVdfTm->operator()(q)+djedGradTm->operator()(p,q)*dgradTdfTm->operator()(q)) - *Valsm[j+4*nbFFm]*(Valsm[l+3*nbFFm]*wJ/2.*nu(p)); - for(int o = 0; o< 3; o++) - { - stiff(j+4*nbFFm,l+4*nbFFm) -=(djedGradVm->operator()(p,o)*dgardVdgradfVm->operator()(o,q)+djedGradTm->operator()(p,o)*dgardTdgradfVm->operator()(o,q)) - *Valsm[j+4*nbFFm]*(Gradsm[l+4*nbFFm][q]*wJ/2.*nu(p)); - stiff(j+4*nbFFm,l+3*nbFFm) -=(djedGradTm->operator()(p,o)*dgardTdgradfTm->operator()(o,q)+djedGradVm->operator()(p,o)*dgardVdgradfTm->operator()(o,q)) - *Valsm[j+4*nbFFm]*(Gradsm[l+3*nbFFm][q]*wJ/2.*nu(p)); - } - } - } - } - for(int l=0;l<nbFFp;l++) - { - for(int p = 0; p< 3; p++) - { - stiff(j+4*nbFFm,l+4*nbFFp+nbdofm) -= (djedVp->operator()(p)*dVdfVp+djedTp->operator()(p)*dTdfVp)*(Valsp[l+4*nbFFp]*Valsm[j+4*nbFFm]*wJ/2.*nu(p)); - stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) -= (djedTp->operator()(p)*dTdfTp+djedVp->operator()(p)*dVdfTp)*(Valsp[l+3*nbFFp]*Valsm[j+4*nbFFm]*wJ/2.*nu(p)); - for(int q = 0; q< 3; q++) - { - stiff(j+4*nbFFm,l+4*nbFFp+nbdofm) -=(djedGradVp->operator()(p,q)*dgradVdfVp->operator()(q)+djedGradTp->operator()(p,q)*dgradTdfVp->operator()(q)) - *Valsm[j+4*nbFFm]*(Valsp[l+4*nbFFp]*wJ/2.*nu(p)); - stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) -=(djedGradTp->operator()(p,q)*dgradTdfTp->operator()(q)+djedGradVp->operator()(p,q)*dgradVdfTp->operator()(q)) - *Valsm[j+4*nbFFm]*(Valsp[l+3*nbFFp]*wJ/2.*nu(p)); - for(int o = 0; o< 3; o++) - { - stiff(j+4*nbFFm,l+4*nbFFp+nbdofm) -=(djedGradVp->operator()(p,o)*dgardVdgradfVp->operator()(o,q)+djedGradTp->operator()(p,o)*dgardTdgradfVp->operator()(o,q)) - *Valsm[j+4*nbFFm]*(Gradsp[l+4*nbFFp][q]*wJ/2.*nu(p)); - stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) -=(djedGradTp->operator()(p,o)*dgardTdgradfTp->operator()(o,q)+djedGradVp->operator()(p,o)*dgardVdgradfTp->operator()(o,q)) - *Valsm[j+4*nbFFm]*(Gradsp[l+3*nbFFp][q]*wJ/2.*nu(p)); - } - } - } - } - } - - for(int j=0;j<nbFFp;j++) - { - for(int l=0;l<nbFFm;l++) - { - for(int p = 0; p< 3; p++) - { - stiff(j+4*nbFFp+nbdofm,l+4*nbFFm) +=( djedVm->operator()(p)*dVdfVm+ djedTm->operator()(p)*dTdfVm)*(Valsm[l+4*nbFFm]*Valsp[j+4*nbFFp]*wJ/2.*nu(p)); - stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) += (djedTm->operator()(p)*dTdfTm+djedVm->operator()(p)*dVdfTm)*(Valsm[l+3*nbFFm]*Valsp[j+4*nbFFp]*wJ/2.*nu(p)); - for(int q = 0; q< 3; q++) - { - stiff(j+4*nbFFp+nbdofm,l+4*nbFFm) +=(djedGradVm->operator()(p,q)*dgradVdfVm->operator()(q)+djedGradTm->operator()(p,q)*dgradTdfVm->operator()(q)) - *Valsp[j+4*nbFFp] *(Valsm[l+4*nbFFm]*wJ/2.*nu(p)); - stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) +=(djedGradVm->operator()(p,q)*dgradVdfTm->operator()(q)+djedGradTm->operator()(p,q)*dgradTdfTm->operator()(q)) - *Valsp[j+4*nbFFp] *(Valsm[l+3*nbFFm]*wJ/2.*nu(p)); - for(int o = 0; o< 3; o++) - { - stiff(j+4*nbFFp+nbdofm,l+4*nbFFm) +=(djedGradVm->operator()(p,o)*dgardVdgradfVm->operator()(o,q)+djedGradTm->operator()(p,o)*dgardTdgradfVm->operator()(o,q)) - *Valsp[j+4*nbFFp]*(Gradsm[l+4*nbFFm][q]*wJ/2.*nu(p)); - stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) +=(djedGradTm->operator()(p,o)*dgardTdgradfTm->operator()(o,q)+djedGradVm->operator()(p,o)*dgardVdgradfTm->operator()(o,q)) - *Valsp[j+4*nbFFp] *(Gradsm[l+3*nbFFm][q]*wJ/2.*nu(p)); - } - } - } - } - for(int l=0;l<nbFFp;l++) - { - for(int p = 0; p< 3; p++) - { - stiff(j+4*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += (djedVp->operator()(p)*dVdfVp+djedTp->operator()(p)*dTdfVp)*(Valsp[l+4*nbFFp]*Valsp[j+4*nbFFp]*wJ/2.*nu(p)); - stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += (djedTp->operator()(p)*dTdfTp+djedVp->operator()(p)*dVdfTp)*(Valsp[l+3*nbFFp]*Valsp[j+4*nbFFp]*wJ/2.*nu(p)); - for(int q = 0; q< 3; q++) - { - stiff(j+4*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += (djedGradVp->operator()(p,q)*dgradVdfVp->operator()(q)+djedGradTp->operator()(p,q)*dgradTdfVp->operator()(q)) - *(Valsp[l+4*nbFFp]*Valsp[j+4*nbFFp]*wJ/2.*nu(p)); - stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += (djedGradTp->operator()(p,q)*dgradTdfTp->operator()(q)+djedGradVp->operator()(p,q)*dgradVdfTp->operator()(q)) - *(Valsp[l+3*nbFFp]*Valsp[j+4*nbFFp]*wJ/2.*nu(p)); - for(int o = 0; o< 3; o++) - { - stiff(j+4*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += (djedGradVp->operator()(p,o)*dgardVdgradfVp->operator()(o,q)+djedGradTp->operator()(p,o)*dgardTdgradfVp->operator()(o,q)) - *Valsp[j+4*nbFFp]*(Gradsp[l+4*nbFFp][q]*wJ/2.*nu(p)); - stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += (djedGradTp->operator()(p,o)*dgardTdgradfTp->operator()(o,q)+djedGradVp->operator()(p,o)*dgardVdgradfTp->operator()(o,q)) - *Valsp[j+4*nbFFp]*(Gradsp[l+3*nbFFp][q]*wJ/2.*nu(p)); - } - } - } - } - } - - // Stability N \mean{k0} (N) - double NBhsNdjy1dfTm=0.;double NBhsNdjy1dfTp=0.; double NBhsNdL1dfTm=0.; double NBhsNdL1dfTp=0.; - double NBhsNdL2dfTm=0.;double NBhsNdL2dfTp=0.; double NBhsNdjy1dfvm=0.; double NBhsNdjy1dfvp=0.; double NBhsNdl2dfvm=0.; double NBhsNdl2dfvp=0.; - - double NBhsNdjy1dTm=0.;double NBhsNdjy1dTp=0.; double NBhsNdL1dTm=0.; double NBhsNdL1dTp=0.; - double NBhsNdL2dTm=0.;double NBhsNdL2dTp=0.; double NBhsNdjy1dvm=0.; double NBhsNdjy1dvp=0.; double NBhsNdL2dVm=0.; double NBhsNdL2dVp=0.; - - static STensor3 NBhsNdjy1dFm, NBhsNdjy1dFp, NBhsNdL1dFm, NBhsNdL1dFp, NBhsNdL2dFm, NBhsNdL2dFp; - NBhsNdjy1dFm*=0.; NBhsNdjy1dFp*=0.; NBhsNdL1dFm*=0.; NBhsNdL1dFp*=0.; NBhsNdL2dFm*=0.; NBhsNdL2dFp*=0.; - - for(int l = 0; l <3; l++) - { - for(int n = 0; n <3; n++) - { - NBhsNdjy1dTm+=djy1dTm->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; - NBhsNdjy1dTp+=djy1dTp->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; - - NBhsNdL1dTm+=dl10dTm->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; - NBhsNdL1dTp+=dl10dTp->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; - NBhsNdL2dTm+=dl20dTm->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; - NBhsNdL2dTp+=dl20dTp->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; - - NBhsNdjy1dvm+=djy1dVm->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; - NBhsNdjy1dvp+=djy1dVp->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; - - NBhsNdL2dVm+=dl20dvm->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; - NBhsNdL2dVp+=dl20dvp->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; - } - } - - NBhsNdjy1dfTm = NBhsNdjy1dTm*dTdfTm+NBhsNdjy1dvm*dVdfTm; - NBhsNdjy1dfTp = NBhsNdjy1dTp*dTdfTp+NBhsNdjy1dvp*dVdfTp; - - NBhsNdL1dfTm = NBhsNdL1dTm*dTdfTm; - NBhsNdL1dfTp = NBhsNdL1dTp*dTdfTp; - NBhsNdL2dfTm = NBhsNdL2dTm*dTdfTm+NBhsNdL2dVm*dVdfTm; - NBhsNdL2dfTp = NBhsNdL2dTp*dTdfTp+NBhsNdL2dVp*dVdfTp; - - NBhsNdjy1dfvm =NBhsNdjy1dvm*dVdfVm+NBhsNdjy1dTm*dTdfVm; - NBhsNdjy1dfvp =NBhsNdjy1dvp*dVdfVp+NBhsNdjy1dTp*dTdfVp; - - NBhsNdl2dfvm =NBhsNdL2dVm*dVdfVm+NBhsNdL2dTm*dTdfVm; - NBhsNdl2dfvp =NBhsNdL2dVp*dVdfVp+NBhsNdL2dTp*dTdfVp; - - for(int j = 0; j<3; j++) - { - for(int p = 0; p<3; p++) - { - for(int l = 0; l <3; l++) - { - for(int n = 0; n <3; n++) - { - NBhsNdjy1dFm(j,p)+=djy1dFm->operator()(l,n,j,p)*nu(n)*nbetahs*nu(l)/2.; - NBhsNdjy1dFp(j,p)+=djy1dFp->operator()(l,n,j,p)*nu(n)*nbetahs*nu(l)/2.; - - NBhsNdL1dFm(j,p)+=dl10dFm->operator()(l,n,j,p)*nu(n)*nbetahs*nu(l)/2.; - NBhsNdL1dFp(j,p)+=dl10dFp->operator()(l,n,j,p)*nu(n)*nbetahs*nu(l)/2.; - NBhsNdL2dFm(j,p)+=dl20dFm->operator()(l,n,j,p)*nu(n)*nbetahs*nu(l)/2.; - NBhsNdL2dFp(j,p)+=dl20dFp->operator()(l,n,j,p)*nu(n)*nbetahs*nu(l)/2.; - } - } - } - } - - double NMeanjy1NBetasc=0.; double NMeanl1NBetasc=0.; double NMeanl2NBetasc=0.; - for(int l = 0; l <3; l++) - { - for(int n = 0; n <3; n++) - { - NMeanjy1NBetasc += (jy1p->operator()(l,n)+jy1m->operator()(l,n))*nu(n)*nbetahs*nu(l)/2.; - NMeanl1NBetasc += (l10p->operator()(l,n)+l10m->operator()(l,n))*nu(n)*nbetahs*nu(l)/2.; - NMeanl2NBetasc += (l20p->operator()(l,n)+l20m->operator()(l,n))*nu(n)*nbetahs*nu(l)/2.; - } - } - - //new terms for dfTI3dfT - for(int j=0;j<nbFFm;j++) - { - for(int l=0;l<nbFFm;l++) - { - stiff(j+3*nbFFm,l+3*nbFFm) -= ftJump*NBhsNdjy1dfTm*Valsm[j+3*nbFFm]*Valsm[l+3*nbFFm]*wJ; - stiff(j+3*nbFFm,l+3*nbFFm) -= fvJump*NBhsNdL2dfTm*Valsm[j+3*nbFFm]*Valsm[l+3*nbFFm]*wJ; - - stiff(j+3*nbFFm,l+3*nbFFm) += NMeanjy1NBetasc*Valsm[j+3*nbFFm]*Valsm[l+3*nbFFm]*wJ; - } - for(int l=0;l<nbFFp;l++) - { - stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) -= ftJump*NBhsNdjy1dfTp*Valsm[j+3*nbFFm]*Valsp[l+3*nbFFp]*wJ; - stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) -= fvJump*NBhsNdL2dfTp*Valsm[j+3*nbFFm]*Valsp[l+3*nbFFp]*wJ; - - stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) -= NMeanjy1NBetasc*Valsm[j+3*nbFFm]*Valsp[l+3*nbFFp]*wJ; - } - } - - for(int j=0;j<nbFFp;j++) - { - for(int l=0;l<nbFFm;l++) - { - stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) += ftJump*NBhsNdjy1dfTm*Valsp[j+3*nbFFp]*Valsm[l+3*nbFFm]*wJ; - stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) += fvJump*NBhsNdL2dfTm *Valsp[j+3*nbFFp]*Valsm[l+3*nbFFm]*wJ; - - stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) -= NMeanjy1NBetasc*Valsp[j+3*nbFFp]*Valsm[l+3*nbFFm]*wJ; - } - for(int l=0;l<nbFFp;l++) - { - stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += ftJump*NBhsNdjy1dfTp*Valsp[j+3*nbFFp]*Valsp[l+3*nbFFp]*wJ; - stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += fvJump*NBhsNdL2dfTp *Valsp[j+3*nbFFp]*Valsp[l+3*nbFFp]*wJ; - - stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += NMeanjy1NBetasc*Valsp[j+3*nbFFp]*Valsp[l+3*nbFFp]*wJ; - } - } - - // terms for dfTI3dfv - for(int j=0;j<nbFFm;j++) - { - for(int l=0;l<nbFFm;l++) - { - stiff(j+3*nbFFm,l+4*nbFFm) -= ftJump*NBhsNdjy1dfvm*Valsm[j+3*nbFFm]*Valsm[l+4*nbFFm]*wJ; - stiff(j+3*nbFFm,l+4*nbFFm) -= fvJump*NBhsNdl2dfvm *Valsm[j+3*nbFFm]*Valsm[l+4*nbFFm]*wJ; - - stiff(j+3*nbFFm,l+4*nbFFm) += NMeanl2NBetasc*Valsm[j+3*nbFFm]*Valsm[l+4*nbFFm]*wJ; - } - for(int l=0;l<nbFFp;l++) - { - stiff(j+3*nbFFm,l+4*nbFFp+nbdofm) -= ftJump*NBhsNdjy1dfvp*Valsm[j+3*nbFFm]*Valsp[l+4*nbFFp]*wJ; - stiff(j+3*nbFFm,l+4*nbFFp+nbdofm) -= fvJump*NBhsNdl2dfvp *Valsm[j+3*nbFFm]*Valsp[l+4*nbFFp]*wJ; - - stiff(j+3*nbFFm,l+4*nbFFp+nbdofm) -= NMeanl2NBetasc*Valsm[j+3*nbFFm]*Valsp[l+4*nbFFp]*wJ; - } - } - - for(int j=0;j<nbFFp;j++) - { - for(int l=0;l<nbFFm;l++) - { - stiff(j+3*nbFFp+nbdofm,l+4*nbFFm) += ftJump*NBhsNdjy1dfvm*Valsp[j+3*nbFFp]*Valsm[l+4*nbFFm]*wJ; - stiff(j+3*nbFFp+nbdofm,l+4*nbFFm) += fvJump*NBhsNdl2dfvm *Valsp[j+3*nbFFp]*Valsm[l+4*nbFFm]*wJ; - - stiff(j+3*nbFFp+nbdofm,l+4*nbFFm) -= NMeanl2NBetasc*Valsp[j+3*nbFFp]*Valsm[l+4*nbFFm]*wJ; - } - for(int l=0;l<nbFFp;l++) - { - stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += ftJump*NBhsNdjy1dfvp*Valsp[j+3*nbFFp]*Valsp[l+4*nbFFp]*wJ; - stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += fvJump*NBhsNdl2dfvp *Valsp[j+3*nbFFp]*Valsp[l+4*nbFFp]*wJ; - - stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) +=NMeanl2NBetasc*Valsp[j+3*nbFFp]*Valsp[l+4*nbFFp]*wJ; - } - } - - //Terms for dfvI3dfv - for(int j=0;j<nbFFm;j++) - { - for(int l=0;l<nbFFm;l++) - { - stiff(j+4*nbFFm,l+4*nbFFm) -= ftJump*NBhsNdl2dfvm*Valsm[j+4*nbFFm]*Valsm[l+4*nbFFm]*wJ; - - stiff(j+4*nbFFm,l+4*nbFFm) += NMeanl1NBetasc*Valsm[j+4*nbFFm]*Valsm[l+4*nbFFm]*wJ; - } - for(int l=0;l<nbFFp;l++) - { - stiff(j+4*nbFFm,l+4*nbFFp+nbdofm) -= ftJump*NBhsNdl2dfvp*Valsm[j+4*nbFFm]*Valsp[l+4*nbFFp]*wJ; - - stiff(j+4*nbFFm,l+4*nbFFp+nbdofm) -= NMeanl1NBetasc*Valsm[j+4*nbFFm]*Valsp[l+4*nbFFp]*wJ; - } - } - - for(int j=0;j<nbFFp;j++) - { - for(int l=0;l<nbFFm;l++) - { - stiff(j+4*nbFFp+nbdofm,l+4*nbFFm) += ftJump*NBhsNdl2dfvm*Valsp[j+4*nbFFp]*Valsm[l+4*nbFFm]*wJ; - - stiff(j+4*nbFFp+nbdofm,l+4*nbFFm) -= NMeanl1NBetasc*Valsp[j+4*nbFFp]*Valsm[l+4*nbFFm]*wJ; - } - for(int l=0;l<nbFFp;l++) - { - stiff(j+4*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += ftJump*NBhsNdl2dfvp*Valsp[j+4*nbFFp]*Valsp[l+4*nbFFp]*wJ; - - stiff(j+4*nbFFp+nbdofm,l+4*nbFFp+nbdofm) +=NMeanl1NBetasc*Valsp[j+4*nbFFp]*Valsp[l+4*nbFFp]*wJ; - } - } - - - for(int j=0;j<nbFFm;j++) - { - for(int l=0;l<nbFFm;l++) - { - stiff(j+4*nbFFm,l+3*nbFFm) -= fvJump*NBhsNdL1dfTm*Valsm[j+4*nbFFm]*Valsm[l+3*nbFFm]*wJ; - stiff(j+4*nbFFm,l+3*nbFFm) -= ftJump*NBhsNdL2dfTm*Valsm[j+4*nbFFm]*Valsm[l+3*nbFFm]*wJ; - - stiff(j+4*nbFFm,l+3*nbFFm) += NMeanl2NBetasc*Valsm[j+4*nbFFm]*Valsm[l+3*nbFFm]*wJ; - } - for(int l=0;l<nbFFp;l++) - { - stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) -= fvJump*NBhsNdL1dfTp*Valsm[j+4*nbFFm]*Valsp[l+3*nbFFp]*wJ; - stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) -= ftJump*NBhsNdL2dfTp*Valsm[j+4*nbFFm]*Valsp[l+3*nbFFp]*wJ; - - stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) -= NMeanl2NBetasc*Valsm[j+4*nbFFm]*Valsp[l+3*nbFFp]*wJ; - } - } - - for(int j=0;j<nbFFp;j++) - { - for(int l=0;l<nbFFm;l++) - { - stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) += fvJump*NBhsNdL1dfTm*Valsp[j+4*nbFFp]*Valsm[l+3*nbFFm]*wJ; - stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) += ftJump*NBhsNdL2dfTm*Valsp[j+4*nbFFp]*Valsm[l+3*nbFFm]*wJ; - - stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) -= NMeanl2NBetasc*Valsp[j+4*nbFFp]*Valsm[l+3*nbFFm]*wJ; - - } - for(int l=0;l<nbFFp;l++) - { - stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += fvJump*NBhsNdL1dfTp*Valsp[j+4*nbFFp]*Valsp[l+3*nbFFp]*wJ; - stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += ftJump*NBhsNdL2dfTp*Valsp[j+4*nbFFp]*Valsp[l+3*nbFFp]*wJ; - - stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += NMeanl2NBetasc*Valsp[j+4*nbFFp]*Valsp[l+3*nbFFp]*wJ; - } - } + Stiff_alphadialitationm*= (-1.)/(fTm*fTm); + Stiff_alphadialitationp*= (-1.)/(fTp*fTp); + const SVector3 &jump = ipvp->getConstRefToJump(); - //F - //new terms for dfvI3dF - for(int j=0;j<nbFFm;j++) - { - for(int k=0;k<3;k++) - { - for(int l=0;l<nbFFm;l++) - { - for(int p=0;p<3;p++) - { - stiff(j+4*nbFFm,l+k*nbFFm) -= fvJump*NBhsNdL1dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsm[j+4*nbFFm]*wJ; - stiff(j+4*nbFFm,l+k*nbFFm) -= ftJump*NBhsNdL2dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsm[j+4*nbFFm]*wJ; - - stiff(j+3*nbFFm,l+k*nbFFm) -= ftJump*NBhsNdjy1dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsm[j+3*nbFFm]*wJ; - stiff(j+3*nbFFm,l+k*nbFFm) -= fvJump*NBhsNdL2dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsm[j+3*nbFFm]*wJ; - } - } - - for(int l=0;l<nbFFp;l++) - { - for(int p=0;p<3;p++) - { - stiff(j+4*nbFFm,l+k*nbFFp+nbdofm) -= fvJump*NBhsNdL1dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsm[j+4*nbFFm]*wJ; - stiff(j+4*nbFFm,l+k*nbFFp+nbdofm) -= ftJump*NBhsNdL2dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsm[j+4*nbFFm]*wJ; - - stiff(j+3*nbFFm,l+k*nbFFp+nbdofm) -= ftJump*NBhsNdjy1dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsm[j+3*nbFFm]*wJ; - stiff(j+3*nbFFm,l+k*nbFFp+nbdofm) -= fvJump*NBhsNdL2dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsm[j+3*nbFFm]*wJ; - } - } - } - } - - for(int j=0;j<nbFFp;j++) - { - for(int k=0;k<3;k++) - { - for(int l=0;l<nbFFm;l++) - { - for(int p=0;p<3;p++) - { - stiff(j+4*nbFFp+nbdofm,l+k*nbFFm) += fvJump*NBhsNdL1dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsp[j+4*nbFFp]*wJ; - stiff(j+4*nbFFp+nbdofm,l+k*nbFFm) += ftJump*NBhsNdL2dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsp[j+4*nbFFp]*wJ; - - stiff(j+3*nbFFp+nbdofm,l+k*nbFFm) += ftJump*NBhsNdjy1dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsp[j+3*nbFFp]*wJ; - stiff(j+3*nbFFp+nbdofm,l+k*nbFFm) += fvJump*NBhsNdL2dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsp[j+3*nbFFp]*wJ; - } - } - - for(int l=0;l<nbFFp;l++) - { - for(int p=0;p<3;p++) - { - stiff(j+4*nbFFp+nbdofm,l+k*nbFFp+nbdofm) +=fvJump*NBhsNdL1dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsp[j+4*nbFFp]*wJ; - stiff(j+4*nbFFp+nbdofm,l+k*nbFFp+nbdofm) +=ftJump*NBhsNdL2dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsp[j+4*nbFFp]*wJ; - - stiff(j+3*nbFFp+nbdofm,l+k*nbFFp+nbdofm) +=ftJump*NBhsNdjy1dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsp[j+3*nbFFp]*wJ; - stiff(j+3*nbFFp+nbdofm,l+k*nbFFp+nbdofm) +=fvJump*NBhsNdL2dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsp[j+3*nbFFp]*wJ; - } - } - } - } - - //dfI2TdfT - // compatibility - // Assembly (loop on shape function) - for(int j=0;j<nbFFm;j++) + if(broken) { - for(int l=0;l<nbFFm;l++) + + } + else + { + const STensor3 *dPdTm = &(ipvm->getConstRefTodPdT()); + const STensor3 *dPdTp = &(ipvp->getConstRefTodPdT()); + const STensor33 *djedFm = &(ipvm->getConstRefTodFluxVdF()); + const STensor33 *djedFp = &(ipvp->getConstRefTodFluxVdF()); + const STensor3 *dPdVm = &(ipvm->getConstRefTodPdV()); + const STensor3 *dPdVp = &(ipvp->getConstRefTodPdV()); + + const STensor3 *l10m = &(ipvm->getConstRefToElecConductivity()); + const STensor3 *l10p = &(ipvp->getConstRefToElecConductivity()); + const STensor3 *l20m = &(ipvm->getConstRefToCrossElecConductivity()); + const STensor3 *l20p = &(ipvp->getConstRefToCrossElecConductivity()); + + const STensor3 *dl10dTm = &(ipvm->getConstRefTodElecConductivitydT()); + const STensor3 *dl10dTp = &(ipvp->getConstRefTodElecConductivitydT()); + const STensor3 *dl20dTm = &(ipvm->getConstRefTodCrossElecConductivitydT()); + const STensor3 *dl20dTp = &(ipvp->getConstRefTodCrossElecConductivitydT()); + + const STensor3 *dl20dvm = &(ipvm->getConstRefTodCrossElecConductivitydv()); + const STensor3 *dl20dvp = &(ipvp->getConstRefTodCrossElecConductivitydv()); + + const STensor43 *dl10dFm = &(ipvm->getConstRefTodElecConductivitydF()); + const STensor43 *dl10dFp = &(ipvp->getConstRefTodElecConductivitydF()); + const STensor43 *dl20dFm = &(ipvm->getConstRefTodCrossElecConductivitydF()); + const STensor43 *dl20dFp = &(ipvp->getConstRefTodCrossElecConductivitydF()); + + const STensor3 *djedGradVm = &(ipvm->getConstRefTodFluxVdGradV()); + const STensor3 *djedGradVp = &(ipvp->getConstRefTodFluxVdGradV()); + const SVector3 *djedVm = &(ipvm->getConstRefTodFluxVdV()); + const SVector3 *djedVp = &(ipvp->getConstRefTodFluxVdV()); + const STensor3 *djedGradTm = &(ipvm->getConstRefTodFluxVdGradT()); + const STensor3 *djedGradTp = &(ipvp->getConstRefTodFluxVdGradT()); + const SVector3 *djedTm = &(ipvm->getConstRefTodFluxVdT()); + const SVector3 *djedTp = &(ipvp->getConstRefTodFluxVdT()); + + const STensor3 *dgardVdgradfVm = &(ipvm->getConstRefTodgradVdgradfV()); + const STensor3 *dgardVdgradfTm = &(ipvm->getConstRefTodgradVdgradfT()); + const STensor3 *dgardTdgradfTm = &(ipvm->getConstRefTodgradTdgradfT()); + const STensor3 *dgardTdgradfVm = &(ipvm->getConstRefTodgradTdgradfV()); + + const double &dVdfVm = (ipvm->getConstRefTodVdfV()); + const double &dVdfTm = (ipvm->getConstRefTodVdfT()); + const double &dTdfTm = (ipvm->getConstRefTodTdfT()); + const double &dTdfVm = (ipvm->getConstRefTodTdfV()); + + const SVector3 *dgradVdfVm = &(ipvm->getConstRefTodgradVdfV()); + const SVector3 *dgradVdfTm = &(ipvm->getConstRefTodgradVdfT()); + const SVector3 *dgradTdfTm = &(ipvm->getConstRefTodgradTdfT()); + const SVector3 *dgradTdfVm = &(ipvm->getConstRefTodgradTdfV()); + + const STensor3 *dgardVdgradfVp = &(ipvp->getConstRefTodgradVdgradfV()); + const STensor3 *dgardVdgradfTp = &(ipvp->getConstRefTodgradVdgradfT()); + const STensor3 *dgardTdgradfTp = &(ipvp->getConstRefTodgradTdgradfT()); + const STensor3 *dgardTdgradfVp = &(ipvp->getConstRefTodgradTdgradfV()); + + const double &dVdfVp = (ipvp->getConstRefTodVdfV()); + const double &dVdfTp = (ipvp->getConstRefTodVdfT()); + const double &dTdfVp = (ipvp->getConstRefTodTdfV()); + const double &dTdfTp = (ipvp->getConstRefTodTdfT()); + + const SVector3 *dgradVdfVp = &(ipvp->getConstRefTodgradVdfV()); + const SVector3 *dgradVdfTp = &(ipvp->getConstRefTodgradVdfT()); + const SVector3 *dgradTdfTp = &(ipvp->getConstRefTodgradTdfT()); + const SVector3 *dgradTdfVp = &(ipvp->getConstRefTodgradTdfV()); + + const STensor3 *jy1m = &(ipvm->getConstRefToEnergyConductivity()); + const STensor43 *djy1dFm = &(ipvm->getConstRefTodEnergyConductivitydF()); + const STensor3 *djy1dVm = &(ipvm->getConstRefTodEnergyConductivitydV()); + const STensor3 *djy1dTm = &(ipvm->getConstRefTodEnergyConductivitydT()); + + const STensor3 *jy1p = &(ipvp->getConstRefToEnergyConductivity()); + const STensor43 *djy1dFp = &(ipvp->getConstRefTodEnergyConductivitydF()); + const STensor3 *djy1dVp = &(ipvp->getConstRefTodEnergyConductivitydV()); + const STensor3 *djy1dTp = &(ipvp->getConstRefTodEnergyConductivitydT()); + + const STensor33 *djydFp = &(ipvp->getConstRefTodFluxEnergydF()); + const STensor3 *djydGradTp = &(ipvp->getConstRefTodFluxEnergydGradT()); + const SVector3 *djydTp = &(ipvp->getConstRefTodFluxEnergydT()); + const STensor3 *djydGradVp = &(ipvp->getConstRefTodFluxEnergydGradV()); + const SVector3 *djydVp = &(ipvp->getConstRefTodFluxEnergydV()); + const SVector3 *fluxjyp = &(ipvp->getConstRefToFluxEnergy()); + + const STensor33 *djydFm = &(ipvm->getConstRefTodFluxEnergydF()); + const STensor3 *djydGradTm = &(ipvm->getConstRefTodFluxEnergydGradT()); + const SVector3 *djydTm = &(ipvm->getConstRefTodFluxEnergydT()); + const STensor3 *djydGradVm = &(ipvm->getConstRefTodFluxEnergydGradV()); + const SVector3 *djydVm = &(ipvm->getConstRefTodFluxEnergydV()); + const SVector3 *fluxjym = &(ipvm->getConstRefToFluxEnergy()); + + + + + double eqRatio = _ElecTherMechEqRatio; + wJ*=eqRatio; + // Assembly consistency (from derivative of sigma with extra field) + for(int j=0;j<nbFFm;j++) { - for(int p =0; p < 3; p++) + for(int k=0;k<3;k++) { - for(int q =0; q < 3; q++) + for(int l=0;l<nbFFm;l++) { - stiff(j+3*nbFFm,l+3*nbFFm) -= (jy1m->operator()(p,q)*Gradsm[j+3*nbFFm][q])*nu(p)*Valsm[l+3*nbFFm]*wJ/2.; + for(int q = 0; q< 3; q++) + { + stiff(j+k*nbFFm,l+3*nbFFm) -= (dPdTm->operator()(k,q)*dTdfTm+dPdVm->operator()(k,q)*dVdfTm)*(Valsm[l+3*nbFFm]*Valsm[j+0*nbFFm]*wJ/2.*nu(q)/eqRatio); - stiff(j+3*nbFFm,l+3*nbFFm) += ftJump*(djy1dTm->operator()(p,q)*dTdfTm+djy1dVm->operator()(p,q)*dVdfTm)*Gradsm[j+3*nbFFm][q]*nu(p)*Valsm[l+3*nbFFm]*wJ/2.; - stiff(j+3*nbFFm,l+3*nbFFm) += fvJump*(dl20dTm->operator()(p,q)*dTdfTm+dl20dvm->operator()(p,q)*dVdfTm)*Gradsm[j+3*nbFFm][q]*(nu(p)*Valsm[l+3*nbFFm])*wJ/2.; + stiff(j+k*nbFFm,l+4*nbFFm) -= (dPdVm->operator()(k,q)*dVdfVm+dPdTm->operator()(k,q)*dTdfVm)*(Valsm[l+4*nbFFm]*Valsm[j+0*nbFFm]*wJ/2.*nu(q)/eqRatio); + } } - } - } - for(int l=0;l<nbFFp;l++) - { - for(int p =0; p < 3; p++) - { - for(int q =0; q < 3; q++) + for(int l=0;l<nbFFp;l++) { - stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) += (jy1m->operator()(p,q)*Gradsm[j+3*nbFFm][q])*nu(p)*Valsp[l+3*nbFFp]*wJ/2.; + for(int q = 0; q< 3; q++) + { + stiff(j+k*nbFFm,l+3*nbFFp+nbdofm) -= (dPdTp->operator()(k,q)*dTdfTp+dPdVp->operator()(k,q)*dVdfTp)*(Valsp[l+3*nbFFp]*Valsm[j+0*nbFFm]*wJ/2.*nu(q)/eqRatio); + + stiff(j+k*nbFFm,l+4*nbFFp+nbdofm) -= (dPdVp->operator()(k,q)*dVdfVp+dPdTp->operator()(k,q)*dTdfVp)*(Valsp[l+4*nbFFp]*Valsm[j+0*nbFFm]*wJ/2.*nu(q)/eqRatio); + } } } } - } - - for(int j=0;j<nbFFp;j++) - { - for(int l=0;l<nbFFm;l++) + for(int j=0;j<nbFFp;j++) { - for(int p =0; p < 3; p++) + for(int k=0;k<3;k++) { - for(int q =0; q < 3; q++) + for(int l=0;l<nbFFm;l++) { - stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) -= (jy1p->operator()(p,q)*Gradsp[j+3*nbFFp][q])*nu(p)*Valsm[l+3*nbFFm]*wJ/2.; + for(int q = 0; q< 3; q++) + { + stiff(j+k*nbFFp+nbdofm,l+3*nbFFm) += (dPdTm->operator()(k,q)*dTdfTm+dPdVm->operator()(k,q)*dVdfTm)*(Valsm[l+3*nbFFm]*Valsp[j+0*nbFFp]*wJ/2.*nu(q)/eqRatio); + + stiff(j+k*nbFFp+nbdofm,l+4*nbFFm) += (dPdVm->operator()(k,q)*dVdfVm+dPdTm->operator()(k,q)*dTdfVm)*(Valsm[l+4*nbFFm]*Valsp[j+0*nbFFp]*wJ/2.*nu(q)/eqRatio); + } } - } - } - for(int l=0;l<nbFFp;l++) - { - for(int p =0; p < 3; p++) - { - for(int q =0; q < 3; q++) + for(int l=0;l<nbFFp;l++) { - stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += (jy1p->operator()(p,q)*Gradsp[j+3*nbFFp][q])*nu(p)*Valsp[l+3*nbFFp]*wJ/2.; + for(int q = 0; q< 3; q++) + { + stiff(j+k*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += (dPdTp->operator()(k,q)*dTdfTp+dPdVp->operator()(k,q)*dVdfTp)*(Valsp[l+3*nbFFp]*Valsp[j+0*nbFFp]*wJ/2.*nu(q)/eqRatio); - stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += ftJump*(djy1dTp->operator()(p,q)*dTdfTp+djy1dVp->operator()(p,q)*dVdfTp)*Gradsp[j+3*nbFFp][q]*nu(p)*Valsp[l+3*nbFFp]*wJ/2.; - stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += fvJump*(dl20dTp->operator()(p,q)*dTdfTp+dl20dvp->operator()(p,q)*dVdfTp)*Gradsp[j+3*nbFFp][q]*(nu(p)*Valsp[l+3*nbFFp])*wJ/2.; + stiff(j+k*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += (dPdVp->operator()(k,q)*dVdfVp+dPdTp->operator()(k,q)*dTdfVp)*(Valsp[l+4*nbFFp]*Valsp[j+0*nbFFp]*wJ/2.*nu(q)/eqRatio); + } } } } - } + + + // Assembly consistency (from derivative of flux with deformation gradient) + for(int j=0;j<nbFFm;j++) + { + for(int k=0;k<3;k++) + { + for(int l=0;l<nbFFm;l++) + { + for(int q = 0; q< 3; q++) + { + for(int N = 0; N< 3; N++) + { + stiff(j+3*nbFFm,l+k*nbFFm) -= djydFm->operator()(N,k,q)*(Gradsm[l+0*nbFFm][q]*Valsm[j+3*nbFFm]*wJ/2.*nu(N)); + } + } + } + for(int l=0;l<nbFFp;l++) + { + for(int q = 0; q< 3; q++) + { + for(int N = 0; N< 3; N++) + { + stiff(j+3*nbFFm,l+k*nbFFp+nbdofm) -= djydFp->operator()(N,k,q)*(Gradsp[l+0*nbFFp][q]*Valsm[j+3*nbFFm]*wJ/2.*nu(N)); + } + } + } + } + } + for(int j=0;j<nbFFp;j++) + { + for(int k=0;k<3;k++) + { + for(int l=0;l<nbFFm;l++) + { + for(int q = 0; q< 3; q++) + { + for(int N = 0; N< 3; N++) + { + stiff(j+3*nbFFp+nbdofm,l+k*nbFFm) += djydFm->operator()(N,k,q)*(Gradsm[l+0*nbFFm][q]*Valsp[j+3*nbFFp]*wJ/2.*nu(N)); + } + } + } + for(int l=0;l<nbFFp;l++) + { + for(int q = 0; q< 3; q++) + { + for(int N = 0; N< 3; N++) + { + stiff(j+3*nbFFp+nbdofm,l+k*nbFFp+nbdofm) += djydFp->operator()(N,k,q)*(Gradsp[l+0*nbFFp][q]*Valsp[j+3*nbFFp]*wJ/2.*nu(N)); + } + } + } + } + } + //djedf + for(int j=0;j<nbFFm;j++) + { + for(int k=0;k<3;k++) + { + for(int l=0;l<nbFFm;l++) + { + for(int q = 0; q< 3; q++) + { + for(int N = 0; N< 3; N++) + { + stiff(j+4*nbFFm,l+k*nbFFm) -= djedFm->operator()(N,k,q)*(Gradsm[l+0*nbFFm][q]*Valsm[j+4*nbFFm]*wJ/2.*nu(N)); + } + } + } + for(int l=0;l<nbFFp;l++) + { + for(int q = 0; q< 3; q++) + { + for(int N = 0; N< 3; N++) + { + stiff(j+4*nbFFm,l+k*nbFFp+nbdofm) -= djedFp->operator()(N,k,q)*(Gradsp[l+0*nbFFp][q]*Valsm[j+4*nbFFm]*wJ/2.*nu(N)); + } + } + } + } + } + for(int j=0;j<nbFFp;j++) + { + for(int k=0;k<3;k++) + { + for(int l=0;l<nbFFm;l++) + { + for(int q = 0; q< 3; q++) + { + for(int N = 0; N< 3; N++) + { + stiff(j+4*nbFFp+nbdofm,l+k*nbFFm) += djedFm->operator()(N,k,q)*(Gradsm[l+0*nbFFm][q]*Valsp[j+4*nbFFp]*wJ/2.*nu(N)); + } + } + } + for(int l=0;l<nbFFp;l++) + { + for(int q = 0; q< 3; q++) + { + for(int N = 0; N< 3; N++) + { + stiff(j+4*nbFFp+nbdofm,l+k*nbFFp+nbdofm) += djedFp->operator()(N,k,q)*(Gradsp[l+0*nbFFp][q]*Valsp[j+4*nbFFp]*wJ/2.*nu(N)); + } + } + } + } + } + + // consistency D\mean{q} DT + //dfI1tdft+dfI1tdfv + for(int j=0;j<nbFFm;j++) + { + for(int l=0;l<nbFFm;l++) + { + for(int p = 0; p< 3; p++) + { + stiff(j+3*nbFFm,l+3*nbFFm) -= (djydTm->operator()(p)*dTdfTm+djydVm->operator()(p)*dVdfTm)*(Valsm[l+3*nbFFm]*Valsm[j+3*nbFFm]*wJ/2.*nu(p)); + stiff(j+3*nbFFm,l+4*nbFFm) -= (djydVm->operator()(p)*dVdfVm+djydTm->operator()(p)*dTdfVm)*(Valsm[l+4*nbFFm]*Valsm[j+3*nbFFm]*wJ/2.*nu(p)); + for(int q = 0; q< 3; q++) + { + stiff(j+3*nbFFm,l+3*nbFFm) -=(djydGradTm->operator()(p,q)*dgradTdfTm->operator()(q)+djydGradVm->operator()(p,q)*dgradVdfTm->operator()(q)) + *(Valsm[l+3*nbFFm]*Valsm[j+3*nbFFm]*wJ/2.*nu(p)); + stiff(j+3*nbFFm,l+4*nbFFm) -=(djydGradTm->operator()(p,q)*dgradTdfVm->operator()(q)+djydGradVm->operator()(p,q)*dgradVdfVm->operator()(q)) + *(Valsm[j+3*nbFFm]*Valsm[l+4*nbFFm]*wJ/2.*nu(p)); + + for(int o = 0; o< 3; o++) + { + stiff(j+3*nbFFm,l+3*nbFFm) -= (djydGradTm->operator()(p,o)*dgardTdgradfTm->operator()(o,q)+djydGradVm->operator()(p,o)*dgardVdgradfTm->operator()(o,q)) + *Valsm[j+3*nbFFm]*(Gradsm[l+3*nbFFm][q]*wJ/2.*nu(p)); + stiff(j+3*nbFFm,l+4*nbFFm) -= (djydGradVm->operator()(p,o)*dgardVdgradfVm->operator()(o,q)+djydGradTm->operator()(p,o)*dgardTdgradfVm->operator()(o,q)) + *Valsm[j+3*nbFFm]*(Gradsm[l+4*nbFFm][q]*wJ/2.*nu(p)); + } + } + } + } + + for(int l=0;l<nbFFp;l++) + { + for(int p = 0; p< 3; p++) + { + stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) -= (djydTp->operator()(p)*dTdfTp+djydVp->operator()(p)*dVdfTp)*(Valsp[l+3*nbFFp]*Valsm[j+3*nbFFm]*wJ/2.*nu(p)); + stiff(j+3*nbFFm,l+4*nbFFp+nbdofm) -= (djydVp->operator()(p)*dVdfVp+djydTp->operator()(p)*dTdfVp)*(Valsp[l+4*nbFFp]*Valsm[j+3*nbFFm]*wJ/2.*nu(p)); + for(int q = 0; q< 3; q++) + { + stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) -= (djydGradTp->operator()(p,q)*dgradTdfTp->operator()(q)+djydGradVp->operator()(p,q)*dgradVdfTp->operator()(q)) + *Valsm[j+3*nbFFm]*(Valsp[l+3*nbFFp]*wJ/2.*nu(p)); + stiff(j+3*nbFFm,l+4*nbFFp+nbdofm) -= (djydGradTp->operator()(p,q)*dgradTdfVp->operator()(q)+djydGradVp->operator()(p,q)*dgradVdfVp->operator()(q)) + *Valsm[j+3*nbFFm]*(Valsp[l+4*nbFFp]*wJ/2.*nu(p)); + + for(int o = 0; o< 3; o++) + { + stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) -=(djydGradTp->operator()(p,o)*dgardTdgradfTp->operator()(o,q)+djydGradVp->operator()(p,o)*dgardVdgradfTp->operator()(o,q)) + *Valsm[j+3*nbFFm]*(Gradsp[l+3*nbFFp][q]*wJ/2.*nu(p)); + stiff(j+3*nbFFm,l+4*nbFFp+nbdofm) -=(djydGradVp->operator()(p,o)*dgardVdgradfVp->operator()(o,q)+djydGradTp->operator()(p,o)*dgardTdgradfVp->operator()(o,q)) + *Valsm[j+3*nbFFm]*(Gradsp[l+4*nbFFp][q]*wJ/2.*nu(p)); + } + } + } + } + } + + for(int j=0;j<nbFFp;j++) + { + for(int l=0;l<nbFFm;l++) + { + for(int p = 0; p< 3; p++) + { + stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) += (djydTm->operator()(p)*dTdfTm+djydVm->operator()(p)*dVdfTm)*(Valsm[l+3*nbFFm]*Valsp[j+3*nbFFp]*wJ/2.*nu(p)); + stiff(j+3*nbFFp+nbdofm,l+4*nbFFm) += (djydVm->operator()(p)*dVdfVm+djydTm->operator()(p)*dTdfVm)*(Valsm[l+4*nbFFm]*Valsp[j+3*nbFFp]*wJ/2.*nu(p)); + for(int q = 0; q< 3; q++) + { + stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) += (djydGradTm->operator()(p,q)*dgradTdfTm->operator()(q)+djydGradVm->operator()(p,q)*dgradVdfTm->operator()(q)) + *Valsp[j+3*nbFFp]*(Valsm[l+3*nbFFm]*wJ/2.*nu(p)); + stiff(j+3*nbFFp+nbdofm,l+4*nbFFm) += (djydGradTm->operator()(p,q)*dgradTdfVm->operator()(q)+djydGradVm->operator()(p,q)*dgradVdfVm->operator()(q)) + *Valsp[j+3*nbFFp]*(Valsm[l+4*nbFFm]*wJ/2.*nu(p)); + for(int o = 0; o< 3; o++) + { + stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) += (djydGradTm->operator()(p,o)*dgardTdgradfTm->operator()(o,q)+djydGradVm->operator()(p,o)*dgardVdgradfTm->operator()(o,q)) + *Valsp[j+3*nbFFp]*(Gradsm[l+3*nbFFm][q]*wJ/2.*nu(p)); + stiff(j+3*nbFFp+nbdofm,l+4*nbFFm) += (djydGradVm->operator()(p,o)*dgardVdgradfVm->operator()(o,q)+djydGradTm->operator()(p,o)*dgardTdgradfVm->operator()(o,q)) + *Valsp[j+3*nbFFp]*(Gradsm[l+4*nbFFm][q]*wJ/2.*nu(p)); + } + } + } + } + for(int l=0;l<nbFFp;l++) + { + for(int p = 0; p< 3; p++) + { + stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += (djydTp->operator()(p)*dTdfTp+djydVp->operator()(p)*dVdfTp)*(Valsp[l+3*nbFFp]*Valsp[j+3*nbFFp]*wJ/2.*nu(p)); + stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += (djydVp->operator()(p)*dVdfVp+djydTp->operator()(p)*dTdfVp)*(Valsp[l+4*nbFFp]*Valsp[j+3*nbFFp]*wJ/2.*nu(p)); + for(int q = 0; q< 3; q++) + { + stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += (djydGradTp->operator()(p,q)*dgradTdfTp->operator()(q)+djydGradVp->operator()(p,q)*dgradVdfTp->operator()(q)) + *Valsp[j+3*nbFFp]*(Valsp[l+3*nbFFp]*wJ/2.*nu(p)); + stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += (djydGradTp->operator()(p,q)*dgradTdfVp->operator()(q)+djydGradVp->operator()(p,q)*dgradVdfVp->operator()(q)) + *Valsp[j+3*nbFFp]*(Valsp[l+4*nbFFp]*wJ/2.*nu(p)); + for(int o = 0; o< 3; o++) + { + stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm)+=(djydGradTp->operator()(p,o)*dgardTdgradfTp->operator()(o,q)+djydGradVp->operator()(p,o)*dgardVdgradfTp->operator()(o,q)) + *Valsp[j+3*nbFFp]*(Gradsp[l+3*nbFFp][q]*wJ/2.*nu(p)); + stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm)+=(djydGradVp->operator()(p,o)*dgardVdgradfVp->operator()(o,q)+djydGradTp->operator()(p,o)*dgardTdgradfVp->operator()(o,q)) + *Valsp[j+3*nbFFp]*(Gradsp[l+4*nbFFp][q]*wJ/2.*nu(p)); + } + } + } + } + } + + + //dfI1vdv+dfI1vdt + for(int j=0;j<nbFFm;j++) + { + for(int l=0;l<nbFFm;l++) + { + for(int p = 0; p< 3; p++) + { + stiff(j+4*nbFFm,l+4*nbFFm) -= (djedVm->operator()(p)*dVdfVm+djedTm->operator()(p)*dTdfVm)*(Valsm[l+4*nbFFm]*Valsm[j+4*nbFFm]*wJ/2.*nu(p)); + stiff(j+4*nbFFm,l+3*nbFFm) -= (djedTm->operator()(p)*dTdfTm+djedVm->operator()(p)*dVdfTm)*(Valsm[l+3*nbFFm]*Valsm[j+4*nbFFm]*wJ/2.*nu(p)); + for(int q = 0; q< 3; q++) + { + stiff(j+4*nbFFm,l+4*nbFFm) -=(djedGradVm->operator()(p,q)*dgradVdfVm->operator()(q)+djedGradTm->operator()(p,q)*dgradTdfVm->operator()(q)) + *(Valsm[l+4*nbFFm]*Valsm[j+4*nbFFm]*wJ/2.*nu(p)); + stiff(j+4*nbFFm,l+3*nbFFm) -=(djedGradVm->operator()(p,q)*dgradVdfTm->operator()(q)+djedGradTm->operator()(p,q)*dgradTdfTm->operator()(q)) + *Valsm[j+4*nbFFm]*(Valsm[l+3*nbFFm]*wJ/2.*nu(p)); + for(int o = 0; o< 3; o++) + { + stiff(j+4*nbFFm,l+4*nbFFm) -=(djedGradVm->operator()(p,o)*dgardVdgradfVm->operator()(o,q)+djedGradTm->operator()(p,o)*dgardTdgradfVm->operator()(o,q)) + *Valsm[j+4*nbFFm]*(Gradsm[l+4*nbFFm][q]*wJ/2.*nu(p)); + stiff(j+4*nbFFm,l+3*nbFFm) -=(djedGradTm->operator()(p,o)*dgardTdgradfTm->operator()(o,q)+djedGradVm->operator()(p,o)*dgardVdgradfTm->operator()(o,q)) + *Valsm[j+4*nbFFm]*(Gradsm[l+3*nbFFm][q]*wJ/2.*nu(p)); + } + } + } + } + for(int l=0;l<nbFFp;l++) + { + for(int p = 0; p< 3; p++) + { + stiff(j+4*nbFFm,l+4*nbFFp+nbdofm) -= (djedVp->operator()(p)*dVdfVp+djedTp->operator()(p)*dTdfVp)*(Valsp[l+4*nbFFp]*Valsm[j+4*nbFFm]*wJ/2.*nu(p)); + stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) -= (djedTp->operator()(p)*dTdfTp+djedVp->operator()(p)*dVdfTp)*(Valsp[l+3*nbFFp]*Valsm[j+4*nbFFm]*wJ/2.*nu(p)); + for(int q = 0; q< 3; q++) + { + stiff(j+4*nbFFm,l+4*nbFFp+nbdofm) -=(djedGradVp->operator()(p,q)*dgradVdfVp->operator()(q)+djedGradTp->operator()(p,q)*dgradTdfVp->operator()(q)) + *Valsm[j+4*nbFFm]*(Valsp[l+4*nbFFp]*wJ/2.*nu(p)); + stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) -=(djedGradTp->operator()(p,q)*dgradTdfTp->operator()(q)+djedGradVp->operator()(p,q)*dgradVdfTp->operator()(q)) + *Valsm[j+4*nbFFm]*(Valsp[l+3*nbFFp]*wJ/2.*nu(p)); + for(int o = 0; o< 3; o++) + { + stiff(j+4*nbFFm,l+4*nbFFp+nbdofm) -=(djedGradVp->operator()(p,o)*dgardVdgradfVp->operator()(o,q)+djedGradTp->operator()(p,o)*dgardTdgradfVp->operator()(o,q)) + *Valsm[j+4*nbFFm]*(Gradsp[l+4*nbFFp][q]*wJ/2.*nu(p)); + stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) -=(djedGradTp->operator()(p,o)*dgardTdgradfTp->operator()(o,q)+djedGradVp->operator()(p,o)*dgardVdgradfTp->operator()(o,q)) + *Valsm[j+4*nbFFm]*(Gradsp[l+3*nbFFp][q]*wJ/2.*nu(p)); + } + } + } + } + } + + for(int j=0;j<nbFFp;j++) + { + for(int l=0;l<nbFFm;l++) + { + for(int p = 0; p< 3; p++) + { + stiff(j+4*nbFFp+nbdofm,l+4*nbFFm) +=( djedVm->operator()(p)*dVdfVm+ djedTm->operator()(p)*dTdfVm)*(Valsm[l+4*nbFFm]*Valsp[j+4*nbFFp]*wJ/2.*nu(p)); + stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) += (djedTm->operator()(p)*dTdfTm+djedVm->operator()(p)*dVdfTm)*(Valsm[l+3*nbFFm]*Valsp[j+4*nbFFp]*wJ/2.*nu(p)); + for(int q = 0; q< 3; q++) + { + stiff(j+4*nbFFp+nbdofm,l+4*nbFFm) +=(djedGradVm->operator()(p,q)*dgradVdfVm->operator()(q)+djedGradTm->operator()(p,q)*dgradTdfVm->operator()(q)) + *Valsp[j+4*nbFFp] *(Valsm[l+4*nbFFm]*wJ/2.*nu(p)); + stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) +=(djedGradVm->operator()(p,q)*dgradVdfTm->operator()(q)+djedGradTm->operator()(p,q)*dgradTdfTm->operator()(q)) + *Valsp[j+4*nbFFp] *(Valsm[l+3*nbFFm]*wJ/2.*nu(p)); + for(int o = 0; o< 3; o++) + { + stiff(j+4*nbFFp+nbdofm,l+4*nbFFm) +=(djedGradVm->operator()(p,o)*dgardVdgradfVm->operator()(o,q)+djedGradTm->operator()(p,o)*dgardTdgradfVm->operator()(o,q)) + *Valsp[j+4*nbFFp]*(Gradsm[l+4*nbFFm][q]*wJ/2.*nu(p)); + stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) +=(djedGradTm->operator()(p,o)*dgardTdgradfTm->operator()(o,q)+djedGradVm->operator()(p,o)*dgardVdgradfTm->operator()(o,q)) + *Valsp[j+4*nbFFp] *(Gradsm[l+3*nbFFm][q]*wJ/2.*nu(p)); + } + } + } + } + for(int l=0;l<nbFFp;l++) + { + for(int p = 0; p< 3; p++) + { + stiff(j+4*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += (djedVp->operator()(p)*dVdfVp+djedTp->operator()(p)*dTdfVp)*(Valsp[l+4*nbFFp]*Valsp[j+4*nbFFp]*wJ/2.*nu(p)); + stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += (djedTp->operator()(p)*dTdfTp+djedVp->operator()(p)*dVdfTp)*(Valsp[l+3*nbFFp]*Valsp[j+4*nbFFp]*wJ/2.*nu(p)); + for(int q = 0; q< 3; q++) + { + stiff(j+4*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += (djedGradVp->operator()(p,q)*dgradVdfVp->operator()(q)+djedGradTp->operator()(p,q)*dgradTdfVp->operator()(q)) + *(Valsp[l+4*nbFFp]*Valsp[j+4*nbFFp]*wJ/2.*nu(p)); + stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += (djedGradTp->operator()(p,q)*dgradTdfTp->operator()(q)+djedGradVp->operator()(p,q)*dgradVdfTp->operator()(q)) + *(Valsp[l+3*nbFFp]*Valsp[j+4*nbFFp]*wJ/2.*nu(p)); + for(int o = 0; o< 3; o++) + { + stiff(j+4*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += (djedGradVp->operator()(p,o)*dgardVdgradfVp->operator()(o,q)+djedGradTp->operator()(p,o)*dgardTdgradfVp->operator()(o,q)) + *Valsp[j+4*nbFFp]*(Gradsp[l+4*nbFFp][q]*wJ/2.*nu(p)); + stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += (djedGradTp->operator()(p,o)*dgardTdgradfTp->operator()(o,q)+djedGradVp->operator()(p,o)*dgardVdgradfTp->operator()(o,q)) + *Valsp[j+4*nbFFp]*(Gradsp[l+3*nbFFp][q]*wJ/2.*nu(p)); + } + } + } + } + } + + // Stability N \mean{k0} (N) + double NBhsNdjy1dfTm=0.;double NBhsNdjy1dfTp=0.; double NBhsNdL1dfTm=0.; double NBhsNdL1dfTp=0.; + double NBhsNdL2dfTm=0.;double NBhsNdL2dfTp=0.; double NBhsNdjy1dfvm=0.; double NBhsNdjy1dfvp=0.; double NBhsNdl2dfvm=0.; double NBhsNdl2dfvp=0.; + + double NBhsNdjy1dTm=0.;double NBhsNdjy1dTp=0.; double NBhsNdL1dTm=0.; double NBhsNdL1dTp=0.; + double NBhsNdL2dTm=0.;double NBhsNdL2dTp=0.; double NBhsNdjy1dvm=0.; double NBhsNdjy1dvp=0.; double NBhsNdL2dVm=0.; double NBhsNdL2dVp=0.; + + for(int l = 0; l <3; l++) + { + for(int n = 0; n <3; n++) + { + NBhsNdjy1dTm+=djy1dTm->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; + NBhsNdjy1dTp+=djy1dTp->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; + + NBhsNdL1dTm+=dl10dTm->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; + NBhsNdL1dTp+=dl10dTp->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; + NBhsNdL2dTm+=dl20dTm->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; + NBhsNdL2dTp+=dl20dTp->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; + + NBhsNdjy1dvm+=djy1dVm->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; + NBhsNdjy1dvp+=djy1dVp->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; + + NBhsNdL2dVm+=dl20dvm->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; + NBhsNdL2dVp+=dl20dvp->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; + } + } + + NBhsNdjy1dfTm = NBhsNdjy1dTm*dTdfTm+NBhsNdjy1dvm*dVdfTm; + NBhsNdjy1dfTp = NBhsNdjy1dTp*dTdfTp+NBhsNdjy1dvp*dVdfTp; + + NBhsNdL1dfTm = NBhsNdL1dTm*dTdfTm; + NBhsNdL1dfTp = NBhsNdL1dTp*dTdfTp; + NBhsNdL2dfTm = NBhsNdL2dTm*dTdfTm+NBhsNdL2dVm*dVdfTm; + NBhsNdL2dfTp = NBhsNdL2dTp*dTdfTp+NBhsNdL2dVp*dVdfTp; + + NBhsNdjy1dfvm =NBhsNdjy1dvm*dVdfVm+NBhsNdjy1dTm*dTdfVm; + NBhsNdjy1dfvp =NBhsNdjy1dvp*dVdfVp+NBhsNdjy1dTp*dTdfVp; + + NBhsNdl2dfvm =NBhsNdL2dVm*dVdfVm+NBhsNdL2dTm*dTdfVm; + NBhsNdl2dfvp =NBhsNdL2dVp*dVdfVp+NBhsNdL2dTp*dTdfVp; + + static STensor3 NBhsNdjy1dFm, NBhsNdjy1dFp, NBhsNdL1dFm, NBhsNdL1dFp, NBhsNdL2dFm, NBhsNdL2dFp; + for(int j = 0; j<3; j++) + { + for(int p = 0; p<3; p++) + { + NBhsNdjy1dFm(j,p)= 0.; + NBhsNdjy1dFp(j,p) = 0.; + NBhsNdL1dFm(j,p) = 0.; + NBhsNdL1dFp(j,p) = 0.; + NBhsNdL2dFm(j,p) = 0.; + NBhsNdL2dFp(j,p) = 0.; + + for(int l = 0; l <3; l++) + { + for(int n = 0; n <3; n++) + { + NBhsNdjy1dFm(j,p)+=djy1dFm->operator()(l,n,j,p)*nu(n)*nbetahs*nu(l)/2.; + NBhsNdjy1dFp(j,p)+=djy1dFp->operator()(l,n,j,p)*nu(n)*nbetahs*nu(l)/2.; + + NBhsNdL1dFm(j,p)+=dl10dFm->operator()(l,n,j,p)*nu(n)*nbetahs*nu(l)/2.; + NBhsNdL1dFp(j,p)+=dl10dFp->operator()(l,n,j,p)*nu(n)*nbetahs*nu(l)/2.; + NBhsNdL2dFm(j,p)+=dl20dFm->operator()(l,n,j,p)*nu(n)*nbetahs*nu(l)/2.; + NBhsNdL2dFp(j,p)+=dl20dFp->operator()(l,n,j,p)*nu(n)*nbetahs*nu(l)/2.; + } + } + } + } + + double NMeanjy1NBetasc=0.; double NMeanl1NBetasc=0.; double NMeanl2NBetasc=0.; + for(int l = 0; l <3; l++) + { + for(int n = 0; n <3; n++) + { + NMeanjy1NBetasc += (jy1p->operator()(l,n)+jy1m->operator()(l,n))*nu(n)*nbetahs*nu(l)/2.; + NMeanl1NBetasc += (l10p->operator()(l,n)+l10m->operator()(l,n))*nu(n)*nbetahs*nu(l)/2.; + NMeanl2NBetasc += (l20p->operator()(l,n)+l20m->operator()(l,n))*nu(n)*nbetahs*nu(l)/2.; + } + } + + //new terms for dfTI3dfT + for(int j=0;j<nbFFm;j++) + { + for(int l=0;l<nbFFm;l++) + { + stiff(j+3*nbFFm,l+3*nbFFm) -= ftJump*NBhsNdjy1dfTm*Valsm[j+3*nbFFm]*Valsm[l+3*nbFFm]*wJ; + stiff(j+3*nbFFm,l+3*nbFFm) -= fvJump*NBhsNdL2dfTm*Valsm[j+3*nbFFm]*Valsm[l+3*nbFFm]*wJ; + + stiff(j+3*nbFFm,l+3*nbFFm) += NMeanjy1NBetasc*Valsm[j+3*nbFFm]*Valsm[l+3*nbFFm]*wJ; + } + for(int l=0;l<nbFFp;l++) + { + stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) -= ftJump*NBhsNdjy1dfTp*Valsm[j+3*nbFFm]*Valsp[l+3*nbFFp]*wJ; + stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) -= fvJump*NBhsNdL2dfTp*Valsm[j+3*nbFFm]*Valsp[l+3*nbFFp]*wJ; + + stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) -= NMeanjy1NBetasc*Valsm[j+3*nbFFm]*Valsp[l+3*nbFFp]*wJ; + } + } + + for(int j=0;j<nbFFp;j++) + { + for(int l=0;l<nbFFm;l++) + { + stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) += ftJump*NBhsNdjy1dfTm*Valsp[j+3*nbFFp]*Valsm[l+3*nbFFm]*wJ; + stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) += fvJump*NBhsNdL2dfTm *Valsp[j+3*nbFFp]*Valsm[l+3*nbFFm]*wJ; + + stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) -= NMeanjy1NBetasc*Valsp[j+3*nbFFp]*Valsm[l+3*nbFFm]*wJ; + } + for(int l=0;l<nbFFp;l++) + { + stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += ftJump*NBhsNdjy1dfTp*Valsp[j+3*nbFFp]*Valsp[l+3*nbFFp]*wJ; + stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += fvJump*NBhsNdL2dfTp *Valsp[j+3*nbFFp]*Valsp[l+3*nbFFp]*wJ; + + stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += NMeanjy1NBetasc*Valsp[j+3*nbFFp]*Valsp[l+3*nbFFp]*wJ; + } + } + + // terms for dfTI3dfv + for(int j=0;j<nbFFm;j++) + { + for(int l=0;l<nbFFm;l++) + { + stiff(j+3*nbFFm,l+4*nbFFm) -= ftJump*NBhsNdjy1dfvm*Valsm[j+3*nbFFm]*Valsm[l+4*nbFFm]*wJ; + stiff(j+3*nbFFm,l+4*nbFFm) -= fvJump*NBhsNdl2dfvm *Valsm[j+3*nbFFm]*Valsm[l+4*nbFFm]*wJ; + + stiff(j+3*nbFFm,l+4*nbFFm) += NMeanl2NBetasc*Valsm[j+3*nbFFm]*Valsm[l+4*nbFFm]*wJ; + } + for(int l=0;l<nbFFp;l++) + { + stiff(j+3*nbFFm,l+4*nbFFp+nbdofm) -= ftJump*NBhsNdjy1dfvp*Valsm[j+3*nbFFm]*Valsp[l+4*nbFFp]*wJ; + stiff(j+3*nbFFm,l+4*nbFFp+nbdofm) -= fvJump*NBhsNdl2dfvp *Valsm[j+3*nbFFm]*Valsp[l+4*nbFFp]*wJ; + + stiff(j+3*nbFFm,l+4*nbFFp+nbdofm) -= NMeanl2NBetasc*Valsm[j+3*nbFFm]*Valsp[l+4*nbFFp]*wJ; + } + } + + for(int j=0;j<nbFFp;j++) + { + for(int l=0;l<nbFFm;l++) + { + stiff(j+3*nbFFp+nbdofm,l+4*nbFFm) += ftJump*NBhsNdjy1dfvm*Valsp[j+3*nbFFp]*Valsm[l+4*nbFFm]*wJ; + stiff(j+3*nbFFp+nbdofm,l+4*nbFFm) += fvJump*NBhsNdl2dfvm *Valsp[j+3*nbFFp]*Valsm[l+4*nbFFm]*wJ; + + stiff(j+3*nbFFp+nbdofm,l+4*nbFFm) -= NMeanl2NBetasc*Valsp[j+3*nbFFp]*Valsm[l+4*nbFFm]*wJ; + } + for(int l=0;l<nbFFp;l++) + { + stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += ftJump*NBhsNdjy1dfvp*Valsp[j+3*nbFFp]*Valsp[l+4*nbFFp]*wJ; + stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += fvJump*NBhsNdl2dfvp *Valsp[j+3*nbFFp]*Valsp[l+4*nbFFp]*wJ; + + stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) +=NMeanl2NBetasc*Valsp[j+3*nbFFp]*Valsp[l+4*nbFFp]*wJ; + } + } + + //Terms for dfvI3dfv + for(int j=0;j<nbFFm;j++) + { + for(int l=0;l<nbFFm;l++) + { + stiff(j+4*nbFFm,l+4*nbFFm) -= ftJump*NBhsNdl2dfvm*Valsm[j+4*nbFFm]*Valsm[l+4*nbFFm]*wJ; + + stiff(j+4*nbFFm,l+4*nbFFm) += NMeanl1NBetasc*Valsm[j+4*nbFFm]*Valsm[l+4*nbFFm]*wJ; + } + for(int l=0;l<nbFFp;l++) + { + stiff(j+4*nbFFm,l+4*nbFFp+nbdofm) -= ftJump*NBhsNdl2dfvp*Valsm[j+4*nbFFm]*Valsp[l+4*nbFFp]*wJ; + + stiff(j+4*nbFFm,l+4*nbFFp+nbdofm) -= NMeanl1NBetasc*Valsm[j+4*nbFFm]*Valsp[l+4*nbFFp]*wJ; + } + } + + for(int j=0;j<nbFFp;j++) + { + for(int l=0;l<nbFFm;l++) + { + stiff(j+4*nbFFp+nbdofm,l+4*nbFFm) += ftJump*NBhsNdl2dfvm*Valsp[j+4*nbFFp]*Valsm[l+4*nbFFm]*wJ; + + stiff(j+4*nbFFp+nbdofm,l+4*nbFFm) -= NMeanl1NBetasc*Valsp[j+4*nbFFp]*Valsm[l+4*nbFFm]*wJ; + } + for(int l=0;l<nbFFp;l++) + { + stiff(j+4*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += ftJump*NBhsNdl2dfvp*Valsp[j+4*nbFFp]*Valsp[l+4*nbFFp]*wJ; + + stiff(j+4*nbFFp+nbdofm,l+4*nbFFp+nbdofm) +=NMeanl1NBetasc*Valsp[j+4*nbFFp]*Valsp[l+4*nbFFp]*wJ; + } + } + + + for(int j=0;j<nbFFm;j++) + { + for(int l=0;l<nbFFm;l++) + { + stiff(j+4*nbFFm,l+3*nbFFm) -= fvJump*NBhsNdL1dfTm*Valsm[j+4*nbFFm]*Valsm[l+3*nbFFm]*wJ; + stiff(j+4*nbFFm,l+3*nbFFm) -= ftJump*NBhsNdL2dfTm*Valsm[j+4*nbFFm]*Valsm[l+3*nbFFm]*wJ; + + stiff(j+4*nbFFm,l+3*nbFFm) += NMeanl2NBetasc*Valsm[j+4*nbFFm]*Valsm[l+3*nbFFm]*wJ; + } + for(int l=0;l<nbFFp;l++) + { + stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) -= fvJump*NBhsNdL1dfTp*Valsm[j+4*nbFFm]*Valsp[l+3*nbFFp]*wJ; + stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) -= ftJump*NBhsNdL2dfTp*Valsm[j+4*nbFFm]*Valsp[l+3*nbFFp]*wJ; + + stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) -= NMeanl2NBetasc*Valsm[j+4*nbFFm]*Valsp[l+3*nbFFp]*wJ; + } + } + + for(int j=0;j<nbFFp;j++) + { + for(int l=0;l<nbFFm;l++) + { + stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) += fvJump*NBhsNdL1dfTm*Valsp[j+4*nbFFp]*Valsm[l+3*nbFFm]*wJ; + stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) += ftJump*NBhsNdL2dfTm*Valsp[j+4*nbFFp]*Valsm[l+3*nbFFm]*wJ; + + stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) -= NMeanl2NBetasc*Valsp[j+4*nbFFp]*Valsm[l+3*nbFFm]*wJ; + + } + for(int l=0;l<nbFFp;l++) + { + stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += fvJump*NBhsNdL1dfTp*Valsp[j+4*nbFFp]*Valsp[l+3*nbFFp]*wJ; + stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += ftJump*NBhsNdL2dfTp*Valsp[j+4*nbFFp]*Valsp[l+3*nbFFp]*wJ; + + stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += NMeanl2NBetasc*Valsp[j+4*nbFFp]*Valsp[l+3*nbFFp]*wJ; + } + } + + //F + //new terms for dfvI3dF + for(int j=0;j<nbFFm;j++) + { + for(int k=0;k<3;k++) + { + for(int l=0;l<nbFFm;l++) + { + for(int p=0;p<3;p++) + { + stiff(j+4*nbFFm,l+k*nbFFm) -= fvJump*NBhsNdL1dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsm[j+4*nbFFm]*wJ; + stiff(j+4*nbFFm,l+k*nbFFm) -= ftJump*NBhsNdL2dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsm[j+4*nbFFm]*wJ; + + stiff(j+3*nbFFm,l+k*nbFFm) -= ftJump*NBhsNdjy1dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsm[j+3*nbFFm]*wJ; + stiff(j+3*nbFFm,l+k*nbFFm) -= fvJump*NBhsNdL2dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsm[j+3*nbFFm]*wJ; + } + } + + for(int l=0;l<nbFFp;l++) + { + for(int p=0;p<3;p++) + { + stiff(j+4*nbFFm,l+k*nbFFp+nbdofm) -= fvJump*NBhsNdL1dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsm[j+4*nbFFm]*wJ; + stiff(j+4*nbFFm,l+k*nbFFp+nbdofm) -= ftJump*NBhsNdL2dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsm[j+4*nbFFm]*wJ; + + stiff(j+3*nbFFm,l+k*nbFFp+nbdofm) -= ftJump*NBhsNdjy1dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsm[j+3*nbFFm]*wJ; + stiff(j+3*nbFFm,l+k*nbFFp+nbdofm) -= fvJump*NBhsNdL2dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsm[j+3*nbFFm]*wJ; + } + } + } + } + + for(int j=0;j<nbFFp;j++) + { + for(int k=0;k<3;k++) + { + for(int l=0;l<nbFFm;l++) + { + for(int p=0;p<3;p++) + { + stiff(j+4*nbFFp+nbdofm,l+k*nbFFm) += fvJump*NBhsNdL1dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsp[j+4*nbFFp]*wJ; + stiff(j+4*nbFFp+nbdofm,l+k*nbFFm) += ftJump*NBhsNdL2dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsp[j+4*nbFFp]*wJ; + + stiff(j+3*nbFFp+nbdofm,l+k*nbFFm) += ftJump*NBhsNdjy1dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsp[j+3*nbFFp]*wJ; + stiff(j+3*nbFFp+nbdofm,l+k*nbFFm) += fvJump*NBhsNdL2dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsp[j+3*nbFFp]*wJ; + } + } + + for(int l=0;l<nbFFp;l++) + { + for(int p=0;p<3;p++) + { + stiff(j+4*nbFFp+nbdofm,l+k*nbFFp+nbdofm) +=fvJump*NBhsNdL1dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsp[j+4*nbFFp]*wJ; + stiff(j+4*nbFFp+nbdofm,l+k*nbFFp+nbdofm) +=ftJump*NBhsNdL2dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsp[j+4*nbFFp]*wJ; + + stiff(j+3*nbFFp+nbdofm,l+k*nbFFp+nbdofm) +=ftJump*NBhsNdjy1dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsp[j+3*nbFFp]*wJ; + stiff(j+3*nbFFp+nbdofm,l+k*nbFFp+nbdofm) +=fvJump*NBhsNdL2dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsp[j+3*nbFFp]*wJ; + } + } + } + } + + //dfI2TdfT + // compatibility + // Assembly (loop on shape function) + for(int j=0;j<nbFFm;j++) + { + for(int l=0;l<nbFFm;l++) + { + for(int p =0; p < 3; p++) + { + for(int q =0; q < 3; q++) + { + stiff(j+3*nbFFm,l+3*nbFFm) -= (jy1m->operator()(p,q)*Gradsm[j+3*nbFFm][q])*nu(p)*Valsm[l+3*nbFFm]*wJ/2.; + stiff(j+3*nbFFm,l+3*nbFFm) += ftJump*(djy1dTm->operator()(p,q)*dTdfTm+djy1dVm->operator()(p,q)*dVdfTm)*Gradsm[j+3*nbFFm][q]*nu(p)*Valsm[l+3*nbFFm]*wJ/2.; + stiff(j+3*nbFFm,l+3*nbFFm) += fvJump*(dl20dTm->operator()(p,q)*dTdfTm+dl20dvm->operator()(p,q)*dVdfTm)*Gradsm[j+3*nbFFm][q]*(nu(p)*Valsm[l+3*nbFFm])*wJ/2.; + } + } + } + for(int l=0;l<nbFFp;l++) + { + for(int p =0; p < 3; p++) + { + for(int q =0; q < 3; q++) + { + stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) += (jy1m->operator()(p,q)*Gradsm[j+3*nbFFm][q])*nu(p)*Valsp[l+3*nbFFp]*wJ/2.; + } + } + } + } + + for(int j=0;j<nbFFp;j++) + { + for(int l=0;l<nbFFm;l++) + { + for(int p =0; p < 3; p++) + { + for(int q =0; q < 3; q++) + { + stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) -= (jy1p->operator()(p,q)*Gradsp[j+3*nbFFp][q])*nu(p)*Valsm[l+3*nbFFm]*wJ/2.; + } + } + } + for(int l=0;l<nbFFp;l++) + { + for(int p =0; p < 3; p++) + { + for(int q =0; q < 3; q++) + { + stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += (jy1p->operator()(p,q)*Gradsp[j+3*nbFFp][q])*nu(p)*Valsp[l+3*nbFFp]*wJ/2.; + + stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += ftJump*(djy1dTp->operator()(p,q)*dTdfTp+djy1dVp->operator()(p,q)*dVdfTp)*Gradsp[j+3*nbFFp][q]*nu(p)*Valsp[l+3*nbFFp]*wJ/2.; + stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += fvJump*(dl20dTp->operator()(p,q)*dTdfTp+dl20dvp->operator()(p,q)*dVdfTp)*Gradsp[j+3*nbFFp][q]*(nu(p)*Valsp[l+3*nbFFp])*wJ/2.; + } + } + } + } //new related to dialetation @@ -4449,9 +4104,8 @@ void ElecTherMechDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMa for(int k =0; k < 3; k++) { for(int p =0; p < 3; p++) - {; - - stiff(j+3*nbFFm,l+3*nbFFm) += gamma*jump(k)*(Stiff_alphadialitationm(k,p)*(-2./fTm)*Valsm[j+3*nbFFm])*nu(p)*Valsm[l+3*nbFFm]*wJ/2.*(-1.)/eqRatio; + { + stiff(j+3*nbFFm,l+3*nbFFm) += gamma*jump(k)*(Stiff_alphadialitationm(k,p)*(-2./fTm)*Valsm[j+3*nbFFm])*nu(p)*Valsm[l+3*nbFFm]*wJ/2.*(-1.)/eqRatio; } } } @@ -4465,58 +4119,111 @@ void ElecTherMechDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMa { for(int p =0; p< 3; p++) { + stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += gamma*jump(k)*(Stiff_alphadialitationp(k,p)*(-2./fTp)*Valsp[j+3*nbFFp])*nu(p)*Valsp[l+3*nbFFp]*wJ/2.*(-1.)/eqRatio; + } + } + } + } + + + for(int j=0;j<nbFFm;j++) + { + for(int k=0;k<3;k++) + { + for(int l=0;l<nbFFm;l++) + { + for(int p =0; p < 3; p++) + { + stiff(j+3*nbFFm,l+k*nbFFm) -= gamma*(Stiff_alphadialitationm(k,p)*Valsm[j+3*nbFFm])*(nu(p)*wJ/2.*Valsm[l+0*nbFFm])/eqRatio*(-1.); + } + } + for(int l=0;l<nbFFp;l++) + { + for(int p =0; p < 3; p++) + { + stiff(j+3*nbFFm,l+k*nbFFp+nbdofm) += gamma*(Stiff_alphadialitationm(k,p)*Valsm[j+3*nbFFm])*(nu(p)*wJ/2.*Valsp[l+0*nbFFp])/eqRatio*(-1.); + } + } + } + } - stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += gamma*jump(k)*(Stiff_alphadialitationp(k,p)*(-2./fTp)*Valsp[j+3*nbFFp])*nu(p)*Valsp[l+3*nbFFp]*wJ/2.*(-1.)/eqRatio; + for(int j=0;j<nbFFp;j++) + { + for(int k=0;k<3;k++) + { + for(int l=0;l<nbFFm;l++) + { + for(int p =0; p < 3; p++) + { + stiff(j+3*nbFFp+nbdofm,l+k*nbFFm) -= gamma*(Stiff_alphadialitationp(k,p)*Valsp[j+3*nbFFp])*(nu(p)*wJ/2.*Valsm[l+0*nbFFm])/eqRatio*(-1.); + } + } + for(int l=0;l<nbFFp;l++) + { + for(int p =0; p < 3; p++) + { + stiff(j+3*nbFFp+nbdofm,l+k*nbFFp+nbdofm) += gamma*(Stiff_alphadialitationp(k,p)*Valsp[j+3*nbFFp])*(nu(p)*wJ/2.*Valsp[l+0*nbFFp])/eqRatio*(-1.); } } } } - - for(int j=0;j<nbFFm;j++) - { - for(int k=0;k<3;k++) - { + //dfI2Tdfv + for(int j=0;j<nbFFm;j++) + { for(int l=0;l<nbFFm;l++) { for(int p =0; p < 3; p++) { - stiff(j+3*nbFFm,l+k*nbFFm) -= gamma*(Stiff_alphadialitationm(k,p)*Valsm[j+3*nbFFm])*(nu(p)*wJ/2.*Valsm[l+0*nbFFm])/eqRatio*(-1.); + for(int q =0; q < 3; q++) + { + stiff(j+3*nbFFm,l+4*nbFFm) -= (l20m->operator()(p,q)*Gradsm[j+3*nbFFm][q])*nu(p)*Valsm[l+4*nbFFm]*wJ/2.; + + stiff(j+3*nbFFm,l+4*nbFFm) += ftJump*(djy1dVm->operator()(p,q)*dVdfVm+djy1dTm->operator()(p,q)*dTdfVm)*Gradsm[j+3*nbFFm][q]*nu(p)*Valsm[l+4*nbFFm]*wJ/2.; + stiff(j+3*nbFFm,l+4*nbFFm) += fvJump*(dl20dvm->operator()(p,q)*dVdfVm+dl20dTm->operator()(p,q)*dTdfVm)*Gradsm[j+3*nbFFm][q]*nu(p)*Valsm[l+4*nbFFm]*wJ/2.; + } } } for(int l=0;l<nbFFp;l++) { for(int p =0; p < 3; p++) { - stiff(j+3*nbFFm,l+k*nbFFp+nbdofm) += gamma*(Stiff_alphadialitationm(k,p)*Valsm[j+3*nbFFm])*(nu(p)*wJ/2.*Valsp[l+0*nbFFp])/eqRatio*(-1.); + for(int q =0; q < 3; q++) + { + stiff(j+3*nbFFm,l+4*nbFFp+nbdofm) += (l20m->operator()(p,q)*Gradsm[j+3*nbFFm][q])*nu(p)*Valsp[l+4*nbFFp]*wJ/2.; + } } } - } } - for(int j=0;j<nbFFp;j++) { - for(int k=0;k<3;k++) - { for(int l=0;l<nbFFm;l++) { for(int p =0; p < 3; p++) { - stiff(j+3*nbFFp+nbdofm,l+k*nbFFm) -= gamma*(Stiff_alphadialitationp(k,p)*Valsp[j+3*nbFFp])*(nu(p)*wJ/2.*Valsm[l+0*nbFFm])/eqRatio*(-1.); + for(int q =0; q < 3; q++) + { + stiff(j+3*nbFFp+nbdofm,l+4*nbFFm) -= (l20p->operator()(p,q)*Gradsp[j+3*nbFFp][q])*(nu(p)*Valsm[l+4*nbFFm])*wJ/2.; + } } } for(int l=0;l<nbFFp;l++) { for(int p =0; p < 3; p++) { - stiff(j+3*nbFFp+nbdofm,l+k*nbFFp+nbdofm) += gamma*(Stiff_alphadialitationp(k,p)*Valsp[j+3*nbFFp])*(nu(p)*wJ/2.*Valsp[l+0*nbFFp])/eqRatio*(-1.); + for(int q =0; q < 3; q++) + { + stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += (l20p->operator()(p,q)*Gradsp[j+3*nbFFp][q])*nu(p)*Valsp[l+4*nbFFp]*wJ/2.; + + stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += ftJump*(djy1dVp->operator()(p,q)*dVdfVp+djy1dTp->operator()(p,q)*dTdfVp)*Gradsp[j+3*nbFFp][q]*nu(p)*Valsp[l+4*nbFFp]*wJ/2.; + stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += fvJump*(dl20dvp->operator()(p,q)*dVdfVp+dl20dTp->operator()(p,q)*dTdfVp)*Gradsp[j+3*nbFFp][q]*nu(p)*Valsp[l+4*nbFFp]*wJ/2.; + } } } - } - } + } - //dfI2Tdfv - for(int j=0;j<nbFFm;j++) + //dfI2vdfv + for(int j=0;j<nbFFm;j++) { for(int l=0;l<nbFFm;l++) { @@ -4524,10 +4231,10 @@ void ElecTherMechDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMa { for(int q =0; q < 3; q++) { - stiff(j+3*nbFFm,l+4*nbFFm) -= (l20m->operator()(p,q)*Gradsm[j+3*nbFFm][q])*nu(p)*Valsm[l+4*nbFFm]*wJ/2.; + stiff(j+4*nbFFm,l+4*nbFFm) -= (l10m->operator()(p,q)*Gradsm[j+4*nbFFm][q])*nu(p)*Valsm[l+4*nbFFm]*wJ/2.; - stiff(j+3*nbFFm,l+4*nbFFm) += ftJump*(djy1dVm->operator()(p,q)*dVdfVm+djy1dTm->operator()(p,q)*dTdfVm)*Gradsm[j+3*nbFFm][q]*nu(p)*Valsm[l+4*nbFFm]*wJ/2.; - stiff(j+3*nbFFm,l+4*nbFFm) += fvJump*(dl20dvm->operator()(p,q)*dVdfVm+dl20dTm->operator()(p,q)*dTdfVm)*Gradsm[j+3*nbFFm][q]*nu(p)*Valsm[l+4*nbFFm]*wJ/2.; + stiff(j+4*nbFFm,l+4*nbFFm) += fvJump*(dl10dTm->operator()(p,q)*dTdfVm*Gradsm[j+4*nbFFm][q])*(nu(p)*Valsm[l+4*nbFFm])*wJ/2.; + stiff(j+4*nbFFm,l+4*nbFFm) += ftJump*(dl20dvm->operator()(p,q)*dVdfVm+dl20dTm->operator()(p,q)*dTdfVm)*Gradsm[j+4*nbFFm][q]*nu(p)*Valsm[l+4*nbFFm]*wJ/2.; } } } @@ -4537,7 +4244,7 @@ void ElecTherMechDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMa { for(int q =0; q < 3; q++) { - stiff(j+3*nbFFm,l+4*nbFFp+nbdofm) += (l20m->operator()(p,q)*Gradsm[j+3*nbFFm][q])*nu(p)*Valsp[l+4*nbFFp]*wJ/2.; + stiff(j+4*nbFFm,l+4*nbFFp+nbdofm) += (l10m->operator()(p,q)*Gradsm[j+4*nbFFm][q])*nu(p)*Valsp[l+4*nbFFp]*wJ/2.; } } } @@ -4550,7 +4257,7 @@ void ElecTherMechDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMa { for(int q =0; q < 3; q++) { - stiff(j+3*nbFFp+nbdofm,l+4*nbFFm) -= (l20p->operator()(p,q)*Gradsp[j+3*nbFFp][q])*(nu(p)*Valsm[l+4*nbFFm])*wJ/2.; + stiff(j+4*nbFFp+nbdofm,l+4*nbFFm) -= (l10p->operator()(p,q)*Gradsp[j+4*nbFFp][q])*(nu(p)*Valsm[l+4*nbFFm])*wJ/2.; } } } @@ -4560,17 +4267,17 @@ void ElecTherMechDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMa { for(int q =0; q < 3; q++) { - stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += (l20p->operator()(p,q)*Gradsp[j+3*nbFFp][q])*nu(p)*Valsp[l+4*nbFFp]*wJ/2.; + stiff(j+4*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += (l10p->operator()(p,q)*Gradsp[j+4*nbFFp][q])*nu(p)*Valsp[l+4*nbFFp]*wJ/2.; - stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += ftJump*(djy1dVp->operator()(p,q)*dVdfVp+djy1dTp->operator()(p,q)*dTdfVp)*Gradsp[j+3*nbFFp][q]*nu(p)*Valsp[l+4*nbFFp]*wJ/2.; - stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += fvJump*(dl20dvp->operator()(p,q)*dVdfVp+dl20dTp->operator()(p,q)*dTdfVp)*Gradsp[j+3*nbFFp][q]*nu(p)*Valsp[l+4*nbFFp]*wJ/2.; + stiff(j+4*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += fvJump*(dl10dTp->operator()(p,q)*dTdfVp*Gradsp[j+4*nbFFp][q])*(nu(p)*Valsp[l+4*nbFFp])*wJ/2.; + stiff(j+4*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += ftJump*(dl20dvp->operator()(p,q)*dVdfVp+dl20dTp->operator()(p,q)*dTdfVp)*Gradsp[j+4*nbFFp][q]*nu(p)*Valsp[l+4*nbFFp]*wJ/2.; } } } } - //dfI2vdfv - for(int j=0;j<nbFFm;j++) + //dfI2vdfT + for(int j=0;j<nbFFm;j++) { for(int l=0;l<nbFFm;l++) { @@ -4578,10 +4285,10 @@ void ElecTherMechDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMa { for(int q =0; q < 3; q++) { - stiff(j+4*nbFFm,l+4*nbFFm) -= (l10m->operator()(p,q)*Gradsm[j+4*nbFFm][q])*nu(p)*Valsm[l+4*nbFFm]*wJ/2.; + stiff(j+4*nbFFm,l+3*nbFFm) -= (l20m->operator()(p,q)*Gradsm[j+4*nbFFm][q])*nu(p)*Valsm[l+3*nbFFm]*wJ/2.; - stiff(j+4*nbFFm,l+4*nbFFm) += fvJump*(dl10dTm->operator()(p,q)*dTdfVm*Gradsm[j+4*nbFFm][q])*(nu(p)*Valsm[l+4*nbFFm])*wJ/2.; - stiff(j+4*nbFFm,l+4*nbFFm) += ftJump*(dl20dvm->operator()(p,q)*dVdfVm+dl20dTm->operator()(p,q)*dTdfVm)*Gradsm[j+4*nbFFm][q]*nu(p)*Valsm[l+4*nbFFm]*wJ/2.; + stiff(j+4*nbFFm,l+3*nbFFm) += fvJump*(dl10dTm->operator()(p,q)*dTdfTm*Gradsm[j+4*nbFFm][q])*(nu(p)*Valsm[l+3*nbFFm])*wJ/2.; + stiff(j+4*nbFFm,l+3*nbFFm) += ftJump*(dl20dTm->operator()(p,q)*dTdfTm+dl20dvm->operator()(p,q)*dVdfTm)*Gradsm[j+4*nbFFm][q]*nu(p)*Valsm[l+3*nbFFm]*wJ/2.; } } } @@ -4591,11 +4298,12 @@ void ElecTherMechDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMa { for(int q =0; q < 3; q++) { - stiff(j+4*nbFFm,l+4*nbFFp+nbdofm) += (l10m->operator()(p,q)*Gradsm[j+4*nbFFm][q])*nu(p)*Valsp[l+4*nbFFp]*wJ/2.; + stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) += (l20m->operator()(p,q)*Gradsm[j+4*nbFFm][q])*nu(p)*Valsp[l+3*nbFFp]*wJ/2.; } } } } + for(int j=0;j<nbFFp;j++) { for(int l=0;l<nbFFm;l++) @@ -4604,7 +4312,7 @@ void ElecTherMechDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMa { for(int q =0; q < 3; q++) { - stiff(j+4*nbFFp+nbdofm,l+4*nbFFm) -= (l10p->operator()(p,q)*Gradsp[j+4*nbFFp][q])*(nu(p)*Valsm[l+4*nbFFm])*wJ/2.; + stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) -= (l20p->operator()(p,q)*Gradsp[j+4*nbFFp][q])*nu(p)*Valsm[l+3*nbFFm]*wJ/2.; } } } @@ -4614,1157 +4322,1104 @@ void ElecTherMechDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMa { for(int q =0; q < 3; q++) { - stiff(j+4*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += (l10p->operator()(p,q)*Gradsp[j+4*nbFFp][q])*nu(p)*Valsp[l+4*nbFFp]*wJ/2.; + stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += (l20p->operator()(p,q)*Gradsp[j+4*nbFFp][q])*nu(p)*Valsp[l+3*nbFFp]*wJ/2.; - stiff(j+4*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += fvJump*(dl10dTp->operator()(p,q)*dTdfVp*Gradsp[j+4*nbFFp][q])*(nu(p)*Valsp[l+4*nbFFp])*wJ/2.; - stiff(j+4*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += ftJump*(dl20dvp->operator()(p,q)*dVdfVp+dl20dTp->operator()(p,q)*dTdfVp)*Gradsp[j+4*nbFFp][q]*nu(p)*Valsp[l+4*nbFFp]*wJ/2.; + stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += fvJump*(dl10dTp->operator()(p,q)*dTdfTp*Gradsp[j+4*nbFFp][q])*(nu(p)*Valsp[l+3*nbFFp])*wJ/2.; + stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += ftJump*(dl20dTp->operator()(p,q)*dTdfTp+dl20dvp->operator()(p,q)*dVdfTp)*Gradsp[j+4*nbFFp][q]*nu(p)*Valsp[l+3*nbFFp]*wJ/2.; } } } } - //dfI2vdfT + //dfTI2dF +dfvI2dF for(int j=0;j<nbFFm;j++) { for(int l=0;l<nbFFm;l++) { - for(int p =0; p < 3; p++) + for(int m =0; m < 3; m++) + { + for(int p =0; p < 3; p++) + { + for(int q =0; q < 3; q++) + { + for(int n =0; n< 3; n++) + { + stiff(j+3*nbFFm,l+m*nbFFm) += ftJump*(djy1dFm->operator()(p,q,m,n)*Gradsm[j+3*nbFFm][q]*Gradsm[l+0*nbFFm][n])*(nu(p)*wJ/2.); + stiff(j+3*nbFFm,l+m*nbFFm) += fvJump*(dl20dFm->operator()(p,q,m,n)*Gradsm[j+3*nbFFm][q]*Gradsm[l+0*nbFFm][n])*(nu(p)*wJ/2.); + + stiff(j+4*nbFFm,l+m*nbFFm) += fvJump*(dl10dFm->operator()(p,q,m,n)*Gradsm[j+4*nbFFm][q]*Gradsm[l+0*nbFFm][n])*(nu(p)*wJ/2.); + stiff(j+4*nbFFm,l+m*nbFFm) += ftJump*(dl20dFm->operator()(p,q,m,n)*Gradsm[j+4*nbFFm][q]*Gradsm[l+0.*nbFFm][n])*(nu(p)*wJ/2.); + } + } + } + } + } + } + + for(int j=0;j<nbFFp;j++) + { + for(int l=0;l<nbFFp;l++) + { + for(int m =0; m < 3; m++) + { + for(int n =0; n< 3; n++) + { + for(int p =0; p < 3; p++) + { + for(int q =0; q < 3; q++) + { + stiff(j+3*nbFFp+nbdofm,l+m*nbFFp+nbdofm) += ftJump*(djy1dFp->operator()(p,q,m,n)*Gradsp[j+3*nbFFp][q]*Gradsp[l+0*nbFFp][n])*(nu(p)*wJ/2.); + stiff(j+3*nbFFp+nbdofm,l+m*nbFFp+nbdofm) += fvJump*(dl20dFp->operator()(p,q,m,n)*Gradsp[j+3*nbFFp][q]*Gradsp[l+0*nbFFp][n])*(nu(p)*wJ/2.); + + stiff(j+4*nbFFp+nbdofm,l+m*nbFFp+nbdofm) += fvJump*(dl10dFp->operator()(p,q,m,n)*Gradsp[j+4*nbFFp][q]*Gradsp[l+0*nbFFp][n])*(nu(p)*wJ/2.); + stiff(j+4*nbFFp+nbdofm,l+m*nbFFp+nbdofm) += ftJump*(dl20dFp->operator()(p,q,m,n)*Gradsp[j+4*nbFFp][q]*Gradsp[l+0*nbFFp][n])*(nu(p)*wJ/2.); + } + } + } + } + } + } + } + } + else + { + const double &ftJump = ipvp->getConstRefTofTJump(); + const double &fvJump = ipvp->getConstRefTofvJump(); + + const double &dfvJumpdvm = ipvm->getConstRefTodfvjumpdvm(); + const double &dfvJumpdvp = ipvp->getConstRefTodfvjumpdvp(); + + const double &dfvJumpdTm = ipvm->getConstRefTodfvjumpdTm(); + const double &dfvJumpdTp = ipvp->getConstRefTodfvjumpdTp(); + + const double &dftJumpdTm = ipvm->getConstRefTodfTjumpdTm(); + const double &dftJumpdTp = ipvp->getConstRefTodfTjumpdTp(); + + //std::vector<TensorialTraits<double>::GradType> &Gradsm = vallm[i]->_vgrads; + //std::vector<TensorialTraits<double>::GradType> &Gradsp = vallp[i]->_vgrads; + + const std::vector<TensorialTraits<double>::GradType> &Gradsm = ipvm->gradf(_minusSpace,ie->getElem(0),GPm[i]); + const std::vector<TensorialTraits<double>::GradType> &Gradsp = ipvp->gradf(_plusSpace,ie->getElem(1),GPp[i]); + + // possibility of fracture + bool broken = false; + if(_mlawMinus->getType() == materialLaw::fracture ) + { + const FractureCohesive3DIPVariable *ipvwf = static_cast<const FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::current)); // broken via minus (OK broken on both sides) + broken = ipvwf->isbroken(); + } + static SVector3 nu; + nu = referenceOutwardNormalm; + nu*= (1./referenceOutwardNormalm.norm()); + + const std::vector<TensorialTraits<double>::ValType> &Valsm = ipvm->f(_minusSpace,ie->getElem(0),GPm[i]); + const std::vector<TensorialTraits<double>::ValType> &Valsp = ipvp->f(_plusSpace,ie->getElem(1),GPp[i]); + + //new + static STensor3 Stiff_alphadialitationm; + Stiff_alphadialitationm = (ipvm->getConstRefToStiff_alphaDilatation()); + static STensor3 Stiff_alphadialitationp; + Stiff_alphadialitationp = (ipvp->getConstRefToStiff_alphaDilatation()); + + const double &Tp = ipvp->getConstRefToTemperature(); + const double &Tm = ipvm->getConstRefToTemperature(); + + Stiff_alphadialitationm*= (-1.)*(Tm*Tm); + Stiff_alphadialitationp*= (-1.)*(Tp*Tp); + const SVector3 &jump = ipvp->getConstRefToJump(); + + + if(broken) + { + + } + else + { + const STensor3 *dPdTm = &(ipvm->getConstRefTodPdT()); + const STensor3 *dPdTp = &(ipvp->getConstRefTodPdT()); + const STensor33 *djedFm = &(ipvm->getConstRefTodFluxVdF()); + const STensor33 *djedFp = &(ipvp->getConstRefTodFluxVdF()); + const STensor3 *dPdVm = &(ipvm->getConstRefTodPdV()); + const STensor3 *dPdVp = &(ipvp->getConstRefTodPdV()); + + const STensor3 *l10m = &(ipvm->getConstRefToElecConductivity()); + const STensor3 *l10p = &(ipvp->getConstRefToElecConductivity()); + const STensor3 *l20m = &(ipvm->getConstRefToCrossElecConductivity()); + const STensor3 *l20p = &(ipvp->getConstRefToCrossElecConductivity()); + + const STensor3 *dl10dTm = &(ipvm->getConstRefTodElecConductivitydT()); + const STensor3 *dl10dTp = &(ipvp->getConstRefTodElecConductivitydT()); + const STensor3 *dl20dTm = &(ipvm->getConstRefTodCrossElecConductivitydT()); + const STensor3 *dl20dTp = &(ipvp->getConstRefTodCrossElecConductivitydT()); + + const STensor3 *dl20dvm = &(ipvm->getConstRefTodCrossElecConductivitydv()); + const STensor3 *dl20dvp = &(ipvp->getConstRefTodCrossElecConductivitydv()); + + const STensor43 *dl10dFm = &(ipvm->getConstRefTodElecConductivitydF()); + const STensor43 *dl10dFp = &(ipvp->getConstRefTodElecConductivitydF()); + const STensor43 *dl20dFm = &(ipvm->getConstRefTodCrossElecConductivitydF()); + const STensor43 *dl20dFp = &(ipvp->getConstRefTodCrossElecConductivitydF()); + + const STensor3 *djedGradVm = &(ipvm->getConstRefTodFluxVdGradV()); + const STensor3 *djedGradVp = &(ipvp->getConstRefTodFluxVdGradV()); + const SVector3 *djedVm = &(ipvm->getConstRefTodFluxVdV()); + const SVector3 *djedVp = &(ipvp->getConstRefTodFluxVdV()); + const STensor3 *djedGradTm = &(ipvm->getConstRefTodFluxVdGradT()); + const STensor3 *djedGradTp = &(ipvp->getConstRefTodFluxVdGradT()); + const SVector3 *djedTm = &(ipvm->getConstRefTodFluxVdT()); + const SVector3 *djedTp = &(ipvp->getConstRefTodFluxVdT()); + + const STensor3 *jy1m = &(ipvm->getConstRefToEnergyConductivity()); + const STensor43 *djy1dFm = &(ipvm->getConstRefTodEnergyConductivitydF()); + const STensor3 *djy1dVm = &(ipvm->getConstRefTodEnergyConductivitydV()); + const STensor3 *djy1dTm = &(ipvm->getConstRefTodEnergyConductivitydT()); + + const STensor3 *jy1p = &(ipvp->getConstRefToEnergyConductivity()); + const STensor43 *djy1dFp = &(ipvp->getConstRefTodEnergyConductivitydF()); + const STensor3 *djy1dVp = &(ipvp->getConstRefTodEnergyConductivitydV()); + const STensor3 *djy1dTp = &(ipvp->getConstRefTodEnergyConductivitydT()); + + const STensor33 *djydFp = &(ipvp->getConstRefTodFluxEnergydF()); + const STensor3 *djydGradTp = &(ipvp->getConstRefTodFluxEnergydGradT()); + const SVector3 *djydTp = &(ipvp->getConstRefTodFluxEnergydT()); + const STensor3 *djydGradVp = &(ipvp->getConstRefTodFluxEnergydGradV()); + const SVector3 *djydVp = &(ipvp->getConstRefTodFluxEnergydV()); + const SVector3 *fluxjyp = &(ipvp->getConstRefToFluxEnergy()); + + const STensor33 *djydFm = &(ipvm->getConstRefTodFluxEnergydF()); + const STensor3 *djydGradTm = &(ipvm->getConstRefTodFluxEnergydGradT()); + const SVector3 *djydTm = &(ipvm->getConstRefTodFluxEnergydT()); + const STensor3 *djydGradVm = &(ipvm->getConstRefTodFluxEnergydGradV()); + const SVector3 *djydVm = &(ipvm->getConstRefTodFluxEnergydV()); + const SVector3 *fluxjym = &(ipvm->getConstRefToFluxEnergy()); + + double eqRatio = _ElecTherMechEqRatio; + wJ*=eqRatio; + + // Assembly consistency (from derivative of sigma with extra field) + //dpdV +dpdT + for(int j=0;j<nbFFm;j++) + { + for(int k=0;k<3;k++) + { + for(int l=0;l<nbFFm;l++) + { + for(int q = 0; q< 3; q++) + { + stiff(j+k*nbFFm,l+3*nbFFm) -= dPdTm->operator()(k,q)*(Valsm[l+3*nbFFm]*Valsm[j+0*nbFFm]*wJ/2.*nu(q)/eqRatio); + + stiff(j+k*nbFFm,l+4*nbFFm) -= dPdVm->operator()(k,q)*(Valsm[l+4*nbFFm]*Valsm[j+0*nbFFm]*wJ/2.*nu(q)/eqRatio); + } + } + for(int l=0;l<nbFFp;l++) + { + for(int q = 0; q< 3; q++) + { + stiff(j+k*nbFFm,l+3*nbFFp+nbdofm) -= dPdTp->operator()(k,q)*(Valsp[l+3*nbFFp]*Valsm[j+0*nbFFm]*wJ/2.*nu(q)/eqRatio); + + stiff(j+k*nbFFm,l+4*nbFFp+nbdofm) -= dPdVp->operator()(k,q)*(Valsp[l+4*nbFFp]*Valsm[j+0*nbFFm]*wJ/2.*nu(q)/eqRatio); + } + } + } + } + for(int j=0;j<nbFFp;j++) + { + for(int k=0;k<3;k++) + { + for(int l=0;l<nbFFm;l++) + { + for(int q = 0; q< 3; q++) + { + stiff(j+k*nbFFp+nbdofm,l+3*nbFFm) += dPdTm->operator()(k,q)*(Valsm[l+3*nbFFm]*Valsp[j+0*nbFFp]*wJ/2.*nu(q)/eqRatio); + + stiff(j+k*nbFFp+nbdofm,l+4*nbFFm) += dPdVm->operator()(k,q)*(Valsm[l+4*nbFFm]*Valsp[j+0*nbFFp]*wJ/2.*nu(q)/eqRatio); + } + } + for(int l=0;l<nbFFp;l++) + { + for(int q = 0; q< 3; q++) + { + stiff(j+k*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += dPdTp->operator()(k,q)*(Valsp[l+3*nbFFp]*Valsp[j+0*nbFFp]*wJ/2.*nu(q)/eqRatio); + + stiff(j+k*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += dPdVp->operator()(k,q)*(Valsp[l+4*nbFFp]*Valsp[j+0*nbFFp]*wJ/2.*nu(q)/eqRatio); + } + } + } + } + + // Assembly consistency (from derivative of flux with deformation gradient) + for(int j=0;j<nbFFm;j++) + { + for(int k=0;k<3;k++) + { + for(int l=0;l<nbFFm;l++) + { + for(int q = 0; q< 3; q++) + { + for(int N = 0; N< 3; N++) + { + stiff(j+3*nbFFm,l+k*nbFFm) -= djydFm->operator()(N,k,q)*(Gradsm[l+0*nbFFm][q]*Valsm[j+3*nbFFm]*wJ/2.*nu(N)); + } + } + } + for(int l=0;l<nbFFp;l++) + { + for(int q = 0; q< 3; q++) + { + for(int N = 0; N< 3; N++) + { + stiff(j+3*nbFFm,l+k*nbFFp+nbdofm) -= djydFp->operator()(N,k,q)*(Gradsp[l+0*nbFFp][q]*Valsm[j+3*nbFFm]*wJ/2.*nu(N)); + } + } + } + } + } + for(int j=0;j<nbFFp;j++) + { + for(int k=0;k<3;k++) + { + for(int l=0;l<nbFFm;l++) + { + for(int q = 0; q< 3; q++) + { + for(int N = 0; N< 3; N++) + { + stiff(j+3*nbFFp+nbdofm,l+k*nbFFm) += djydFm->operator()(N,k,q)*(Gradsm[l+0*nbFFm][q]*Valsp[j+3*nbFFp]*wJ/2.*nu(N)); + } + } + } + for(int l=0;l<nbFFp;l++) + { + for(int q = 0; q< 3; q++) + { + for(int N = 0; N< 3; N++) + { + stiff(j+3*nbFFp+nbdofm,l+k*nbFFp+nbdofm) += djydFp->operator()(N,k,q)*(Gradsp[l+0*nbFFp][q]*Valsp[j+3*nbFFp]*wJ/2.*nu(N)); + } + } + } + } + } + //djedf (derivative if cross term) + for(int j=0;j<nbFFm;j++) + { + for(int k=0;k<3;k++) + { + for(int l=0;l<nbFFm;l++) + { + for(int q = 0; q< 3; q++) + { + for(int N = 0; N< 3; N++) + { + stiff(j+4*nbFFm,l+k*nbFFm) -= djedFm->operator()(N,k,q)*(Gradsm[l+0*nbFFm][q]*Valsm[j+4*nbFFm]*wJ/2.*nu(N)); + } + } + } + for(int l=0;l<nbFFp;l++) + { + for(int q = 0; q< 3; q++) + { + for(int N = 0; N< 3; N++) + { + stiff(j+4*nbFFm,l+k*nbFFp+nbdofm) -= djedFp->operator()(N,k,q)*(Gradsp[l+0*nbFFp][q]*Valsm[j+4*nbFFm]*wJ/2.*nu(N)); + } + } + } + } + } + for(int j=0;j<nbFFp;j++) + { + for(int k=0;k<3;k++) + { + for(int l=0;l<nbFFm;l++) + { + for(int q = 0; q< 3; q++) + { + for(int N = 0; N< 3; N++) + { + stiff(j+4*nbFFp+nbdofm,l+k*nbFFm) += djedFm->operator()(N,k,q)*(Gradsm[l+0*nbFFm][q]*Valsp[j+4*nbFFp]*wJ/2.*nu(N)); + } + } + } + for(int l=0;l<nbFFp;l++) + { + for(int q = 0; q< 3; q++) + { + for(int N = 0; N< 3; N++) + { + stiff(j+4*nbFFp+nbdofm,l+k*nbFFp+nbdofm) += djedFp->operator()(N,k,q)*(Gradsp[l+0*nbFFp][q]*Valsp[j+4*nbFFp]*wJ/2.*nu(N)); + } + } + } + } + } + + // consistency D\mean{q} DT + // Assembly consistency + //dfI1tdt+dfI1tdv + for(int j=0;j<nbFFm;j++) + { + for(int l=0;l<nbFFm;l++) + { + for(int p = 0; p< 3; p++) + { + stiff(j+3*nbFFm,l+3*nbFFm) -= djydTm->operator()(p)*(Valsm[l+3*nbFFm]*Valsm[j+3*nbFFm]*wJ/2.*nu(p)); + stiff(j+3*nbFFm,l+4*nbFFm) -= djydVm->operator()(p)*(Valsm[l+4*nbFFm]*Valsm[j+3*nbFFm]*wJ/2.*nu(p)); + for(int q = 0; q< 3; q++) + { + stiff(j+3*nbFFm,l+3*nbFFm) -= djydGradTm->operator()(q,p)*(Gradsm[l+3*nbFFm][p]*Valsm[j+3*nbFFm]*wJ/2.*nu(q)); + stiff(j+3*nbFFm,l+4*nbFFm) -= djydGradVm->operator()(q,p)*(Gradsm[l+4*nbFFm][p]*Valsm[j+3*nbFFm]*wJ/2.*nu(q)); + } + } + } + for(int l=0;l<nbFFp;l++) + { + for(int p = 0; p< 3; p++) + { + stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) -= djydTp->operator()(p)*(Valsp[l+3*nbFFp]*Valsm[j+3*nbFFm]*wJ/2.*nu(p)); + stiff(j+3*nbFFm,l+4*nbFFp+nbdofm) -= djydVp->operator()(p)*(Valsp[l+4*nbFFp]*Valsm[j+3*nbFFm]*wJ/2.*nu(p)); + for(int q = 0; q< 3; q++) + { + stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) -= djydGradTp->operator()(q,p)*(Gradsp[l+3*nbFFp][p]*Valsm[j+3*nbFFm]*wJ/2.*nu(q)); + stiff(j+3*nbFFm,l+4*nbFFp+nbdofm) -= djydGradVp->operator()(q,p)*(Gradsp[l+4*nbFFp][p]*Valsm[j+3*nbFFm]*wJ/2.*nu(q)); + } + } + } + } + for(int j=0;j<nbFFp;j++) + { + for(int l=0;l<nbFFm;l++) { - for(int q =0; q < 3; q++) + for(int p = 0; p< 3; p++) { - stiff(j+4*nbFFm,l+3*nbFFm) -= (l20m->operator()(p,q)*Gradsm[j+4*nbFFm][q])*nu(p)*Valsm[l+3*nbFFm]*wJ/2.; - - stiff(j+4*nbFFm,l+3*nbFFm) += fvJump*(dl10dTm->operator()(p,q)*dTdfTm*Gradsm[j+4*nbFFm][q])*(nu(p)*Valsm[l+3*nbFFm])*wJ/2.; - stiff(j+4*nbFFm,l+3*nbFFm) += ftJump*(dl20dTm->operator()(p,q)*dTdfTm+dl20dvm->operator()(p,q)*dVdfTm)*Gradsm[j+4*nbFFm][q]*nu(p)*Valsm[l+3*nbFFm]*wJ/2.; + stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) += djydTm->operator()(p)*(Valsm[l+3*nbFFm]*Valsp[j+3*nbFFp]*wJ/2.*nu(p)); + stiff(j+3*nbFFp+nbdofm,l+4*nbFFm) += djydVm->operator()(p)*(Valsm[l+4*nbFFm]*Valsp[j+3*nbFFp]*wJ/2.*nu(p)); + for(int q = 0; q< 3; q++) + { + stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) += djydGradTm->operator()(q,p)*(Gradsm[l+3*nbFFm][p]*Valsp[j+3*nbFFp]*wJ/2.*nu(q)); + stiff(j+3*nbFFp+nbdofm,l+4*nbFFm) += djydGradVm->operator()(q,p)*(Gradsm[l+4*nbFFm][p]*Valsp[j+3*nbFFp]*wJ/2.*nu(q)); + } } } - } - for(int l=0;l<nbFFp;l++) - { - for(int p =0; p < 3; p++) + for(int l=0;l<nbFFp;l++) { - for(int q =0; q < 3; q++) + for(int p = 0; p< 3; p++) { - stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) += (l20m->operator()(p,q)*Gradsm[j+4*nbFFm][q])*nu(p)*Valsp[l+3*nbFFp]*wJ/2.; + stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += djydTp->operator()(p)*(Valsp[l+3*nbFFp]*Valsp[j+3*nbFFp]*wJ/2.*nu(p)); + stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += djydVp->operator()(p)*(Valsp[l+4*nbFFp]*Valsp[j+3*nbFFp]*wJ/2.*nu(p)); + for(int q = 0; q< 3; q++) + { + stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += djydGradTp->operator()(q,p)*(Gradsp[l+3*nbFFp][p]*Valsp[j+3*nbFFp]*wJ/2.*nu(q)); + stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += djydGradVp->operator()(q,p)*(Gradsp[l+4*nbFFp][p]*Valsp[j+3*nbFFp]*wJ/2.*nu(q)); + } } } } - } - for(int j=0;j<nbFFp;j++) - { - for(int l=0;l<nbFFm;l++) + //dfI1vdv+dfI1vdt + for(int j=0;j<nbFFm;j++) { - for(int p =0; p < 3; p++) + for(int l=0;l<nbFFm;l++) { - for(int q =0; q < 3; q++) + for(int p = 0; p< 3; p++) { - stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) -= (l20p->operator()(p,q)*Gradsp[j+4*nbFFp][q])*nu(p)*Valsm[l+3*nbFFm]*wJ/2.; + stiff(j+4*nbFFm,l+4*nbFFm) -= djedVm->operator()(p)*(Valsm[l+4*nbFFm]*Valsm[j+4*nbFFm]*wJ/2.*nu(p)); + stiff(j+4*nbFFm,l+3*nbFFm) -= djedTm->operator()(p)*(Valsm[l+3*nbFFm]*Valsm[j+4*nbFFm]*wJ/2.*nu(p)); + for(int q = 0; q< 3; q++) + { + stiff(j+4*nbFFm,l+4*nbFFm) -= djedGradVm->operator()(q,p)*(Gradsm[l+4*nbFFm][p]*Valsm[j+4*nbFFm]*wJ/2.*nu(q)); + stiff(j+4*nbFFm,l+3*nbFFm) -= djedGradTm->operator()(q,p)*(Gradsm[l+3*nbFFm][p]*Valsm[j+4*nbFFm]*wJ/2.*nu(q)); + } } } - } - for(int l=0;l<nbFFp;l++) - { - for(int p =0; p < 3; p++) + for(int l=0;l<nbFFp;l++) { - for(int q =0; q < 3; q++) + for(int p = 0; p< 3; p++) { - stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += (l20p->operator()(p,q)*Gradsp[j+4*nbFFp][q])*nu(p)*Valsp[l+3*nbFFp]*wJ/2.; + stiff(j+4*nbFFm,l+4*nbFFp+nbdofm) -= djedVp->operator()(p)*(Valsp[l+4*nbFFp]*Valsm[j+4*nbFFm]*wJ/2.*nu(p)); + stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) -= djedTp->operator()(p)*(Valsp[l+3*nbFFp]*Valsm[j+4*nbFFm]*wJ/2.*nu(p)); - stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += fvJump*(dl10dTp->operator()(p,q)*dTdfTp*Gradsp[j+4*nbFFp][q])*(nu(p)*Valsp[l+3*nbFFp])*wJ/2.; - stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += ftJump*(dl20dTp->operator()(p,q)*dTdfTp+dl20dvp->operator()(p,q)*dVdfTp)*Gradsp[j+4*nbFFp][q]*nu(p)*Valsp[l+3*nbFFp]*wJ/2.; + for(int q = 0; q< 3; q++) + { + stiff(j+4*nbFFm,l+4*nbFFp+nbdofm) -= djedGradVp->operator()(q,p)*(Gradsp[l+4*nbFFp][p]*Valsm[j+4*nbFFm]*wJ/2.*nu(q)); + stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) -= djedGradTp->operator()(q,p)*(Gradsp[l+3*nbFFp][p]*Valsm[j+4*nbFFm]*wJ/2.*nu(q)); + } } } } - } - - //dfTI2dF +dfvI2dF - for(int j=0;j<nbFFm;j++) - { - for(int l=0;l<nbFFm;l++) + for(int j=0;j<nbFFp;j++) { - for(int m =0; m < 3; m++) + for(int l=0;l<nbFFm;l++) { - for(int p =0; p < 3; p++) - { - for(int q =0; q < 3; q++) - { - for(int n =0; n< 3; n++) - { - stiff(j+3*nbFFm,l+m*nbFFm) += ftJump*(djy1dFm->operator()(p,q,m,n)*Gradsm[j+3*nbFFm][q]*Gradsm[l+0*nbFFm][n])*(nu(p)*wJ/2.); - stiff(j+3*nbFFm,l+m*nbFFm) += fvJump*(dl20dFm->operator()(p,q,m,n)*Gradsm[j+3*nbFFm][q]*Gradsm[l+0*nbFFm][n])*(nu(p)*wJ/2.); + for(int p = 0; p< 3; p++) + { + stiff(j+4*nbFFp+nbdofm,l+4*nbFFm) += djedVm->operator()(p)*(Valsm[l+4*nbFFm]*Valsp[j+4*nbFFp]*wJ/2.*nu(p)); + stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) += djedTm->operator()(p)*(Valsm[l+3*nbFFm]*Valsp[j+4*nbFFp]*wJ/2.*nu(p)); - stiff(j+4*nbFFm,l+m*nbFFm) += fvJump*(dl10dFm->operator()(p,q,m,n)*Gradsm[j+4*nbFFm][q]*Gradsm[l+0*nbFFm][n])*(nu(p)*wJ/2.); - stiff(j+4*nbFFm,l+m*nbFFm) += ftJump*(dl20dFm->operator()(p,q,m,n)*Gradsm[j+4*nbFFm][q]*Gradsm[l+0.*nbFFm][n])*(nu(p)*wJ/2.); - } - } - } + for(int q = 0; q< 3; q++) + { + stiff(j+4*nbFFp+nbdofm,l+4*nbFFm) += djedGradVm->operator()(q,p)*(Gradsm[l+4*nbFFm][p]*Valsp[j+4*nbFFp]*wJ/2.*nu(q)); + stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) += djedGradTm->operator()(q,p)*(Gradsm[l+3*nbFFm][p]*Valsp[j+4*nbFFp]*wJ/2.*nu(q)); + } + } } - } - } - - for(int j=0;j<nbFFp;j++) - { - for(int l=0;l<nbFFp;l++) - { - for(int m =0; m < 3; m++) + for(int l=0;l<nbFFp;l++) { - for(int n =0; n< 3; n++) + for(int p = 0; p< 3; p++) { - for(int p =0; p < 3; p++) - { - for(int q =0; q < 3; q++) - { - stiff(j+3*nbFFp+nbdofm,l+m*nbFFp+nbdofm) += ftJump*(djy1dFp->operator()(p,q,m,n)*Gradsp[j+3*nbFFp][q]*Gradsp[l+0*nbFFp][n])*(nu(p)*wJ/2.); - stiff(j+3*nbFFp+nbdofm,l+m*nbFFp+nbdofm) += fvJump*(dl20dFp->operator()(p,q,m,n)*Gradsp[j+3*nbFFp][q]*Gradsp[l+0*nbFFp][n])*(nu(p)*wJ/2.); - - stiff(j+4*nbFFp+nbdofm,l+m*nbFFp+nbdofm) += fvJump*(dl10dFp->operator()(p,q,m,n)*Gradsp[j+4*nbFFp][q]*Gradsp[l+0*nbFFp][n])*(nu(p)*wJ/2.); - stiff(j+4*nbFFp+nbdofm,l+m*nbFFp+nbdofm) += ftJump*(dl20dFp->operator()(p,q,m,n)*Gradsp[j+4*nbFFp][q]*Gradsp[l+0*nbFFp][n])*(nu(p)*wJ/2.); - } - } + stiff(j+4*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += djedVp->operator()(p)*(Valsp[l+4*nbFFp]*Valsp[j+4*nbFFp]*wJ/2.*nu(p)); + stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += djedTp->operator()(p)*(Valsp[l+3*nbFFp]*Valsp[j+4*nbFFp]*wJ/2.*nu(p)); + for(int q = 0; q< 3; q++) + { + stiff(j+4*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += djedGradVp->operator()(q,p)*(Gradsp[l+4*nbFFp][p]*Valsp[j+4*nbFFp]*wJ/2.*nu(q)); + stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += djedGradTp->operator()(q,p)*(Gradsp[l+3*nbFFp][p]*Valsp[j+4*nbFFp]*wJ/2.*nu(q)); + } } } } - } - } - } - else - { - const double &ftJump = ipvp->getConstRefTofTJump(); - const double &fvJump = ipvp->getConstRefTofvJump(); - - const double &dfvJumpdvm = ipvm->getConstRefTodfvjumpdvm(); - const double &dfvJumpdvp = ipvp->getConstRefTodfvjumpdvp(); - - const double &dfvJumpdTm = ipvm->getConstRefTodfvjumpdTm(); - const double &dfvJumpdTp = ipvp->getConstRefTodfvjumpdTp(); - - const double &dftJumpdTm = ipvm->getConstRefTodfTjumpdTm(); - const double &dftJumpdTp = ipvp->getConstRefTodfTjumpdTp(); - - //std::vector<TensorialTraits<double>::GradType> &Gradsm = vallm[i]->_vgrads; - //std::vector<TensorialTraits<double>::GradType> &Gradsp = vallp[i]->_vgrads; - - const std::vector<TensorialTraits<double>::GradType> &Gradsm = ipvm->gradf(_minusSpace,ie->getElem(0),GPm[i]); - const std::vector<TensorialTraits<double>::GradType> &Gradsp = ipvp->gradf(_plusSpace,ie->getElem(1),GPp[i]); - - // possibility of fracture - bool broken = false; - if(_mlawMinus->getType() == materialLaw::fracture ) - { - const FractureCohesive3DIPVariable *ipvwf = static_cast<const FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::current)); // broken via minus (OK broken on both sides) - broken = ipvwf->isbroken(); - //const FractureCohesive3DIPVariable *ipvwfprev = static_cast<const FractureCohesive3DIPVariable*>(ipsm->getState(IPStateBase::previous)); - //broken = ipvwfprev->isbroken(); // use continuity principle at fracture initialization to avoid instability - } - double wJ = detJ* weight; - static SVector3 nu; - nu = referenceOutwardNormalm; - nu*= (1./referenceOutwardNormalm.norm()); + // Stability N \mean{k0} (N) + double NBhsNdjy1dTm=0.;double NBhsNdjy1dTp=0.; double NBhsNdjy1dvm=0.; double NBhsNdjy1dvp=0.; + double NBhsNdL1dTm=0.;double NBhsNdL1dTp=0.; double NBhsNdL2dTm=0.;double NBhsNdL2dTp=0.;double NBhsNdL2dVm=0.; double NBhsNdL2dVp=0.; - //std::vector<TensorialTraits<double>::ValType> &Valsm = vallm[i]->_vvals; - //std::vector<TensorialTraits<double>::ValType> &Valsp = vallp[i]->_vvals; + for(int l = 0; l <3; l++) + { + for(int n = 0; n <3; n++) + { + NBhsNdjy1dTm+=djy1dTm->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; + NBhsNdjy1dTp+=djy1dTp->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; - const std::vector<TensorialTraits<double>::ValType> &Valsm = ipvm->f(_minusSpace,ie->getElem(0),GPm[i]); - const std::vector<TensorialTraits<double>::ValType> &Valsp = ipvp->f(_plusSpace,ie->getElem(1),GPp[i]); + NBhsNdL1dTm+=dl10dTm->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; + NBhsNdL1dTp+=dl10dTp->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; + NBhsNdL2dTm+=dl20dTm->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; + NBhsNdL2dTp+=dl20dTp->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; - //new - static STensor3 Stiff_alphadialitationm; - Stiff_alphadialitationm = (ipvm->getConstRefToStiff_alphaDilatation()); - static STensor3 Stiff_alphadialitationp; - Stiff_alphadialitationp = (ipvp->getConstRefToStiff_alphaDilatation()); + NBhsNdjy1dvm+=djy1dVm->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; + NBhsNdjy1dvp+=djy1dVp->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; - const double &Tp = ipvp->getConstRefToTemperature(); - const double &Tm = ipvm->getConstRefToTemperature(); + NBhsNdL2dVm+=dl20dvm->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; + NBhsNdL2dVp+=dl20dvp->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; + } + } - Stiff_alphadialitationm*= (-1.)*(Tm*Tm); - Stiff_alphadialitationp*= (-1.)*(Tp*Tp); - const SVector3 &jump = ipvp->getConstRefToJump(); - - - if(broken) - { - - } - else - { - const STensor3 *dPdTm = &(ipvm->getConstRefTodPdT()); - const STensor3 *dPdTp = &(ipvp->getConstRefTodPdT()); - const STensor33 *djedFm = &(ipvm->getConstRefTodFluxVdF()); - const STensor33 *djedFp = &(ipvp->getConstRefTodFluxVdF()); - const STensor3 *dPdVm = &(ipvm->getConstRefTodPdV()); - const STensor3 *dPdVp = &(ipvp->getConstRefTodPdV()); - - const STensor3 *l10m = &(ipvm->getConstRefToElecConductivity()); - const STensor3 *l10p = &(ipvp->getConstRefToElecConductivity()); - const STensor3 *l20m = &(ipvm->getConstRefToCrossElecConductivity()); - const STensor3 *l20p = &(ipvp->getConstRefToCrossElecConductivity()); - - const STensor3 *dl10dTm = &(ipvm->getConstRefTodElecConductivitydT()); - const STensor3 *dl10dTp = &(ipvp->getConstRefTodElecConductivitydT()); - const STensor3 *dl20dTm = &(ipvm->getConstRefTodCrossElecConductivitydT()); - const STensor3 *dl20dTp = &(ipvp->getConstRefTodCrossElecConductivitydT()); - - const STensor3 *dl20dvm = &(ipvm->getConstRefTodCrossElecConductivitydv()); - const STensor3 *dl20dvp = &(ipvp->getConstRefTodCrossElecConductivitydv()); - - const STensor43 *dl10dFm = &(ipvm->getConstRefTodElecConductivitydF()); - const STensor43 *dl10dFp = &(ipvp->getConstRefTodElecConductivitydF()); - const STensor43 *dl20dFm = &(ipvm->getConstRefTodCrossElecConductivitydF()); - const STensor43 *dl20dFp = &(ipvp->getConstRefTodCrossElecConductivitydF()); - - const STensor3 *djedGradVm = &(ipvm->getConstRefTodFluxVdGradV()); - const STensor3 *djedGradVp = &(ipvp->getConstRefTodFluxVdGradV()); - const SVector3 *djedVm = &(ipvm->getConstRefTodFluxVdV()); - const SVector3 *djedVp = &(ipvp->getConstRefTodFluxVdV()); - const STensor3 *djedGradTm = &(ipvm->getConstRefTodFluxVdGradT()); - const STensor3 *djedGradTp = &(ipvp->getConstRefTodFluxVdGradT()); - const SVector3 *djedTm = &(ipvm->getConstRefTodFluxVdT()); - const SVector3 *djedTp = &(ipvp->getConstRefTodFluxVdT()); - - const STensor3 *jy1m = &(ipvm->getConstRefToEnergyConductivity()); - const STensor43 *djy1dFm = &(ipvm->getConstRefTodEnergyConductivitydF()); - const STensor3 *djy1dVm = &(ipvm->getConstRefTodEnergyConductivitydV()); - const STensor3 *djy1dTm = &(ipvm->getConstRefTodEnergyConductivitydT()); - - const STensor3 *jy1p = &(ipvp->getConstRefToEnergyConductivity()); - const STensor43 *djy1dFp = &(ipvp->getConstRefTodEnergyConductivitydF()); - const STensor3 *djy1dVp = &(ipvp->getConstRefTodEnergyConductivitydV()); - const STensor3 *djy1dTp = &(ipvp->getConstRefTodEnergyConductivitydT()); - - const STensor33 *djydFp = &(ipvp->getConstRefTodFluxEnergydF()); - const STensor3 *djydGradTp = &(ipvp->getConstRefTodFluxEnergydGradT()); - const SVector3 *djydTp = &(ipvp->getConstRefTodFluxEnergydT()); - const STensor3 *djydGradVp = &(ipvp->getConstRefTodFluxEnergydGradV()); - const SVector3 *djydVp = &(ipvp->getConstRefTodFluxEnergydV()); - const SVector3 *fluxjyp = &(ipvp->getConstRefToFluxEnergy()); - - const STensor33 *djydFm = &(ipvm->getConstRefTodFluxEnergydF()); - const STensor3 *djydGradTm = &(ipvm->getConstRefTodFluxEnergydGradT()); - const SVector3 *djydTm = &(ipvm->getConstRefTodFluxEnergydT()); - const STensor3 *djydGradVm = &(ipvm->getConstRefTodFluxEnergydGradV()); - const SVector3 *djydVm = &(ipvm->getConstRefTodFluxEnergydV()); - const SVector3 *fluxjym = &(ipvm->getConstRefToFluxEnergy()); - - double eqRatio = _ElecTherMechEqRatio; - wJ*=eqRatio; - - // Assembly consistency (from derivative of sigma with extra field) - //dpdV +dpdT - for(int j=0;j<nbFFm;j++) - { - for(int k=0;k<3;k++) - { - for(int l=0;l<nbFFm;l++) - { - for(int q = 0; q< 3; q++) - { - stiff(j+k*nbFFm,l+3*nbFFm) -= dPdTm->operator()(k,q)*(Valsm[l+3*nbFFm]*Valsm[j+0*nbFFm]*wJ/2.*nu(q)/eqRatio); - - stiff(j+k*nbFFm,l+4*nbFFm) -= dPdVm->operator()(k,q)*(Valsm[l+4*nbFFm]*Valsm[j+0*nbFFm]*wJ/2.*nu(q)/eqRatio); - } - } - for(int l=0;l<nbFFp;l++) - { - for(int q = 0; q< 3; q++) - { - stiff(j+k*nbFFm,l+3*nbFFp+nbdofm) -= dPdTp->operator()(k,q)*(Valsp[l+3*nbFFp]*Valsm[j+0*nbFFm]*wJ/2.*nu(q)/eqRatio); - - stiff(j+k*nbFFm,l+4*nbFFp+nbdofm) -= dPdVp->operator()(k,q)*(Valsp[l+4*nbFFp]*Valsm[j+0*nbFFm]*wJ/2.*nu(q)/eqRatio); - } - } - } - } - for(int j=0;j<nbFFp;j++) - { - for(int k=0;k<3;k++) - { - for(int l=0;l<nbFFm;l++) - { - for(int q = 0; q< 3; q++) - { - stiff(j+k*nbFFp+nbdofm,l+3*nbFFm) += dPdTm->operator()(k,q)*(Valsm[l+3*nbFFm]*Valsp[j+0*nbFFp]*wJ/2.*nu(q)/eqRatio); - - stiff(j+k*nbFFp+nbdofm,l+4*nbFFm) += dPdVm->operator()(k,q)*(Valsm[l+4*nbFFm]*Valsp[j+0*nbFFp]*wJ/2.*nu(q)/eqRatio); - } - } - for(int l=0;l<nbFFp;l++) - { - for(int q = 0; q< 3; q++) - { - stiff(j+k*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += dPdTp->operator()(k,q)*(Valsp[l+3*nbFFp]*Valsp[j+0*nbFFp]*wJ/2.*nu(q)/eqRatio); - - stiff(j+k*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += dPdVp->operator()(k,q)*(Valsp[l+4*nbFFp]*Valsp[j+0*nbFFp]*wJ/2.*nu(q)/eqRatio); - } - } - } - } - - // Assembly consistency (from derivative of flux with deformation gradient) - for(int j=0;j<nbFFm;j++) - { - for(int k=0;k<3;k++) - { - for(int l=0;l<nbFFm;l++) - { - for(int q = 0; q< 3; q++) - { - for(int N = 0; N< 3; N++) - { - stiff(j+3*nbFFm,l+k*nbFFm) -= djydFm->operator()(N,k,q)*(Gradsm[l+0*nbFFm][q]*Valsm[j+3*nbFFm]*wJ/2.*nu(N)); - } - } - } - for(int l=0;l<nbFFp;l++) - { - for(int q = 0; q< 3; q++) - { - for(int N = 0; N< 3; N++) - { - stiff(j+3*nbFFm,l+k*nbFFp+nbdofm) -= djydFp->operator()(N,k,q)*(Gradsp[l+0*nbFFp][q]*Valsm[j+3*nbFFm]*wJ/2.*nu(N)); - } - } - } - } - } - for(int j=0;j<nbFFp;j++) - { - for(int k=0;k<3;k++) - { - for(int l=0;l<nbFFm;l++) - { - for(int q = 0; q< 3; q++) - { - for(int N = 0; N< 3; N++) - { - stiff(j+3*nbFFp+nbdofm,l+k*nbFFm) += djydFm->operator()(N,k,q)*(Gradsm[l+0*nbFFm][q]*Valsp[j+3*nbFFp]*wJ/2.*nu(N)); - } - } - } - for(int l=0;l<nbFFp;l++) - { - for(int q = 0; q< 3; q++) - { - for(int N = 0; N< 3; N++) - { - stiff(j+3*nbFFp+nbdofm,l+k*nbFFp+nbdofm) += djydFp->operator()(N,k,q)*(Gradsp[l+0*nbFFp][q]*Valsp[j+3*nbFFp]*wJ/2.*nu(N)); - } - } - } - } - } - //djedf (derivative if cross term) - for(int j=0;j<nbFFm;j++) - { - for(int k=0;k<3;k++) - { - for(int l=0;l<nbFFm;l++) - { - for(int q = 0; q< 3; q++) - { - for(int N = 0; N< 3; N++) - { - stiff(j+4*nbFFm,l+k*nbFFm) -= djedFm->operator()(N,k,q)*(Gradsm[l+0*nbFFm][q]*Valsm[j+4*nbFFm]*wJ/2.*nu(N)); - } - } - } - for(int l=0;l<nbFFp;l++) - { - for(int q = 0; q< 3; q++) - { - for(int N = 0; N< 3; N++) - { - stiff(j+4*nbFFm,l+k*nbFFp+nbdofm) -= djedFp->operator()(N,k,q)*(Gradsp[l+0*nbFFp][q]*Valsm[j+4*nbFFm]*wJ/2.*nu(N)); - } - } - } - } - } - for(int j=0;j<nbFFp;j++) - { - for(int k=0;k<3;k++) - { - for(int l=0;l<nbFFm;l++) - { - for(int q = 0; q< 3; q++) - { - for(int N = 0; N< 3; N++) - { - stiff(j+4*nbFFp+nbdofm,l+k*nbFFm) += djedFm->operator()(N,k,q)*(Gradsm[l+0*nbFFm][q]*Valsp[j+4*nbFFp]*wJ/2.*nu(N)); - } - } - } - for(int l=0;l<nbFFp;l++) - { - for(int q = 0; q< 3; q++) - { - for(int N = 0; N< 3; N++) - { - stiff(j+4*nbFFp+nbdofm,l+k*nbFFp+nbdofm) += djedFp->operator()(N,k,q)*(Gradsp[l+0*nbFFp][q]*Valsp[j+4*nbFFp]*wJ/2.*nu(N)); - } - } - } - } - } + static STensor3 NBhsNdjy1dFm; + static STensor3 NBhsNdjy1dFp; + static STensor3 NBhsNdL1dFm; + static STensor3 NBhsNdL1dFp; + static STensor3 NBhsNdL2dFm; + static STensor3 NBhsNdL2dFp; - // consistency D\mean{q} DT - // Assembly consistency - //dfI1tdt+dfI1tdv - for(int j=0;j<nbFFm;j++) - { - for(int l=0;l<nbFFm;l++) - { - for(int p = 0; p< 3; p++) - { - stiff(j+3*nbFFm,l+3*nbFFm) -= djydTm->operator()(p)*(Valsm[l+3*nbFFm]*Valsm[j+3*nbFFm]*wJ/2.*nu(p)); - stiff(j+3*nbFFm,l+4*nbFFm) -= djydVm->operator()(p)*(Valsm[l+4*nbFFm]*Valsm[j+3*nbFFm]*wJ/2.*nu(p)); - for(int q = 0; q< 3; q++) - { - stiff(j+3*nbFFm,l+3*nbFFm) -= djydGradTm->operator()(q,p)*(Gradsm[l+3*nbFFm][p]*Valsm[j+3*nbFFm]*wJ/2.*nu(q)); - stiff(j+3*nbFFm,l+4*nbFFm) -= djydGradVm->operator()(q,p)*(Gradsm[l+4*nbFFm][p]*Valsm[j+3*nbFFm]*wJ/2.*nu(q)); - } - } - } - for(int l=0;l<nbFFp;l++) - { - for(int p = 0; p< 3; p++) - { - stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) -= djydTp->operator()(p)*(Valsp[l+3*nbFFp]*Valsm[j+3*nbFFm]*wJ/2.*nu(p)); - stiff(j+3*nbFFm,l+4*nbFFp+nbdofm) -= djydVp->operator()(p)*(Valsp[l+4*nbFFp]*Valsm[j+3*nbFFm]*wJ/2.*nu(p)); - for(int q = 0; q< 3; q++) - { - stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) -= djydGradTp->operator()(q,p)*(Gradsp[l+3*nbFFp][p]*Valsm[j+3*nbFFm]*wJ/2.*nu(q)); - stiff(j+3*nbFFm,l+4*nbFFp+nbdofm) -= djydGradVp->operator()(q,p)*(Gradsp[l+4*nbFFp][p]*Valsm[j+3*nbFFm]*wJ/2.*nu(q)); - } - } - } - } - for(int j=0;j<nbFFp;j++) - { - for(int l=0;l<nbFFm;l++) - { - for(int p = 0; p< 3; p++) - { - stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) += djydTm->operator()(p)*(Valsm[l+3*nbFFm]*Valsp[j+3*nbFFp]*wJ/2.*nu(p)); - stiff(j+3*nbFFp+nbdofm,l+4*nbFFm) += djydVm->operator()(p)*(Valsm[l+4*nbFFm]*Valsp[j+3*nbFFp]*wJ/2.*nu(p)); - for(int q = 0; q< 3; q++) - { - stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) += djydGradTm->operator()(q,p)*(Gradsm[l+3*nbFFm][p]*Valsp[j+3*nbFFp]*wJ/2.*nu(q)); - stiff(j+3*nbFFp+nbdofm,l+4*nbFFm) += djydGradVm->operator()(q,p)*(Gradsm[l+4*nbFFm][p]*Valsp[j+3*nbFFp]*wJ/2.*nu(q)); - } - } - } - for(int l=0;l<nbFFp;l++) - { - for(int p = 0; p< 3; p++) - { - stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += djydTp->operator()(p)*(Valsp[l+3*nbFFp]*Valsp[j+3*nbFFp]*wJ/2.*nu(p)); - stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += djydVp->operator()(p)*(Valsp[l+4*nbFFp]*Valsp[j+3*nbFFp]*wJ/2.*nu(p)); - for(int q = 0; q< 3; q++) - { - stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += djydGradTp->operator()(q,p)*(Gradsp[l+3*nbFFp][p]*Valsp[j+3*nbFFp]*wJ/2.*nu(q)); - stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += djydGradVp->operator()(q,p)*(Gradsp[l+4*nbFFp][p]*Valsp[j+3*nbFFp]*wJ/2.*nu(q)); - } - } - } - } - - //dfI1vdv+dfI1vdt - for(int j=0;j<nbFFm;j++) - { - for(int l=0;l<nbFFm;l++) - { - for(int p = 0; p< 3; p++) - { - stiff(j+4*nbFFm,l+4*nbFFm) -= djedVm->operator()(p)*(Valsm[l+4*nbFFm]*Valsm[j+4*nbFFm]*wJ/2.*nu(p)); - stiff(j+4*nbFFm,l+3*nbFFm) -= djedTm->operator()(p)*(Valsm[l+3*nbFFm]*Valsm[j+4*nbFFm]*wJ/2.*nu(p)); - for(int q = 0; q< 3; q++) - { - stiff(j+4*nbFFm,l+4*nbFFm) -= djedGradVm->operator()(q,p)*(Gradsm[l+4*nbFFm][p]*Valsm[j+4*nbFFm]*wJ/2.*nu(q)); - stiff(j+4*nbFFm,l+3*nbFFm) -= djedGradTm->operator()(q,p)*(Gradsm[l+3*nbFFm][p]*Valsm[j+4*nbFFm]*wJ/2.*nu(q)); - } - } - } - for(int l=0;l<nbFFp;l++) - { - for(int p = 0; p< 3; p++) - { - stiff(j+4*nbFFm,l+4*nbFFp+nbdofm) -= djedVp->operator()(p)*(Valsp[l+4*nbFFp]*Valsm[j+4*nbFFm]*wJ/2.*nu(p)); - stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) -= djedTp->operator()(p)*(Valsp[l+3*nbFFp]*Valsm[j+4*nbFFm]*wJ/2.*nu(p)); - - for(int q = 0; q< 3; q++) - { - stiff(j+4*nbFFm,l+4*nbFFp+nbdofm) -= djedGradVp->operator()(q,p)*(Gradsp[l+4*nbFFp][p]*Valsm[j+4*nbFFm]*wJ/2.*nu(q)); - stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) -= djedGradTp->operator()(q,p)*(Gradsp[l+3*nbFFp][p]*Valsm[j+4*nbFFm]*wJ/2.*nu(q)); - } - } - } - } - for(int j=0;j<nbFFp;j++) - { - for(int l=0;l<nbFFm;l++) - { - for(int p = 0; p< 3; p++) - { - stiff(j+4*nbFFp+nbdofm,l+4*nbFFm) += djedVm->operator()(p)*(Valsm[l+4*nbFFm]*Valsp[j+4*nbFFp]*wJ/2.*nu(p)); - stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) += djedTm->operator()(p)*(Valsm[l+3*nbFFm]*Valsp[j+4*nbFFp]*wJ/2.*nu(p)); - - for(int q = 0; q< 3; q++) - { - stiff(j+4*nbFFp+nbdofm,l+4*nbFFm) += djedGradVm->operator()(q,p)*(Gradsm[l+4*nbFFm][p]*Valsp[j+4*nbFFp]*wJ/2.*nu(q)); - stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) += djedGradTm->operator()(q,p)*(Gradsm[l+3*nbFFm][p]*Valsp[j+4*nbFFp]*wJ/2.*nu(q)); - } - } - } - for(int l=0;l<nbFFp;l++) - { - for(int p = 0; p< 3; p++) - { - stiff(j+4*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += djedVp->operator()(p)*(Valsp[l+4*nbFFp]*Valsp[j+4*nbFFp]*wJ/2.*nu(p)); - stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += djedTp->operator()(p)*(Valsp[l+3*nbFFp]*Valsp[j+4*nbFFp]*wJ/2.*nu(p)); - for(int q = 0; q< 3; q++) - { - stiff(j+4*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += djedGradVp->operator()(q,p)*(Gradsp[l+4*nbFFp][p]*Valsp[j+4*nbFFp]*wJ/2.*nu(q)); - stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += djedGradTp->operator()(q,p)*(Gradsp[l+3*nbFFp][p]*Valsp[j+4*nbFFp]*wJ/2.*nu(q)); - } - } - } - } + for(int j = 0; j<3; j++){ + for(int p = 0; p<3; p++) + { + NBhsNdjy1dFm(j,p) = 0.; + NBhsNdjy1dFp(j,p)= 0.; + NBhsNdL1dFm(j,p)= 0.; + NBhsNdL1dFp(j,p)= 0.; + NBhsNdL2dFm(j,p)= 0.; + NBhsNdL2dFp(j,p)= 0.; + + for(int l = 0; l <3; l++) + { + for(int n = 0; n <3; n++) + { + NBhsNdjy1dFm(j,p)+=djy1dFm->operator()(l,n,j,p)*nu(n)*nbetahs*nu(l)/2.; + NBhsNdjy1dFp(j,p)+=djy1dFp->operator()(l,n,j,p)*nu(n)*nbetahs*nu(l)/2.; + NBhsNdL1dFm(j,p)+= dl10dFm->operator()(l,n,j,p)*nu(n)*nbetahs*nu(l)/2.; + NBhsNdL1dFp(j,p)+= dl10dFp->operator()(l,n,j,p)*nu(n)*nbetahs*nu(l)/2.; + NBhsNdL2dFm(j,p)+= dl20dFm->operator()(l,n,j,p)*nu(n)*nbetahs*nu(l)/2.; + NBhsNdL2dFp(j,p)+= dl20dFp->operator()(l,n,j,p)*nu(n)*nbetahs*nu(l)/2.; + } + } + } + } - // Stability N \mean{k0} (N) - double NBhsNdjy1dTm=0.;double NBhsNdjy1dTp=0.; double NBhsNdjy1dvm=0.; double NBhsNdjy1dvp=0.; - double NBhsNdL1dTm=0.;double NBhsNdL1dTp=0.; double NBhsNdL2dTm=0.;double NBhsNdL2dTp=0.;double NBhsNdL2dVm=0.; double NBhsNdL2dVp=0.; - STensor3 NBhsNdjy1dFm(0.);STensor3 NBhsNdjy1dFp(0.);STensor3 NBhsNdL1dFm(0.);STensor3 NBhsNdL1dFp(0.);STensor3 NBhsNdL2dFm(0.);STensor3 NBhsNdL2dFp(0.); - - for(int l = 0; l <3; l++) - { - for(int n = 0; n <3; n++) - { - NBhsNdjy1dTm+=djy1dTm->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; - NBhsNdjy1dTp+=djy1dTp->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; - - NBhsNdL1dTm+=dl10dTm->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; - NBhsNdL1dTp+=dl10dTp->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; - NBhsNdL2dTm+=dl20dTm->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; - NBhsNdL2dTp+=dl20dTp->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; - - NBhsNdjy1dvm+=djy1dVm->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; - NBhsNdjy1dvp+=djy1dVp->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; - - NBhsNdL2dVm+=dl20dvm->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; - NBhsNdL2dVp+=dl20dvp->operator()(l,n)*nu(n)*nbetahs*nu(l)/2.; - } - } - - for(int j = 0; j<3; j++) - { - for(int p = 0; p<3; p++) - { - for(int l = 0; l <3; l++) - { - for(int n = 0; n <3; n++) - { - NBhsNdjy1dFm(j,p)+=djy1dFm->operator()(l,n,j,p)*nu(n)*nbetahs*nu(l)/2.; - NBhsNdjy1dFp(j,p)+=djy1dFp->operator()(l,n,j,p)*nu(n)*nbetahs*nu(l)/2.; - NBhsNdL1dFm(j,p)+= dl10dFm->operator()(l,n,j,p)*nu(n)*nbetahs*nu(l)/2.; - NBhsNdL1dFp(j,p)+= dl10dFp->operator()(l,n,j,p)*nu(n)*nbetahs*nu(l)/2.; - NBhsNdL2dFm(j,p)+= dl20dFm->operator()(l,n,j,p)*nu(n)*nbetahs*nu(l)/2.; - NBhsNdL2dFp(j,p)+= dl20dFp->operator()(l,n,j,p)*nu(n)*nbetahs*nu(l)/2.; - } - } - } - } - - // dfIt3tdt - double NMeanjy1NBetasc=0.; - double NMeanl1NBetasc=0.; double NMeanl2NBetasc=0.; - for(int l = 0; l <3; l++) - { - for(int n = 0; n <3; n++) + // dfIt3tdt + double NMeanjy1NBetasc=0.; + double NMeanl1NBetasc=0.; double NMeanl2NBetasc=0.; + for(int l = 0; l <3; l++) { - NMeanjy1NBetasc += (jy1p->operator()(l,n)+jy1m->operator()(l,n))*nu(n)*nbetahs*nu(l)/2.; - NMeanl1NBetasc += (l10p->operator()(l,n)+l10m->operator()(l,n))*nu(n)*nbetahs*nu(l)/2.; - NMeanl2NBetasc += (l20p->operator()(l,n)+l20m->operator()(l,n))*nu(n)*nbetahs*nu(l)/2.; + for(int n = 0; n <3; n++) + { + NMeanjy1NBetasc += (jy1p->operator()(l,n)+jy1m->operator()(l,n))*nu(n)*nbetahs*nu(l)/2.; + NMeanl1NBetasc += (l10p->operator()(l,n)+l10m->operator()(l,n))*nu(n)*nbetahs*nu(l)/2.; + NMeanl2NBetasc += (l20p->operator()(l,n)+l20m->operator()(l,n))*nu(n)*nbetahs*nu(l)/2.; + } } - } - for(int j=0;j<nbFFm;j++) - { - for(int l=0;l<nbFFm;l++) + for(int j=0;j<nbFFm;j++) { - stiff(j+3*nbFFm,l+3*nbFFm) -= dftJumpdTm*NMeanjy1NBetasc*Valsm[j+3*nbFFm]*Valsm[l+3*nbFFm]*wJ; - stiff(j+3*nbFFm,l+3*nbFFm) -= dfvJumpdTm*NMeanl2NBetasc*Valsm[j+3*nbFFm]*Valsm[l+3*nbFFm]*wJ; + for(int l=0;l<nbFFm;l++) + { + stiff(j+3*nbFFm,l+3*nbFFm) -= dftJumpdTm*NMeanjy1NBetasc*Valsm[j+3*nbFFm]*Valsm[l+3*nbFFm]*wJ; + stiff(j+3*nbFFm,l+3*nbFFm) -= dfvJumpdTm*NMeanl2NBetasc*Valsm[j+3*nbFFm]*Valsm[l+3*nbFFm]*wJ; - stiff(j+3*nbFFm,l+3*nbFFm) -= ftJump*NBhsNdjy1dTm*Valsm[l+3*nbFFm]*Valsm[j+3*nbFFm]*wJ; - stiff(j+3*nbFFm,l+3*nbFFm) -= fvJump*NBhsNdL2dTm*Valsm[l+3*nbFFm]*Valsm[j+3*nbFFm]*wJ; - } - for(int l=0;l<nbFFp;l++) - { - stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) -= dftJumpdTp*NMeanjy1NBetasc*Valsm[j+3*nbFFm]*Valsp[l+3*nbFFp]*wJ; - stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) -= dfvJumpdTp*NMeanl2NBetasc*Valsm[j+3*nbFFm]*Valsp[l+3*nbFFp]*wJ; + stiff(j+3*nbFFm,l+3*nbFFm) -= ftJump*NBhsNdjy1dTm*Valsm[l+3*nbFFm]*Valsm[j+3*nbFFm]*wJ; + stiff(j+3*nbFFm,l+3*nbFFm) -= fvJump*NBhsNdL2dTm*Valsm[l+3*nbFFm]*Valsm[j+3*nbFFm]*wJ; + } + for(int l=0;l<nbFFp;l++) + { + stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) -= dftJumpdTp*NMeanjy1NBetasc*Valsm[j+3*nbFFm]*Valsp[l+3*nbFFp]*wJ; + stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) -= dfvJumpdTp*NMeanl2NBetasc*Valsm[j+3*nbFFm]*Valsp[l+3*nbFFp]*wJ; - stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) -= ftJump*NBhsNdjy1dTp*Valsm[l+3*nbFFm]*Valsp[j+3*nbFFp]*wJ; - stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) -= fvJump*NBhsNdL2dTp*Valsm[l+3*nbFFm]*Valsp[j+3*nbFFp]*wJ; + stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) -= ftJump*NBhsNdjy1dTp*Valsm[l+3*nbFFm]*Valsp[j+3*nbFFp]*wJ; + stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) -= fvJump*NBhsNdL2dTp*Valsm[l+3*nbFFm]*Valsp[j+3*nbFFp]*wJ; + } } - } - for(int j=0;j<nbFFp;j++) - { - for(int l=0;l<nbFFm;l++) + for(int j=0;j<nbFFp;j++) { - stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) += dftJumpdTm*NMeanjy1NBetasc*Valsp[j+3*nbFFp]*Valsm[l+3*nbFFm]*wJ; - stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) += dfvJumpdTm*NMeanl2NBetasc*Valsp[j+3*nbFFp]*Valsm[l+3*nbFFm]*wJ; + for(int l=0;l<nbFFm;l++) + { + stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) += dftJumpdTm*NMeanjy1NBetasc*Valsp[j+3*nbFFp]*Valsm[l+3*nbFFm]*wJ; + stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) += dfvJumpdTm*NMeanl2NBetasc*Valsp[j+3*nbFFp]*Valsm[l+3*nbFFm]*wJ; - stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) += ftJump*NBhsNdjy1dTm*Valsp[l+3*nbFFp]*Valsm[j+3*nbFFm]*wJ; - stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) += fvJump*NBhsNdL2dTm*Valsp[l+3*nbFFp]*Valsm[j+3*nbFFm]*wJ; - } - for(int l=0;l<nbFFp;l++) - { - stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += dftJumpdTp*NMeanjy1NBetasc*Valsp[j+3*nbFFp]*Valsp[l+3*nbFFp]*wJ; - stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += dfvJumpdTp*NMeanl2NBetasc*Valsp[j+3*nbFFp]*Valsp[l+3*nbFFp]*wJ; + stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) += ftJump*NBhsNdjy1dTm*Valsp[l+3*nbFFp]*Valsm[j+3*nbFFm]*wJ; + stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) += fvJump*NBhsNdL2dTm*Valsp[l+3*nbFFp]*Valsm[j+3*nbFFm]*wJ; + } + for(int l=0;l<nbFFp;l++) + { + stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += dftJumpdTp*NMeanjy1NBetasc*Valsp[j+3*nbFFp]*Valsp[l+3*nbFFp]*wJ; + stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += dfvJumpdTp*NMeanl2NBetasc*Valsp[j+3*nbFFp]*Valsp[l+3*nbFFp]*wJ; - stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += ftJump*NBhsNdjy1dTp*Valsp[l+3*nbFFp]*Valsp[j+3*nbFFp]*wJ; - stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += fvJump*NBhsNdL2dTp*Valsp[l+3*nbFFp]*Valsp[j+3*nbFFp]*wJ; + stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += ftJump*NBhsNdjy1dTp*Valsp[l+3*nbFFp]*Valsp[j+3*nbFFp]*wJ; + stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += fvJump*NBhsNdL2dTp*Valsp[l+3*nbFFp]*Valsp[j+3*nbFFp]*wJ; + } } - } - //Terms for dfTI3dv - for(int j=0;j<nbFFm;j++) - { - for(int l=0;l<nbFFm;l++) + //Terms for dfTI3dv + for(int j=0;j<nbFFm;j++) { - stiff(j+3*nbFFm,l+4*nbFFm) -= ftJump*NBhsNdjy1dvm*Valsm[j+3*nbFFm]*Valsm[l+4*nbFFm]*wJ; - stiff(j+3*nbFFm,l+4*nbFFm) -= fvJump*NBhsNdL2dVm*Valsm[j+3*nbFFm]*Valsm[l+4*nbFFm]*wJ; + for(int l=0;l<nbFFm;l++) + { + stiff(j+3*nbFFm,l+4*nbFFm) -= ftJump*NBhsNdjy1dvm*Valsm[j+3*nbFFm]*Valsm[l+4*nbFFm]*wJ; + stiff(j+3*nbFFm,l+4*nbFFm) -= fvJump*NBhsNdL2dVm*Valsm[j+3*nbFFm]*Valsm[l+4*nbFFm]*wJ; - stiff(j+3*nbFFm,l+4*nbFFm) -= dfvJumpdvm*NMeanl2NBetasc*Valsm[j+3*nbFFm]*Valsm[l+4*nbFFm]*wJ; - } - for(int l=0;l<nbFFp;l++) - { - stiff(j+3*nbFFm,l+4*nbFFp+nbdofm) -= ftJump*NBhsNdjy1dvp*Valsm[j+3*nbFFm]*Valsp[l+4*nbFFp]*wJ; - stiff(j+3*nbFFm,l+4*nbFFp+nbdofm) -= fvJump*NBhsNdL2dVp*Valsm[j+3*nbFFm]*Valsp[l+4*nbFFp]*wJ; + stiff(j+3*nbFFm,l+4*nbFFm) -= dfvJumpdvm*NMeanl2NBetasc*Valsm[j+3*nbFFm]*Valsm[l+4*nbFFm]*wJ; + } + for(int l=0;l<nbFFp;l++) + { + stiff(j+3*nbFFm,l+4*nbFFp+nbdofm) -= ftJump*NBhsNdjy1dvp*Valsm[j+3*nbFFm]*Valsp[l+4*nbFFp]*wJ; + stiff(j+3*nbFFm,l+4*nbFFp+nbdofm) -= fvJump*NBhsNdL2dVp*Valsm[j+3*nbFFm]*Valsp[l+4*nbFFp]*wJ; - stiff(j+3*nbFFm,l+4*nbFFp+nbdofm) -= dfvJumpdvp*NMeanl2NBetasc*Valsm[j+3*nbFFm]*Valsp[l+4*nbFFp]*wJ; + stiff(j+3*nbFFm,l+4*nbFFp+nbdofm) -= dfvJumpdvp*NMeanl2NBetasc*Valsm[j+3*nbFFm]*Valsp[l+4*nbFFp]*wJ; + } } - } - for(int j=0;j<nbFFp;j++) - { - for(int l=0;l<nbFFm;l++) + for(int j=0;j<nbFFp;j++) { - stiff(j+3*nbFFp+nbdofm,l+4*nbFFm) += ftJump*NBhsNdjy1dvm*Valsp[j+3*nbFFp]*Valsm[l+4*nbFFm]*wJ; - stiff(j+3*nbFFp+nbdofm,l+4*nbFFm) += fvJump*NBhsNdL2dVm*Valsp[j+3*nbFFp]*Valsm[l+4*nbFFm]*wJ; + for(int l=0;l<nbFFm;l++) + { + stiff(j+3*nbFFp+nbdofm,l+4*nbFFm) += ftJump*NBhsNdjy1dvm*Valsp[j+3*nbFFp]*Valsm[l+4*nbFFm]*wJ; + stiff(j+3*nbFFp+nbdofm,l+4*nbFFm) += fvJump*NBhsNdL2dVm*Valsp[j+3*nbFFp]*Valsm[l+4*nbFFm]*wJ; - stiff(j+3*nbFFp+nbdofm,l+4*nbFFm) += dfvJumpdvm*NMeanl2NBetasc*Valsp[j+3*nbFFp]*Valsm[l+4*nbFFm]*wJ; - } - for(int l=0;l<nbFFp;l++) - { - stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += ftJump*NBhsNdjy1dvp*Valsp[j+3*nbFFp]*Valsp[l+4*nbFFp]*wJ; - stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += fvJump*NBhsNdL2dVp*Valsp[j+3*nbFFp]*Valsp[l+4*nbFFp]*wJ; + stiff(j+3*nbFFp+nbdofm,l+4*nbFFm) += dfvJumpdvm*NMeanl2NBetasc*Valsp[j+3*nbFFp]*Valsm[l+4*nbFFm]*wJ; + } + for(int l=0;l<nbFFp;l++) + { + stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += ftJump*NBhsNdjy1dvp*Valsp[j+3*nbFFp]*Valsp[l+4*nbFFp]*wJ; + stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += fvJump*NBhsNdL2dVp*Valsp[j+3*nbFFp]*Valsp[l+4*nbFFp]*wJ; - stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) +=dfvJumpdvp*NMeanl2NBetasc*Valsp[j+3*nbFFp]*Valsp[l+4*nbFFp]*wJ; + stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) +=dfvJumpdvp*NMeanl2NBetasc*Valsp[j+3*nbFFp]*Valsp[l+4*nbFFp]*wJ; + } } - } - //dfI3vdv - for(int j=0;j<nbFFm;j++) - { - for(int l=0;l<nbFFm;l++) + //dfI3vdv + for(int j=0;j<nbFFm;j++) { + for(int l=0;l<nbFFm;l++) + { - stiff(j+4*nbFFm,l+4*nbFFm) -= ftJump*NBhsNdL2dVm*Valsm[j+4*nbFFm]*Valsm[l+4*nbFFm]*wJ; + stiff(j+4*nbFFm,l+4*nbFFm) -= ftJump*NBhsNdL2dVm*Valsm[j+4*nbFFm]*Valsm[l+4*nbFFm]*wJ; - stiff(j+4*nbFFm,l+4*nbFFm) -= dfvJumpdvm*NMeanl1NBetasc*Valsm[j+4*nbFFm]*Valsm[l+4*nbFFm]*wJ; - } - for(int l=0;l<nbFFp;l++) - { + stiff(j+4*nbFFm,l+4*nbFFm) -= dfvJumpdvm*NMeanl1NBetasc*Valsm[j+4*nbFFm]*Valsm[l+4*nbFFm]*wJ; + } + for(int l=0;l<nbFFp;l++) + { - stiff(j+4*nbFFm,l+4*nbFFp+nbdofm) -= ftJump*NBhsNdL2dVp*Valsm[j+4*nbFFm]*Valsp[l+4*nbFFp]*wJ; + stiff(j+4*nbFFm,l+4*nbFFp+nbdofm) -= ftJump*NBhsNdL2dVp*Valsm[j+4*nbFFm]*Valsp[l+4*nbFFp]*wJ; - stiff(j+4*nbFFm,l+4*nbFFp+nbdofm) -= dfvJumpdvp*NMeanl1NBetasc*Valsm[j+4*nbFFm]*Valsp[l+4*nbFFp]*wJ; + stiff(j+4*nbFFm,l+4*nbFFp+nbdofm) -= dfvJumpdvp*NMeanl1NBetasc*Valsm[j+4*nbFFm]*Valsp[l+4*nbFFp]*wJ; + } } - } - for(int j=0;j<nbFFp;j++) - { - for(int l=0;l<nbFFm;l++) + for(int j=0;j<nbFFp;j++) { - stiff(j+4*nbFFp+nbdofm,l+4*nbFFm) += ftJump*NBhsNdL2dVm*Valsp[j+4*nbFFp]*Valsm[l+4*nbFFm]*wJ; + for(int l=0;l<nbFFm;l++) + { + stiff(j+4*nbFFp+nbdofm,l+4*nbFFm) += ftJump*NBhsNdL2dVm*Valsp[j+4*nbFFp]*Valsm[l+4*nbFFm]*wJ; - stiff(j+4*nbFFp+nbdofm,l+4*nbFFm) += dfvJumpdvm*NMeanl1NBetasc*Valsp[j+4*nbFFp]*Valsm[l+4*nbFFm]*wJ; + stiff(j+4*nbFFp+nbdofm,l+4*nbFFm) += dfvJumpdvm*NMeanl1NBetasc*Valsp[j+4*nbFFp]*Valsm[l+4*nbFFm]*wJ; - } - for(int l=0;l<nbFFp;l++) - { - stiff(j+4*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += ftJump*NBhsNdL2dVp*Valsp[j+4*nbFFp]*Valsp[l+4*nbFFp]*wJ; + } + for(int l=0;l<nbFFp;l++) + { + stiff(j+4*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += ftJump*NBhsNdL2dVp*Valsp[j+4*nbFFp]*Valsp[l+4*nbFFp]*wJ; - stiff(j+4*nbFFp+nbdofm,l+4*nbFFp+nbdofm) +=dfvJumpdvp*NMeanl1NBetasc*Valsp[j+4*nbFFp]*Valsp[l+4*nbFFp]*wJ; + stiff(j+4*nbFFp+nbdofm,l+4*nbFFp+nbdofm) +=dfvJumpdvp*NMeanl1NBetasc*Valsp[j+4*nbFFp]*Valsp[l+4*nbFFp]*wJ; + } } - } - //Terms for dfvI3dT - for(int j=0;j<nbFFm;j++) - { - for(int l=0;l<nbFFm;l++) + //Terms for dfvI3dT + for(int j=0;j<nbFFm;j++) { - stiff(j+4*nbFFm,l+3*nbFFm) -= fvJump*NBhsNdL1dTm*Valsm[j+4*nbFFm]*Valsm[l+3*nbFFm]*wJ; - stiff(j+4*nbFFm,l+3*nbFFm) -= ftJump*NBhsNdL2dTm*Valsm[j+4*nbFFm]*Valsm[l+3*nbFFm]*wJ; + for(int l=0;l<nbFFm;l++) + { + stiff(j+4*nbFFm,l+3*nbFFm) -= fvJump*NBhsNdL1dTm*Valsm[j+4*nbFFm]*Valsm[l+3*nbFFm]*wJ; + stiff(j+4*nbFFm,l+3*nbFFm) -= ftJump*NBhsNdL2dTm*Valsm[j+4*nbFFm]*Valsm[l+3*nbFFm]*wJ; - stiff(j+4*nbFFm,l+3*nbFFm) -= dfvJumpdTm*NMeanl1NBetasc*Valsm[j+4*nbFFm]*Valsm[l+3*nbFFm]*wJ; - stiff(j+4*nbFFm,l+3*nbFFm) -= dftJumpdTm*NMeanl2NBetasc*Valsm[j+4*nbFFm]*Valsm[l+3*nbFFm]*wJ; - } - for(int l=0;l<nbFFp;l++) - { - stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) -= fvJump*NBhsNdL1dTp*Valsm[j+4*nbFFm]*Valsp[l+3*nbFFp]*wJ; - stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) -= ftJump*NBhsNdL2dTp*Valsm[j+4*nbFFm]*Valsp[l+3*nbFFp]*wJ; + stiff(j+4*nbFFm,l+3*nbFFm) -= dfvJumpdTm*NMeanl1NBetasc*Valsm[j+4*nbFFm]*Valsm[l+3*nbFFm]*wJ; + stiff(j+4*nbFFm,l+3*nbFFm) -= dftJumpdTm*NMeanl2NBetasc*Valsm[j+4*nbFFm]*Valsm[l+3*nbFFm]*wJ; + } + for(int l=0;l<nbFFp;l++) + { + stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) -= fvJump*NBhsNdL1dTp*Valsm[j+4*nbFFm]*Valsp[l+3*nbFFp]*wJ; + stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) -= ftJump*NBhsNdL2dTp*Valsm[j+4*nbFFm]*Valsp[l+3*nbFFp]*wJ; - stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) -= dfvJumpdTp*NMeanl1NBetasc*Valsm[j+4*nbFFm]*Valsp[l+3*nbFFp]*wJ; - stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) -= dftJumpdTp*NMeanl2NBetasc*Valsm[j+4*nbFFm]*Valsp[l+3*nbFFp]*wJ; + stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) -= dfvJumpdTp*NMeanl1NBetasc*Valsm[j+4*nbFFm]*Valsp[l+3*nbFFp]*wJ; + stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) -= dftJumpdTp*NMeanl2NBetasc*Valsm[j+4*nbFFm]*Valsp[l+3*nbFFp]*wJ; + } } - } - for(int j=0;j<nbFFp;j++) - { - for(int l=0;l<nbFFm;l++) + for(int j=0;j<nbFFp;j++) { - stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) += fvJump*NBhsNdL1dTm*Valsp[j+4*nbFFp]*Valsm[l+3*nbFFm]*wJ; - stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) += ftJump*NBhsNdL2dTm*Valsp[j+4*nbFFp]*Valsm[l+3*nbFFm]*wJ; + for(int l=0;l<nbFFm;l++) + { + stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) += fvJump*NBhsNdL1dTm*Valsp[j+4*nbFFp]*Valsm[l+3*nbFFm]*wJ; + stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) += ftJump*NBhsNdL2dTm*Valsp[j+4*nbFFp]*Valsm[l+3*nbFFm]*wJ; - stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) += dfvJumpdTm*NMeanl1NBetasc*Valsp[j+4*nbFFp]*Valsm[l+3*nbFFm]*wJ; - stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) += dftJumpdTm*NMeanl2NBetasc*Valsp[j+4*nbFFp]*Valsm[l+3*nbFFm]*wJ; - } - for(int l=0;l<nbFFp;l++) - { - stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += fvJump*NBhsNdL1dTp*Valsp[j+4*nbFFp]*Valsp[l+3*nbFFp]*wJ; - stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += ftJump*NBhsNdL2dTp*Valsp[j+4*nbFFp]*Valsp[l+3*nbFFp]*wJ; + stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) += dfvJumpdTm*NMeanl1NBetasc*Valsp[j+4*nbFFp]*Valsm[l+3*nbFFm]*wJ; + stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) += dftJumpdTm*NMeanl2NBetasc*Valsp[j+4*nbFFp]*Valsm[l+3*nbFFm]*wJ; + } + for(int l=0;l<nbFFp;l++) + { + stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += fvJump*NBhsNdL1dTp*Valsp[j+4*nbFFp]*Valsp[l+3*nbFFp]*wJ; + stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += ftJump*NBhsNdL2dTp*Valsp[j+4*nbFFp]*Valsp[l+3*nbFFp]*wJ; - stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) +=dfvJumpdTp*NMeanl1NBetasc*Valsp[j+4*nbFFp]*Valsp[l+3*nbFFp]*wJ; - stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += dftJumpdTp*NMeanl2NBetasc*Valsp[j+4*nbFFp]*Valsp[l+3*nbFFp]*wJ; + stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) +=dfvJumpdTp*NMeanl1NBetasc*Valsp[j+4*nbFFp]*Valsp[l+3*nbFFp]*wJ; + stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += dftJumpdTp*NMeanl2NBetasc*Valsp[j+4*nbFFp]*Valsp[l+3*nbFFp]*wJ; + } } - } - //F - //new terms for dfvI3dF +dfTI3dF - for(int j=0;j<nbFFm;j++) - { - for(int k=0;k<3;k++) - { - for(int l=0;l<nbFFm;l++) + //F + //new terms for dfvI3dF +dfTI3dF + for(int j=0;j<nbFFm;j++) { - for(int p=0;p<3;p++) - { - stiff(j+4*nbFFm,l+k*nbFFm) -= fvJump*NBhsNdL1dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsm[j+4*nbFFm]*wJ; - stiff(j+4*nbFFm,l+k*nbFFm) -= ftJump*NBhsNdL2dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsm[j+4*nbFFm]*wJ; + for(int k=0;k<3;k++) + { + for(int l=0;l<nbFFm;l++) + { + for(int p=0;p<3;p++) + { + stiff(j+4*nbFFm,l+k*nbFFm) -= fvJump*NBhsNdL1dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsm[j+4*nbFFm]*wJ; + stiff(j+4*nbFFm,l+k*nbFFm) -= ftJump*NBhsNdL2dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsm[j+4*nbFFm]*wJ; - stiff(j+3*nbFFm,l+k*nbFFm) -= ftJump*NBhsNdjy1dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsm[j+3*nbFFm]*wJ; - stiff(j+3*nbFFm,l+k*nbFFm) -= fvJump*NBhsNdL2dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsm[j+3*nbFFm]*wJ; - } - } + stiff(j+3*nbFFm,l+k*nbFFm) -= ftJump*NBhsNdjy1dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsm[j+3*nbFFm]*wJ; + stiff(j+3*nbFFm,l+k*nbFFm) -= fvJump*NBhsNdL2dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsm[j+3*nbFFm]*wJ; + } + } - for(int l=0;l<nbFFp;l++) - { - for(int p=0;p<3;p++) - { - stiff(j+4*nbFFm,l+k*nbFFp+nbdofm) -= fvJump*NBhsNdL1dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsm[j+4*nbFFm]*wJ; - stiff(j+4*nbFFm,l+k*nbFFp+nbdofm) -= ftJump*NBhsNdL2dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsm[j+4*nbFFm]*wJ; + for(int l=0;l<nbFFp;l++) + { + for(int p= 0;p<3;p++) + { + stiff(j+4*nbFFm,l+k*nbFFp+nbdofm) -= fvJump*NBhsNdL1dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsm[j+4*nbFFm]*wJ; + stiff(j+4*nbFFm,l+k*nbFFp+nbdofm) -= ftJump*NBhsNdL2dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsm[j+4*nbFFm]*wJ; - stiff(j+3*nbFFm,l+k*nbFFp+nbdofm) -= ftJump*NBhsNdjy1dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsm[j+3*nbFFm]*wJ; - stiff(j+3*nbFFm,l+k*nbFFp+nbdofm) -= fvJump*NBhsNdL2dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsm[j+3*nbFFm]*wJ; - } - } - } - } + stiff(j+3*nbFFm,l+k*nbFFp+nbdofm) -= ftJump*NBhsNdjy1dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsm[j+3*nbFFm]*wJ; + stiff(j+3*nbFFm,l+k*nbFFp+nbdofm) -= fvJump*NBhsNdL2dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsm[j+3*nbFFm]*wJ; + } + } + } + } - for(int j=0;j<nbFFp;j++) - { - for(int k=0;k<3;k++) - { - for(int l=0;l<nbFFm;l++) + for(int j=0;j<nbFFp;j++) { - for(int p=0;p<3;p++) - { - stiff(j+4*nbFFp+nbdofm,l+k*nbFFm) += fvJump*NBhsNdL1dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsp[j+4*nbFFp]*wJ; - stiff(j+4*nbFFp+nbdofm,l+k*nbFFm) += ftJump*NBhsNdL2dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsp[j+4*nbFFp]*wJ; + for(int k=0;k<3;k++) + { + for(int l=0;l<nbFFm;l++) + { + for(int p=0;p<3;p++) + { + stiff(j+4*nbFFp+nbdofm,l+k*nbFFm) += fvJump*NBhsNdL1dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsp[j+4*nbFFp]*wJ; + stiff(j+4*nbFFp+nbdofm,l+k*nbFFm) += ftJump*NBhsNdL2dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsp[j+4*nbFFp]*wJ; - stiff(j+3*nbFFp+nbdofm,l+k*nbFFm) += ftJump*NBhsNdjy1dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsp[j+3*nbFFp]*wJ; - stiff(j+3*nbFFp+nbdofm,l+k*nbFFm) += fvJump*NBhsNdL2dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsp[j+3*nbFFp]*wJ; - } - } + stiff(j+3*nbFFp+nbdofm,l+k*nbFFm) += ftJump*NBhsNdjy1dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsp[j+3*nbFFp]*wJ; + stiff(j+3*nbFFp+nbdofm,l+k*nbFFm) += fvJump*NBhsNdL2dFm(k,p)*Gradsm[l+0*nbFFm][p]*Valsp[j+3*nbFFp]*wJ; + } + } - for(int l=0;l<nbFFp;l++) - { - for(int p=0;p<3;p++) - { - stiff(j+4*nbFFp+nbdofm,l+k*nbFFp+nbdofm) +=fvJump*NBhsNdL1dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsp[j+4*nbFFp]*wJ; - stiff(j+4*nbFFp+nbdofm,l+k*nbFFp+nbdofm) +=ftJump*NBhsNdL2dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsp[j+4*nbFFp]*wJ; + for(int l=0;l<nbFFp;l++) + { + for(int p=0;p<3;p++) + { + stiff(j+4*nbFFp+nbdofm,l+k*nbFFp+nbdofm) +=fvJump*NBhsNdL1dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsp[j+4*nbFFp]*wJ; + stiff(j+4*nbFFp+nbdofm,l+k*nbFFp+nbdofm) +=ftJump*NBhsNdL2dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsp[j+4*nbFFp]*wJ; - stiff(j+3*nbFFp+nbdofm,l+k*nbFFp+nbdofm) +=ftJump*NBhsNdjy1dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsp[j+3*nbFFp]*wJ; - stiff(j+3*nbFFp+nbdofm,l+k*nbFFp+nbdofm) +=fvJump*NBhsNdL2dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsp[j+3*nbFFp]*wJ; - } - } - } - } + stiff(j+3*nbFFp+nbdofm,l+k*nbFFp+nbdofm) +=ftJump*NBhsNdjy1dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsp[j+3*nbFFp]*wJ; + stiff(j+3*nbFFp+nbdofm,l+k*nbFFp+nbdofm) +=fvJump*NBhsNdL2dFp(k,p)*Gradsp[l+0*nbFFp][p]*Valsp[j+3*nbFFp]*wJ; + } + } + } + } - //dfI2tdt ( compatibility) - // Assembly (loop on shape function) - for(int j=0;j<nbFFm;j++) - { - for(int l=0;l<nbFFm;l++) + //dfI2tdt ( compatibility) + // Assembly (loop on shape function) + for(int j=0;j<nbFFm;j++) { - for(int p =0; p < 3; p++) + for(int l=0;l<nbFFm;l++) { - for(int q =0; q < 3; q++) + for(int p =0; p < 3; p++) { - stiff(j+3*nbFFm,l+3*nbFFm) += (jy1m->operator()(p,q)*Gradsm[j+3*nbFFm][q])*nu(p)*Valsm[l+3*nbFFm]*dftJumpdTm*wJ/2.; - stiff(j+3*nbFFm,l+3*nbFFm) += (l20m->operator()(p,q)*Gradsm[j+3*nbFFm][q])*nu(p)*Valsm[l+3*nbFFm]*dfvJumpdTm*wJ/2.; + for(int q =0; q < 3; q++) + { + stiff(j+3*nbFFm,l+3*nbFFm) += (jy1m->operator()(p,q)*Gradsm[j+3*nbFFm][q])*nu(p)*Valsm[l+3*nbFFm]*dftJumpdTm*wJ/2.; + stiff(j+3*nbFFm,l+3*nbFFm) += (l20m->operator()(p,q)*Gradsm[j+3*nbFFm][q])*nu(p)*Valsm[l+3*nbFFm]*dfvJumpdTm*wJ/2.; - stiff(j+3*nbFFm,l+3*nbFFm) += ftJump*(djy1dTm->operator()(p,q)*Gradsm[j+3*nbFFm][q])*nu(p)*Valsm[l+3*nbFFm]*wJ/2.; - stiff(j+3*nbFFm,l+3*nbFFm) += fvJump*(dl20dTm->operator()(p,q)*Gradsm[j+3*nbFFm][q])*(nu(p)*Valsm[l+3*nbFFm])*wJ/2.; + stiff(j+3*nbFFm,l+3*nbFFm) += ftJump*(djy1dTm->operator()(p,q)*Gradsm[j+3*nbFFm][q])*nu(p)*Valsm[l+3*nbFFm]*wJ/2.; + stiff(j+3*nbFFm,l+3*nbFFm) += fvJump*(dl20dTm->operator()(p,q)*Gradsm[j+3*nbFFm][q])*(nu(p)*Valsm[l+3*nbFFm])*wJ/2.; + } } } - } - for(int l=0;l<nbFFp;l++) - { - for(int p =0; p < 3; p++) + for(int l=0;l<nbFFp;l++) { - for(int q =0; q < 3; q++) + for(int p =0; p < 3; p++) { - stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) += (jy1m->operator()(p,q)*Gradsm[j+3*nbFFm][q])*nu(p)*Valsp[l+3*nbFFp]*dftJumpdTp*wJ/2.; - stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) += (l20m->operator()(p,q)*Gradsm[j+3*nbFFm][q])*nu(p)*Valsp[l+3*nbFFp]*dfvJumpdTp*wJ/2.; + for(int q =0; q < 3; q++) + { + stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) += (jy1m->operator()(p,q)*Gradsm[j+3*nbFFm][q])*nu(p)*Valsp[l+3*nbFFp]*dftJumpdTp*wJ/2.; + stiff(j+3*nbFFm,l+3*nbFFp+nbdofm) += (l20m->operator()(p,q)*Gradsm[j+3*nbFFm][q])*nu(p)*Valsp[l+3*nbFFp]*dfvJumpdTp*wJ/2.; + } } } } - } - for(int j=0;j<nbFFp;j++) - { - for(int l=0;l<nbFFm;l++) + for(int j=0;j<nbFFp;j++) { - for(int p =0; p < 3; p++) + for(int l=0;l<nbFFm;l++) { - for(int q =0; q < 3; q++) + for(int p =0; p < 3; p++) { - stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) += (jy1p->operator()(p,q)*Gradsp[j+3*nbFFp][q])*nu(p)*Valsm[l+3*nbFFm]*dftJumpdTm*wJ/2.; - stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) += (l20p->operator()(p,q)*Gradsp[j+3*nbFFp][q])*nu(p)*Valsm[l+3*nbFFm]*dfvJumpdTm*wJ/2.; + for(int q =0; q < 3; q++) + { + stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) += (jy1p->operator()(p,q)*Gradsp[j+3*nbFFp][q])*nu(p)*Valsm[l+3*nbFFm]*dftJumpdTm*wJ/2.; + stiff(j+3*nbFFp+nbdofm,l+3*nbFFm) += (l20p->operator()(p,q)*Gradsp[j+3*nbFFp][q])*nu(p)*Valsm[l+3*nbFFm]*dfvJumpdTm*wJ/2.; + } } } - } - for(int l=0;l<nbFFp;l++) - { - for(int p =0; p < 3; p++) + for(int l=0;l<nbFFp;l++) { - for(int q =0; q < 3; q++) + for(int p =0; p < 3; p++) { - stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += (jy1p->operator()(p,q)*Gradsp[j+3*nbFFp][q])*nu(p)*Valsp[l+3*nbFFp]*dftJumpdTp*wJ/2.; - stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += (l20p->operator()(p,q)*Gradsp[j+3*nbFFp][q])*nu(p)*Valsp[l+3*nbFFp]*dfvJumpdTp*wJ/2.; + for(int q =0; q < 3; q++) + { + stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += (jy1p->operator()(p,q)*Gradsp[j+3*nbFFp][q])*nu(p)*Valsp[l+3*nbFFp]*dftJumpdTp*wJ/2.; + stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += (l20p->operator()(p,q)*Gradsp[j+3*nbFFp][q])*nu(p)*Valsp[l+3*nbFFp]*dfvJumpdTp*wJ/2.; - stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += ftJump*(djy1dTp->operator()(p,q)*Gradsp[j+3*nbFFp][q])*nu(p)*Valsp[l+3*nbFFp]*wJ/2.; - stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += fvJump*(dl20dTp->operator()(p,q)*Gradsp[j+3*nbFFp][q])*(nu(p)*Valsp[l+3*nbFFp])*wJ/2.; + stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += ftJump*(djy1dTp->operator()(p,q)*Gradsp[j+3*nbFFp][q])*nu(p)*Valsp[l+3*nbFFp]*wJ/2.; + stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += fvJump*(dl20dTp->operator()(p,q)*Gradsp[j+3*nbFFp][q])*(nu(p)*Valsp[l+3*nbFFp])*wJ/2.; + } } } } - } - //new related to dialetation + //new related to dialetation - for(int j=0;j<nbFFm;j++) - { - for(int l=0;l<nbFFm;l++) + for(int j=0;j<nbFFm;j++) { - for(int k =0; k < 3; k++) + for(int l=0;l<nbFFm;l++) { - for(int p =0; p < 3; p++) - {; - - stiff(j+3*nbFFm,l+3*nbFFm) += gamma* jump(k)*(Stiff_alphadialitationm(k,p)*(2./Tm)*Valsm[j+3*nbFFm])*nu(p)*Valsm[l+3*nbFFm]*wJ/2.*(-1.)/eqRatio; + for(int k =0; k < 3; k++) + { + for(int p =0; p < 3; p++) + { + stiff(j+3*nbFFm,l+3*nbFFm) += gamma* jump(k)*(Stiff_alphadialitationm(k,p)*(2./Tm)*Valsm[j+3*nbFFm])*nu(p)*Valsm[l+3*nbFFm]*wJ/2.*(-1.)/eqRatio; + } } } } - } - for(int j=0;j<nbFFp;j++) - { - for(int l=0;l<nbFFp;l++) + for(int j=0;j<nbFFp;j++) { - for(int k =0; k < 3; k++) + for(int l=0;l<nbFFp;l++) { - for(int p =0; p< 3; p++) + for(int k =0; k < 3; k++) { + for(int p =0; p< 3; p++) + { - stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += gamma* jump(k)*(Stiff_alphadialitationp(k,p)*(2./Tp)*Valsp[j+3*nbFFp])*nu(p)*Valsp[l+3*nbFFp]*wJ/2.*(-1.)/eqRatio; + stiff(j+3*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += gamma* jump(k)*(Stiff_alphadialitationp(k,p)*(2./Tp)*Valsp[j+3*nbFFp])*nu(p)*Valsp[l+3*nbFFp]*wJ/2.*(-1.)/eqRatio; + } } } } - } - for(int j=0;j<nbFFm;j++) - { - for(int k=0;k<3;k++) - { - for(int l=0;l<nbFFm;l++) - { - for(int p =0; p < 3; p++) - { - stiff(j+3*nbFFm,l+k*nbFFm) -= gamma* (Stiff_alphadialitationm(k,p)*Valsm[j+3*nbFFm])*(nu(p)*wJ/2.*Valsm[l+0*nbFFm])/eqRatio*(-1.); - } - } - for(int l=0;l<nbFFp;l++) + for(int j=0;j<nbFFm;j++) { - for(int p =0; p < 3; p++) + for(int k=0;k<3;k++) { - stiff(j+3*nbFFm,l+k*nbFFp+nbdofm) += gamma*(Stiff_alphadialitationm(k,p)*Valsm[j+3*nbFFm])*(nu(p)*wJ/2.*Valsp[l+0*nbFFp])/eqRatio*(-1.); + for(int l=0;l<nbFFm;l++) + { + for(int p =0; p < 3; p++) + { + stiff(j+3*nbFFm,l+k*nbFFm) -= gamma* (Stiff_alphadialitationm(k,p)*Valsm[j+3*nbFFm])*(nu(p)*wJ/2.*Valsm[l+0*nbFFm])/eqRatio*(-1.); + } + } + for(int l=0;l<nbFFp;l++) + { + for(int p =0; p < 3; p++) + { + stiff(j+3*nbFFm,l+k*nbFFp+nbdofm) += gamma*(Stiff_alphadialitationm(k,p)*Valsm[j+3*nbFFm])*(nu(p)*wJ/2.*Valsp[l+0*nbFFp])/eqRatio*(-1.); + } + } } } - } - } - for(int j=0;j<nbFFp;j++) - { - for(int k=0;k<3;k++) - { - for(int l=0;l<nbFFm;l++) - { - for(int p =0; p < 3; p++) - { - stiff(j+3*nbFFp+nbdofm,l+k*nbFFm) -= gamma*(Stiff_alphadialitationp(k,p)*Valsp[j+3*nbFFp])*(nu(p)*wJ/2.*Valsm[l+0*nbFFm])/eqRatio*(-1.); - } - } - for(int l=0;l<nbFFp;l++) + for(int j=0;j<nbFFp;j++) { - for(int p =0; p < 3; p++) + for(int k=0;k<3;k++) { - stiff(j+3*nbFFp+nbdofm,l+k*nbFFp+nbdofm) += gamma*(Stiff_alphadialitationp(k,p)*Valsp[j+3*nbFFp])*(nu(p)*wJ/2.*Valsp[l+0*nbFFp])/eqRatio*(-1.); + for(int l=0;l<nbFFm;l++) + { + for(int p =0; p < 3; p++) + { + stiff(j+3*nbFFp+nbdofm,l+k*nbFFm) -= gamma*(Stiff_alphadialitationp(k,p)*Valsp[j+3*nbFFp])*(nu(p)*wJ/2.*Valsm[l+0*nbFFm])/eqRatio*(-1.); + } + } + for(int l=0;l<nbFFp;l++) + { + for(int p =0; p < 3; p++) + { + stiff(j+3*nbFFp+nbdofm,l+k*nbFFp+nbdofm) += gamma*(Stiff_alphadialitationp(k,p)*Valsp[j+3*nbFFp])*(nu(p)*wJ/2.*Valsp[l+0*nbFFp])/eqRatio*(-1.); + } + } } } - } - } - //dfI2tdv - for(int j=0;j<nbFFm;j++) - { - for(int l=0;l<nbFFm;l++) + //dfI2tdv + for(int j=0;j<nbFFm;j++) { - for(int p =0; p < 3; p++) + for(int l=0;l<nbFFm;l++) { - for(int q =0; q < 3; q++) + for(int p =0; p < 3; p++) { - stiff(j+3*nbFFm,l+4*nbFFm) += (l20m->operator()(p,q)*Gradsm[j+3*nbFFm][q])*nu(p)*Valsm[l+4*nbFFm]*dfvJumpdvm*wJ/2.; + for(int q =0; q < 3; q++) + { + stiff(j+3*nbFFm,l+4*nbFFm) += (l20m->operator()(p,q)*Gradsm[j+3*nbFFm][q])*nu(p)*Valsm[l+4*nbFFm]*dfvJumpdvm*wJ/2.; - stiff(j+3*nbFFm,l+4*nbFFm) += ftJump*(djy1dVm->operator()(p,q)*Gradsm[j+3*nbFFm][q])*nu(p)*Valsm[l+4*nbFFm]*wJ/2.; - stiff(j+3*nbFFm,l+4*nbFFm) += fvJump*(dl20dvm->operator()(p,q)*Gradsm[j+3*nbFFm][q])*nu(p)*Valsm[l+4*nbFFm]*wJ/2.; + stiff(j+3*nbFFm,l+4*nbFFm) += ftJump*(djy1dVm->operator()(p,q)*Gradsm[j+3*nbFFm][q])*nu(p)*Valsm[l+4*nbFFm]*wJ/2.; + stiff(j+3*nbFFm,l+4*nbFFm) += fvJump*(dl20dvm->operator()(p,q)*Gradsm[j+3*nbFFm][q])*nu(p)*Valsm[l+4*nbFFm]*wJ/2.; + } } } - } - for(int l=0;l<nbFFp;l++) - { - for(int p =0; p < 3; p++) + for(int l=0;l<nbFFp;l++) { - for(int q =0; q < 3; q++) + for(int p =0; p < 3; p++) { - stiff(j+3*nbFFm,l+4*nbFFp+nbdofm) += (l20m->operator()(p,q)*Gradsm[j+3*nbFFm][q])*nu(p)*Valsp[l+4*nbFFp]*dfvJumpdvp*wJ/2.; + for(int q =0; q < 3; q++) + { + stiff(j+3*nbFFm,l+4*nbFFp+nbdofm) += (l20m->operator()(p,q)*Gradsm[j+3*nbFFm][q])*nu(p)*Valsp[l+4*nbFFp]*dfvJumpdvp*wJ/2.; + } } } } - } - for(int j=0;j<nbFFp;j++) - { - for(int l=0;l<nbFFm;l++) + for(int j=0;j<nbFFp;j++) { - for(int p =0; p < 3; p++) + for(int l=0;l<nbFFm;l++) { - for(int q =0; q < 3; q++) + for(int p =0; p < 3; p++) { - stiff(j+3*nbFFp+nbdofm,l+4*nbFFm) += (l20p->operator()(p,q)*Gradsp[j+3*nbFFp][q])*(nu(p)*Valsm[l+4*nbFFm])*dfvJumpdvm*wJ/2.; + for(int q =0; q < 3; q++) + { + stiff(j+3*nbFFp+nbdofm,l+4*nbFFm) += (l20p->operator()(p,q)*Gradsp[j+3*nbFFp][q])*(nu(p)*Valsm[l+4*nbFFm])*dfvJumpdvm*wJ/2.; + } } } - } - for(int l=0;l<nbFFp;l++) - { - for(int p =0; p < 3; p++) + for(int l=0;l<nbFFp;l++) { - for(int q =0; q < 3; q++) + for(int p =0; p < 3; p++) { - stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += (l20p->operator()(p,q)*Gradsp[j+3*nbFFp][q])*nu(p)*Valsp[l+4*nbFFp]*dfvJumpdvp*wJ/2.; + for(int q =0; q < 3; q++) + { + stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += (l20p->operator()(p,q)*Gradsp[j+3*nbFFp][q])*nu(p)*Valsp[l+4*nbFFp]*dfvJumpdvp*wJ/2.; - stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += ftJump*(djy1dVp->operator()(p,q)*Gradsp[j+3*nbFFp][q])*nu(p)*Valsp[l+4*nbFFp]*wJ/2.; - stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += fvJump*(dl20dvp->operator()(p,q)*Gradsp[j+3*nbFFp][q])*nu(p)*Valsp[l+4*nbFFp]*wJ/2.; + stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += ftJump*(djy1dVp->operator()(p,q)*Gradsp[j+3*nbFFp][q])*nu(p)*Valsp[l+4*nbFFp]*wJ/2.; + stiff(j+3*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += fvJump*(dl20dvp->operator()(p,q)*Gradsp[j+3*nbFFp][q])*nu(p)*Valsp[l+4*nbFFp]*wJ/2.; + } } } } - } - //dfI2vdv (compatibility) - for(int j=0;j<nbFFm;j++) - { - for(int l=0;l<nbFFm;l++) + //dfI2vdv (compatibility) + for(int j=0;j<nbFFm;j++) { - for(int p =0; p < 3; p++) + for(int l=0;l<nbFFm;l++) { - for(int q =0; q < 3; q++) + for(int p =0; p < 3; p++) { - stiff(j+4*nbFFm,l+4*nbFFm) += (l10m->operator()(p,q)*Gradsm[j+4*nbFFm][q])*nu(p)*Valsm[l+4*nbFFm]*dfvJumpdvm*wJ/2.; - - stiff(j+4*nbFFm,l+4*nbFFm) += ftJump*(dl20dvm->operator()(p,q)*Gradsm[j+4*nbFFm][q])*nu(p)*Valsm[l+4*nbFFm]*wJ/2.; + for(int q =0; q < 3; q++) + { + stiff(j+4*nbFFm,l+4*nbFFm) += (l10m->operator()(p,q)*Gradsm[j+4*nbFFm][q])*nu(p)*Valsm[l+4*nbFFm]*dfvJumpdvm*wJ/2.; + stiff(j+4*nbFFm,l+4*nbFFm) += ftJump*(dl20dvm->operator()(p,q)*Gradsm[j+4*nbFFm][q])*nu(p)*Valsm[l+4*nbFFm]*wJ/2.; + } } } - } - for(int l=0;l<nbFFp;l++) - { - for(int p =0; p < 3; p++) + for(int l=0;l<nbFFp;l++) { - for(int q =0; q < 3; q++) + for(int p =0; p < 3; p++) { - stiff(j+4*nbFFm,l+4*nbFFp+nbdofm) += (l10m->operator()(p,q)*Gradsm[j+4*nbFFm][q])*nu(p)*Valsp[l+4*nbFFp]*dfvJumpdvp*wJ/2.; + for(int q =0; q < 3; q++) + { + stiff(j+4*nbFFm,l+4*nbFFp+nbdofm) += (l10m->operator()(p,q)*Gradsm[j+4*nbFFm][q])*nu(p)*Valsp[l+4*nbFFp]*dfvJumpdvp*wJ/2.; + } } } } - } - for(int j=0;j<nbFFp;j++) - { - for(int l=0;l<nbFFm;l++) + for(int j=0;j<nbFFp;j++) { - for(int p =0; p < 3; p++) + for(int l=0;l<nbFFm;l++) { - for(int q =0; q < 3; q++) + for(int p =0; p < 3; p++) { - stiff(j+4*nbFFp+nbdofm,l+4*nbFFm) += (l10p->operator()(p,q)*Gradsp[j+4*nbFFp][q])*(nu(p)*Valsm[l+4*nbFFm])*dfvJumpdvm*wJ/2.; + for(int q =0; q < 3; q++) + { + stiff(j+4*nbFFp+nbdofm,l+4*nbFFm) += (l10p->operator()(p,q)*Gradsp[j+4*nbFFp][q])*(nu(p)*Valsm[l+4*nbFFm])*dfvJumpdvm*wJ/2.; + } } } - } - for(int l=0;l<nbFFp;l++) - { - for(int p =0; p < 3; p++) + for(int l=0;l<nbFFp;l++) { - for(int q =0; q < 3; q++) + for(int p =0; p < 3; p++) { - stiff(j+4*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += (l10p->operator()(p,q)*Gradsp[j+4*nbFFp][q])*nu(p)*Valsp[l+4*nbFFp]*dfvJumpdvp*wJ/2.; + for(int q =0; q < 3; q++) + { + stiff(j+4*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += (l10p->operator()(p,q)*Gradsp[j+4*nbFFp][q])*nu(p)*Valsp[l+4*nbFFp]*dfvJumpdvp*wJ/2.; - stiff(j+4*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += ftJump*(dl20dvp->operator()(p,q)*Gradsp[j+4*nbFFp][q])*nu(p)*Valsp[l+4*nbFFp]*wJ/2.; + stiff(j+4*nbFFp+nbdofm,l+4*nbFFp+nbdofm) += ftJump*(dl20dvp->operator()(p,q)*Gradsp[j+4*nbFFp][q])*nu(p)*Valsp[l+4*nbFFp]*wJ/2.; + } } } } - } - // terms dfvI2dt - for(int j=0;j<nbFFm;j++) - { - for(int l=0;l<nbFFm;l++) + // terms dfvI2dt + for(int j=0;j<nbFFm;j++) { - for(int p =0; p < 3; p++) + for(int l=0;l<nbFFm;l++) { - for(int q =0; q < 3; q++) + for(int p =0; p < 3; p++) { - stiff(j+4*nbFFm,l+3*nbFFm) += (l10m->operator()(p,q)*Gradsm[j+4*nbFFm][q])*nu(p)*Valsm[l+3*nbFFm]*dfvJumpdTm*wJ/2.; - stiff(j+4*nbFFm,l+3*nbFFm) += (l20m->operator()(p,q)*Gradsm[j+4*nbFFm][q])*nu(p)*Valsm[l+3*nbFFm]*dftJumpdTm*wJ/2.; + for(int q =0; q < 3; q++) + { + stiff(j+4*nbFFm,l+3*nbFFm) += (l10m->operator()(p,q)*Gradsm[j+4*nbFFm][q])*nu(p)*Valsm[l+3*nbFFm]*dfvJumpdTm*wJ/2.; + stiff(j+4*nbFFm,l+3*nbFFm) += (l20m->operator()(p,q)*Gradsm[j+4*nbFFm][q])*nu(p)*Valsm[l+3*nbFFm]*dftJumpdTm*wJ/2.; - stiff(j+4*nbFFm,l+3*nbFFm) += fvJump*(dl10dTm->operator()(p,q)*Gradsm[j+4*nbFFm][q])*nu(p)*Valsm[l+3*nbFFm]*wJ/2.; - stiff(j+4*nbFFm,l+3*nbFFm) += ftJump*(dl20dTm->operator()(p,q)*Gradsm[j+4*nbFFm][q])*nu(p)*Valsm[l+3*nbFFm]*wJ/2.; + stiff(j+4*nbFFm,l+3*nbFFm) += fvJump*(dl10dTm->operator()(p,q)*Gradsm[j+4*nbFFm][q])*nu(p)*Valsm[l+3*nbFFm]*wJ/2.; + stiff(j+4*nbFFm,l+3*nbFFm) += ftJump*(dl20dTm->operator()(p,q)*Gradsm[j+4*nbFFm][q])*nu(p)*Valsm[l+3*nbFFm]*wJ/2.; + } } } - } - for(int l=0;l<nbFFp;l++) - { - for(int p =0; p < 3; p++) + for(int l=0;l<nbFFp;l++) { - for(int q =0; q < 3; q++) + for(int p =0; p < 3; p++) { - stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) += (l10m->operator()(p,q)*Gradsm[j+4*nbFFm][q])*nu(p)*Valsp[l+3*nbFFp]*dfvJumpdTp*wJ/2.; - stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) += (l20m->operator()(p,q)*Gradsm[j+4*nbFFm][q])*nu(p)*Valsp[l+3*nbFFp]*dftJumpdTp*wJ/2.; + for(int q =0; q < 3; q++) + { + stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) += (l10m->operator()(p,q)*Gradsm[j+4*nbFFm][q])*nu(p)*Valsp[l+3*nbFFp]*dfvJumpdTp*wJ/2.; + stiff(j+4*nbFFm,l+3*nbFFp+nbdofm) += (l20m->operator()(p,q)*Gradsm[j+4*nbFFm][q])*nu(p)*Valsp[l+3*nbFFp]*dftJumpdTp*wJ/2.; + } } } } - } - for(int j=0;j<nbFFp;j++) - { - for(int l=0;l<nbFFm;l++) + for(int j=0;j<nbFFp;j++) { - for(int p =0; p < 3; p++) + for(int l=0;l<nbFFm;l++) { - for(int q =0; q < 3; q++) + for(int p =0; p < 3; p++) { - stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) += (l10p->operator()(p,q)*Gradsp[j+4*nbFFp][q])*nu(p)*Valsm[l+3*nbFFm]*dfvJumpdTm*wJ/2.; - stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) += (l20p->operator()(p,q)*Gradsp[j+4*nbFFp][q])*nu(p)*Valsm[l+3*nbFFm]*dftJumpdTm*wJ/2.; + for(int q =0; q < 3; q++) + { + stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) += (l10p->operator()(p,q)*Gradsp[j+4*nbFFp][q])*nu(p)*Valsm[l+3*nbFFm]*dfvJumpdTm*wJ/2.; + stiff(j+4*nbFFp+nbdofm,l+3*nbFFm) += (l20p->operator()(p,q)*Gradsp[j+4*nbFFp][q])*nu(p)*Valsm[l+3*nbFFm]*dftJumpdTm*wJ/2.; + } } } - } - for(int l=0;l<nbFFp;l++) - { - for(int p =0; p < 3; p++) + for(int l=0;l<nbFFp;l++) { - for(int q =0; q < 3; q++) + for(int p =0; p < 3; p++) { - stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += (l10p->operator()(p,q)*Gradsp[j+4*nbFFp][q])*nu(p)*Valsp[l+3*nbFFp]*dfvJumpdTp*wJ/2.; - stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += (l20p->operator()(p,q)*Gradsp[j+4*nbFFp][q])*nu(p)*Valsp[l+3*nbFFp]*dftJumpdTp*wJ/2.; + for(int q =0; q < 3; q++) + { + stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += (l10p->operator()(p,q)*Gradsp[j+4*nbFFp][q])*nu(p)*Valsp[l+3*nbFFp]*dfvJumpdTp*wJ/2.; + stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += (l20p->operator()(p,q)*Gradsp[j+4*nbFFp][q])*nu(p)*Valsp[l+3*nbFFp]*dftJumpdTp*wJ/2.; - stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += fvJump*(dl10dTp->operator()(p,q)*Gradsp[j+4*nbFFp][q])*(nu(p)*Valsp[l+3*nbFFp])*wJ/2.; - stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += ftJump*(dl20dTp->operator()(p,q)*Gradsp[j+4*nbFFp][q])*nu(p)*Valsp[l+3*nbFFp]*wJ/2.; + stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += fvJump*(dl10dTp->operator()(p,q)*Gradsp[j+4*nbFFp][q])*(nu(p)*Valsp[l+3*nbFFp])*wJ/2.; + stiff(j+4*nbFFp+nbdofm,l+3*nbFFp+nbdofm) += ftJump*(dl20dTp->operator()(p,q)*Gradsp[j+4*nbFFp][q])*nu(p)*Valsp[l+3*nbFFp]*wJ/2.; + } } } } - } - //dfTI2dF+dfvI2dF - for(int j=0;j<nbFFm;j++) - { - for(int l=0;l<nbFFm;l++) + //dfTI2dF+dfvI2dF + for(int j=0;j<nbFFm;j++) { - for(int m =0; m < 3; m++) + for(int l=0;l<nbFFm;l++) { - for(int p =0; p < 3; p++) - { - for(int q =0; q < 3; q++) - { - for(int n =0; n< 3; n++) + for(int m =0; m < 3; m++) + { + for(int p =0; p < 3; p++) + { + for(int q =0; q < 3; q++) { - stiff(j+3*nbFFm,l+m*nbFFm) += ftJump*(djy1dFm->operator()(p,q,m,n)*Gradsm[j+3*nbFFm][q]*Gradsm[l+0*nbFFm][n])*(nu(p)*wJ/2.); - stiff(j+3*nbFFm,l+m*nbFFm) += fvJump*(dl20dFm->operator()(p,q,m,n)*Gradsm[j+3*nbFFm][q]*Gradsm[l+0*nbFFm][n])*(nu(p)*wJ/2.); - - stiff(j+4*nbFFm,l+m*nbFFm) += fvJump*(dl10dFm->operator()(p,q,m,n)*Gradsm[j+4*nbFFm][q]*Gradsm[l+0*nbFFm][n])*(nu(p)*wJ/2.); - stiff(j+4*nbFFm,l+m*nbFFm) += ftJump*(dl20dFm->operator()(p,q,m,n)*Gradsm[j+4*nbFFm][q]*Gradsm[l+0.*nbFFm][n])*(nu(p)*wJ/2.); - } - } - } + for(int n =0; n< 3; n++) + { + stiff(j+3*nbFFm,l+m*nbFFm) += ftJump*(djy1dFm->operator()(p,q,m,n)*Gradsm[j+3*nbFFm][q]*Gradsm[l+0*nbFFm][n])*(nu(p)*wJ/2.); + stiff(j+3*nbFFm,l+m*nbFFm) += fvJump*(dl20dFm->operator()(p,q,m,n)*Gradsm[j+3*nbFFm][q]*Gradsm[l+0*nbFFm][n])*(nu(p)*wJ/2.); + + stiff(j+4*nbFFm,l+m*nbFFm) += fvJump*(dl10dFm->operator()(p,q,m,n)*Gradsm[j+4*nbFFm][q]*Gradsm[l+0*nbFFm][n])*(nu(p)*wJ/2.); + stiff(j+4*nbFFm,l+m*nbFFm) += ftJump*(dl20dFm->operator()(p,q,m,n)*Gradsm[j+4*nbFFm][q]*Gradsm[l+0.*nbFFm][n])*(nu(p)*wJ/2.); + } + } + } + } } } - } - for(int j=0;j<nbFFp;j++) - { - for(int l=0;l<nbFFp;l++) + for(int j=0;j<nbFFp;j++) { - for(int m =0; m < 3; m++) + for(int l=0;l<nbFFp;l++) { - for(int n =0; n< 3; n++) + for(int m =0; m < 3; m++) { - for(int p =0; p < 3; p++) - { - for(int q =0; q < 3; q++) - { - stiff(j+3*nbFFp+nbdofm,l+m*nbFFp+nbdofm) += ftJump*(djy1dFp->operator()(p,q,m,n)*Gradsp[j+3*nbFFp][q]*Gradsp[l+0*nbFFp][n])*(nu(p)*wJ/2.); - stiff(j+3*nbFFp+nbdofm,l+m*nbFFp+nbdofm) += fvJump*(dl20dFp->operator()(p,q,m,n)*Gradsp[j+3*nbFFp][q]*Gradsp[l+0*nbFFp][n])*(nu(p)*wJ/2.); - - stiff(j+4*nbFFp+nbdofm,l+m*nbFFp+nbdofm) += fvJump*(dl10dFp->operator()(p,q,m,n)*Gradsp[j+4*nbFFp][q]*Gradsp[l+0*nbFFp][n])*(nu(p)*wJ/2.); - stiff(j+4*nbFFp+nbdofm,l+m*nbFFp+nbdofm) += ftJump*(dl20dFp->operator()(p,q,m,n)*Gradsp[j+4*nbFFp][q]*Gradsp[l+0*nbFFp][n])*(nu(p)*wJ/2.); - } - } + for(int n =0; n< 3; n++) + { + for(int p =0; p < 3; p++) + { + for(int q =0; q < 3; q++) + { + stiff(j+3*nbFFp+nbdofm,l+m*nbFFp+nbdofm) += ftJump*(djy1dFp->operator()(p,q,m,n)*Gradsp[j+3*nbFFp][q]*Gradsp[l+0*nbFFp][n])*(nu(p)*wJ/2.); + stiff(j+3*nbFFp+nbdofm,l+m*nbFFp+nbdofm) += fvJump*(dl20dFp->operator()(p,q,m,n)*Gradsp[j+3*nbFFp][q]*Gradsp[l+0*nbFFp][n])*(nu(p)*wJ/2.); + + stiff(j+4*nbFFp+nbdofm,l+m*nbFFp+nbdofm) += fvJump*(dl10dFp->operator()(p,q,m,n)*Gradsp[j+4*nbFFp][q]*Gradsp[l+0*nbFFp][n])*(nu(p)*wJ/2.); + stiff(j+4*nbFFp+nbdofm,l+m*nbFFp+nbdofm) += ftJump*(dl20dFp->operator()(p,q,m,n)*Gradsp[j+4*nbFFp][q]*Gradsp[l+0*nbFFp][n])*(nu(p)*wJ/2.); + } + } + } } } } } - } } - } + } } } // stiff.print("dginter"); - - } +}; diff --git a/dG3D/src/extraFieldFunctionSpace.h b/dG3D/src/extraFieldFunctionSpace.h index 0aaeb2acceb79766cdab6894c3d74eebf1ae779e..9b4056c0a8df9b29b4398ec789ce71412cc9979b 100644 --- a/dG3D/src/extraFieldFunctionSpace.h +++ b/dG3D/src/extraFieldFunctionSpace.h @@ -17,7 +17,7 @@ class extraFieldFunctionSpace : public ThreeDLagrangeFunctionSpace{ protected: - virtual void getKeysOnElement(MElement *ele, std::vector<Dof> &keys){ + virtual void getKeysOnElement(MElement *ele, std::vector<Dof> &keys) const{ Msg::Fatal("This function is not implemented"); } @@ -38,7 +38,7 @@ class extraFieldFunctionSpace : public ThreeDLagrangeFunctionSpace{ else if (_ncomp == 3) return new extraFieldFunctionSpace(_dom,id,3,comp[0],comp[1],comp[2]); else return new extraFieldFunctionSpace(_dom,id,_ncomp); } - virtual int getNumKeys(MElement *ele) { + virtual int getNumKeys(MElement *ele) const { if (_dom->IsMultipleFieldFormulation()){ if (dynamic_cast<MInterfaceElement*>(ele) == NULL) { Msg::Fatal("Multiple fields are now considered for interface element only"); @@ -80,7 +80,7 @@ class extraFieldFunctionSpace : public ThreeDLagrangeFunctionSpace{ } }; - virtual void getKeys(MElement *ele, std::vector<Dof> &keys) { + virtual void getKeys(MElement *ele, std::vector<Dof> &keys) const{ if (_dom->IsMultipleFieldFormulation()){ if (_dom->getEnrichedUnknownLocation() == partDomain::NODE){ // generate Dof at nodes diff --git a/dG3D/src/hoDGMaterialLaw.cpp b/dG3D/src/hoDGMaterialLaw.cpp index b64915d7f650b084e20249499d94f16db44893fd..4a2708c3eb4f7e38b963635e7d9ae40bfecabce5 100644 --- a/dG3D/src/hoDGMaterialLaw.cpp +++ b/dG3D/src/hoDGMaterialLaw.cpp @@ -281,8 +281,8 @@ void fullHODGElasticMaterialLaw::setParameter(const std::string key, const doubl }; void fullHODGElasticMaterialLaw::fillElasticStiffness(elasticLawBase* fs, STensor53& firstsecond, STensor53& secondfirst){ - STensor3 F(0.), P(0.); - STensor33 G(0.), Q(0.); + static STensor3 F(0.), P(0.); + static STensor33 G(0.), Q(0.); elasticFirstSecondLaw* pfs = dynamic_cast<linearElasticFirstSecondLaw*>(fs); pfs->constitutive(F,G,P,Q,firstsecond,secondfirst,true); }; @@ -332,9 +332,11 @@ void fullHODGElasticMaterialLaw::stress(IPVariable* ipv, const IPVariable* ipvpr if (_elasticFirstSecond){ static STensor3 P1; - P1*=(0.); + STensorOperation::zero(P1); + static STensor33 Q1; - Q1*=(0.); + STensorOperation::zero(Q1); + elasticFirstSecondLaw* fs = dynamic_cast<elasticFirstSecondLaw*>(_elasticFirstSecond); fs->constitutive(F,G,P1,Q1,LG,JF,stiff); P+= P1; diff --git a/dG3D/src/hoDGPartDomain.cpp b/dG3D/src/hoDGPartDomain.cpp index 6a4924a9acd24672cfd8e4c6d08548892c4bdfc4..52ea68117dd39750cee35c22f939e0c55243e758 100644 --- a/dG3D/src/hoDGPartDomain.cpp +++ b/dG3D/src/hoDGPartDomain.cpp @@ -40,46 +40,6 @@ hoDGDomain::hoDGDomain(const int tag, const int phys, const int sp, const int ln hoDGDomain::hoDGDomain(const hoDGDomain &source) :dG3DDomain(source){ }; - -void hoDGDomain::writeDeformationGradient(const IPField* ipf, FILE* file){ - IntPt* GP; - const ipFiniteStrain *vipv[256]; - for (groupOfElements::elementContainer::iterator it= g->begin(); it!=g->end(); it++){ - MElement* ele= *it; - ipf->getIPv(ele,vipv); - int npts= integBulk->getIntPoints(ele,&GP); - static STensor3 FF; - FF*=0; - static STensor33 GG; - GG*=0; - double volume = 0.; - for (int i=0; i<npts; i++){ - double weight= GP[i].weight; - double u = GP[i].pt[0]; - double v = GP[i].pt[1]; - double w = GP[i].pt[2]; - double detJ = ele->getJacobianDeterminant(u,v,w); - const STensor3& F = vipv[i]->getConstRefToDeformationGradient(); - const hoDGIPVariable* hodg= dynamic_cast<const hoDGIPVariable*>(vipv[i]); - if (hodg){ - const STensor33& G = hodg->getConstRefToGradientOfDeformationGradient(); - GG += G*(weight*detJ); - } - - FF += F*weight*detJ; - volume += weight*detJ; - }; - - FF *= (1./volume); - GG *= (1./volume); - - SPoint3 P = ele->barycenter(); - fprintf(file,"%d;%g;%g;%g;%g;%g;%g;%g;%g;%g;%g;%g;%g \n",ele->getNum(), - P.x(),P.y(),P.z(),FF(0,0),FF(0,1),FF(0,2),FF(1,0),FF(1,1),FF(1,2),GG(0,0,0),GG(0,1,1),GG(1,0,1)); - }; -}; - - void hoDGDomain::computeStrain(MElement *e, const int npts_bulk, IntPt *GP, AllIPState::ipstateElementContainer *vips, IPStateBase::whichState ws, fullVector<double> &disp) const{ @@ -94,10 +54,7 @@ void hoDGDomain::computeStrain(MElement *e, const int npts_bulk, IntPt *GP, int nbFF = e->getNumShapeFunctions(); for(int j=0;j<npts_bulk;j++){ - // hessien value at gauss points - //Hesses.clear(); - //sp->hessf(e,GP[j].pt[0],GP[j].pt[1],GP[j].pt[2],Hesses); - + IPStateBase* ips = (*vips)[j]; hoDGIPVariable *ipv = static_cast<hoDGIPVariable*>(ips->getState(ws)); hoDGIPVariable *ipvprev = static_cast<hoDGIPVariable*>(ips->getState(IPStateBase::previous)); @@ -105,7 +62,8 @@ void hoDGDomain::computeStrain(MElement *e, const int npts_bulk, IntPt *GP, const std::vector<TensorialTraits<double>::HessType>& Hesses = ipv->hessf(_space,e,GP[j]); //x y z STensor33* gradientOfGradientDeformation = &ipv->getRefToGradientOfDeformationGradient(); - gradientOfGradientDeformation->operator=(0.); + STensorOperation::zero(*gradientOfGradientDeformation); + for (int i = 0; i < nbFF; i++){ for (int k=0; k<3; k++){ for (int l=0; l<3; l++){ @@ -131,24 +89,16 @@ void hoDGDomain::computeStrain(AllIPState *aips,MInterfaceElement *ie, IntPt *GP dG3DMaterialLaw* dgminus = static_cast<dG3DMaterialLaw*>(efMinus->getMaterialLaw()); if (dgplus->isHighOrder() or dgminus->isHighOrder()){ if(!virt){ - //nlsFunctionSpaceXYZ<double> *spaceminus = static_cast<nlsFunctionSpaceXYZ<double> *>(efMinus->getFunctionSpace()); FunctionSpaceBase* spaceminus = efMinus->getFunctionSpace(); int npts=integBound->getIntPoints(ele,&GP); // Value of Gauss points on elements IntPt *GPm; IntPt *GPp; _interQuad->getIntPoints(ie,GP,&GPm,&GPp); - // Get values of hess and ThirdDev at all Gauss point - //std::vector<GaussPointSpaceValues<double>*> vallm; - //spaceminus->get(ie->getElem(0),npts,GPm,vallm); - // vector with nodal displacement of interface - // take from minus displacement vector - //nlsFunctionSpaceXYZ<double>* spaceplus = static_cast<nlsFunctionSpaceXYZ<double>*>(efPlus->getFunctionSpace()); + FunctionSpaceBase* spaceplus = efPlus->getFunctionSpace(); MElement *em = ie->getElem(0); MElement *ep = ie->getElem(1); - //std::vector<GaussPointSpaceValues<double>*> vallp; - //spaceplus->get(ep,npts,GPp,vallp); // gauss point int nbdofm = spaceminus->getNumKeys(em); int nbdofp = spaceplus->getNumKeys(ep); @@ -156,17 +106,6 @@ void hoDGDomain::computeStrain(AllIPState *aips,MInterfaceElement *ie, IntPt *GP int nbFFp = ep->getNumVertices(); AllIPState::ipstateElementContainer *vips = aips->getIPstate(ie->getNum()); for(int j=0;j<npts;j++){ - // key of gauss point grad value at gauss point -// double uem = GPm[j].pt[0]; double vem = GPm[j].pt[1]; double wem = GPm[j].pt[2]; -// double uep = GPp[j].pt[0]; double vep = GPp[j].pt[1]; double wep = GPp[j].pt[2]; -// ie->getuvwOnElem(GP[j].pt[0],GP[j].pt[1],uem,vem,wem,uep,vep,wep); -// Hessm.clear(); Hessp.clear(); -// spaceminus->hessf(em,uem,vem,wem,Hessm); -// spaceplus->hessf(ep,uep,vep,wep,Hessp); - //std::vector<TensorialTraits<double>::HessType> &Hessm = vallm[j]->_vhess; - //std::vector<TensorialTraits<double>::HessType> &Hessp = vallp[j]->_vhess; - - IPStateBase* ipsm = (*vips)[j]; IPStateBase* ipsp = (*vips)[j+npts]; @@ -181,7 +120,7 @@ void hoDGDomain::computeStrain(AllIPState *aips,MInterfaceElement *ie, IntPt *GP const std::vector<TensorialTraits<double>::HessType> &Hessp = ipvp->hessf(spaceplus,ep,GPp[j]); STensor33* gradientOfDeformationGradientm = &ipvm->getRefToGradientOfDeformationGradient(); - gradientOfDeformationGradientm->operator =(0.); + STensorOperation::zero(*gradientOfDeformationGradientm); for (int i = 0; i < nbFFm; i++){ for (int k=0; k<3; k++){ @@ -192,10 +131,9 @@ void hoDGDomain::computeStrain(AllIPState *aips,MInterfaceElement *ie, IntPt *GP }; }; }; - //gradientOfDeformationGradientm->print("Negative G"); STensor33* gradientOfDeformationGradientp = &ipvp->getRefToGradientOfDeformationGradient(); - gradientOfDeformationGradientp->operator=(0.); + STensorOperation::zero(*gradientOfDeformationGradientp); for (int i = 0; i < nbFFp; i++){ for (int k=0; k<3; k++){ for (int l=0; l<3; l++){ @@ -205,21 +143,15 @@ void hoDGDomain::computeStrain(AllIPState *aips,MInterfaceElement *ie, IntPt *GP }; }; }; - //gradientOfDeformationGradientp->print("positive G"); if (_fullDg){ -// Thirdm.clear(); -// Thirdp.clear(); -// spaceminus->thirdDevf(em,uem,vem,wem,Thirdm); -// spaceplus->thirdDevf(ep,uep,vep,wep,Thirdp); - //std::vector<TensorialTraits<double>::ThirdDevType> &Thirdm = vallm[j]->_vthird; - //std::vector<TensorialTraits<double>::ThirdDevType> &Thirdp = vallp[j]->_vthird; std::vector<TensorialTraits<double>::ThirdDevType> &Thirdm = ipvm->thirdDevf(spaceminus,em,GPm[j]); std::vector<TensorialTraits<double>::ThirdDevType> &Thirdp = ipvp->thirdDevf(spaceplus,ep,GPp[j]); STensor43* thirdOrderGradientm = & ipvm->getRefToThirdOrderDeformationGradient(); - thirdOrderGradientm->operator=(0.); + STensorOperation::zero(*thirdOrderGradientm); + for (int i=0; i<nbFFm; i++) for (int k=0; k<3; k++) for (int l=0; l<3; l++) @@ -228,8 +160,9 @@ void hoDGDomain::computeStrain(AllIPState *aips,MInterfaceElement *ie, IntPt *GP thirdOrderGradientm->operator()(1,k,l,m) += Thirdm[i+0*nbFFm](k,l,m)*dispm(i+1*nbFFm); thirdOrderGradientm->operator()(2,k,l,m) += Thirdm[i+0*nbFFm](k,l,m)*dispm(i+2*nbFFm); }; + STensor43* thirdOrderGradientp = & ipvp->getRefToThirdOrderDeformationGradient(); - thirdOrderGradientp->operator=(0.); + STensorOperation::zero(*thirdOrderGradientp); for (int i=0; i<nbFFp; i++) for (int k=0; k<3; k++) for (int l=0; l<3; l++) diff --git a/dG3D/src/hoDGPartDomain.h b/dG3D/src/hoDGPartDomain.h index a8573f4078af00dd40501efb4e007e55e8986753..f855c97b6300cc15db59bcf16ae5164853136633 100644 --- a/dG3D/src/hoDGPartDomain.h +++ b/dG3D/src/hoDGPartDomain.h @@ -19,7 +19,6 @@ class hoDGDomain : public dG3DDomain{ #ifndef SWIG hoDGDomain(const hoDGDomain &source); virtual ~hoDGDomain(){}; - virtual void writeDeformationGradient(const IPField* ipf, FILE* file); virtual void computeStrain(MElement *e, const int npts_bulk, IntPt *GP, AllIPState::ipstateElementContainer *vips, IPStateBase::whichState ws, fullVector<double> &disp) const; diff --git a/dG3D/src/hoDGTerms.cpp b/dG3D/src/hoDGTerms.cpp index bb03c262bcf5f6f78188799623e5a1dca656c7ce..7c7f6d54d84e010cc6638e5d785e0f3ff9995a94 100644 --- a/dG3D/src/hoDGTerms.cpp +++ b/dG3D/src/hoDGTerms.cpp @@ -16,24 +16,16 @@ void hoDGStiffnessBulk::get(MElement *ele, int npts, IntPt *GP, fullMatrix<double> &mStiff) const{ dG3DStiffnessBulk::get(ele,npts,GP,mStiff); if (this->sym){ - //nlsFunctionSpaceXYZ<double>* sp1 = static_cast<nlsFunctionSpaceXYZ<double>*>(&(this->space1)); // sym if (_mlaw->isHighOrder()){ - if (ele->getParent()) ele=ele->getParent(); int nbFF = ele->getNumShapeFunctions(); - //double jac[3][3]; _ipf->getIPv(ele,vipv); - // get values of Grads, Hess and detJ at all Gauss points - //std::vector<GaussPointSpaceValues<double>*> vall; - //sp1->get(ele,npts,GP,vall); for (int i = 0; i < npts; i++){ -// const double u = GP[i].pt[0]; const double v = GP[i].pt[1]; const double w = GP[i].pt[2]; - const double weight = GP[i].weight; //const double detJ = ele->getJacobian(u, v, w, jac); - const hoDGIPVariable* hoipv = static_cast<const hoDGIPVariable*>(vipv[i]); std::vector<TensorialTraits<double>::GradType>& Grads = hoipv->gradf(&space1,ele,GP[i]); std::vector<TensorialTraits<double>::HessType>& Hesses =hoipv->hessf(&space1,ele,GP[i]); double& detJ = hoipv->getJacobianDeterminant(ele,GP[i]); + const double weight = GP[i].weight; const STensor63& secondtangent = hoipv->getConstRefToSecondOrderTangent(); const STensor53& firstsecond = hoipv->getConstRefToCrossTangentFirstSecond(); @@ -67,17 +59,13 @@ void hoDGStiffnessBulk::get(MElement *ele, int npts, IntPt *GP, fullMatrix<doubl void hoDGForceBulk::get(MElement *ele,int npts,IntPt *GP,fullVector<double> &vFor) const{ dG3DForceBulk::get(ele,npts,GP,vFor); if (_mlaw->isHighOrder()){ - //nlsFunctionSpaceXYZ<double>* sp1 = static_cast<nlsFunctionSpaceXYZ<double>*>(&(this->space1)); - if (ele->getParent()) ele=ele->getParent(); int nbDof = space1.getNumKeys(ele); int nbFF = ele->getNumShapeFunctions(); - double jac[3][3]; _ipf->getIPv(ele,vipv,vipvprev); for (int i = 0; i < npts; i++){ - //const double u = GP[i].pt[0]; const double v = GP[i].pt[1]; const double w = GP[i].pt[2]; const double weight = GP[i].weight; //const double detJ = ele->getJacobian(u, v, w, jac); const hoDGIPVariable* hoipv = static_cast<const hoDGIPVariable*>(vipv[i]); @@ -118,7 +106,6 @@ void hoDGStiffnessInter::get(MElement *ele,int npts,IntPt *GP, fullMatrix<double int nbFFm = eleminus->getNumShapeFunctions(); int nbFFp = eleplus->getNumShapeFunctions(); - double jac[3][3]; _ipf->getIPv(ele,vipv,vipvprev); // Get values of Gauss points on minus and plus elements @@ -129,9 +116,10 @@ void hoDGStiffnessInter::get(MElement *ele,int npts,IntPt *GP, fullMatrix<double for (int i = 0; i < npts; i++){ const double u = GP[i].pt[0]; const double v = GP[i].pt[1]; const double w = GP[i].pt[2]; const double weight = GP[i].weight; - const double detJ = ele->getJacobian(u, v, w, jac); - //const double detJ = ele->getJacobian(vgradsuvw[i],jac); - SVector3 normal = vipv[i]->getConstRefToReferenceOutwardNormal(); + const double& detJ = vipv[i]->getJacobianDeterminant(ie,GP[i]); + + static SVector3 normal; + normal = vipv[i]->getConstRefToReferenceOutwardNormal(); normal*= (1./normal.norm()); const double ratio = detJ*weight; @@ -166,9 +154,10 @@ void hoDGStiffnessInter::get(MElement *ele,int npts,IntPt *GP, fullMatrix<double const STensor53& LGplus = vipv[i+npts]->getConstRefToCrossTangentFirstSecond(); const STensor53& JFplus = vipv[i+npts]->getConstRefToCrossTangentSecondFirst(); - STensor63 elJmeanbetahs(elJminus); + static STensor63 elJmeanbetahs; + elJmeanbetahs = (elJminus); elJmeanbetahs += elJplus; - elJmeanbetahs *= 0.5*_beta1/hs; + elJmeanbetahs *= (0.5*_beta1/hs); for (int k=0; k<3; k++){ for (int q=0; q<3; q++){ @@ -283,13 +272,10 @@ void hoDGForceInter::get(MElement *ele,int npts,IntPt *GP,fullVector<double> &vF for (int i = 0; i < npts; i++){ const double u = GP[i].pt[0]; const double v = GP[i].pt[1]; const double w = GP[i].pt[2]; const double weight = GP[i].weight; - const double detJ = ele->getJacobian(u, v, w, jac); - //const double detJ = ele->getJacobian(vgradsuvw[i],jac); -// double uem = GPm[i].pt[0]; double vem = GPm[i].pt[1]; double wem = GPm[i].pt[2]; -// double uep = GPp[i].pt[0]; double vep = GPp[i].pt[1]; double wep = GPp[i].pt[2]; -// ie->getuvwOnElem(u,v,uem,vem,wem,uep,vep,wep); - // negative normal - SVector3 normal(vipv[i]->getConstRefToReferenceOutwardNormal()); + const double& detJ = vipv[i]->getJacobianDeterminant(ie,GP[i]); + + static SVector3 normal; + normal = (vipv[i]->getConstRefToReferenceOutwardNormal()); normal*= (1./normal.norm()); // normalize @@ -331,9 +317,10 @@ void hoDGForceInter::get(MElement *ele,int npts,IntPt *GP,fullVector<double> &vF const STensor43& Kplus = vipv[i+npts]->getConstRefToThirdOrderDeformationGradient(); // compute the mean value of divergence of the second-stress - STensor3 meanDivSecondStress(0.); + static STensor3 meanDivSecondStress; for (int j=0; j<3; j++) - for (int k=0; k<3; k++) + for (int k=0; k<3; k++){ + meanDivSecondStress(j,k) = 0.; for (int l=0; l<3; l++) for (int p=0; p<3; p++) for (int q=0; q<3; q++){ @@ -344,6 +331,8 @@ void hoDGForceInter::get(MElement *ele,int npts,IntPt *GP,fullVector<double> &vF Jplus(j,k,l,p,q,r)*Kplus(p,q,r,l)); } } + + } const SVector3& jump = vipv[i]->getConstRefToJump(); for (int j=0; j<nbFFm; j++){ @@ -399,51 +388,7 @@ void hoDGForceInter::get(MElement *ele,int npts,IntPt *GP,fullVector<double> &vF } } } - /* - for (int k=0; k<3; k++){ - for (int j=0; j<nbFFm; j++){ - //term add from mean of divergence of second stress - vFor(j + 0*nbFFm) += meanDivSecondStress(0,k)*ValMinus[j+0*nbFFm]*normal[k]*ratio; - vFor(j + 1*nbFFm) += meanDivSecondStress(1,k)*ValMinus[j+0*nbFFm]*normal[k]*ratio; - vFor(j + 2*nbFFm) += meanDivSecondStress(2,k)*ValMinus[j+0*nbFFm]*normal[k]*ratio; - for (int l=0; l<3; l++){ - for (int m=0; m<3; m++){ - for (int n=0; n<3; n++){ - // term from the variations of PK effective stress - vFor(j + 0*nbFFm) += 0.5*jump[l]*(LGelminus(l,k,0,m,n) - JFelminus(l,k,n,0,m))*HessMinus[j+0*nbFFm](m,n)*normal[k]*ratio; - vFor(j + 1*nbFFm) += 0.5*jump[l]*(LGelminus(l,k,1,m,n) - JFelminus(l,k,n,1,m))*HessMinus[j+0*nbFFm](m,n)*normal[k]*ratio; - vFor(j + 2*nbFFm) += 0.5*jump[l]*(LGelminus(l,k,2,m,n) - JFelminus(l,k,n,2,m))*HessMinus[j+0*nbFFm](m,n)*normal[k]*ratio; - - for (int s=0; s<3; s++){ - vFor(j + 0*nbFFm) -= 0.5*jump[l]*Jelminus(l,k,s,0,m,n)*ThirdMius[j+0*nbFFm](m,n,s)*normal[k]*ratio; - vFor(j + 1*nbFFm) -= 0.5*jump[l]*Jelminus(l,k,s,1,m,n)*ThirdMius[j+0*nbFFm](m,n,s)*normal[k]*ratio; - vFor(j + 2*nbFFm) -= 0.5*jump[l]*Jelminus(l,k,s,2,m,n)*ThirdMius[j+0*nbFFm](m,n,s)*normal[k]*ratio; - } - } - } - } - } - for (int j=0; j<nbFFp; j++){ - vFor(j + 0*nbFFp+mDofSize) -= meanDivSecondStress(0,k)*ValPlus[j+0*nbFFp]*normal[k]*ratio; - vFor(j + 1*nbFFp+mDofSize) -= meanDivSecondStress(1,k)*ValPlus[j+0*nbFFp]*normal[k]*ratio; - vFor(j + 2*nbFFp+mDofSize) -= meanDivSecondStress(2,k)*ValPlus[j+0*nbFFp]*normal[k]*ratio; - for (int l=0; l<3; l++){ - for (int m=0; m<3; m++){ - for (int n=0; n<3; n++){ - vFor(j + 0*nbFFp+mDofSize) += 0.5*jump[l]*(LGelplus(l,k,0,m,n)- JFelplus(l,k,n,0,m))*HessPlus[j+0*nbFFp](m,n)*normal[k]*ratio; - vFor(j + 1*nbFFp+mDofSize) += 0.5*jump[l]*(LGelplus(l,k,1,m,n)- JFelplus(l,k,n,1,m))*HessPlus[j+0*nbFFp](m,n)*normal[k]*ratio; - vFor(j + 2*nbFFp+mDofSize) += 0.5*jump[l]*(LGelplus(l,k,2,m,n)- JFelplus(l,k,n,2,m))*HessPlus[j+0*nbFFp](m,n)*normal[k]*ratio; - for (int s=0; s<3; s++){ - vFor(j + 0*nbFFp+mDofSize) -= 0.5*jump[l]*Jelplus(l,k,s,0,m,n)*ThirdPlus[j+0*nbFFp](m,n,s)*normal[k]*ratio; - vFor(j + 1*nbFFp+mDofSize) -= 0.5*jump[l]*Jelplus(l,k,s,1,m,n)*ThirdPlus[j+0*nbFFp](m,n,s)*normal[k]*ratio; - vFor(j + 2*nbFFp+mDofSize) -= 0.5*jump[l]*Jelplus(l,k,s,2,m,n)*ThirdPlus[j+0*nbFFp](m,n,s)*normal[k]*ratio; - } - } - } - } - } - } - */ + } // deformation gradient @@ -453,8 +398,8 @@ void hoDGForceInter::get(MElement *ele,int npts,IntPt *GP,fullVector<double> &vF const STensor33& Qminus = vipv[i]->getConstRefToSecondOrderStress(); const STensor33& Qplus = vipv[i+npts]->getConstRefToSecondOrderStress(); - STensor33 Qmean(0.); // mean of Q - STensor33 FjumpN(0.); // jump of F + static STensor33 Qmean; // mean of Q + static STensor33 FjumpN; // jump of F for (int j=0; j<3; j++){ for (int k=0; k<3; k++){ @@ -489,8 +434,18 @@ void hoDGForceInter::get(MElement *ele,int npts,IntPt *GP,fullVector<double> &vF } // compatibility term [F_ij]*N_k *<d_Q_ijk> - STensor33 FjumNJelminus(0), FjumNJelplus(0), FjumNMeanJFel(0); - STensor3 FjumNJFelminus(0), FjumNJFelplus(0); + static STensor33 FjumNJelminus; + static STensor33 FjumNJelplus; + static STensor33 FjumNMeanJFel; + static STensor3 FjumNJFelminus; + static STensor3 FjumNJFelplus; + + STensorOperation::zero(FjumNJelminus); + STensorOperation::zero(FjumNJelplus); + + STensorOperation::zero(FjumNMeanJFel); + STensorOperation::zero(FjumNJFelminus); + STensorOperation::zero(FjumNJFelplus); for (int j=0; j<3; j++){ for (int k=0; k<3; k++){ @@ -546,7 +501,8 @@ void hoDGForceInter::get(MElement *ele,int npts,IntPt *GP,fullVector<double> &vF } }; // stability term [F_ij]*N_k <beta/hs*J_ijkpqr>[d_F_pq]*N_r - STensor3 FjumNMeanJFelN(0.); + static STensor3 FjumNMeanJFelN; + STensorOperation::zero(FjumNMeanJFelN); for (int j=0; j<3; j++){ for (int k=0; k<3; k++){ for (int l=0; l<3; l++){ @@ -576,41 +532,6 @@ void hoDGForceInter::get(MElement *ele,int npts,IntPt *GP,fullVector<double> &vF vFor(j+ 2*nbFFp+mDofSize) += FjumNMeanJFelN(2,m)*GradPlus[j+0*nbFFp](m)*ratio; } } - - -/* - for(int j=0;j<nbFFm; j++){ - for (int k=0; k<3; k++){ - vFor(j+ 0*nbFFm) += 0.5* FjumNJFelminus(0,k)*GradMinus[j+0*nbFFm](k)*ratio; - vFor(j+ 1*nbFFm) += 0.5* FjumNJFelminus(1,k)*GradMinus[j+0*nbFFm](k)*ratio; - vFor(j+ 2*nbFFm) += 0.5* FjumNJFelminus(2,k)*GradMinus[j+0*nbFFm](k)*ratio; - for (int m = 0; m<3; m++){ - vFor(j+ 0*nbFFm) +=( 0.5*FjumNJelminus(0,k,m)*HessMinus[j+0*nbFFm](k,m) - -(Qmean(0,k,m)+FjumNMeanJFel(0,k,m))*normal[m]*GradMinus[j+0*nbFFm](k))*ratio; - vFor(j+ 1*nbFFm) +=( 0.5*FjumNJelminus(1,k,m)*HessMinus[j+0*nbFFm](k,m) - -(Qmean(1,k,m)+FjumNMeanJFel(1,k,m))*normal[m]*GradMinus[j+0*nbFFm](k))*ratio; - vFor(j+ 2*nbFFm) +=( 0.5*FjumNJelminus(2,k,m)*HessMinus[j+0*nbFFm](k,m) - -(Qmean(2,k,m)+FjumNMeanJFel(2,k,m))*normal[m]*GradMinus[j+0*nbFFm](k))*ratio; - } - } - }; - - for(int j=0;j<nbFFp; j++){ - for (int k=0; k<3; k++){ - vFor(j+ 0*nbFFp+mDofSize) += 0.5* FjumNJFelplus(0,k)*GradPlus[j+0*nbFFm](k)*ratio; - vFor(j+ 1*nbFFp+mDofSize) += 0.5* FjumNJFelplus(1,k)*GradPlus[j+0*nbFFm](k)*ratio; - vFor(j+ 2*nbFFp+mDofSize) += 0.5* FjumNJFelplus(2,k)*GradPlus[j+0*nbFFm](k)*ratio; - for (int m = 0; m<3; m++){ - vFor(j+ 0*nbFFp+mDofSize) +=( 0.5*FjumNJelplus(0,k,m)*HessPlus[j+0*nbFFp](k,m) - +(Qmean(0,k,m)+FjumNMeanJFel(0,k,m))*normal[m]*GradPlus[j+0*nbFFp](k))*ratio; - vFor(j+ 1*nbFFp+mDofSize) +=( 0.5*FjumNJelplus(1,k,m)*HessPlus[j+0*nbFFp](k,m) - +(Qmean(1,k,m)+FjumNMeanJFel(1,k,m))*normal[m]*GradPlus[j+0*nbFFp](k))*ratio; - vFor(j+ 2*nbFFp+mDofSize) +=( 0.5*FjumNJelplus(2,k,m)*HessPlus[j+0*nbFFp](k,m) - +(Qmean(2,k,m)+FjumNMeanJFel(2,k,m))*normal[m]*GradPlus[j+0*nbFFp](k))*ratio; - } - } - }; - */ }; } }; diff --git a/dG3D/src/multipleFieldDG3DTerms.cpp b/dG3D/src/multipleFieldDG3DTerms.cpp index ac817678b43c436aa6d419c3c70e9e7681a25a63..6fa6e1d88bb3df477b58001851c86ea8a0bd7747 100644 --- a/dG3D/src/multipleFieldDG3DTerms.cpp +++ b/dG3D/src/multipleFieldDG3DTerms.cpp @@ -15,14 +15,14 @@ void twoFieldDG3DForceBulk::get(MElement *ele,int npts,IntPt *GP,fullVector<double> &vFor) const { - FunctionSpaceBase* space = _dom->getFunctionSpace(); + const FunctionSpaceBase* space = _dom->getFunctionSpace(); int nbdof = space->getNumKeys(ele); int nbFF = ele->getNumShapeFunctions(); vFor.resize(nbdof); vFor.setAll(0.); - AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ele->getNum()); + const AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ele->getNum()); for (int i = 0; i < npts; i++){ const dG3DEnhancedStrainIPVariable *ipv = static_cast<const dG3DEnhancedStrainIPVariable*>((*vips)[i]->getState(IPStateBase::current)); @@ -59,21 +59,20 @@ void twoFieldDG3DForceBulk::get(MElement *ele,int npts,IntPt *GP,fullVector<doub void twoFieldDG3DStiffnessBulk::get(MElement *ele,int npts,IntPt *GP,fullMatrix<double> &mStiff) const { - FunctionSpaceBase* space = _dom->getFunctionSpace(); + const FunctionSpaceBase* space = _dom->getFunctionSpace(); int nbdof = space->getNumKeys(ele); int nbFF = ele->getNumShapeFunctions(); mStiff.resize(nbdof,nbdof); mStiff.setAll(0.); - AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ele->getNum()); + const AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ele->getNum()); - for (int i = 0; i < npts; i++){ - const dG3DEnhancedStrainIPVariable *ipv = static_cast<const dG3DEnhancedStrainIPVariable*>((*vips)[i]->getState(IPStateBase::current)); - - double weight = GP[i].weight; - double & detJ = ipv->getJacobianDeterminant(ele,GP[i]); - double ratio = detJ*weight; + for (int i = 0; i < npts; i++){ + const dG3DEnhancedStrainIPVariable *ipv = static_cast<const dG3DEnhancedStrainIPVariable*>((*vips)[i]->getState(IPStateBase::current)); + double weight = GP[i].weight; + double & detJ = ipv->getJacobianDeterminant(ele,GP[i]); + double ratio = detJ*weight; const std::vector<TensorialTraits<double>::GradType> &Grads = ipv->gradf(space,ele,GP[i]); const std::vector<TensorialTraits<double>::ValType> &Vals = ipv->f(space,ele,GP[i]); @@ -144,9 +143,9 @@ void twoFieldDG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fullVector< const int nbFFp = ie->getElem(1)->getNumVertices(); const int nbFF = ele->getNumVertices(); - FunctionSpaceBase* minusSpace = _dom->getFunctionSpaceMinus(); - FunctionSpaceBase* plusSpace = _dom->getFunctionSpacePlus(); - FunctionSpaceBase* spaceInter = _dom->getInterfaceFunctionSpace(); + const FunctionSpaceBase* minusSpace = _dom->getFunctionSpaceMinus(); + const FunctionSpaceBase* plusSpace = _dom->getFunctionSpacePlus(); + const FunctionSpaceBase* spaceInter = _dom->getInterfaceFunctionSpace(); const int nbdofm = minusSpace->getNumKeys(ie->getElem(0)); const int nbdofp = plusSpace->getNumKeys(ie->getElem(1)); @@ -157,7 +156,7 @@ void twoFieldDG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fullVector< if(_dom->getFormulation()){ // get value at gauss's point - AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); + const AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); // Values on minus and plus elements IntPt *GPm; IntPt *GPp; _dom->getInterfaceQuadrature()->getIntPoints(ie,GP,&GPm,&GPp); @@ -200,31 +199,46 @@ void twoFieldDG3DForceInter::get(MElement *ele, int npts, IntPt *GP, fullVector< // cohesive term static SVector3 T; - T*=(0.); static SVector3 diffJump; + diffJump = ipvm->getConstRefToJump(); const SVector3& instrain = ipvm->getConstRefToIncompatibleStrainVector(); + if (!broken){ - static STensor3 Sh; - Sh*=(0.); - if (_dom->getMultipleFieldMethod() == 1){ - const STensor43& eHm = ipvm->getConstRefToElasticTangentModuli(); - const STensor43& eHp = ipvp->getConstRefToElasticTangentModuli(); - - for (int j=0; j<3; j++) - for (int k=0; k<3; k++) - for (int l=0; l<3; l++) - for (int s=0; s<3; s++) - Sh(j,k) += 0.5*(eHm(j,l,k,s)+eHp(j,l,k,s))*normal(l)*normal(s); - - } - // compute from stress tensor const STensor3& Pm = ipvm->getConstRefToFirstPiolaKirchhoffStress(); const STensor3& Pp = ipvp->getConstRefToFirstPiolaKirchhoffStress(); - for (int j=0; j<3; j++){ - for (int k=0; k<3; k++){ - T(j) += 0.5*(Pm(j,k)+Pp(j,k))*normal(k) + _beta*Sh(j,k)*instrain(k); + + + if (_dom->getMultipleFieldMethod() == 1){ + const STensor43& eHm = ipvm->getConstRefToElasticTangentModuli(); + const STensor43& eHp = ipvp->getConstRefToElasticTangentModuli(); + + static STensor3 Sh; + for (int j=0; j<3; j++){ + for (int k=0; k<3; k++){ + Sh(j,k) = 0.; + for (int l=0; l<3; l++){ + for (int s=0; s<3; s++){ + Sh(j,k) += 0.5*(eHm(j,l,k,s)+eHp(j,l,k,s))*normal(l)*normal(s); + } + } + } + } + + for (int j=0; j<3; j++){ + T(j) = 0.; + for (int k=0; k<3; k++){ + T(j) += 0.5*(Pm(j,k)+Pp(j,k))*normal(k) + _beta*Sh(j,k)*instrain(k); + } + } + } + else{ + for (int j=0; j<3; j++){ + T(j) = 0.; + for (int k=0; k<3; k++){ + T(j) += 0.5*(Pm(j,k)+Pp(j,k))*normal(k); + } } } } @@ -282,9 +296,9 @@ void twoFieldDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMatrix const int nbFFp = ie->getElem(1)->getNumVertices(); const int nbFF = ele->getNumVertices(); - FunctionSpaceBase* minusSpace = _dom->getFunctionSpaceMinus(); - FunctionSpaceBase* plusSpace = _dom->getFunctionSpacePlus(); - FunctionSpaceBase* spaceInter = _dom->getInterfaceFunctionSpace(); + const FunctionSpaceBase* minusSpace = _dom->getFunctionSpaceMinus(); + const FunctionSpaceBase* plusSpace = _dom->getFunctionSpacePlus(); + const FunctionSpaceBase* spaceInter = _dom->getInterfaceFunctionSpace(); const int nbdofm = minusSpace->getNumKeys(ie->getElem(0)); const int nbdofp = plusSpace->getNumKeys(ie->getElem(1)); @@ -299,7 +313,7 @@ void twoFieldDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMatrix double hs = ie->getCharacteristicSize(); // get value at gauss's point - AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); + const AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); // Values on minus and plus elements IntPt *GPm; IntPt *GPp; _dom->getInterfaceQuadrature()->getIntPoints(ie,GP,&GPm,&GPp); @@ -321,10 +335,9 @@ void twoFieldDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMatrix const std::vector<TensorialTraits<double>::GradType> &Gradsm = ipvm->gradf(minusSpace,ie->getElem(0),GPm[i]); const std::vector<TensorialTraits<double>::GradType> &Gradsp = ipvp->gradf(plusSpace,ie->getElem(1),GPp[i]); - const std::vector<TensorialTraits<double>::ValType> &Valsm = ipvm->f(minusSpace,ie->getElem(0),GPm[i]); const std::vector<TensorialTraits<double>::ValType> &Valsp = ipvp->f(plusSpace,ie->getElem(1),GPp[i]); - + const std::vector<TensorialTraits<double>::ValType>& Vals = ipvm->f(spaceInter,ie,GP[i]); const double weight = GP[i].weight; @@ -338,19 +351,21 @@ void twoFieldDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMatrix bool broken = false; const FractureCohesive3DIPVariable *ipvmf = dynamic_cast<const FractureCohesive3DIPVariable*>(ipvm); if(ipvmf != NULL){ - broken = ipvmf->isbroken(); + broken = ipvmf->isbroken(); } - static STensor33 DdiffJumpDFm, DdiffJumpDFp; - DdiffJumpDFm*=0.; DdiffJumpDFp*=0.; - static STensor3 DdiffJumpDjump(1.), DdiffJumpDinStrain; - DdiffJumpDjump*=0.; - DdiffJumpDjump(0,0)=1.; - DdiffJumpDjump(1,1)=1.; - DdiffJumpDjump(2,2)=1.; - DdiffJumpDinStrain*=0.; - + static STensor33 DdiffJumpDFm; + static STensor33 DdiffJumpDFp; + STensorOperation::zero(DdiffJumpDFm); + STensorOperation::zero(DdiffJumpDFp); + + + static STensor3 DdiffJumpDjump; + static STensor3 DdiffJumpDinStrain; + STensorOperation::unity(DdiffJumpDjump); + STensorOperation::zero(DdiffJumpDinStrain); + if (broken){ const FractureCohesive3DIPVariable *ipvpf = static_cast<const FractureCohesive3DIPVariable*>(ipvp); @@ -375,8 +390,10 @@ void twoFieldDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMatrix } } - STensor33 DTDFm(0.), DTDFp(0.); - STensor3 DTDjump(0.),DTDinStrain(0.); + static STensor33 DTDFm; + static STensor33 DTDFp; + static STensor3 DTDjump; + static STensor3 DTDinStrain; if (broken){ const FractureCohesive3DIPVariable *ipvpf = static_cast<const FractureCohesive3DIPVariable*>(ipvp); @@ -398,34 +415,30 @@ void twoFieldDG3DStiffnessInter::get(MElement *ele,int npts,IntPt *GP,fullMatrix else{ const STensor43& Hm = ipvm->getConstRefToTangentModuli(); const STensor43& Hp = ipvp->getConstRefToTangentModuli(); - + const STensor43& eHm = ipvm->getConstRefToElasticTangentModuli(); + const STensor43& eHp = ipvp->getConstRefToElasticTangentModuli(); + for (int j=0; j<3; j++){ - for (int k=0; k<3; k++){ - for (int p=0; p<3; p++){ - for (int q=0; q<3; q++){ + for (int p=0; p<3; p++){ + DTDinStrain(j,p) = 0.; + DTDjump(j,p) = 0.; + for (int q=0; q<3; q++){ + DTDFm(j,p,q) = 0.; + DTDFp(j,p,q) = 0.; + for (int k=0; k<3; k++){ DTDFm(j,p,q) += 0.5*Hm(j,k,p,q)*normal(k); DTDFp(j,p,q) += 0.5*Hp(j,k,p,q)*normal(k); if (_dom->getMultipleFieldMethod() == 0){ DTDinStrain(j,p) += 0.5*(Hm(j,k,p,q)+Hp(j,k,p,q))*normal(k)*normal(q); } + else if (_dom->getMultipleFieldMethod() == 1){ + DTDinStrain(j,p) += _beta*0.5*(eHm(j,k,p,q)+eHp(j,k,p,q))*normal(k)*normal(q); + }; } } } } - - if (_dom->getMultipleFieldMethod() == 1){ - const STensor43& eHm = ipvm->getConstRefToElasticTangentModuli(); - const STensor43& eHp = ipvp->getConstRefToElasticTangentModuli(); - STensor3 Sh(0.); - for (int j=0; j<3; j++) - for (int k=0; k<3; k++) - for (int l=0; l<3; l++) - for (int s=0; s<3; s++) - Sh(j,k) += 0.5*(eHm(j,l,k,s)+eHp(j,l,k,s))*normal(l)*normal(s); - - DTDinStrain.daxpy(Sh,_beta); - } } @@ -617,9 +630,9 @@ void dG3DTwoFieldForceInter::get(MElement *ele, int npts, IntPt *GP, fullVector< const int nbFFp = ie->getElem(1)->getNumVertices(); const int nbFF = ele->getNumVertices(); - FunctionSpaceBase* minusSpace = _dom->getFunctionSpaceMinus(); - FunctionSpaceBase* plusSpace = _dom->getFunctionSpacePlus(); - FunctionSpaceBase* spaceInter = _dom->getInterfaceFunctionSpace(); + const FunctionSpaceBase* minusSpace = _dom->getFunctionSpaceMinus(); + const FunctionSpaceBase* plusSpace = _dom->getFunctionSpacePlus(); + const FunctionSpaceBase* spaceInter = _dom->getInterfaceFunctionSpace(); const int nbdofm = minusSpace->getNumKeys(ie->getElem(0)); const int nbdofp = plusSpace->getNumKeys(ie->getElem(1)); @@ -630,7 +643,7 @@ void dG3DTwoFieldForceInter::get(MElement *ele, int npts, IntPt *GP, fullVector< if(_dom->getFormulation()){ // get value at gauss's point - AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); + const AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); // Values on minus and plus elements IntPt *GPm; IntPt *GPp; _dom->getInterfaceQuadrature()->getIntPoints(ie,GP,&GPm,&GPp); @@ -680,8 +693,8 @@ void dG3DTwoFieldForceInter::get(MElement *ele, int npts, IntPt *GP, fullVector< // consistent term static SVector3 averagePN; - averagePN*=(0.); for (int j=0; j<3; j++){ + averagePN(j) = 0.; for (int k=0; k<3; k++){ averagePN(j) += (Pm(j,k)+Pp(j,k))*0.5*normal(k); } @@ -703,10 +716,11 @@ void dG3DTwoFieldForceInter::get(MElement *ele, int npts, IntPt *GP, fullVector< const STensor43& eHm = ipvm->getConstRefToElasticTangentModuli(); const STensor43& eHp = ipvp->getConstRefToElasticTangentModuli(); - SVector3 jumpNbhHN(0.); - for (int j=0; j<3; j++){ - for (int k=0; k<3; k++){ - for (int p=0; p<3; p++){ + static SVector3 jumpNbhHN; + for (int p=0; p<3; p++){ + jumpNbhHN(p) = 0.; + for (int j=0; j<3; j++){ + for (int k=0; k<3; k++){ for (int q=0; q<3; q++){ jumpNbhHN(p) += (ujump(j)*normal(k))*0.5*betahs*(eHm(j,k,p,q)+eHp(j,k,p,q))*normal(q); } @@ -727,11 +741,12 @@ void dG3DTwoFieldForceInter::get(MElement *ele, int npts, IntPt *GP, fullVector< // compatibility term static STensor3 jumpNeHm, jumpNeHp; - jumpNeHm*=0.; jumpNeHp*=0.; - for (int j=0; j<3; j++){ - for (int k=0; k<3; k++){ - for (int p=0; p<3; p++){ - for (int q=0; q<3; q++){ + for (int p=0; p<3; p++){ + for (int q=0; q<3; q++){ + jumpNeHm(p,q) = 0.; + jumpNeHp(p,q) = 0.; + for (int j=0; j<3; j++){ + for (int k=0; k<3; k++){ jumpNeHm(p,q) += ujump(j)*normal(k)*eHm(j,k,p,q); jumpNeHp(p,q) += ujump(j)*normal(k)*eHp(j,k,p,q); } @@ -771,10 +786,9 @@ void dG3DTwoFieldForceInter::get(MElement *ele, int npts, IntPt *GP, fullVector< } else{ // twofield formulation - const FractureCohesive3DIPVariable *ipvpf = static_cast<const FractureCohesive3DIPVariable*>(ipvp); - + const FractureCohesive3DIPVariable *ipvpf = static_cast<const FractureCohesive3DIPVariable*>(ipvp); static SVector3 T; - T = ipvmf->getConstRefToInterfaceForce(); + T = ipvmf->getConstRefToInterfaceForce(); T += ipvpf->getConstRefToInterfaceForce(); T*= 0.5; @@ -791,17 +805,17 @@ void dG3DTwoFieldForceInter::get(MElement *ele, int npts, IntPt *GP, fullVector< } - static SVector3 cjump; - cjump = ipvmf->getConstRefToCohesiveJump(); - cjump += ipvpf->getConstRefToCohesiveJump(); - cjump *= (0.5); - - - static SVector3 diffJump; - diffJump = ujump; - diffJump -= ipvmf->getConstRefToDGJump(); - diffJump -= cjump; - + static SVector3 cjump; + cjump = ipvmf->getConstRefToCohesiveJump(); + cjump += ipvpf->getConstRefToCohesiveJump(); + cjump *= (0.5); + + + static SVector3 diffJump; + diffJump = ujump; + diffJump -= ipvmf->getConstRefToDGJump(); + diffJump -= cjump; + if (_dom->getEnrichedUnknownLocation() == partDomain::NODE){ for (int j=0; j< nbFF; j++){ for (int k=0; k<3; k++){ @@ -827,9 +841,9 @@ void dG3DTwoFieldStiffnessInter::get(MElement *ele,int npts,IntPt *GP, fullMatri const int nbFFp = ie->getElem(1)->getNumVertices(); const int nbFF = ele->getNumVertices(); - FunctionSpaceBase* minusSpace = _dom->getFunctionSpaceMinus(); - FunctionSpaceBase* plusSpace = _dom->getFunctionSpacePlus(); - FunctionSpaceBase* spaceInter = _dom->getInterfaceFunctionSpace(); + const FunctionSpaceBase* minusSpace = _dom->getFunctionSpaceMinus(); + const FunctionSpaceBase* plusSpace = _dom->getFunctionSpacePlus(); + const FunctionSpaceBase* spaceInter = _dom->getInterfaceFunctionSpace(); const int nbdofm = minusSpace->getNumKeys(ie->getElem(0)); const int nbdofp = plusSpace->getNumKeys(ie->getElem(1)); @@ -840,7 +854,7 @@ void dG3DTwoFieldStiffnessInter::get(MElement *ele,int npts,IntPt *GP, fullMatri if(_dom->getFormulation()){ // get value at gauss's point - AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); + const AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); // Values on minus and plus elements IntPt *GPm; IntPt *GPp; _dom->getInterfaceQuadrature()->getIntPoints(ie,GP,&GPm,&GPp); @@ -889,7 +903,9 @@ void dG3DTwoFieldStiffnessInter::get(MElement *ele,int npts,IntPt *GP, fullMatri const STensor43& Hm = ipvm->getConstRefToTangentModuli(); const STensor43& Hp = ipvp->getConstRefToTangentModuli(); - STensor33 DaveragePNDFm(0.), DaveragePNDFp(0.); + static STensor33 DaveragePNDFm, DaveragePNDFp; + STensorOperation::zero(DaveragePNDFm); + STensorOperation::zero(DaveragePNDFp); for (int j=0; j<3; j++){ for (int k=0; k<3; k++){ for (int p=0; p<3; p++){ @@ -942,7 +958,8 @@ void dG3DTwoFieldStiffnessInter::get(MElement *ele,int npts,IntPt *GP, fullMatri const STensor43& eHm = ipvm->getConstRefToElasticTangentModuli(); const STensor43& eHp = ipvp->getConstRefToElasticTangentModuli(); - STensor3 NbhHN(0.); + static STensor3 NbhHN; + STensorOperation::zero(NbhHN); for (int j=0; j<3; j++){ for (int k=0; k<3; k++){ for (int p=0; p<3; p++){ @@ -984,7 +1001,8 @@ void dG3DTwoFieldStiffnessInter::get(MElement *ele,int npts,IntPt *GP, fullMatri // compatibility term static STensor33 NeHm, NeHp; - NeHm*=0.; NeHp*=0.; + STensorOperation::zero(NeHm); + STensorOperation::zero(NeHp); for (int j=0; j<3; j++){ for (int k=0; k<3; k++){ for (int p=0; p<3; p++){ @@ -1095,7 +1113,7 @@ void dG3DTwoFieldStiffnessInter::get(MElement *ele,int npts,IntPt *GP, fullMatri } static STensor3 dTDjump; - dTDjump =(ipvmf->getConstRefToDInterfaceForceDjump()); + dTDjump =(ipvmf->getConstRefToDInterfaceForceDjump()); dTDjump += ipvpf->getConstRefToDInterfaceForceDjump(); dTDjump *= 0.5; @@ -1133,7 +1151,7 @@ void dG3DTwoFieldStiffnessInter::get(MElement *ele,int npts,IntPt *GP, fullMatri // twofield formulation static STensor3 dTdinStrain; - dTdinStrain = (ipvmf->getConstRefToDInterfaceForceDIncompatibleStrainVector()); + dTdinStrain = (ipvmf->getConstRefToDInterfaceForceDIncompatibleStrainVector()); dTdinStrain += ipvpf->getConstRefToDInterfaceForceDIncompatibleStrainVector(); dTdinStrain *= (0.5); @@ -1183,12 +1201,12 @@ void dG3DTwoFieldStiffnessInter::get(MElement *ele,int npts,IntPt *GP, fullMatri const STensor3& Sup = ipvpf->getConstRefToDCohesiveJumpDJump(); static STensor3 DdiffJumpDjump; - DdiffJumpDjump*=0; DdiffJumpDjump(0,0)=1.; DdiffJumpDjump(1,1)=1.; DdiffJumpDjump(2,2)=1.; + STensorOperation::unity(DdiffJumpDjump); DdiffJumpDjump.daxpy(Sum,-0.5); DdiffJumpDjump.daxpy(Sup,-0.5); static STensor3 DdiffJumpDinStrain; - DdiffJumpDinStrain = ipvmf->getConstRefToDCohesiveJumpDIncompatibleStrainVector(); + DdiffJumpDinStrain = ipvmf->getConstRefToDCohesiveJumpDIncompatibleStrainVector(); DdiffJumpDinStrain += ipvpf->getConstRefToDCohesiveJumpDIncompatibleStrainVector(); DdiffJumpDinStrain *= (-0.5); diff --git a/dG3D/src/pathFollowingTerms.cpp b/dG3D/src/pathFollowingTerms.cpp index 5e9120d5a9559ebf9633d5e2af406be6ea047d81..fff39643880498571dc431385fde476655e5379a 100644 --- a/dG3D/src/pathFollowingTerms.cpp +++ b/dG3D/src/pathFollowingTerms.cpp @@ -13,84 +13,9 @@ #include "dG3DEnhancedStrainIPVariable.h" #include "highOrderTensor.h" -void dG3DElasticPathFollowingBulkScalarTerm::get(MElement *ele, int npts, IntPt *GP, double &val) const{ - val = 0.; - AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ele->getNum()); - for (int i = 0; i < npts; i++){ - const dG3DIPVariableBase* ipv = dynamic_cast<const dG3DIPVariableBase*>((*vips)[i]->getState(IPStateBase::current)); - const dG3DIPVariableBase* ipvprev = dynamic_cast<const dG3DIPVariableBase*>((*vips)[i]->getState(IPStateBase::previous)); - double weight = GP[i].weight; - double detJ = ipv->getJacobianDeterminant(ele,GP[i]); - val += ((ipv->defoEnergy() -(ipvprev->defoEnergy()) ) *detJ*weight); - }; -}; - -void dG3DElasticPathFollowingBulkLinearTerm::get(MElement *ele,int npts,IntPt *GP,fullVector<double> &m) const{ - FunctionSpaceBase* space = _dom->getFunctionSpace(); - - int nbFF = ele->getNumShapeFunctions(); - int nbdof = space->getNumKeys(ele); - m.resize(nbdof); - m.setAll(0.); - - AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ele->getNum()); - - for (int i = 0; i < npts; i++) - { - const dG3DIPVariableBase* ipv = dynamic_cast<const dG3DIPVariableBase*>((*vips)[i]->getState(IPStateBase::current)); - - double weight = GP[i].weight; - const double & detJ = ipv->getJacobianDeterminant(ele,GP[i]); - const std::vector<TensorialTraits<double>::GradType> &Grads = ipv->gradf(space,ele,GP[i]); - const STensor3& P = ipv->getConstRefToFirstPiolaKirchhoffStress(); - for (int k=0; k< nbFF; k++){ - for (int l=0; l< 3; l++){ - for (int p=0; p< 3; p++){ - m(k+l*nbFF) += P(l,p)*Grads[k+l*nbFF](p)*detJ*weight; - } - } - } - - } - -}; - -void dG3DEnhancedStrainElasticPathFollowingBulkScalarTerm::get(MElement *ele, int npts, IntPt *GP, double &val) const{ - dG3DElasticPathFollowingBulkScalarTerm::get(ele,npts,GP,val); -}; - -void dG3DEnhancedStrainElasticPathFollowingBulkLinearTerm::get(MElement *ele,int npts,IntPt *GP,fullVector<double> &m) const{ - dG3DEnhancedStrainElasticPathFollowingBulkLinearTerm::get(ele,npts,GP,m); - - FunctionSpaceBase* space = _dom->getFunctionSpace(); - int nbFF = ele->getNumShapeFunctions(); - - AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ele->getNum()); - - for (int i = 0; i < npts; i++) - { - const dG3DEnhancedStrainIPVariable* ipv = dynamic_cast<const dG3DEnhancedStrainIPVariable*>((*vips)[i]->getState(IPStateBase::current)); - - double weight = GP[i].weight; - const double & detJ = ipv->getJacobianDeterminant(ele,GP[i]); - - const std::vector<TensorialTraits<double>::ValType> &Vals = ipv->f(space,ele,GP[i]); - const STensor3& P = ipv->getConstRefToFirstPiolaKirchhoffStress(); - for (int k=0; k< nbFF; k++){ - for (int l=0; l< 3; l++){ - for (int p=0; p< 3; p++){ - int row = Tensor23::getIndex(l,p); - m(k+row*nbFF+3*nbFF) += P(l,p)*Vals[k+row*nbFF]*detJ*weight; - } - } - } - } - -}; - void dG3DDissipationPathFollowingBulkScalarTerm::get(MElement *ele, int npts, IntPt *GP, double &val) const{ val = 0.; - AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ele->getNum()); + const AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ele->getNum()); for (int i = 0; i < npts; i++){ const dG3DIPVariableBase* ipv = dynamic_cast<const dG3DIPVariableBase*>((*vips)[i]->getState(IPStateBase::current)); const dG3DIPVariableBase* ipvprev = dynamic_cast<const dG3DIPVariableBase*>((*vips)[i]->getState(IPStateBase::previous)); @@ -103,14 +28,14 @@ void dG3DDissipationPathFollowingBulkScalarTerm::get(MElement *ele, int npts, In }; void dG3DDissipationPathFollowingBulkLinearTerm::get(MElement *ele,int npts,IntPt *GP,fullVector<double> &m) const{ - FunctionSpaceBase* sp = _dom->getFunctionSpace(); + const FunctionSpaceBase* sp = _dom->getFunctionSpace(); int nbFF = ele->getNumShapeFunctions(); int nbdof = sp->getNumKeys(ele); m.resize(nbdof); m.setAll(0.); - AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ele->getNum()); + const AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ele->getNum()); for (int i = 0; i < npts; i++) { @@ -142,10 +67,10 @@ void dG3DEnhancedStrainDissipationPathFollowingBulkLinearTerm::get(MElement *ele dG3DDissipationPathFollowingBulkLinearTerm::get(ele,npts,GP,m); - FunctionSpaceBase* sp = _dom->getFunctionSpace(); + const FunctionSpaceBase* sp = _dom->getFunctionSpace(); int nbFF = ele->getNumShapeFunctions(); - AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ele->getNum()); + const AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ele->getNum()); for (int i = 0; i < npts; i++) { @@ -179,7 +104,7 @@ void dG3DDissipationPathFollowingBoundScalarTerm::get(MElement *ele, int npts, I } if ((ie != NULL) and _dom->getFormulation()){ // get all ipvs - AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); + const AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); for (int i = 0; i < npts; i++){ const IPStateBase *ipsm = (*vips)[i]; @@ -192,10 +117,8 @@ void dG3DDissipationPathFollowingBoundScalarTerm::get(MElement *ele, int npts, I const FractureCohesive3DIPVariable *ipvp = dynamic_cast<const FractureCohesive3DIPVariable*>(ipsp->getState(IPStateBase::current)); const FractureCohesive3DIPVariable *ipvpprev = dynamic_cast<const FractureCohesive3DIPVariable*>(ipsp->getState(IPStateBase::previous)); - // Coordonate of Gauss' point i - const double u = GP[i].pt[0]; const double v = GP[i].pt[1]; const double w = GP[i].pt[2]; const double weight = GP[i].weight; - double detJ = ele->getJacobianDeterminant(u, v, w); + double detJ = ipvm->getJacobianDeterminant(ie,GP[i]); const Cohesive3DIPVariable* cipvm = ipvm->getIPvFrac(); const Cohesive3DIPVariable* cipvmprev = ipvmprev->getIPvFrac(); @@ -217,9 +140,9 @@ void dG3DDissipationPathFollowingBoundScalarTerm::get(MElement *ele, int npts, I void dG3DDissipationPathFollowingBoundLinearTerm::get(MElement *ele,int npts,IntPt *GP,fullVector<double> &m) const{ if(_dom->getFormulation()) { - FunctionSpaceBase* spaceMinus = _dom->getFunctionSpaceMinus(); - FunctionSpaceBase* spacePlus = _dom->getFunctionSpacePlus(); - FunctionSpaceBase* spaceInter = _dom->getInterfaceFunctionSpace(); + const FunctionSpaceBase* spaceMinus = _dom->getFunctionSpaceMinus(); + const FunctionSpaceBase* spacePlus = _dom->getFunctionSpacePlus(); + const FunctionSpaceBase* spaceInter = _dom->getInterfaceFunctionSpace(); MInterfaceElement *ie = dynamic_cast<MInterfaceElement*>(ele); const int nbFFm = ie->getElem(0)->getNumVertices(); @@ -229,7 +152,7 @@ void dG3DDissipationPathFollowingBoundLinearTerm::get(MElement *ele,int npts,Int m.resize(nbdofm+nbdofp); m.scale(0.); - AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); + const AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); // Values on minus and plus elements IntPt *GPm; IntPt *GPp; _dom->getInterfaceQuadrature()->getIntPoints(ie,GP,&GPm,&GPp); @@ -254,7 +177,7 @@ void dG3DDissipationPathFollowingBoundLinearTerm::get(MElement *ele,int npts,Int const Cohesive3DIPVariable* cipvp = ipvp->getIPvFrac(); static SVector3 dirrEnergDJump; - dirrEnergDJump = cipvm->getConstRefToDIrreversibleEnergyDJump(); + dirrEnergDJump = cipvm->getConstRefToDIrreversibleEnergyDJump(); dirrEnergDJump += cipvp->getConstRefToDIrreversibleEnergyDJump(); dirrEnergDJump*= 0.5; @@ -336,9 +259,9 @@ void twoFieldDG3DDissipationPathFollowingBoundLinearTerm::get(MElement *ele,int { MInterfaceElement *ie = dynamic_cast<MInterfaceElement*>(ele); - FunctionSpaceBase* spaceMinus = _dom->getFunctionSpaceMinus(); - FunctionSpaceBase* spacePlus = _dom->getFunctionSpacePlus(); - FunctionSpaceBase* spaceInter = _dom->getInterfaceFunctionSpace(); + const FunctionSpaceBase* spaceMinus = _dom->getFunctionSpaceMinus(); + const FunctionSpaceBase* spacePlus = _dom->getFunctionSpacePlus(); + const FunctionSpaceBase* spaceInter = _dom->getInterfaceFunctionSpace(); const int nbFFm = ie->getElem(0)->getNumVertices(); const int nbFFp = ie->getElem(1)->getNumVertices(); @@ -351,7 +274,7 @@ void twoFieldDG3DDissipationPathFollowingBoundLinearTerm::get(MElement *ele,int m.scale(0.); - AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); + const AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ie->getNum()); // Values on minus and plus elements IntPt *GPm; IntPt *GPp; _dom->getInterfaceQuadrature()->getIntPoints(ie,GP,&GPm,&GPp); @@ -377,12 +300,12 @@ void twoFieldDG3DDissipationPathFollowingBoundLinearTerm::get(MElement *ele,int const Cohesive3DIPVariable* cipvp = ipvp->getIPvFrac(); static SVector3 dirrEnergDJump; - dirrEnergDJump = cipvm->getConstRefToDIrreversibleEnergyDJump(); + dirrEnergDJump = cipvm->getConstRefToDIrreversibleEnergyDJump(); dirrEnergDJump += cipvp->getConstRefToDIrreversibleEnergyDJump(); dirrEnergDJump*= 0.5; static SVector3 dirrEnergDInStrain; - dirrEnergDInStrain = cipvm->getConstRefToDIrreversibleEnergyDIncompatibleStrainVector(); + dirrEnergDInStrain = cipvm->getConstRefToDIrreversibleEnergyDIncompatibleStrainVector(); dirrEnergDInStrain += cipvp->getConstRefToDIrreversibleEnergyDIncompatibleStrainVector(); dirrEnergDInStrain *= 0.5; @@ -431,9 +354,9 @@ void dG3DNonLocalDissipationPathFollowingBulkScalarTerm::get(MElement *ele, int void dG3DNonLocalDissipationPathFollowingBulkLinearTerm::get(MElement *ele,int npts,IntPt *GP,fullVector<double> &m) const{ dG3DDissipationPathFollowingBulkLinearTerm::get(ele,npts,GP,m); - AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ele->getNum()); + const AllIPState::ipstateElementContainer *vips = _ipf->getAips()->getIPstate(ele->getNum()); - FunctionSpaceBase* space = _dom->getFunctionSpace(); + const FunctionSpaceBase* space = _dom->getFunctionSpace(); int nbFF = ele->getNumShapeFunctions(); for (int i = 0; i < npts; i++) diff --git a/dG3D/src/pathFollowingTerms.h b/dG3D/src/pathFollowingTerms.h index d806f67aa9ae5e3c30844427f5d018e783207699..ccd3da5ca3fcc5a2eefa510eacf953c07ac5a0e7 100644 --- a/dG3D/src/pathFollowingTerms.h +++ b/dG3D/src/pathFollowingTerms.h @@ -15,79 +15,6 @@ #include "ipField.h" #include "dG3DCohesiveBandIPVariable.h" -class dG3DElasticPathFollowingBulkScalarTerm : public ScalarTermBase<double>{ - protected: - const IPField* _ipf; - const partDomain* _dom; - - public: - dG3DElasticPathFollowingBulkScalarTerm(const partDomain* dom, const IPField* ip):_dom(dom), _ipf(ip){} - virtual ~dG3DElasticPathFollowingBulkScalarTerm(){} - - virtual void get(MElement *ele, int npts, IntPt *GP, double &val) const; - virtual void get(MElement *ele, int npts, IntPt *GP, std::vector<double> &vval) const { - Msg::Fatal("dG3DElasticPathFollowingBulkScalarTerm::get(MElement *ele, int npts, IntPt *GP, std::vector<T2> &vval) is not defined"); - }; - virtual ScalarTermBase<double>* clone () const {return new dG3DElasticPathFollowingBulkScalarTerm(_dom,_ipf);}; - -}; - -class dG3DElasticPathFollowingBulkLinearTerm : public LinearTermBase<double>{ - protected: - const IPField* _ipf; - const partDomain* _dom; - - public: - dG3DElasticPathFollowingBulkLinearTerm(const partDomain* dom,const IPField* ip): LinearTermBase<double>(),_dom(dom),_ipf(ip){}; - virtual ~dG3DElasticPathFollowingBulkLinearTerm(){} - - virtual void get(MElement *ele,int npts,IntPt *GP,fullVector<double> &m) const; - virtual void get(MElement *ele, int npts, IntPt *GP, std::vector<fullVector<double> > &mv) const - { - Msg::Fatal("Define me get by integration point dG3DElasticPathFollowingBulkLinearTerm"); - } - - virtual LinearTermBase<double>* clone () const - { - return new dG3DElasticPathFollowingBulkLinearTerm(_dom,_ipf); - } -}; - -class dG3DEnhancedStrainElasticPathFollowingBulkScalarTerm : public dG3DElasticPathFollowingBulkScalarTerm{ - protected: - - public: - dG3DEnhancedStrainElasticPathFollowingBulkScalarTerm(const partDomain* dom, const IPField* ip):dG3DElasticPathFollowingBulkScalarTerm(dom,ip){} - virtual ~dG3DEnhancedStrainElasticPathFollowingBulkScalarTerm(){} - - virtual void get(MElement *ele, int npts, IntPt *GP, double &val) const; - virtual void get(MElement *ele, int npts, IntPt *GP, std::vector<double> &vval) const { - Msg::Fatal("dG3DEnhancedStrainElasticPathFollowingBulkScalarTerm::get(MElement *ele, int npts, IntPt *GP, std::vector<T2> &vval) is not defined"); - }; - virtual ScalarTermBase<double>* clone () const {return new dG3DEnhancedStrainElasticPathFollowingBulkScalarTerm(_dom,_ipf);}; - -}; - -class dG3DEnhancedStrainElasticPathFollowingBulkLinearTerm : public dG3DElasticPathFollowingBulkLinearTerm { - protected: - - - public: - dG3DEnhancedStrainElasticPathFollowingBulkLinearTerm(const partDomain* dom,const IPField* ip): dG3DElasticPathFollowingBulkLinearTerm(dom,ip){}; - virtual ~dG3DEnhancedStrainElasticPathFollowingBulkLinearTerm(){} - - virtual void get(MElement *ele,int npts,IntPt *GP,fullVector<double> &m) const; - virtual void get(MElement *ele, int npts, IntPt *GP, std::vector<fullVector<double> > &mv) const - { - Msg::Fatal("Define me get by integration point dG3DEnhancedStrainElasticPathFollowingBulkLinearTerm"); - } - - virtual LinearTermBase<double>* clone () const - { - return new dG3DEnhancedStrainElasticPathFollowingBulkLinearTerm(_dom,_ipf); - } -}; - class dG3DDissipationPathFollowingBulkScalarTerm : public ScalarTermBase<double>{ protected: const IPField* _ipf; diff --git a/dgshell/src/dgC0ShellFunctionSpace.h b/dgshell/src/dgC0ShellFunctionSpace.h index af45c19655c042a9e6db9104a068f39f761c63f3..4c6a95baefd043d5c147f377b4f49dcdd932b4fe 100644 --- a/dgshell/src/dgC0ShellFunctionSpace.h +++ b/dgshell/src/dgC0ShellFunctionSpace.h @@ -369,7 +369,7 @@ class DgC0FullDgLagrangeBetween2DomainsFunctionSpace : public IsoparametricLagra protected: FunctionSpaceBase *spaceMinus; FunctionSpaceBase *spacePlus; - virtual void getKeysOnElement(MElement *ele, std::vector<Dof> &keys){ + virtual void getKeysOnElement(MElement *ele, std::vector<Dof> &keys) const { Msg::Error("Impossible to get key for an element on a interface Domain"); } public: @@ -381,18 +381,21 @@ class DgC0FullDgLagrangeBetween2DomainsFunctionSpace : public IsoparametricLagra return new DgC0FullDgLagrangeBetween2DomainsFunctionSpace(spaceMinus,spacePlus); } - virtual void getKeys(MInterfaceElement *iele, std::vector<Dof> &keys){ + virtual void getKeys(MInterfaceElement *iele, std::vector<Dof> &keys) const{ spaceMinus->getKeys(iele->getElem(0),keys); spacePlus->getKeys(iele->getElem(1),keys); } - virtual void getKeys(MElement *ele, std::vector<Dof> &keys){ + virtual void getKeys(MElement *ele, std::vector<Dof> &keys) const{ // As all element are interface element on an interface domain MInterfaceElement *iele = dynamic_cast<MInterfaceElement*>(ele); this->getKeys(iele,keys); } // special function of interFunctionSpace - virtual FunctionSpaceBase* getMinusSpace()const {return spaceMinus;} - virtual FunctionSpaceBase* getPlusSpace() const {return spacePlus;} + virtual FunctionSpaceBase* getMinusSpace() {return spaceMinus;} + virtual FunctionSpaceBase* getPlusSpace() {return spacePlus;} + + virtual const FunctionSpaceBase* getMinusSpace()const {return spaceMinus;} + virtual const FunctionSpaceBase* getPlusSpace() const {return spacePlus;} virtual void getNumKeys(MInterfaceElement *ele, int &numMinus, int &numPlus) const { numMinus = spaceMinus->getNumKeys(ele->getElem(0)); diff --git a/dgshell/src/dgC0ShellRigidContactSpace.h b/dgshell/src/dgC0ShellRigidContactSpace.h index db206eb398990065fcc7a5375d0fda5affdc9f21..d5df9836c2df0d2ceb0c3375db59469f4ccba467 100644 --- a/dgshell/src/dgC0ShellRigidContactSpace.h +++ b/dgshell/src/dgC0ShellRigidContactSpace.h @@ -18,7 +18,7 @@ class dgC0ShellRigidContactSpace : public rigidContactSpaceBase{ dgC0ShellRigidContactSpace(const int id, FunctionSpace<double> *sp, MVertex *ver) : rigidContactSpaceBase(id,sp,ver){} dgC0ShellRigidContactSpace(const int id, FunctionSpace<double> *sp, MVertex *ver, const int comp1, const int comp2 = -1, const int comp3 =-1) : rigidContactSpaceBase(id,sp,ver,comp1,comp2,comp3){} - virtual void getKeys(MElement *ele,std::vector<Dof> &keys){ + virtual void getKeys(MElement *ele,std::vector<Dof> &keys) const{ if(ele->getDim() != 0){ // if dim 0 return the key of gravity center only !! _space->getKeys(ele,keys); } @@ -26,18 +26,18 @@ class dgC0ShellRigidContactSpace : public rigidContactSpaceBase{ keys.push_back(Dof(_gc->getNum(),Dof3IntType::createTypeWithThreeInts(_comp[i],_id))); } } - virtual int getNumKeys(MElement *ele){ + virtual int getNumKeys(MElement *ele) const{ int nkeysele = _space->getNumKeys(ele); return nkeysele + _comp.size(); } - virtual void getKeysOfGravityCenter(std::vector<Dof> &keys){ + virtual void getKeysOfGravityCenter(std::vector<Dof> &keys) const{ for(int i=0;i<_comp.size(); i++) keys.push_back(Dof(_gc->getNum(),Dof3IntType::createTypeWithThreeInts(_comp[i],_id))); } - virtual int getNumKeysOfGravityCenter(){ + virtual int getNumKeysOfGravityCenter() const{ return _comp.size(); } - virtual void getKeys(MElement *ele, const int ind, std::vector<Dof> &keys){ + virtual void getKeys(MElement *ele, const int ind, std::vector<Dof> &keys) const{ // generate keys of element and select the good ones after LAGRANGE OK ?? CHANGE THIS HOW TODO std::vector<Dof> tkeys; this->getKeys(ele,tkeys); @@ -48,7 +48,7 @@ class dgC0ShellRigidContactSpace : public rigidContactSpaceBase{ keys.push_back(tkeys[ind+i*nbver]); this->getKeysOfGravityCenter(keys); } - virtual int getNumKeys(MElement *ele, int ind){ + virtual int getNumKeys(MElement *ele, int ind) const{ return 2*_comp.size(); } }; diff --git a/dgshell/src/dgC0ShellTerms.cpp b/dgshell/src/dgC0ShellTerms.cpp index d60919a9cba190ca7da9a10b522e065e04627be7..2af8facbf9ab41c240aa04da58490db65379e877 100644 --- a/dgshell/src/dgC0ShellTerms.cpp +++ b/dgshell/src/dgC0ShellTerms.cpp @@ -259,7 +259,7 @@ void IsotropicForceBulkTermC0DgShell::get(MElement *ele,int npts,IntPt *GP,fullV m2.resize(6*npts,nbdof,false); // set operation --> no need to setAll 0 here // get gauss' point data - AllIPState::ipstateElementContainer* vips = ipf->getAips()->getIPstate(ele->getNum()); + const AllIPState::ipstateElementContainer* vips = ipf->getAips()->getIPstate(ele->getNum()); // set matrix m1 and m2 (one set by component x,y,z for m1) // get the shape function (and derivative values) @@ -273,7 +273,7 @@ void IsotropicForceBulkTermC0DgShell::get(MElement *ele,int npts,IntPt *GP,fullV // Coordonate of Gauss' point i // u = GP[i].pt[0]; v = GP[i].pt[1]; w = GP[i].pt[2]; // ipv data - IPStateBase* ips = (*vips)[i]; + const IPStateBase* ips = (*vips)[i]; const IPVariableShell *ipv = static_cast<const IPVariableShell*>(ips->getState(IPStateBase::current)); const shellLocalBasis *lb = ipv->getshellLocalBasis(); const Bvector *B = ipv->getBvector(); diff --git a/dgshell/src/dgNonLinearShellTerms.cpp b/dgshell/src/dgNonLinearShellTerms.cpp index 2ccd6dc93da81fd266c44782a1ffe71bcc29c053..3c8b1b2314de529efc16ebf2fd132e135234714d 100644 --- a/dgshell/src/dgNonLinearShellTerms.cpp +++ b/dgshell/src/dgNonLinearShellTerms.cpp @@ -19,7 +19,7 @@ void dgNonLinearShellForceBulk::get(MElement *ele,int npts,IntPt *GP,fullVector< m.resize(nbdof); m.scale(0.); // get IPVariable of element - AllIPState::ipstateElementContainer* vips = _ipf->getAips()->getIPstate(ele->getNum()); + const AllIPState::ipstateElementContainer* vips = _ipf->getAips()->getIPstate(ele->getNum()); // Shape functions values at Gauss points nlsFunctionSpaceUVW<double>* sp1 = static_cast<nlsFunctionSpaceUVW<double>*>(&(this->space1)); std::vector<GaussPointSpaceValues<double>*> vgps; diff --git a/dgshell/src/dgShellDomain.h b/dgshell/src/dgShellDomain.h index 170a89faf739605b040f9d5f1631d04829679f79..39592a6cf4e0b49183d0a38d1b35df4c7b7ab239 100644 --- a/dgshell/src/dgShellDomain.h +++ b/dgshell/src/dgShellDomain.h @@ -55,7 +55,7 @@ class dgLinearShellDomain : public dgPartDomain{ fullVector<double> &dispp, fullVector<double> &dispExtra, const bool virt, bool stiff, const bool checkfrac=true); virtual void computeIPVariable(AllIPState *aips,const unknownField *ufield,const IPStateBase::whichState ws, bool stiff); - virtual void checkFailure(AllIPState* aips){ + virtual void checkFailure(IPField* ipf) const{ // Msg::Warning("This function checkFailure is not defined "); } virtual FunctionSpaceBase* getSpaceForBC(const nonLinearBoundaryCondition::type bc_type, const nonLinearBoundaryCondition::location bc_location, @@ -77,10 +77,17 @@ class dgLinearShellDomain : public dgPartDomain{ const simpleFunctionTime<double>* f, const unknownField *uf, const IPField * ip, nonLinearBoundaryCondition::location onWhat) const; virtual double scaleTimeStep() const {return _sts;} - virtual FunctionSpaceBase* getFunctionSpace() const{return _space;} - virtual FunctionSpaceBase* getFunctionSpaceMinus() const{return _spaceMinus;} - virtual FunctionSpaceBase* getFunctionSpacePlus() const{return _spacePlus;} - virtual FunctionSpaceBase* getInterfaceFunctionSpace() const { + virtual FunctionSpaceBase* getFunctionSpace(){return _space;} + virtual const FunctionSpaceBase* getFunctionSpace() const{return _space;} + virtual FunctionSpaceBase* getFunctionSpaceMinus(){return _spaceMinus;} + virtual const FunctionSpaceBase* getFunctionSpaceMinus() const{return _spaceMinus;} + virtual FunctionSpaceBase* getFunctionSpacePlus() {return _spacePlus;} + virtual const FunctionSpaceBase* getFunctionSpacePlus() const{return _spacePlus;} + virtual FunctionSpaceBase* getInterfaceFunctionSpace() { + Msg::Error("getInterfaceFunctionSpace is not defined"); + return NULL; + } + virtual const FunctionSpaceBase* getInterfaceFunctionSpace() const { Msg::Error("getInterfaceFunctionSpace is not defined"); return NULL; }