diff --git a/NonLinearSolver/BoundaryConditions/nonLinearMicroBC.cpp b/NonLinearSolver/BoundaryConditions/nonLinearMicroBC.cpp index fd47546606b93ad98c7975e6655adfcfbff27f03..1516f89d0e265bbbc3b0864508c8132c24a7c9ac 100644 --- a/NonLinearSolver/BoundaryConditions/nonLinearMicroBC.cpp +++ b/NonLinearSolver/BoundaryConditions/nonLinearMicroBC.cpp @@ -37,6 +37,33 @@ nonLinearMicroBC::nonLinearMicroBC(const nonLinearMicroBC& src): } +void nonLinearMicroBC::collecDataFromPrevious(const nonLinearMicroBC& src){ + // only values are transferred + _constrainedDofs = src._constrainedDofs; + _constrainedMechaDofs = src._constrainedMechaDofs; + _constrainedConDofs = src._constrainedConDofs; + _constrainedNonConDofs = src._constrainedNonConDofs; + _totalMechaDofNumber = src._totalMechaDofNumber; + _totalConDofNumber = src._totalConDofNumber; + _totalNonConDofNumber = src._totalNonConDofNumber; + // previous kinematic variables + Fprev = src.Fcur; + Gprev = src.Gcur; + gradTprev = src.gradTcur; + Tprev = src.Tcur; + Tinit = src.Tinit; + gradVprev = src.gradVcur; + FI *= 0.; + G *=0.; + for (int i=0; i< gradT.size(); i++){ + gradT[i]*= 0.; + T[i] = 0.; + } + for (int i=0; i< gradV.size(); i++){ + gradV[i]*=0.; + } +}; + nonLinearMicroBC::~nonLinearMicroBC(){ for (int i=0; i< _g.size(); i++){ if (_g[i]!= NULL) delete _g[i]; @@ -234,11 +261,12 @@ nonLinearPeriodicBC::nonLinearPeriodicBC(const int tag, const int dim): nonLinearMicroBC(tag,dim),_XaddNewVertices(false),_Xdegree(3), _YaddNewVertices(false),_Ydegree(3), _ZaddNewVertices(false),_Zdegree(3), - _wM(nonLinearPeriodicBC::CEM),_forceInterp(false){ } + _wM(nonLinearPeriodicBC::CEM),_forceInterp(false), + _isShifted(false),_shiftPBCNormal(0.,0.,0.){ } nonLinearPeriodicBC::nonLinearPeriodicBC(const nonLinearPeriodicBC& src):nonLinearMicroBC(src), _wM(src._wM),_Xdegree(src._Xdegree),_XaddNewVertices(src._XaddNewVertices),_Ydegree(src._Ydegree), _YaddNewVertices(src._YaddNewVertices),_Zdegree(src._Zdegree),_ZaddNewVertices(src._ZaddNewVertices), - _forceInterp(src._forceInterp) + _forceInterp(src._forceInterp),_isShifted(src._isShifted),_shiftPBCNormal(src._shiftPBCNormal) { }; @@ -304,6 +332,21 @@ void nonLinearPeriodicBC::setPeriodicBCOptions(const int method, const int seg, } }; + +void nonLinearPeriodicBC::setShiftedBC(const bool fl){ + _isShifted = fl; +} +void nonLinearPeriodicBC::setShiftPBCNormal(const double n1, const double n2, const double n3){ + _shiftPBCNormal[0] = n1; + _shiftPBCNormal[1] = n2; + _shiftPBCNormal[2] = n3; + _shiftPBCNormal.normalize(); +}; +void nonLinearPeriodicBC::setShiftPBCNormal(const SVector3& n){ + this->setShiftPBCNormal(n[0],n[1],n[2]); + printf("set Shifted PBC = [%f %f %f]\n",n[0],n[1],n[2]); +}; + nonLinearDisplacementBC::nonLinearDisplacementBC( const int tag, const int dim): nonLinearMicroBC(tag,dim){}; @@ -320,3 +363,85 @@ nonLinearMixedBC::nonLinearMixedBC(const nonLinearMixedBC& src) : nonLinearMicro _kPhysical(src._kPhysical),_sPhysical(src._sPhysical),_fixVertices(src._fixVertices), _additionalSecondOrderStaticPhysical(src._additionalSecondOrderStaticPhysical),_negativeFactor(src._negativeFactor), _periodicNegative(src._periodicNegative),_periodicPositive(src._periodicPositive){} + +nonLinearOrthogonalMixedBCDirectionFollowing::nonLinearOrthogonalMixedBCDirectionFollowing(const int tag, const int dim): +nonLinearMicroBC(tag,dim){} + +nonLinearOrthogonalMixedBCDirectionFollowing::nonLinearOrthogonalMixedBCDirectionFollowing(const nonLinearOrthogonalMixedBCDirectionFollowing& src): +nonLinearMicroBC(src),_KUBCDirection(src._KUBCDirection),_SUBCDirection(src._SUBCDirection){} + +void nonLinearOrthogonalMixedBCDirectionFollowing::setKUBCDirection(const SVector3& dir){ +_KUBCDirection.push_back(dir); +}; +void nonLinearOrthogonalMixedBCDirectionFollowing::setSUBCDirection(const SVector3& dir){ +_SUBCDirection.push_back(dir); +}; + +void nonLinearOrthogonalMixedBCDirectionFollowing::setKUBCDirection(const double nx, const double ny, const double nz){ + SVector3 n(nx,ny,nz); + n.normalize(); + _KUBCDirection.push_back(n); +}; +void nonLinearOrthogonalMixedBCDirectionFollowing::setSUBCDirection(const double nx, const double ny, const double nz){ + SVector3 n(nx,ny,nz); + n.normalize(); + _SUBCDirection.push_back(n); +}; + +void nonLinearOrthogonalMixedBCDirectionFollowing::clearDirs(){ _KUBCDirection.clear(); _SUBCDirection.clear();}; + + +nonLinearMixedBCDirectionFollowing::nonLinearMixedBCDirectionFollowing(const int tag, const int dim): + nonLinearMicroBC(tag,dim){} + +nonLinearMixedBCDirectionFollowing::nonLinearMixedBCDirectionFollowing(const nonLinearMixedBCDirectionFollowing& src): + nonLinearMicroBC(src),_KUBCDirection(src._KUBCDirection),_SUBCDirection(src._SUBCDirection), + _PBCNormalDirection(src._PBCNormalDirection), _PBCDirection(src._PBCDirection), + _rootPhysical(src._rootPhysical), + _interpolationDegree(src._interpolationDegree), + _fullConstrained(src._fullConstrained){} + +void nonLinearMixedBCDirectionFollowing::setKUBCDirection(const SVector3& dir){ + _KUBCDirection.push_back(dir); +}; +void nonLinearMixedBCDirectionFollowing::setSUBCDirection(const SVector3& dir){ + _SUBCDirection.push_back(dir); +}; + +void nonLinearMixedBCDirectionFollowing::setPBCDirection(const SVector3& dir, const SVector3& norm, const bool full){ + _PBCDirection.push_back(dir); + _PBCNormalDirection.push_back(norm); + _fullConstrained.push_back(full); +}; + +void nonLinearMixedBCDirectionFollowing::setKUBCDirection(const double nx, const double ny, const double nz){ + SVector3 n(nx,ny,nz); + n.normalize(); + _KUBCDirection.push_back(n); +}; +void nonLinearMixedBCDirectionFollowing::setSUBCDirection(const double nx, const double ny, const double nz){ + SVector3 n(nx,ny,nz); + n.normalize(); + _SUBCDirection.push_back(n); +}; + +void nonLinearMixedBCDirectionFollowing::setPBCDirection(const double nx, const double ny, const double nz, + const double tx, const double ty, const double tz, const bool fullConstrained ){ + SVector3 n(nx,ny,nz); + n.normalize(); + _PBCNormalDirection.push_back(n); + + SVector3 t(tx,ty,tz); + t.normalize(); + _PBCDirection.push_back(t); + + _fullConstrained.push_back(fullConstrained); +}; + +void nonLinearMixedBCDirectionFollowing::setRootPhysical(const int phy){ + _rootPhysical.push_back(phy); +}; + +void nonLinearMixedBCDirectionFollowing::setInterpolationDegree(const int deg){ + _interpolationDegree.push_back(deg); +}; \ No newline at end of file diff --git a/NonLinearSolver/BoundaryConditions/nonLinearMicroBC.h b/NonLinearSolver/BoundaryConditions/nonLinearMicroBC.h index 35d28db614be22f1f58cebe2f5c4bbff5e6e8d32..a4785e566e196b0a3c1301f08030cdedbd09bdbb 100644 --- a/NonLinearSolver/BoundaryConditions/nonLinearMicroBC.h +++ b/NonLinearSolver/BoundaryConditions/nonLinearMicroBC.h @@ -21,7 +21,7 @@ class nonLinearMicroBC{ public: - enum whichBCType{LDBC =0, PBC=1, MKBC=2, MIXBC=3}; // Linear displacement BC, periodic BC, minimal kinematical BC, mixed BC + enum whichBCType{LDBC =0, PBC=1, MKBC=2, MIXBC=3, OrthogonalDirectionalMixedBC =4, DirectionalMIXBC=5}; // Linear displacement BC, periodic BC, minimal kinematical BC, mixed BC #ifndef SWIG protected: @@ -103,6 +103,8 @@ public: #ifndef SWIG nonLinearMicroBC(const int tag, const int dim); nonLinearMicroBC(const nonLinearMicroBC& src); + + virtual void collecDataFromPrevious(const nonLinearMicroBC& src); const STensor3& getPreviousDeformationGradient() const {return Fprev;}; const STensor3& getCurrentDeformationGradient() const{return Fcur;}; @@ -411,15 +413,20 @@ class nonLinearPeriodicBC: public nonLinearMicroBC{ bool _forceInterp; // true if forcing setting value // false if checking with existing vertex + + // for shiftedBC + bool _isShifted; + SVector3 _shiftPBCNormal; // by a plane whose normal is _shiftPBCNormal + public: nonLinearPeriodicBC(const int tag, const int dim); #ifndef SWIG - nonLinearPeriodicBC(const nonLinearPeriodicBC& src); - virtual ~nonLinearPeriodicBC(){}; + nonLinearPeriodicBC(const nonLinearPeriodicBC& src); + virtual ~nonLinearPeriodicBC(){}; virtual nonLinearMicroBC::whichBCType getType() const {return nonLinearMicroBC::PBC;}; - virtual nonLinearMicroBC* clone() const {return new nonLinearPeriodicBC(*this);}; + virtual nonLinearMicroBC* clone() const {return new nonLinearPeriodicBC(*this);}; int getMaxDegree() const{ @@ -456,7 +463,11 @@ class nonLinearPeriodicBC: public nonLinearMicroBC{ else if (i==2) return _Zdegree; else Msg::Fatal("direction must be correctly defined getPBCPolynomialDegree(i)"); } - + + const SVector3& getShiftPBCNormal() const {return _shiftPBCNormal;}; + void setShiftPBCNormal(const SVector3& n); + bool isShifted() const{return _isShifted;}; + #endif //SWIG void setAddNewVertices(const int i, const bool add = true) { @@ -481,10 +492,12 @@ class nonLinearPeriodicBC: public nonLinearMicroBC{ void setPBCMethod(const int i){ _wM = whichMethod(i); } - void setPeriodicBCOptions(const int method, const int seg = 5, const bool addvertex = 0); - + void setPeriodicBCOptions(const int method, const int seg = 5, const bool addvertex = 0); + void setShiftedBC(const bool fl); + void setShiftPBCNormal(const double n1, const double n2, const double n3); }; + class nonLinearDisplacementBC : public nonLinearMicroBC{ public: @@ -571,7 +584,85 @@ class nonLinearMixedBC : public nonLinearMicroBC{ _periodicNegative.push_back(std::pair<int,int>(neg,comp)); _negativeFactor = negFact; }; +}; + +class nonLinearOrthogonalMixedBCDirectionFollowing : public nonLinearMicroBC{ + #ifndef SWIG + protected: + std::vector<SVector3> _KUBCDirection; + std::vector<SVector3> _SUBCDirection; + #endif // SWIG + + public: + nonLinearOrthogonalMixedBCDirectionFollowing(const int tag, const int dim); + #ifndef SWIG + nonLinearOrthogonalMixedBCDirectionFollowing(const nonLinearOrthogonalMixedBCDirectionFollowing& src); + virtual ~nonLinearOrthogonalMixedBCDirectionFollowing(){}; + + virtual nonLinearMicroBC::whichBCType getType() const{ + return nonLinearMicroBC::OrthogonalDirectionalMixedBC; + }; + + const std::vector<SVector3>& getKUBCDirection() const {return _KUBCDirection;}; + const std::vector<SVector3>& getSUBCDirection() const {return _SUBCDirection;}; + virtual nonLinearMicroBC* clone() const {return new nonLinearOrthogonalMixedBCDirectionFollowing(*this);} + + void setKUBCDirection(const SVector3& dir); + void setSUBCDirection(const SVector3& dir); + void clearDirs(); + #endif // SWIG + void setKUBCDirection(const double nx, const double ny, const double nz); + void setSUBCDirection(const double nx, const double ny, const double nz); }; +class nonLinearMixedBCDirectionFollowing : public nonLinearMicroBC{ + #ifndef SWIG + protected: + std::vector<SVector3> _KUBCDirection; + std::vector<SVector3> _SUBCDirection; + std::vector<SVector3> _PBCDirection; + std::vector<SVector3> _PBCNormalDirection; // normal to PBCdir + + std::vector<int> _rootPhysical; // v1 v2 v4 for 2D and v1 v2 v4 v5 for 3D + std::vector<int> _interpolationDegree; // following v1v2, v1v4, v1v5 + std::vector<bool> _fullConstrained; // true if full, false otherwise + + #endif // SWIG + public: + nonLinearMixedBCDirectionFollowing(const int tag, const int dim); + #ifndef SWIG + nonLinearMixedBCDirectionFollowing(const nonLinearMixedBCDirectionFollowing& src); + virtual ~nonLinearMixedBCDirectionFollowing(){}; + + virtual nonLinearMicroBC::whichBCType getType() const{ + return nonLinearMicroBC::DirectionalMIXBC; + }; + + virtual nonLinearMicroBC* clone() const {return new nonLinearMixedBCDirectionFollowing(*this);} + + const std::vector<SVector3>& getKUBCDirection() const {return _KUBCDirection;}; + const std::vector<SVector3>& getSUBCDirection() const {return _SUBCDirection;}; + + // for PBC + const std::vector<SVector3>& getPBCNormalDirection() const {return _PBCNormalDirection;}; + const std::vector<SVector3>& getPBCDirection() const {return _PBCDirection;}; + const std::vector<int>& getRootPhysical() const {return _rootPhysical;}; + const std::vector<int>& getInterpolationDegree() const {return _interpolationDegree;}; + const std::vector<bool>& getFullConstrainedFlag() const {return _fullConstrained;}; + + void setKUBCDirection(const SVector3& dir); + void setSUBCDirection(const SVector3& dir); + void setPBCDirection(const SVector3& dir, const SVector3& norm, const bool full); + + #endif //SWIG + + void setKUBCDirection(const double nx, const double ny, const double nz); + void setSUBCDirection(const double nx, const double ny, const double nz); + void setPBCDirection(const double nx, const double ny, const double nz, + const double tx, const double ty, const double tz, + const bool fullConstrained); + void setRootPhysical(const int phy); + void setInterpolationDegree(const int deg); +}; #endif // NONLINEARMICROBC_H_ diff --git a/NonLinearSolver/Domain/partDomain.cpp b/NonLinearSolver/Domain/partDomain.cpp index 606d46bedfdd3ae937e263328b41d01b5528a27b..5dc83c80c9b4013169076c4d5aada173d8d9ab4c 100644 --- a/NonLinearSolver/Domain/partDomain.cpp +++ b/NonLinearSolver/Domain/partDomain.cpp @@ -508,6 +508,33 @@ double partDomain::computeVolumeDomain(const IPField* ipf) const{ return volume; }; +void partDomain::computeActiveDamageCenter(const IPField* ipf, SPoint3& pos) const{ + if ((g->size()>0) and (ipf->getNumOfActiveDamageIPs() > 0)){ + IntPt* GP; + // 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()); + int npts= integBulk->getIntPoints(ele,&GP); + for (int i=0; i<npts; i++){ + const IPStateBase *ips = (*vips)[i]; + const ipFiniteStrain *ipv = static_cast<const ipFiniteStrain*>(ips->getState(IPStateBase::current)); + const ipFiniteStrain *ipvprev = static_cast<const ipFiniteStrain*>(ips->getState(IPStateBase::previousActiveDamage)); + if (ipvprev->isActiveDamage()){ + double weight= GP[i].weight; + const double &detJ = ipv->getJacobianDeterminant(ele,GP[i]); + double ratio = detJ*weight; + SPoint3 P; + ele->pnt(GP[i].pt[0],GP[i].pt[1],GP[i].pt[2],P); + for (int j=0; j<3; j++){ + pos[j] += P[j]*ratio; + } + } + }; + }; + } +}; + void partDomain::computeActiveDamagingAverageStrainIncrement(const IPField* ipf, STensor3& strain) const{ // compute average strain on active damaging part // damaging volume will besed on ws= current, previous, or initial diff --git a/NonLinearSolver/Domain/partDomain.h b/NonLinearSolver/Domain/partDomain.h index 8c69cb29a5558bca99f6de9988f9e6e07d1c1999..ddab9cffc69fcf6ec46b16b2d32406b1512a7c4e 100644 --- a/NonLinearSolver/Domain/partDomain.h +++ b/NonLinearSolver/Domain/partDomain.h @@ -263,6 +263,7 @@ public: virtual void computeAverageHighOrderStress(const IPField* ipf, STensor33& stress) const; virtual double computeVolumeDomain(const IPField* ipf) const; + virtual void computeActiveDamageCenter(const IPField* ipf, SPoint3& pos) const; virtual void computeActiveDamagingAverageStrainIncrement(const IPField* _ipf, STensor3& strain) const; virtual double computeVolumeActiveDamageDomain(const IPField* ipf) const; virtual void computeActiveNonlocalDamageIncrement(const IPField* _ipf, double& dD) const; // choose ws between previous or initial diff --git a/NonLinearSolver/Interface/CMakeLists.txt b/NonLinearSolver/Interface/CMakeLists.txt index 7f4a42a07631cb25669ca63921809d46dae330e2..6938ee681d3d699c7b8e493d6047d5d67fde6013 100644 --- a/NonLinearSolver/Interface/CMakeLists.txt +++ b/NonLinearSolver/Interface/CMakeLists.txt @@ -13,6 +13,7 @@ set(SRC MInterfaceTriangleN.cpp MInterfaceQuadrangleN.cpp InterfaceKeys.cpp + interfaceReferenceLocalBasis.cpp ) file(GLOB HDR RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.h) diff --git a/NonLinearSolver/Interface/interfaceReferenceLocalBasis.cpp b/NonLinearSolver/Interface/interfaceReferenceLocalBasis.cpp new file mode 100644 index 0000000000000000000000000000000000000000..5cd73626afc2823e29cf6521ceed1df846fbe0c0 --- /dev/null +++ b/NonLinearSolver/Interface/interfaceReferenceLocalBasis.cpp @@ -0,0 +1,92 @@ +// +// +// Description: compute interface localb basis +// +// +// Author: <Van Dung NGUYEN>, (C) 2017 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "interfaceReferenceLocalBasis.h" +#include "MInterfaceElement.h" +#include "functionSpace.h" + +void computeInterfaceReferenceLocalBasis(const MElement* ele, const IntPt* GP, SVector3& n, SVector3& t, SVector3& b){ + printf("begin computation local basis \n"); + + const MInterfaceElement *iele = dynamic_cast<const MInterfaceElement*>(ele); + int nbvertexInter = iele->getNumVertices(); + + std::vector<TensorialTraits<double>::GradType> Grads; + double gradsuvw[256][3]; + ele->getGradShapeFunctions((*GP).pt[0], (*GP).pt[1], (*GP).pt[2], gradsuvw); + for(int i = 0; i < nbvertexInter; ++i){ + Grads.push_back(TensorialTraits<double>::GradType(gradsuvw[i][0], gradsuvw[i][1], gradsuvw[i][2])); + } + + SVector3 referencePhi0[2]; + if (ele->getDim() == 2){ + for(int k=0;k<nbvertexInter;k++) + { + double x = ele->getVertex(k)->x(); + double y = ele->getVertex(k)->y(); + double z = ele->getVertex(k)->z(); + //evaulate displacements at interface + for(int i=0;i<2;i++) + { + referencePhi0[i](0) += Grads[k](i)*x; + referencePhi0[i](1) += Grads[k](i)*y; + referencePhi0[i](2) += Grads[k](i)*z; + } + } + } + else if (ele->getDim() == 1){ + for(int k=0;k<nbvertexInter;k++) + { + double x = ele->getVertex(k)->x(); + double y = ele->getVertex(k)->y(); + double z = ele->getVertex(k)->z(); + referencePhi0[0](0) += Grads[k](0)*x; + referencePhi0[0](1) += Grads[k](0)*y; + referencePhi0[0](2) += Grads[k](0)*z; + } + + SVector3 phi0[2]; + + SPoint3 P; + ele->pnt((*GP).pt[0], (*GP).pt[1], (*GP).pt[2],P); + const MElement* em = iele->getElem(0); + double uvw[3]; + em->xyz2uvw(P.data(),uvw); + std::vector<TensorialTraits<double>::GradType> gradmUVW; + em->getGradShapeFunctions(uvw[0], uvw[1], uvw[2], gradsuvw); + int nbFFm = em->getNumShapeFunctions(); + for(int i = 0; i < nbFFm; ++i){ + gradmUVW.push_back(TensorialTraits<double>::GradType(gradsuvw[i][0], gradsuvw[i][1], gradsuvw[i][2])); + } + + for(int k=0;k<nbFFm;k++) + { + double x = em->getVertex(k)->x(); + double y = em->getVertex(k)->y(); + double z = em->getVertex(k)->z(); + //evaulate displacements at interface + for(int i=0;i<2;i++) + { + phi0[i](0) += gradmUVW[k](i)*x; + phi0[i](1) += gradmUVW[k](i)*y; + phi0[i](2) += gradmUVW[k](i)*z; + } + } + referencePhi0[1] = crossprod(phi0[0],phi0[1]); + referencePhi0[1].normalize(); + } + + n = crossprod(referencePhi0[0],referencePhi0[1]); n.normalize(); + t = referencePhi0[0]; t.normalize(); + b = crossprod(n,t); b.normalize(); + + printf("local basis em = %d, ep = %d: n = [%e %e %e], t = [%e %e %e] ; b =[%e %e %e]\n", + iele->getElem(0)->getNum(),iele->getElem(1)->getNum(),n[0],n[1],n[2],t[0],t[1],t[2],b[0],b[1],b[2]); +}; \ No newline at end of file diff --git a/NonLinearSolver/Interface/interfaceReferenceLocalBasis.h b/NonLinearSolver/Interface/interfaceReferenceLocalBasis.h new file mode 100644 index 0000000000000000000000000000000000000000..feef6848b6d15dad8bf4585636e26ea5ac066377 --- /dev/null +++ b/NonLinearSolver/Interface/interfaceReferenceLocalBasis.h @@ -0,0 +1,16 @@ +// +// +// Description: compute interface localb basis +// +// +// Author: <Van Dung NGUYEN>, (C) 2017 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#include "MElement.h" +#include "SVector3.h" + + +void computeInterfaceReferenceLocalBasis(const MElement* ele, const IntPt* GP, SVector3& n, SVector3& t, SVector3& b); \ No newline at end of file diff --git a/NonLinearSolver/field/OneUnknownField.cpp b/NonLinearSolver/field/OneUnknownField.cpp index 3e8159f1c0af5a553f39b22667ec6c9511d9cfe3..223dfbad627a02de06dd336c732c4f93771c66df 100644 --- a/NonLinearSolver/field/OneUnknownField.cpp +++ b/NonLinearSolver/field/OneUnknownField.cpp @@ -1,26 +1,27 @@ #include "OneUnknownField.h" #include "partDomain.h" +#include "nonLinearMechSolver.h" -OneUnknownField::OneUnknownField(dofManager<double> * p, std::vector<partDomain*>* alldom, +OneUnknownField::OneUnknownField(nonLinearMechSolver* sl, const std::vector<nlsField::dataBuildView> &dbview, - const std::string filename): nlsField(filename,100000000,1,dbview),_pAssembler(p), _vdom(alldom), + const std::string filename): nlsField(filename,100000000,1,dbview),_solver(sl), _dname("ElementNodeData"){ int totelem = 0; - for(std::vector<partDomain*>::const_iterator itdom=_vdom->begin(); itdom!=_vdom->end(); ++itdom){ + for(std::vector<partDomain*>::const_iterator itdom=_solver->getDomainVector()->begin(); itdom!=_solver->getDomainVector()->end(); ++itdom){ totelem += (*itdom)->groupOfElementsSize(); } this->setTotElem(totelem); // save initial values - this->buildAllView(*_vdom,0.,0); + this->buildAllView(*_solver->getDomainVector(),0.,0); } void OneUnknownField::buildData(FILE* myview,const std::vector<partDomain*> &vdom,const int comp,const ElemValue ev) const{ std::vector<double> fieldData; - for(std::vector<partDomain*>::const_iterator itdom=_vdom->begin(); itdom!=_vdom->end(); ++itdom){ + for(std::vector<partDomain*>::const_iterator itdom=vdom.begin(); itdom!=vdom.end(); ++itdom){ partDomain *dom = *itdom; for (groupOfElements::elementContainer::const_iterator it = dom->g_cbegin(); it != dom->g_cend(); ++it){ MElement *ele = *it; @@ -43,7 +44,7 @@ void OneUnknownField::get(partDomain *dom, MElement *ele,std::vector<double> &ud int numver = ele->getNumVertices(); for (int i=0; i< numver; i++){ double val = 0.; - _pAssembler->getDofValue(R[i+comp*numver],val); + _solver->getDofManager()->getDofValue(R[i+comp*numver],val); udofs.push_back(val); } @@ -52,5 +53,5 @@ void OneUnknownField::get(partDomain *dom, MElement *ele,std::vector<double> &ud void OneUnknownField::archive(const double time, const int step){ // msh view - this->buildAllView(*_vdom,time,step); + this->buildAllView(*_solver->getDomainVector(),time,step); } diff --git a/NonLinearSolver/field/OneUnknownField.h b/NonLinearSolver/field/OneUnknownField.h index 0c0ecf2eeeeb33244253ce58015fd73bdcefa393..9e8211d9e875dda09d1d46bc99f3dead095c1bee 100644 --- a/NonLinearSolver/field/OneUnknownField.h +++ b/NonLinearSolver/field/OneUnknownField.h @@ -13,18 +13,18 @@ #include "nlsField.h" #include "dofManager.h" +class nonLinearMechSolver; class OneUnknownField : public nlsField{ protected: const std::string _dname; - dofManager<double>* _pAssembler; // To access to component of equation system template this - std::vector<partDomain*>* _vdom; - + nonLinearMechSolver* _solver; + protected: virtual const std::string& dataname() const {return _dname;}; virtual void buildData(FILE* myview,const std::vector<partDomain*> &vdom,const int cmp,const ElemValue ev_) const; public: - OneUnknownField(dofManager<double> * p, std::vector<partDomain*>* alldom, + OneUnknownField(nonLinearMechSolver* sl, const std::vector<nlsField::dataBuildView> &dbview, const std::string filename ="dispComponent.msh"); virtual ~OneUnknownField(){} diff --git a/NonLinearSolver/field/eigenModeView.cpp b/NonLinearSolver/field/eigenModeView.cpp index 8b666ce21621db39566fb86b40c57d78a7533924..b812f46e1dce647bbb148b453c7295c27f31e1f2 100644 --- a/NonLinearSolver/field/eigenModeView.cpp +++ b/NonLinearSolver/field/eigenModeView.cpp @@ -11,23 +11,23 @@ #include "partDomain.h" #include "staticDofManager.h" -eigenVectorField::eigenVectorField(dofManager<double> *pas, std::vector<partDomain*> &elas, std::vector<partDomain*> &gdom, - std::set<contactDomain*> *acontact,const int nc, std::vector<unknownField::archiveNode> &archiving, +eigenVectorField::eigenVectorField(nonLinearMechSolver* sl, const int nc, + std::vector<unknownField::archiveNode> &archiving, const std::vector<nlsField::dataBuildView> &dbview_, - eigenSolver* eig, int num, const std::string file) : unknownField(pas,elas,gdom,acontact,nc,archiving,dbview_,file+int2str(num)+".msh"), _eigenSolver(eig), _num(num){} + eigenSolver* eig, int num, const std::string file) : unknownField(sl,nc,archiving,dbview_,file+int2str(num)+".msh"), _eigenSolver(eig), _num(num){} void eigenVectorField::get(Dof &D,double &udof) const{ - if (pAssembler->isFixed(D)){ - pAssembler->getFixedDofValue(D,udof); + if (_solver->getDofManager()->isFixed(D)){ + _solver->getDofManager()->getFixedDofValue(D,udof); return; }; - int comp = pAssembler->getDofNumber(D); + int comp = _solver->getDofManager()->getDofNumber(D); if (comp>=0){ std::complex<double> val = _eigenSolver->getEigenVectorComp(_num,comp); udof = val.real(); } else{ - std::map<Dof, DofAffineConstraint<double> >& constraints = pAssembler->getAllLinearConstraints(); + std::map<Dof, DofAffineConstraint<double> >& constraints = _solver->getDofManager()->getAllLinearConstraints(); std::map<Dof, DofAffineConstraint<double> >::iterator it =constraints.find(D); if (it != constraints.end()){ udof = it->second.shift; @@ -67,7 +67,7 @@ void eigenVectorField::get(partDomain *dom, MElement *ele,std::vector<double> &u }; void eigenVectorField::archive(const double time,const int step) { - this->buildAllView(*_vdom,time,step); + this->buildAllView(*_solver->getDomainVector(),time,step); if(!_forceView){ double u; for(std::vector<archiveNode>::const_iterator it = varch.begin(); it!=varch.end();++it){ @@ -83,7 +83,7 @@ void eigenVectorField::archive(const double time,const int step) { }; void eigenVectorField::setInitial(const std::vector<Dof> &R,const std::vector<double> &disp){ - staticDofManager<double>* staticAssembler = dynamic_cast<staticDofManager<double>*>(pAssembler); + staticDofManager<double>* staticAssembler = _solver->getStaticDofManager(); if (staticAssembler) staticAssembler->setInitial(R,disp); }; diff --git a/NonLinearSolver/field/eigenModeView.h b/NonLinearSolver/field/eigenModeView.h index 6884d876f8cd3d3903e4f0eed51472bd91140fe7..c54eec7ee71ed5478d9635c07a9a9cdcadd8cb99 100644 --- a/NonLinearSolver/field/eigenModeView.h +++ b/NonLinearSolver/field/eigenModeView.h @@ -19,8 +19,7 @@ class eigenVectorField : public unknownField{ eigenSolver* _eigenSolver; int _num; public: - eigenVectorField(dofManager<double> *pas, std::vector<partDomain*> &elas, std::vector<partDomain*> &gdom, - std::set<contactDomain*> *acontact, + eigenVectorField(nonLinearMechSolver* sl, const int nc, std::vector<unknownField::archiveNode> &archiving, const std::vector<nlsField::dataBuildView> &dbview_, eigenSolver* eig, int num, const std::string file = "mode"); diff --git a/NonLinearSolver/field/energyField.cpp b/NonLinearSolver/field/energyField.cpp index 3082078bb277830dbb6acdb7ec631ab0d0d04538..cfa7e8ff689c29c272b1d277cf1592de50b655e2 100644 --- a/NonLinearSolver/field/energyField.cpp +++ b/NonLinearSolver/field/energyField.cpp @@ -15,6 +15,7 @@ #include "SVector3.h" #include "unknownField.h" #include "dofManagerMultiSystems.h" +#include "nonLinearMechSolver.h" double dot(const std::vector<double> &a, const fullVector<dofManager<double>::dataMat> &b){ double c = 0.; for(int i =0; i<a.size(); i++){ @@ -31,148 +32,146 @@ double dot(const std::vector<double> &a, const std::vector<double> &b){ return c; } -energeticField::energeticField(IPField *ipf,unknownField *ufield, dofManager<double> *pAssembler, - std::vector<partDomain*> &domvec, nonLinearMechSolver::contactContainer &vcdom, - const std::vector<dataBuildView> &dbview_, +energeticField::energeticField(nonLinearMechSolver* sl, const std::vector<dataBuildView> &dbview_, const int energyComp,const int fracComp, nonLinearMechSolver::scheme myscheme) : elementsField("energy.msh",100000000,1,dbview_), _dynamics((myscheme == nonLinearMechSolver::StaticLinear || myscheme == nonLinearMechSolver::StaticNonLinear) ? false : true), - _ipf(ipf), _ufield(ufield), _pAssembler(pAssembler), _energyComputation(energyComp),_fractureEnergyComputation(fracComp), - _sAssembler(dynamic_cast<staticDofManager<double>*>(pAssembler)), - _domvec(domvec), _wext(0.), - _rigidContactFilter(),fpenergy(NULL), _systemSizeWithoutRigidContact(0), fpfrac(NULL) + _wext(0.), _rigidContactFilter(),fpenergy(NULL), _systemSizeWithoutRigidContact(0), fpfrac(NULL), + _solver(sl) { - std::string fracname; - #if defined(HAVE_MPI) - if(Msg::GetCommSize() > 1){ - std::ostringstream oss; - oss << Msg::GetCommRank(); - _fname = "energy_part" + oss.str() + ".csv"; - fracname = "fractureEnergy_part" + oss.str() + ".csv"; - } - else - #endif // HAVE_MPI - { - _fname = "energy.csv"; - fracname = "fractureEnergy.csv"; - } - if(_energyComputation>0) - { - if(!restartManager::available()) - { - // initialize file to store energy - fpenergy = fopen(_fname.c_str(),"w"); - fprintf(fpenergy,"Time;Kinetic;Deformation;Plastic;Wext;Inversible;Total\n"); - fprintf(fpenergy,"0.;0.;0.;0.;0.;0.;0.\n"); // false if initial deformation FIX IT HOW ?? - } - else - { - // open the actual energy file - fpenergy = fopen(_fname.c_str(),"a"); - } - } - else - { - // remove file - std::string rfname = "rm -rf "+_fname; - system(rfname.c_str()); - } - if(_fractureEnergyComputation>0) - { - if(!restartManager::available()) - { - fpfrac = fopen(fracname.c_str(),"w"); - fprintf(fpfrac,"Time;Total;Array of value\n"); - } - else - { - fpfrac = fopen(fracname.c_str(),"a"); - } - } - else - { - std::string rfname = "rm -rf "+fracname; - system(rfname.c_str()); - } - // set system size without rigid contact - if(_sAssembler !=NULL) - { - _systemSizeWithoutRigidContact = _sAssembler->getFirstRigidContactUnknowns(); - } - else - { - _systemSizeWithoutRigidContact = pAssembler->sizeOfR(); - } - // avoid this HOW ?? - long int nelem=0; - for(std::vector<partDomain*>::iterator itdom=_domvec.begin(); itdom!=_domvec.end();++itdom){ - partDomain *dom = *itdom; - nelem+=dom->groupOfElementsSize(); - } - this->setTotElem(nelem); + std::vector<partDomain*> &domvec = *(_solver->getDomainVector()); + nonLinearMechSolver::contactContainer &vcdom = *(_solver->getAllContactDomain()); + dofManager<double>* pAssembler = _solver->getDofManager(); + #if defined(HAVE_MPI) + if(Msg::GetCommSize() > 1){ + std::ostringstream oss; + oss << Msg::GetCommRank(); + _fname = "energy_part" + oss.str() + ".csv"; + _fracname = "fractureEnergy_part" + oss.str() + ".csv"; + } + else + #endif // HAVE_MPI + { + _fname = "energy.csv"; + _fracname = "fractureEnergy.csv"; + } + if(_energyComputation>0) + { + if(!restartManager::available()) + { + // initialize file to store energy + fpenergy = fopen(_fname.c_str(),"w"); + fprintf(fpenergy,"Time;Kinetic;Deformation;Plastic;Wext;Inversible;Total\n"); + fprintf(fpenergy,"0.;0.;0.;0.;0.;0.;0.\n"); // false if initial deformation FIX IT HOW ?? + } + else + { + // open the actual energy file + fpenergy = fopen(_fname.c_str(),"a"); + } + } + else + { + // remove file + std::string rfname = "rm -rf "+_fname; + system(rfname.c_str()); + } + if(_fractureEnergyComputation>0) + { + if(!restartManager::available()) + { + fpfrac = fopen(_fracname.c_str(),"w"); + fprintf(fpfrac,"Time;Total;Array of value\n"); + } + else + { + fpfrac = fopen(_fracname.c_str(),"a"); + } + } + else + { + std::string rfname = "rm -rf "+_fracname; + system(rfname.c_str()); + } + // set system size without rigid contact + if(_solver->getStaticDofManager() !=NULL) + { + _systemSizeWithoutRigidContact = _solver->getStaticDofManager()->getFirstRigidContactUnknowns(); + } + else + { + _systemSizeWithoutRigidContact = _solver->getDofManager()->sizeOfR(); + } + // avoid this HOW ?? + long int nelem=0; + for(std::vector<partDomain*>::iterator itdom=domvec.begin(); itdom!= domvec.end();++itdom){ + partDomain *dom = *itdom; + nelem+=dom->groupOfElementsSize(); + } + this->setTotElem(nelem); - // init non linear system to get the external work - std::string Aname("A"); - dofManagerMultiSystems<double>* multiDof = dynamic_cast<dofManagerMultiSystems<double>*>(_pAssembler); - linearSystem<double> *lsys; - if(multiDof ==NULL) - { - lsys = _pAssembler->getLinearSystem(Aname); - } - else - { - lsys = multiDof->getManager(0)->getLinearSystem(Aname); - } - _nlsys = dynamic_cast<nonLinearSystem<double>*>(lsys); - if(_nlsys!=NULL) - { - // Wext for prescribed displacement (but without rigid contact body) - std::vector<Dof> R; - for(nonLinearMechSolver::contactContainer::iterator itC = vcdom.begin(); itC!=vcdom.end();++itC) - { - contactDomain *cdom = *itC; - rigidContactSpaceBase *rspace = static_cast<rigidContactSpaceBase*>(cdom->getSpace()); - rspace->getKeysOfGravityCenter(R); - _rigidContactFilter.addDof(R); - } - R.clear(); - _pAssembler->getFixedDof(R); - for(int i=0; i<R.size(); i++){ - if(!_rigidContactFilter(R[i])){ - #if defined(HAVE_MPI) - if(R[i].getType()<0) // dof another rank - { - _rigidContactFilter.addDof(R[i]); - } - else - #endif // HAVE_MPI - { - _fextn.insert(std::pair<Dof,double>(R[i],0.)); - _dispn.insert(std::pair<Dof,double>(R[i],0.)); - _fextnp1.insert(std::pair<Dof,double>(R[i],0.)); - _dispnp1.insert(std::pair<Dof,double>(R[i],0.)); - } - } - } - } - else - { - Msg::Error("Wext cannot be computed for a linear system! The value will be set to 0"); - } + // init non linear system to get the external work + std::string Aname("A"); + dofManagerMultiSystems<double>* multiDof = dynamic_cast<dofManagerMultiSystems<double>*>(_solver->getDofManager()); + linearSystem<double> *lsys; + if(multiDof ==NULL) + { + lsys = _solver->getDofManager()->getLinearSystem(Aname); + } + else + { + lsys = multiDof->getManager(0)->getLinearSystem(Aname); + } + nonLinearSystem<double>* nlsys = dynamic_cast<nonLinearSystem<double>*>(lsys); + if(nlsys!=NULL) + { + // Wext for prescribed displacement (but without rigid contact body) + std::vector<Dof> R; + for(nonLinearMechSolver::contactContainer::iterator itC = vcdom.begin(); itC!=vcdom.end();++itC) + { + contactDomain *cdom = *itC; + rigidContactSpaceBase *rspace = static_cast<rigidContactSpaceBase*>(cdom->getSpace()); + rspace->getKeysOfGravityCenter(R); + _rigidContactFilter.addDof(R); + } + R.clear(); + _solver->getDofManager()->getFixedDof(R); + for(int i=0; i<R.size(); i++){ + if(!_rigidContactFilter(R[i])){ + #if defined(HAVE_MPI) + if(R[i].getType()<0) // dof another rank + { + _rigidContactFilter.addDof(R[i]); + } + else + #endif // HAVE_MPI + { + _fextn.insert(std::pair<Dof,double>(R[i],0.)); + _dispn.insert(std::pair<Dof,double>(R[i],0.)); + _fextnp1.insert(std::pair<Dof,double>(R[i],0.)); + _dispnp1.insert(std::pair<Dof,double>(R[i],0.)); + } + } + } + } + else + { + Msg::Error("Wext cannot be computed for a linear system! The value will be set to 0"); + } - } +} double energeticField::kineticEnergy() const { - if(_sAssembler == NULL || !_dynamics) return 0.; // system is not dynamic --> kinetic energy = 0 - else return _sAssembler->getKineticEnergy(_systemSizeWithoutRigidContact,_rigidContactFilter); + if(_solver->getStaticDofManager() == NULL || !_dynamics) return 0.; // system is not dynamic --> kinetic energy = 0 + else return _solver->getStaticDofManager()->getKineticEnergy(_systemSizeWithoutRigidContact,_rigidContactFilter); } double energeticField::kineticEnergy(MElement *ele, const partDomain *dom) const{ double ener=0.; - if(_sAssembler != NULL && _dynamics){ + if(_solver->getStaticDofManager() != NULL && _dynamics){ // get Dof std::vector<Dof> R; std::vector<double> velocities; @@ -180,8 +179,8 @@ double energeticField::kineticEnergy(MElement *ele, const partDomain *dom) const FunctionSpaceBase *sp = dom->getFunctionSpace(); sp->getKeys(ele,R); int nkeys = sp->getNumKeys(ele); - _sAssembler->getDofValue(R,velocities,nonLinearBoundaryCondition::velocity); - _sAssembler->getVertexMass(R,vmass); + _solver->getStaticDofManager()->getDofValue(R,velocities,nonLinearBoundaryCondition::velocity); + _solver->getStaticDofManager()->getVertexMass(R,vmass); for(int i=0; i!=nkeys; i++) ener+=vmass[i]*velocities[i]*velocities[i]; R.clear(); velocities.clear(); vmass.clear(); @@ -190,33 +189,46 @@ double energeticField::kineticEnergy(MElement *ele, const partDomain *dom) const } double energeticField::deformationEnergy(MElement *ele, const partDomain *dom) const{ - return _ipf->computeBulkDeformationEnergy(ele,dom,IPStateBase::current); + return _solver->getIPField()->computeBulkDeformationEnergy(ele,dom,IPStateBase::current); } double energeticField::deformationEnergy() const{ - return _ipf->computeDeformationEnergy(IPStateBase::current); + return _solver->getIPField()->computeDeformationEnergy(IPStateBase::current); } double energeticField::plasticEnergy(MElement *ele, const partDomain *dom) const{ - return _ipf->computeBulkPlasticEnergy(ele,dom,IPStateBase::current); + return _solver->getIPField()->computeBulkPlasticEnergy(ele,dom,IPStateBase::current); } double energeticField::plasticEnergy() const{ - return _ipf->computePlasticEnergy(IPStateBase::current); + return _solver->getIPField()->computePlasticEnergy(IPStateBase::current); } double energeticField::irreversibleEnergy(MElement *ele, const partDomain *dom) const{ - return _ipf->computeBulkIrreversibleEnergy(ele,dom,IPStateBase::current); + return _solver->getIPField()->computeBulkIrreversibleEnergy(ele,dom,IPStateBase::current); } double energeticField::irreversibleEnergy() const{ - return _ipf->computeIrreversibleEnergy(IPStateBase::current); + return _solver->getIPField()->computeIrreversibleEnergy(IPStateBase::current); }; void energeticField::externalWork()const{ // for multiSystem takes only the first one (displacement) double Deltawext=0.; - if(_nlsys!=NULL){ - Deltawext = 2*_nlsys->getExternalWork(_systemSizeWithoutRigidContact); // as we divided the value by 2 later !!! + std::string Aname("A"); + dofManagerMultiSystems<double>* multiDof = dynamic_cast<dofManagerMultiSystems<double>*>(_solver->getDofManager()); + linearSystem<double> *lsys; + if(multiDof ==NULL) + { + lsys = _solver->getDofManager()->getLinearSystem(Aname); + } + else + { + lsys = multiDof->getManager(0)->getLinearSystem(Aname); + } + nonLinearSystem<double>* nlsys = dynamic_cast<nonLinearSystem<double>*>(lsys); + + if(nlsys!=NULL){ + Deltawext = 2*nlsys->getExternalWork(_systemSizeWithoutRigidContact); // as we divided the value by 2 later !!! // Now compute the work of external forces due to prescribed displacement (-Wint - Winertia) // Do the scalar product on vector (more efficient) TO DO THE SCALAR PRODUCT WITH BLAS HOW ?? @@ -226,12 +238,12 @@ void energeticField::externalWork()const{ // for multiSystem takes only the firs std::vector<double> forceval; std::vector<Dof> R2; std::vector<double> forceval2; - if(_sAssembler!=NULL) - _sAssembler->getFixedRightHandSide(R2,forceval2); + if(_solver->getStaticDofManager()!=NULL) + _solver->getStaticDofManager()->getFixedRightHandSide(R2,forceval2); else { - _pAssembler->getFixedDof(R2); - _pAssembler->getDofValue(R2,forceval2); + _solver->getDofManager()->getFixedDof(R2); + _solver->getDofManager()->getDofValue(R2,forceval2); } std::vector<Dof> R; for(int i=0;i<R2.size();i++){ @@ -242,11 +254,11 @@ void energeticField::externalWork()const{ // for multiSystem takes only the firs } R2.clear(); forceval2.clear(); - _ufield->get(R,disp); + _solver->getUnknownField()->get(R,disp); // Compute inertial forces if needed - if(_sAssembler != NULL and _sAssembler->getScheme() == nonLinearMechSolver::Explicit){ // otherwise static cases and no inertial forces - _ufield->get(R,acc,nonLinearBoundaryCondition::acceleration); - _sAssembler->getVertexMass(R,_mass); + if(_solver->getStaticDofManager() != NULL and _solver->getStaticDofManager()->getScheme() == nonLinearMechSolver::Explicit){ // otherwise static cases and no inertial forces + _solver->getUnknownField()->get(R,acc,nonLinearBoundaryCondition::acceleration); + _solver->getStaticDofManager()->getVertexMass(R,_mass); for(int i=0; i<forceval.size(); i++) forceval[i] -= _mass[i]*acc[i]; } @@ -268,7 +280,7 @@ void energeticField::externalWork()const{ // for multiSystem takes only the firs int energeticField::fractureEnergy(double* arrayEnergy) const { - return _ipf->computeFractureEnergy(arrayEnergy,IPStateBase::current); + return _solver->getIPField()->computeFractureEnergy(arrayEnergy,IPStateBase::current); } void energeticField::get(partDomain *dom,MElement *ele,std::vector<double> &ener, const int cc, @@ -316,7 +328,7 @@ void energeticField::archive(const double time,const int step) { if(_energyComputation !=0) this->externalWork(); // msh file - this->buildAllView(_domvec,time,step); + this->buildAllView(*_solver->getDomainVector(),time,step); if((!_forceView) and(_energyComputation>0)) { // txt file @@ -398,3 +410,27 @@ energeticField::restart() restartManager::restart(_dispnp1); return; } + +void energeticField::closeFile(){ + elementsField::closeFile(); + if (fpenergy != NULL) { + fclose(fpenergy); fpenergy = NULL; + } + if (fpfrac != NULL){ + fclose(fpfrac); fpfrac= NULL; + } +}; + +void energeticField::resetFile(){ + elementsField::resetFile(); + if(_energyComputation>0) + { + fpenergy = fopen(_fname.c_str(),"a"); + fprintf(fpenergy,"Time;Kinetic;Deformation;Plastic;Wext;Inversible;Total\n"); + } + if(_fractureEnergyComputation>0) + { + fpfrac = fopen(_fracname.c_str(),"a"); + fprintf(fpfrac,"Time;Total;Array of value\n"); + } +}; \ No newline at end of file diff --git a/NonLinearSolver/field/energyField.h b/NonLinearSolver/field/energyField.h index 71e5702cbc47403358d4de2a800d3fc6c4ef002e..8a4ce54c4447a45ca0d0b45238a6cc4eea85cbab 100644 --- a/NonLinearSolver/field/energyField.h +++ b/NonLinearSolver/field/energyField.h @@ -13,21 +13,16 @@ #define ENERGETICFIELD_H_ #include "elementsField.h" -#include "nonLinearMechSolver.h" #include "staticDofManager.h" #include "solverAlgorithms.h" +class nonLinearMechSolver; class energeticField : public elementsField{ protected: -// linearSystem<double> *_lsys; const bool _dynamics; // account for kinetics energy in the total energy - IPField *_ipf; - unknownField *_ufield; - dofManager<double> *_pAssembler; - staticDofManager<double>* _sAssembler; // can be == NULL but stored to avoid multiple dynamic_cast - nonLinearSystem<double> *_nlsys; // can be == NULL but stored to avoid multiple dynamic_cast + nonLinearMechSolver* _solver; std::string _fname; // file to store total energy in function of time (one by part in mpi the sum column by column has to be done in post processing) - std::vector<partDomain*> &_domvec; - int _energyComputation,_fractureEnergyComputation; + std::string _fracname; + int _energyComputation,_fractureEnergyComputation; int _systemSizeWithoutRigidContact; FILE *fpenergy; FILE *fpfrac; @@ -48,10 +43,8 @@ class energeticField : public elementsField{ total =5 }; #ifndef SWIG - energeticField(IPField *ipf, - unknownField *ufield, dofManager<double> *pAssembler, - std::vector<partDomain*> &domvec, nonLinearMechSolver::contactContainer &vcdom, - const std::vector<dataBuildView> &dbview_,const int energyComp,const int fracComp, + energeticField(nonLinearMechSolver* sl, const std::vector<dataBuildView> &dbview_, + const int energyComp,const int fracComp, nonLinearMechSolver::scheme myscheme); ~energeticField() @@ -78,6 +71,9 @@ class energeticField : public elementsField{ double get(whichEnergy we = total) const; void archive(const double time,const int step=1); virtual void restart(); + + virtual void closeFile(); + virtual void resetFile(); #endif // SWIG }; #endif // ENERGETICFIELD_H_ diff --git a/NonLinearSolver/field/nlsField.cpp b/NonLinearSolver/field/nlsField.cpp index cafbf9e3a1e6083bed34bb0753c0a1c79ec0535e..d14f1de4d154e5339db9af61c995a45a2edf0103 100644 --- a/NonLinearSolver/field/nlsField.cpp +++ b/NonLinearSolver/field/nlsField.cpp @@ -90,6 +90,13 @@ void nlsField::createFile(){ } } +void nlsField::resetFile(){ + if(_vBuildView->size() > 0) + { + this->createFile(); + } +}; + nlsField::nlsField(const std::string &fnn, const uint32_t fms, const int ncomp, const std::vector<dataBuildView> &dbview_) : numfile(0), fmaxsize(fms), totelem(0), numcomp(ncomp), view(false), diff --git a/NonLinearSolver/field/nlsField.h b/NonLinearSolver/field/nlsField.h index 29cdaadc43d173d7d800d8cc38606ec3dd14e7d9..cda8cf10e0537b8b070ef6ad26125813b9dbb916 100644 --- a/NonLinearSolver/field/nlsField.h +++ b/NonLinearSolver/field/nlsField.h @@ -93,6 +93,7 @@ class nlsField{ virtual void onelabView(const std::string &meshFileName, const std::string &fname, const std::vector<partDomain*> &vdom,const std::string &valuename, const int comp,const double time, const int nstep) const; + virtual void resetFile(); #endif // SWIG }; #endif // nlsField_H_ diff --git a/NonLinearSolver/field/unknownField.cpp b/NonLinearSolver/field/unknownField.cpp index 40669f11d4b98b47430b1ce3ed2f10b12f02e98a..fe14062ce0e21cdc8da181a5fa71c27558a3b39b 100644 --- a/NonLinearSolver/field/unknownField.cpp +++ b/NonLinearSolver/field/unknownField.cpp @@ -16,13 +16,14 @@ #include "MPoint.h" // constructor -unknownField::unknownField(dofManager<double> *pas, std::vector<partDomain*> &vdom, std::vector<partDomain*> &vghostdom, - nonLinearMechSolver::contactContainer *acontact,const int nc, std::vector<unknownField::archiveNode> &archiving, +unknownField::unknownField(nonLinearMechSolver* sl,const int nc, + std::vector<unknownField::archiveNode> &archiving, const std::vector<nlsField::dataBuildView> &dbview_, - const std::string filen): pAssembler(pas),nodesField(filen,100000000,nc,dbview_), - _allContact(acontact), _vdom(&vdom), - _dynassembler(dynamic_cast<staticDofManager<double>*>(pAssembler)) + const std::string filen): _solver(sl),nodesField(filen,100000000,nc,dbview_) { + std::vector<partDomain*>& vdom = *_solver->getDomainVector(); + std::vector<partDomain*>& vghostdom = *_solver->getGhostDomainMPI(); + std::vector<bool> alfind; for(int i=0;i<archiving.size(); i++) alfind.push_back(false); @@ -97,7 +98,7 @@ unknownField::unknownField(dofManager<double> *pas, std::vector<partDomain*> &vd } // increment the total element with rigid contact and add archiving if necessary - for(nonLinearMechSolver::contactContainer::iterator it = _allContact->begin(); it!=_allContact->end(); ++it){ + for(nonLinearMechSolver::contactContainer::iterator it = _solver->getAllContactDomain()->begin(); it!=_solver->getAllContactDomain()->end(); ++it){ contactDomain *cdom = *it; if(cdom->isRigid()){ totelem += cdom->gMaster->size(); @@ -155,7 +156,7 @@ void unknownField::buildData(FILE* myview,const std::vector<partDomain*> &vdom,c nodesField::buildData(myview,vdom,cc,ev); // add contact domain std::vector<double> fieldData; - for(nonLinearMechSolver::contactContainer::iterator it=_allContact->begin(); it!=_allContact->end(); ++it){ + for(nonLinearMechSolver::contactContainer::iterator it=_solver->getAllContactDomain()->begin(); it!=_solver->getAllContactDomain()->end(); ++it){ contactDomain *cdom = *it; if(cdom->isRigid()){ for (groupOfElements::elementContainer::const_iterator it = cdom->gMaster->begin(); it != cdom->gMaster->end(); ++it){ @@ -186,11 +187,11 @@ unknownField::~unknownField() } void unknownField::get(Dof &D,double &udof) const{ - pAssembler->getDofValue(D,udof); + _solver->getDofManager()->getDofValue(D,udof); } void unknownField::get(Dof &D, double &udof, nonLinearBoundaryCondition::whichCondition wv) const { - _dynassembler->getDofValue(D,udof,wv); + _solver->getStaticDofManager()->getDofValue(D,udof,wv); } void unknownField::get(std::vector<Dof> &R, std::vector<double> &disp) const{ @@ -244,17 +245,17 @@ void unknownField::get(partDomain *dom, MElement *ele,std::vector<double> &udofs void unknownField::archive(const double time,const int step) { // msh view - this->buildAllView(*_vdom,time,step); + this->buildAllView(*_solver->getDomainVector(),time,step); if(!_forceView) { double u; for(std::vector<archiveNode>::const_iterator it = varch.begin(); it!=varch.end();++it){ if( step%it->nstep == 0){ const Dof D = it->D; - if(_dynassembler!=NULL) - _dynassembler->getDofValue(D,u,it->wc); + if(_solver->getStaticDofManager()!=NULL) + _solver->getStaticDofManager()->getDofValue(D,u,it->wc); else - pAssembler->getDofValue(D,u); + _solver->getDofManager()->getDofValue(D,u); fprintf(it->fp,"%e;%e\n",time,u); if( step%(it->nstep*1) == 0) fflush(it->fp); } @@ -273,10 +274,10 @@ void unknownField::valuesForOnelab(fullVector<double> &nodalValues) const double u; for(std::vector<archiveNode>::const_iterator it = varch.begin(); it!=varch.end();++it,++index){ const Dof D = it->D; - if(_dynassembler!=NULL) - _dynassembler->getDofValue(D,u,it->wc); + if(_solver->getStaticDofManager()!=NULL) + _solver->getStaticDofManager()->getDofValue(D,u,it->wc); else - pAssembler->getDofValue(D,u); + _solver->getDofManager()->getDofValue(D,u); nodalValues.set(index,u); } @@ -288,3 +289,19 @@ unknownField::restart() nodesField::restart(); return; } + +void unknownField::closeFile(){ + nodesField::closeFile(); + for(int i=0;i<varch.size();i++) + { + varch[i].closeFile(); + } +}; + +void unknownField::resetFile(){ + nodesField::resetFile(); + for(int i=0;i<varch.size();i++) + { + varch[i].openFile(); + } +}; diff --git a/NonLinearSolver/field/unknownField.h b/NonLinearSolver/field/unknownField.h index 854640683a647474d3c4068e25ac4d1f0a69eaab..529fe5c48c1f30337bc75ceecb498b5475924462 100644 --- a/NonLinearSolver/field/unknownField.h +++ b/NonLinearSolver/field/unknownField.h @@ -21,6 +21,7 @@ #include "nonLinearBC.h" #include "MInterfaceElement.h" class contactDomain; +class nonLinearMechSolver; template<class T> class staticDofManager; class unknownField : public nodesField{ public: @@ -41,13 +42,19 @@ class unknownField : public nodesField{ archiveNode(Dof R, const int pnum, int n, int comp,nonLinearBoundaryCondition::whichCondition wv=nonLinearBoundaryCondition::position, int nstep_=1,bool isc=false) : physnum(pnum),nodenum(n), D(R),_comp(comp), wc(wv), nstep(nstep_), iscontact(isc),fp(NULL) { - // open File + openFile(); + } + archiveNode(const archiveNode &source) : physnum(source.physnum), nodenum(source.nodenum), D(source.D), _comp(source._comp), + nstep(source.nstep), wc(source.wc), fp(source.fp), iscontact(source.iscontact){} + ~archiveNode(){}; + void openFile(){ + // open File std::ostringstream oss; oss << nodenum; std::string s = oss.str(); // component of displacement oss.str(""); - oss << comp; + oss << _comp; std::string s2 = oss.str(); #if defined(HAVE_MPI) if(Msg::GetCommSize() != 1){ @@ -69,23 +76,16 @@ class unknownField : public nodesField{ break; } fp = fopen(fname.c_str(),"a"); - } - archiveNode(const archiveNode &source) : physnum(source.physnum), nodenum(source.nodenum), D(source.D), _comp(source._comp), - nstep(source.nstep), wc(source.wc), fp(source.fp), iscontact(source.iscontact){} - ~archiveNode(){}; - void closeFile(){fclose(fp);} + }; + void closeFile(){if (fp!=NULL) {fclose(fp); fp=NULL;};} }; - protected: - dofManager<double> *pAssembler; // To access to component of equation system template this - staticDofManager<double>* _dynassembler; // can be == NULL but avoid multiple dynamic_cast - std::vector<archiveNode> varch; - std::vector<partDomain*> *_vdom; - std::set<contactDomain*> *_allContact; + protected: + nonLinearMechSolver* _solver; + std::vector<archiveNode> varch; virtual void buildData(FILE* myview,const std::vector<partDomain*> &vdom,const int cc,const ElemValue ev) const; public: // update all displacement value - unknownField(dofManager<double> *pas, std::vector<partDomain*> &elas, std::vector<partDomain*> &gdom,std::set<contactDomain*> *acontact, - const int nc, std::vector<archiveNode> &archiving, + unknownField(nonLinearMechSolver* s, const int nc, std::vector<archiveNode> &archiving, const std::vector<nlsField::dataBuildView> &dbview_, const std::string="disp.msh"); virtual ~unknownField(); // get Operation @@ -102,5 +102,8 @@ class unknownField : public nodesField{ virtual void archive(const double time,const int step=1); virtual void valuesForOnelab(fullVector<double> &nodalValues) const; virtual void restart(); + + virtual void closeFile(); + virtual void resetFile(); }; #endif // _UNKNOWNFIELD_H_ diff --git a/NonLinearSolver/internalPoints/ipAnisotropicStoch.cpp b/NonLinearSolver/internalPoints/ipAnisotropicStoch.cpp index 55cc611d4a6a328fbfa03c6781ab05ef417826d0..15a27cb7e852dc31ea8e24d0c249c32ab4ba72a3 100644 --- a/NonLinearSolver/internalPoints/ipAnisotropicStoch.cpp +++ b/NonLinearSolver/internalPoints/ipAnisotropicStoch.cpp @@ -95,6 +95,119 @@ IPAnisotropicStoch::IPAnisotropicStoch(const SVector3 &GaussP, const fullMatrix< MUxz = MUxzMat(nx,ny); MUyz = MUyzMat(nx,ny); } + + else if (intpl == 3 ){ + double alpha = 0.1; + double min = 0.001; + double max = 0.999; + if(x > 0.5){nx=nx+1;} + if(y > 0.5){ny=ny+1;} + + if (x <=min or x >= max){ + if (y <=min or y >= max){ + Ex = ExMat(nx,ny); + Ey = EyMat(nx,ny); + Ez = EzMat(nx,ny); + + Vxy = VxyMat(nx,ny); + Vxz = VxzMat(nx,ny); + Vyz = VyzMat(nx,ny); + + MUxy = MUxyMat(nx,ny); + MUxz = MUxzMat(nx,ny); + MUyz = MUyzMat(nx,ny); + } + else{ + int ny0; + if( y >0.5 ){ + ny0 = ny-1; + if(ny0 < 0){ny0=0;} + } + if( y <=0.5){ + ny0 = ny; + ny = ny+1; + } + double coef = 0.5*(1.0+tanh((y-0.5)/alpha)); + Ex = ExMat(nx,ny0) + (ExMat(nx,ny)-ExMat(nx,ny0))*coef; + Ey = EyMat(nx,ny0) + (EyMat(nx,ny)-EyMat(nx,ny0))*coef; + Ez = EzMat(nx,ny0) + (EzMat(nx,ny)-EzMat(nx,ny0))*coef; + + Vxy = VxyMat(nx,ny0) + (VxyMat(nx,ny)-VxyMat(nx,ny0))*coef; + Vxz = VxzMat(nx,ny0) + (VxyMat(nx,ny)-VxyMat(nx,ny0))*coef; + Vyz = VyzMat(nx,ny0) + (VyzMat(nx,ny)-VyzMat(nx,ny0))*coef; + + MUxy = MUxyMat(nx,ny0) + (MUxyMat(nx,ny)-MUxyMat(nx,ny0))*coef; + MUxz = MUxzMat(nx,ny0) + (MUxzMat(nx,ny)-MUxzMat(nx,ny0))*coef; + MUyz = MUyzMat(nx,ny0) + (MUyzMat(nx,ny)-MUyzMat(nx,ny0))*coef; + } + } + else{ + if (y <=min or y >= max){ + int nx0; + if( x >0.5 ){ + nx0 = nx-1; + if(nx0 < 0){nx0=0;} + } + if( x <=0.5){ + nx0 = nx; + nx = nx+1; + } + double coef = 0.5*(1.0+tanh((x-0.5)/alpha)); + Ex = ExMat(nx0,ny) + (ExMat(nx,ny)-ExMat(nx0,ny))*coef; + Ey = EyMat(nx0,ny) + (EyMat(nx,ny)-EyMat(nx0,ny))*coef; + Ez = EzMat(nx0,ny) + (EzMat(nx,ny)-EzMat(nx0,ny))*coef; + + Vxy = VxyMat(nx0,ny) + (VxyMat(nx,ny)-VxyMat(nx0,ny))*coef; + Vxz = VxzMat(nx0,ny) + (VxyMat(nx,ny)-VxyMat(nx0,ny))*coef; + Vyz = VyzMat(nx0,ny) + (VyzMat(nx,ny)-VyzMat(nx0,ny))*coef; + + MUxy = MUxyMat(nx0,ny) + (MUxyMat(nx,ny)-MUxyMat(nx0,ny))*coef; + MUxz = MUxzMat(nx0,ny) + (MUxzMat(nx,ny)-MUxzMat(nx0,ny))*coef; + MUyz = MUyzMat(nx0,ny) + (MUyzMat(nx,ny)-MUyzMat(nx0,ny))*coef; + } + else{ + int nx0, ny0; + if( x >0.5 ){ + nx0 = nx-1; + if(nx0 < 0){nx0=0;} + } + if( x <=0.5){ + nx0 = nx; + nx = nx+1; + } + if( y >0.5 ){ + ny0 = ny-1; + if(ny0 < 0){ny0=0;} + } + if( y <=0.5){ + ny0 = ny; + ny = ny+1; + } + double cx,cy,s,t; + cx = 0.5*(1.0+tanh((x-0.5)/alpha)); + cy = 0.5*(1.0+tanh((y-0.5)/alpha)); + s = (x-min)/(max-min); + t = (y-min)/(max-min); + double c00 = (1.0-cx)*(1.0-t) + (1.0-cy)*(1.0-s) - (1.0-s)*(1.0-t); + double c01 = (1.0-cx)*t + cy*(1.0-s) - (1.0-s)*t; + double c10 = cx*(1.0-t) + (1.0-cy)*s - s*(1.0-t); + double c11 = cx*t + cy*s - s*t; + + Ex = c00*ExMat(nx0,ny0) + c01*ExMat(nx0,ny) + c10*ExMat(nx,ny0) + c11*ExMat(nx,ny); + Ey = c00*EyMat(nx0,ny0) + c01*EyMat(nx0,ny) + c10*EyMat(nx,ny0) + c11*EyMat(nx,ny); + Ez = c00*EzMat(nx0,ny0) + c01*EzMat(nx0,ny) + c10*EzMat(nx,ny0) + c11*EzMat(nx,ny); + + Vxy = c00*VxyMat(nx0,ny0) + c01*VxyMat(nx0,ny) + c10*VxyMat(nx,ny0) + c11*VxyMat(nx,ny); + Vxz = c00*VxzMat(nx0,ny0) + c01*VxzMat(nx0,ny) + c10*VxzMat(nx,ny0) + c11*VxzMat(nx,ny); + Vyz = c00*VyzMat(nx0,ny0) + c01*VyzMat(nx0,ny) + c10*VyzMat(nx,ny0) + c11*VyzMat(nx,ny); + + MUxy = c00*MUxyMat(nx0,ny0) + c01*MUxyMat(nx0,ny) + c10*MUxyMat(nx,ny0) + c11*MUxyMat(nx,ny); + MUxz = c00*MUxzMat(nx0,ny0) + c01*MUxzMat(nx0,ny) + c10*MUxzMat(nx,ny0) + c11*MUxzMat(nx,ny); + MUyz = c00*MUyzMat(nx0,ny0) + c01*MUyzMat(nx0,ny) + c10*MUyzMat(nx,ny0) + c11*MUyzMat(nx,ny); + } + } + } + else { printf("Unknown interpolation method: %d\n", intpl); } diff --git a/NonLinearSolver/internalPoints/ipCohesive.h b/NonLinearSolver/internalPoints/ipCohesive.h index 4d57216a128409ae497c739f4e45fad734316b5c..9707044e001d74046c35144d1bbb73aa5c38ae83 100644 --- a/NonLinearSolver/internalPoints/ipCohesive.h +++ b/NonLinearSolver/internalPoints/ipCohesive.h @@ -226,6 +226,7 @@ class IPTransverseIsoCurvatureCohesive : public IPTransverseIsotropicCohesive{ N_local.normalize(); _A = Proj_A + tan(init_Angle*3.14159/180.)*N_local; } + _A.normalize(); } IPTransverseIsoCurvatureCohesive(const IPTransverseIsoCurvatureCohesive& src): IPTransverseIsotropicCohesive(src) { diff --git a/NonLinearSolver/internalPoints/ipField.cpp b/NonLinearSolver/internalPoints/ipField.cpp index 7ae01dbc70af63991ecd96ab4a390ca3fc4af91a..2f1b91a97b5ab4db4705b2ab4551e734b3beedb0 100644 --- a/NonLinearSolver/internalPoints/ipField.cpp +++ b/NonLinearSolver/internalPoints/ipField.cpp @@ -18,17 +18,19 @@ #include "numericalMaterial.h" void IPField::compute1state(IPStateBase::whichState ws, bool stiff){ - for(std::vector<partDomain*>::iterator itdom=_efield->begin(); itdom!=_efield->end(); ++itdom){ + std::vector<partDomain*>* domainVector = _solver->getDomainVector(); + unknownField* ufield = _solver->getUnknownField(); + for(std::vector<partDomain*>::iterator itdom=domainVector->begin(); itdom!=domainVector->end(); ++itdom){ partDomain *dom = *itdom; - dom->computeIPVariable(_AIPS,_ufield,ws,stiff); + dom->computeIPVariable(_AIPS,ufield,ws,stiff); } } void IPField::nextStep(const double time){ - + std::vector<partDomain*>* domainVector = _solver->getDomainVector(); // check failure, cohesive insertion at current time step - for (int idom=0; idom < _efield->size(); idom++){ - partDomain* dom = (*_efield)[idom]; + for (int idom=0; idom < domainVector->size(); idom++){ + partDomain* dom = (*domainVector)[idom]; dom->checkFailure(_AIPS); } @@ -44,9 +46,9 @@ void IPField::nextStep(const double time){ if (otherRanks.size() > 0){ std::vector<int> brokenIPs; std::vector<int> blockDamageIPs; - for (int idom=0; idom< _efield->size(); idom++){ - (*_efield)[idom]->getBrokenIPs(brokenIPs); - (*_efield)[idom]->getBlockDamageIps(blockDamageIPs); + for (int idom=0; idom< domainVector->size(); idom++){ + (*domainVector)[idom]->getBrokenIPs(brokenIPs); + (*domainVector)[idom]->getBlockDamageIps(blockDamageIPs); } // send data for (std::set<int>::const_iterator it = otherRanks.begin(); it != otherRanks.end(); it++){ @@ -160,12 +162,13 @@ void IPField::initialBroken(MElement *iele, materialLaw* mlaw ){ } void IPField::initialBroken(GModel* pModel, std::vector<int> &vnumphys){ + std::vector<partDomain*>* domainVector = _solver->getDomainVector(); std::vector<MVertex*> vv; for(int i=0;i<vnumphys.size();i++){ // get the vertex associated to the physical entities LINES ONLY !! pModel->getMeshVerticesForPhysicalGroup(1,vnumphys[i],vv); // find the InterfaceElement associated to these vertex (identify interior node as degree 2 min) - for(std::vector<partDomain*>::iterator itfield = _efield->begin(); itfield != _efield->end(); ++itfield){ + for(std::vector<partDomain*>::iterator itfield = domainVector->begin(); itfield != domainVector->end(); ++itfield){ if((*itfield)->IsInterfaceTerms()) { dgPartDomain *dgdom = static_cast<dgPartDomain*>(*itfield); @@ -183,9 +186,11 @@ void IPField::initialBroken(GModel* pModel, std::vector<int> &vnumphys){ } } +const std::vector<partDomain*>& IPField::getDomainVector() const {return *_solver->getDomainVector();}; + void IPField::archive(const double time, const int step){ // msh view - this->buildAllView(*_efield,time,step); + this->buildAllView(*_solver->getDomainVector(),time,step); if(!_forceView) { // txt archive @@ -353,8 +358,9 @@ double IPField::computeInterfaceDeformationEnergy(MElement *ele, const dgPartDom } double IPField::computeDeformationEnergy(const IPStateBase::whichState ws) const{ + const std::vector<partDomain*>* domainVector = _solver->getDomainVector(); double ener=0.; - for(std::vector<partDomain*>::const_iterator itdom=_efield->begin(); itdom!=_efield->end(); ++itdom){ + for(std::vector<partDomain*>::const_iterator itdom=domainVector->begin(); itdom!=domainVector->end(); ++itdom){ partDomain *dom = *itdom; for(groupOfElements::elementContainer::const_iterator it=dom->g_cbegin(); it!=dom->g_cend(); ++it){ MElement *ele = *it; @@ -432,8 +438,9 @@ double IPField::computeBulkPlasticEnergy(MElement *ele, const partDomain *dom, c } double IPField::computePlasticEnergy(const IPStateBase::whichState ws) const{ + const std::vector<partDomain*>* domainVector = _solver->getDomainVector(); double ener=0.; - for(std::vector<partDomain*>::const_iterator itdom=_efield->begin(); itdom!=_efield->end(); ++itdom){ + for(std::vector<partDomain*>::const_iterator itdom=domainVector->begin(); itdom!=domainVector->end(); ++itdom){ partDomain *dom = *itdom; for(groupOfElements::elementContainer::const_iterator it=dom->g_cbegin(); it!=dom->g_cend(); ++it){ MElement *ele = *it; @@ -534,8 +541,9 @@ double IPField::computeInterfaceIrreversibleEnergy(MElement *ele, const dgPartDo }; double IPField::computeIrreversibleEnergy(const IPStateBase::whichState ws) const{ + const std::vector<partDomain*>* domainVector = _solver->getDomainVector(); double ener=0.; - for(std::vector<partDomain*>::const_iterator itdom=_efield->begin(); itdom!=_efield->end(); ++itdom){ + for(std::vector<partDomain*>::const_iterator itdom=domainVector->begin(); itdom!=domainVector->end(); ++itdom){ partDomain *dom = *itdom; for(groupOfElements::elementContainer::const_iterator it=dom->g_cbegin(); it!=dom->g_cend(); ++it){ MElement *ele = *it; @@ -573,8 +581,10 @@ double IPField::computeIrreversibleEnergy(const IPStateBase::whichState ws) cons }; double IPField::computeInterfaceIrreversibleEnergy(const IPStateBase::whichState ws) const{ + const std::vector<partDomain*>* domainVector = _solver->getDomainVector(); + double ener=0.; - for(std::vector<partDomain*>::const_iterator itdom=_efield->begin(); itdom!=_efield->end(); ++itdom){ + for(std::vector<partDomain*>::const_iterator itdom=domainVector->begin(); itdom!=domainVector->end(); ++itdom){ partDomain *dom = *itdom; // interface energy @@ -657,22 +667,74 @@ int IPField::computeFractureEnergy(MElement *ele, const dgPartDomain *dom,double return ncomp; } +int IPField::computeFractureEnergy(double * arrayEnergy,const IPStateBase::whichState ws) const +{ + static double tmpArray[10]; + int maxcomp = 0; + for(int i=0;i<10;i++){ + arrayEnergy[i]=0.; + tmpArray[i]=0.; + } + const std::vector<partDomain*>* domainVector = _solver->getDomainVector(); + for(std::vector<partDomain*>::const_iterator itdom=domainVector->begin(); itdom!=domainVector->end(); ++itdom){ + const partDomain *dom = *itdom; + if(dom->IsInterfaceTerms()) // otherwise no fracture + { + const dgPartDomain* dgdom = static_cast<const dgPartDomain*>(dom); + if((dgdom->getMaterialLawMinus()->getType() == materialLaw::fracture) and (dgdom->getMaterialLawPlus()->getType() == materialLaw::fracture))//comment it to get H1 norm in the interface e.g. LinearThermoMech + { + for(groupOfElements::elementContainer::const_iterator it=dgdom->gi->begin(); it!=dgdom->gi->end(); ++it) + { + MElement *ele = *it; + #if defined(HAVE_MPI) + if(Msg::GetCommSize()>1) + { + MInterfaceElement *iele = dynamic_cast<MInterfaceElement*>(ele); + if(iele->getElem(0)->getPartition()==0 or iele->getElem(0)->getPartition() == Msg::GetCommRank()+1) // if - element is ghost not computed to avoid to count twice the contribution + { + int ncomp = this->computeFractureEnergy(ele,dgdom,tmpArray,ws); + for(int i=0;i<ncomp;i++){ + arrayEnergy[i]+=tmpArray[i]; + tmpArray[i]=0.; + } + if(ncomp>maxcomp) + maxcomp = ncomp; + } + } + else + #endif // HAVE_MPI + { + int ncomp = this->computeFractureEnergy(ele,dgdom,tmpArray,ws); + for(int i=0;i<ncomp;i++){ + arrayEnergy[i]+=tmpArray[i]; + tmpArray[i]=0.; + } + if(ncomp>maxcomp) + maxcomp = ncomp; + } + } + } + } + } + return maxcomp; +} + -IPField::IPField(nonLinearMechSolver* sl, std::vector<partDomain*> *ef,dofManager<double>* pa, - unknownField* uf, std::vector<ip2archive> &vaip, +IPField::IPField(nonLinearMechSolver* sl, std::vector<ip2archive> &vaip, const std::vector<dataBuildView> &dbview_, std::string filename): - _solver(sl),_efield(ef), _dm(pa),_ufield(uf), elementsField(filename,100000000,1,dbview_), + _solver(sl),elementsField(filename,100000000,1,dbview_), _numOfActiveDamageIPs(0),_numOfActiveDamageIPsReached(0){ // Creation of storage for IP data - _AIPS = new AllIPState(*_efield); + std::vector<partDomain*>* domainVector = _solver->getDomainVector(); + _AIPS = new AllIPState(*domainVector); // compute the number of element long int nelem=0; - for(std::vector<partDomain*>::iterator itdom=_efield->begin(); itdom!=_efield->end(); ++itdom){ + for(std::vector<partDomain*>::iterator itdom=domainVector->begin(); itdom!=domainVector->end(); ++itdom){ partDomain *dom = *itdom; nelem+= dom->groupOfElementsSize(); } this->setTotElem(nelem); - this->buildAllView(*_efield,0.,0); + this->buildAllView(*domainVector,0.,0); // Build the viparch vector (find the nearest ipvariable to each given vertex) for(std::vector<ip2archive>::iterator ita=vaip.begin(); ita!=vaip.end(); ++ita){ @@ -684,7 +746,7 @@ IPField::IPField(nonLinearMechSolver* sl, std::vector<partDomain*> *ef,dofManage if (dim == -1){ if (aip.plusNum == aip.minusNum){ // bulk case - for(std::vector<partDomain*>::iterator itdom=_efield->begin(); itdom!=_efield->end(); ++itdom) + for(std::vector<partDomain*>::iterator itdom=domainVector->begin(); itdom!=domainVector->end(); ++itdom) { partDomain *dom = *itdom; for (groupOfElements::elementContainer::iterator ite = dom->g_cbegin(); ite!= dom->g_cend(); ite++){ @@ -705,7 +767,7 @@ IPField::IPField(nonLinearMechSolver* sl, std::vector<partDomain*> *ef,dofManage } else{ // interface case - for(std::vector<partDomain*>::iterator itdom=_efield->begin(); itdom!=_efield->end(); ++itdom) + for(std::vector<partDomain*>::iterator itdom=domainVector->begin(); itdom!=domainVector->end(); ++itdom) { partDomain *dom = *itdom; dgPartDomain* dgDom = dynamic_cast<dgPartDomain*>(dom); @@ -741,7 +803,7 @@ IPField::IPField(nonLinearMechSolver* sl, std::vector<partDomain*> *ef,dofManage MVertex *ver = *itv; dgPartDomain *dgdom; bool samedim = false; - for(std::vector<partDomain*>::iterator itdom=_efield->begin(); itdom!=_efield->end(); ++itdom) + for(std::vector<partDomain*>::iterator itdom=domainVector->begin(); itdom!=domainVector->end(); ++itdom) { partDomain *dom = *itdom; if(dom->IsInterfaceTerms()) @@ -835,7 +897,7 @@ IPField::IPField(nonLinearMechSolver* sl, std::vector<partDomain*> *ef,dofManage { dgPartDomain *dgdom; bool samedim = false; - for(std::vector<partDomain*>::iterator itdom=_efield->begin(); itdom!=_efield->end(); ++itdom){ + for(std::vector<partDomain*>::iterator itdom=domainVector->begin(); itdom!=domainVector->end(); ++itdom){ partDomain *dom = *itdom; if(dom->IsInterfaceTerms()) { // otherwise the domain doesn't contain interface element @@ -1006,17 +1068,6 @@ double IPField::getIPcompAndVolume(const partDomain *ef,MElement *ele, const IPS } } -void IPField::resetUnknownField(unknownField *uf) -{ - _ufield = uf; - // reset archiving file if needed - if(_vBuildView->size() > 0) - { -// FILE *fp = fopen(this->fileName.c_str(),"w"); WHY ?? - this->createFile(); - } -} - void IPField::setFactorOnArchivingFiles(const int fact) { for(int i=0;i<viparch.size();i++) @@ -1046,11 +1097,6 @@ void IPField::closeFile() } }; } -void IPField::openArchivingFiles() -{ - for(int i=0;i<viparch.size();i++) - viparch[i].openFile(); -} void IPField::blockDamage(const IPStateBase::whichState ws, const bool fl){ AllIPState::ipstateContainer& allMap =*(_AIPS->getAIPSContainer()); @@ -1081,4 +1127,11 @@ void IPField::checkCritialInterfaceIP(){ } +}; + +void IPField::resetFile(){ + elementsField::resetFile(); + for(int i=0;i<viparch.size();i++){ + viparch[i].openFile(); + } }; \ No newline at end of file diff --git a/NonLinearSolver/internalPoints/ipField.h b/NonLinearSolver/internalPoints/ipField.h index f6dd83845c6eb589bad003ed40c64127362ca20d..3164f3a8810641c04bd0a7916bc31626d89e1343 100644 --- a/NonLinearSolver/internalPoints/ipField.h +++ b/NonLinearSolver/internalPoints/ipField.h @@ -177,23 +177,19 @@ class IPField : public elementsField { }; protected : - std::vector<partDomain*>* _efield; - dofManager<double> *_dm; AllIPState *_AIPS; - unknownField *_ufield; std::vector<ip2archive> viparch; nonLinearMechSolver* _solver; // solver to which ipField belongs int _numOfActiveDamageIPs; int _numOfActiveDamageIPsReached; public : - IPField(nonLinearMechSolver* sl, std::vector<partDomain*> *ef,dofManager<double>* pa, - unknownField* uf, std::vector<ip2archive> &vaip, + IPField(nonLinearMechSolver* sl, std::vector<ip2archive> &vaip, const std::vector<dataBuildView> &dbview_,std::string filename = "stress.msh"); void archive(const double time,const int step=1); AllIPState* getAips() const {return _AIPS;} - const std::vector<partDomain*>& getDomainVector() const {return *_efield;}; + const std::vector<partDomain*>& getDomainVector() const; virtual ~IPField(){delete _AIPS;} void compute1state(IPStateBase::whichState ws, bool stiff); @@ -220,15 +216,11 @@ class IPField : public elementsField { // initial broken void initialBroken(GModel* pModel, std::vector<int> &vnumphys); void initialBroken(MElement *iele, materialLaw *mlaw); - // used in case of switch between scheme - void resetUnknownField(unknownField *uf); void setFactorOnArchivingFiles(const int fact); // close all files - void closeFile(); - // open all files (used after switch between scheme otherwise open in constructor) - void openArchivingFiles(); - + virtual void closeFile(); + template<class T> void getIPv(const MElement *ele,const T** vipv, const IPStateBase::whichState ws= IPStateBase::current) const { AllIPState::ipstateElementContainer* vips = _AIPS->getIPstate(ele->getNum()); @@ -361,62 +353,16 @@ class IPField : public elementsField { double computeInterfaceIrreversibleEnergy(const IPStateBase::whichState ws) const; int computeFractureEnergy(MElement *ele,const dgPartDomain *dom,double* arrayEnergy, const IPStateBase::whichState ws) const; - int computeFractureEnergy(double * arrayEnergy,const IPStateBase::whichState ws) const - { - static double tmpArray[10]; - int maxcomp = 0; - for(int i=0;i<10;i++){ - arrayEnergy[i]=0.; - tmpArray[i]=0.; - } - for(std::vector<partDomain*>::const_iterator itdom=_efield->begin(); itdom!=_efield->end(); ++itdom){ - const partDomain *dom = *itdom; - if(dom->IsInterfaceTerms()) // otherwise no fracture - { - const dgPartDomain* dgdom = static_cast<const dgPartDomain*>(dom); - if((dgdom->getMaterialLawMinus()->getType() == materialLaw::fracture) and (dgdom->getMaterialLawPlus()->getType() == materialLaw::fracture))//comment it to get H1 norm in the interface e.g. LinearThermoMech - { - for(groupOfElements::elementContainer::const_iterator it=dgdom->gi->begin(); it!=dgdom->gi->end(); ++it) - { - MElement *ele = *it; - #if defined(HAVE_MPI) - if(Msg::GetCommSize()>1) - { - MInterfaceElement *iele = dynamic_cast<MInterfaceElement*>(ele); - if(iele->getElem(0)->getPartition()==0 or iele->getElem(0)->getPartition() == Msg::GetCommRank()+1) // if - element is ghost not computed to avoid to count twice the contribution - { - int ncomp = this->computeFractureEnergy(ele,dgdom,tmpArray,ws); - for(int i=0;i<ncomp;i++){ - arrayEnergy[i]+=tmpArray[i]; - tmpArray[i]=0.; - } - if(ncomp>maxcomp) - maxcomp = ncomp; - } - } - else - #endif // HAVE_MPI - { - int ncomp = this->computeFractureEnergy(ele,dgdom,tmpArray,ws); - for(int i=0;i<ncomp;i++){ - arrayEnergy[i]+=tmpArray[i]; - tmpArray[i]=0.; - } - if(ncomp>maxcomp) - maxcomp = ncomp; - } - } - } - } - } - return maxcomp; - } + int computeFractureEnergy(double * arrayEnergy,const IPStateBase::whichState ws) const; + // store all IPVariable values virtual void restart(); // block damage of problem virtual void blockDamage(const IPStateBase::whichState ws, const bool fl); virtual void checkCritialInterfaceIP(); + + virtual void resetFile(); #endif // swig }; #endif // IPField diff --git a/NonLinearSolver/internalPoints/ipTransverseIsoCurvature.cpp b/NonLinearSolver/internalPoints/ipTransverseIsoCurvature.cpp index 1c8de0707b9d95b7b567b1190ca9689bd3764398..64d9505baae4ecbd2314a2e0c17682e3e5d8dbde 100644 --- a/NonLinearSolver/internalPoints/ipTransverseIsoCurvature.cpp +++ b/NonLinearSolver/internalPoints/ipTransverseIsoCurvature.cpp @@ -44,5 +44,6 @@ IPTransverseIsoCurvature::IPTransverseIsoCurvature(const SVector3 &GaussP, const N_local.normalize(); _A = Proj_A + tan(init_Angle*3.14159/180.)*N_local; } + _A.normalize(); } diff --git a/NonLinearSolver/materialLaw/mlaw.h b/NonLinearSolver/materialLaw/mlaw.h index 0b15aa6d0918e10ad9fdafe6062c3aaab6c87470..6f2c67960cd170b9a76cfc661c49ad07075e0561 100644 --- a/NonLinearSolver/materialLaw/mlaw.h +++ b/NonLinearSolver/materialLaw/mlaw.h @@ -68,7 +68,7 @@ class materialLaw{ virtual double getExtraDofStoredEnergyPerUnitField(double T) const {return 0.;} virtual double getCharacteristicLength() const {return 0.;}; - virtual void setSolver(nonLinearMechSolver* sv){_solver = sv;}; + virtual void setSolver(const nonLinearMechSolver* sv){_solver = sv;}; virtual const nonLinearMechSolver* getSolver() const {return _solver;}; virtual bool withDamage() const {return false;}; diff --git a/NonLinearSolver/materialLaw/mlawAnIsotropicTherMech.cpp b/NonLinearSolver/materialLaw/mlawAnIsotropicTherMech.cpp index 604d08d3da46b5aad8603be5d41b2af09194b4d7..7db2a689686ac7039582046b67ff50a79a4526db 100644 --- a/NonLinearSolver/materialLaw/mlawAnIsotropicTherMech.cpp +++ b/NonLinearSolver/materialLaw/mlawAnIsotropicTherMech.cpp @@ -156,6 +156,7 @@ void mlawAnIsotropicTherMech::constitutive( mlawTransverseIsotropic::constitutive( F0, Fn,P,(const IPTransverseIsotropic *)q0, (IPTransverseIsotropic *)q1,Tangent,stiff) ; SVector3 A; getTransverseDirection( A, q0); + A.normalize(); static STensor3 C; C*=0.; diff --git a/NonLinearSolver/materialLaw/mlawSMP.cpp b/NonLinearSolver/materialLaw/mlawSMP.cpp index 831ac38a63095ff8be2c889263888b0d4edfec3e..b51929f3d912fec3cc31c8296c5a9e95990b523b 100644 --- a/NonLinearSolver/materialLaw/mlawSMP.cpp +++ b/NonLinearSolver/materialLaw/mlawSMP.cpp @@ -2156,16 +2156,16 @@ void mlawSMP::tangent2(STensor43 &Tangent2,/*STensor43 &dFp2invdF,*/ const STens 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); - }}}}}}} + //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 diff --git a/NonLinearSolver/materialLaw/mlawTransverseIsotropic.cpp b/NonLinearSolver/materialLaw/mlawTransverseIsotropic.cpp index 0464d5d389631ce5d9b16e5466d51a66b59d5183..b4125a808f70123204d3f30bd1aea35865863fb7 100644 --- a/NonLinearSolver/materialLaw/mlawTransverseIsotropic.cpp +++ b/NonLinearSolver/materialLaw/mlawTransverseIsotropic.cpp @@ -88,6 +88,7 @@ void mlawTransverseIsotropic::constitutive(const STensor3& F0,const STensor3& Fn static SVector3 A; getTransverseDirection( A, q0); + A.normalize(); /* compute gradient of deformation */ double Jac= (Fn(0,0) * (Fn(1,1) * Fn(2,2) - Fn(1,2) * Fn(2,1)) - diff --git a/NonLinearSolver/nlsolver/CMakeLists.txt b/NonLinearSolver/nlsolver/CMakeLists.txt index 26a8769ebc42176f39253a3aa8ea2162d88f0320..99e39cfb119fbb3d76bab3744e4f330aed2c498f 100644 --- a/NonLinearSolver/nlsolver/CMakeLists.txt +++ b/NonLinearSolver/nlsolver/CMakeLists.txt @@ -22,7 +22,8 @@ set(SRC currentConfig.h nonLinearSystems.h dofManagerMultiSystems.h - imperfectionToMesh.cpp + imperfectionToMesh.cpp + homogenizedData.cpp ) file(GLOB HDR RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.h) diff --git a/NonLinearSolver/nlsolver/homogenizedData.cpp b/NonLinearSolver/nlsolver/homogenizedData.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b735846c7d8f5223be50f48cf20df3d13e59bbf1 --- /dev/null +++ b/NonLinearSolver/nlsolver/homogenizedData.cpp @@ -0,0 +1,554 @@ +// +// +// Description: store homogenized data +// +// Author: <Van Dung NGUYEN>, (C) 2013 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "homogenizedData.h" +#include "nonLinearMechSolver.h" + +homogenizedData::homogenizedData(const nonLinearMechSolver* solver, const bool failureExtr, const bool irrEnergExtract): _isBroken(false),deformationEnergy(0.),plasticEnergy(0.), +irreversibleEnergyExtraction(irrEnergExtract), cohesiveLawExtraction(failureExtr),irreversibleEnergy(0.){ + int numMecaDof = solver->getMicroBC()->getTotalNumberOfMechanicalDofs(); + int numConDof = solver->getMicroBC()->getTotalNumberOfConDofs(); + int numNonConDof = solver->getMicroBC()->getTotalNumberOfNonConDofs(); + + if (numMecaDof > 0){ + for (int i=0; i< numConDof; i++){ + dPdgradT.push_back(STensor33(0.)); + dPdT.push_back(STensor3(0.)); + if (solver->getMicroBC()->getOrder() == 2){ + dQdgradT.push_back(STensor43(0.)); + dQdT.push_back(STensor33(0.)); + } + if (cohesiveLawExtraction){ + dCohesivejumpdgradT.push_back(STensor3(0.)); + dCohesivejumpdT.push_back(SVector3(0.)); + + dFdamdgradT.push_back(STensor33(0.)); + dFdamdT.push_back(STensor3(0.)); + } + + if (irreversibleEnergyExtraction){ + dIrreversibleEnergydgradT.push_back(SVector3(0.)); + dIrreversibleEnergydT.push_back(0.); + } + + } + for (int i=0; i< numNonConDof; i++){ + dPdgradV.push_back(STensor33(0.)); + if (solver->getMicroBC()->getOrder() == 2){ + dQdgradV.push_back(STensor43(0.)); + } + if (cohesiveLawExtraction){ + dCohesivejumpdgradV.push_back(STensor3(0.)); + dFdamdgradV.push_back(STensor33(0.)); + } + + if (irreversibleEnergyExtraction){ + dIrreversibleEnergydgradV.push_back(SVector3(0.)); + } + } + } + + if (numConDof > 0){ + for (int index=0; index< numConDof; index++){ + fluxT.push_back(SVector3(0.)); + eT.push_back(0.); + srcT.push_back(0.); + Cp.push_back(0.); + + if (numMecaDof > 0){ + dfluxTdF.push_back(STensor33(0.)); + dsrcTdF.push_back(STensor3(0.)); + + if (solver->getMicroBC()->getOrder() == 2){ + dfluxTdG.push_back(STensor43(0.)); + dsrcTdG.push_back(STensor33(0.)); + } + } + + std::vector<STensor3> vecSTensor3; + std::vector<SVector3> vecSVector3; + std::vector<double> vecValue; + for (int fieldIndex=0; fieldIndex< numConDof; fieldIndex++){ + vecSTensor3.push_back(STensor3(0.)); + vecSVector3.push_back(SVector3(0.)); + vecValue.push_back(0.); + } + dfluxTdgradT.push_back(vecSTensor3); + dfluxTdT.push_back(vecSVector3); + dsrcTdgradT.push_back(vecSVector3); + dsrcTdT.push_back(vecValue); + + if (numNonConDof > 0){ + vecSTensor3.clear(); + vecSVector3.clear(); + for (int fieldIndex=0; fieldIndex< numNonConDof; fieldIndex++){ + vecSTensor3.push_back(STensor3(0.)); + vecSVector3.push_back(SVector3(0.)); + }; + dfluxTdgradV.push_back(vecSTensor3); + dsrcTdgradV.push_back(vecSVector3); + + } + } + + } + + if (numNonConDof > 0){ + for (int index=0; index< numNonConDof; index++){ + fluxV.push_back(SVector3(0.)); + if (numMecaDof > 0){ + dfluxVdF.push_back(STensor33(0.)); + if (solver->getMicroBC()->getOrder() == 2){ + dfluxVdG.push_back(STensor43(0.)); + } + } + if (numConDof > 0){ + std::vector<STensor3> vecSTensor3; + std::vector<SVector3> vecSVector3; + for (int fieldIndex = 0; fieldIndex < numConDof; fieldIndex++){ + vecSTensor3.push_back(STensor3(0.)); + vecSVector3.push_back(SVector3(0.)); + } + dfluxVdgradT.push_back(vecSTensor3); + dfluxVdT.push_back(vecSVector3); + } + std::vector<STensor3> vecSTensor3; + for (int fieldIndex = 0; fieldIndex < numNonConDof; fieldIndex++){ + vecSTensor3.push_back(STensor3(0.)); + } + dfluxVdgradV.push_back(vecSTensor3); + } + } +}; +homogenizedData::homogenizedData(const homogenizedData& src): +P(src.P),Q(src.Q),fluxT(src.fluxT),eT(src.eT),srcT(src.srcT),Cp(src.Cp),fluxV(src.fluxV), +dPdF(src.dPdF),dPdG(src.dPdG),dPdgradT(src.dPdgradT),dPdT(src.dPdT),dPdgradV(src.dPdgradV), +dQdF(src.dQdF),dQdG(src.dQdG),dQdgradT(src.dQdgradT),dQdT(src.dQdT),dQdgradV(src.dQdgradV), +dfluxTdF(src.dfluxTdF),dfluxTdG(src.dfluxTdG),dfluxTdgradT(src.dfluxTdgradT),dfluxTdT(src.dfluxTdT),dfluxTdgradV(src.dfluxTdgradV), +dfluxVdF(src.dfluxVdF),dfluxVdG(src.dfluxVdG),dfluxVdgradT(src.dfluxVdgradT),dfluxVdT(src.dfluxVdT),dfluxVdgradV(src.dfluxVdgradV), +dsrcTdF(src.dsrcTdF),dsrcTdG(src.dsrcTdG),dsrcTdgradT(src.dsrcTdgradT),dsrcTdT(src.dsrcTdT),dsrcTdgradV(src.dsrcTdgradV), +_cohesiveJump(src._cohesiveJump),_cohesiveTraction(src._cohesiveTraction),_lostSolutionUniquenssCriterion(src._lostSolutionUniquenssCriterion), +_isBroken(src._isBroken),_damageVolume(src._damageVolume),_Fdam(src._Fdam),_stressDam(src._stressDam), +_averageCohesiveBandWidth(src._averageCohesiveBandWidth),_DamageActiveZone(src._DamageActiveZone), +dCohesivejumpdF(src.dCohesivejumpdF),dCohesivejumpdG(src.dCohesivejumpdG),dCohesivejumpdgradT(src.dCohesivejumpdgradT), +dCohesivejumpdT(src.dCohesivejumpdT),dCohesivejumpdgradV(src.dCohesivejumpdgradV), +dFdamdF(src.dFdamdF),dFdamdG(src.dFdamdG),dFdamdgradT(src.dFdamdgradT),dFdamdT(src.dFdamdT),dFdamdgradV(src.dFdamdgradV), +deformationEnergy(src.deformationEnergy),plasticEnergy(src.plasticEnergy),irreversibleEnergy(src.irreversibleEnergy), +dIrreversibleEnergydF(src.dIrreversibleEnergydF), dIrreversibleEnergydG(src.dIrreversibleEnergydG), +dIrreversibleEnergydgradT(src.dIrreversibleEnergydgradT),dIrreversibleEnergydT(src.dIrreversibleEnergydT), +dIrreversibleEnergydgradV(src.dIrreversibleEnergydgradV),irreversibleEnergyExtraction(src.irreversibleEnergyExtraction), +cohesiveLawExtraction(src.cohesiveLawExtraction) +{}; +homogenizedData& homogenizedData::operator = (const homogenizedData& src){ + P = src.P; + Q = src.Q; + fluxT = src.fluxT; + eT = src.eT; + srcT = src.srcT; + Cp = src.Cp; + fluxV = src.fluxV; + dPdF = src.dPdF; + dPdG = src.dPdG; + dPdgradT = src.dPdgradT; + dPdT = src.dPdT; + dPdgradV = src.dPdgradV; + dQdF = src.dQdF; + dQdG =src.dQdG; + dQdgradT = src.dQdgradT; + dQdT = src.dQdT; + dQdgradV = src.dQdgradV; + dfluxTdF = src.dfluxTdF; + dfluxTdG = src.dfluxTdG; + dfluxTdgradT = src.dfluxTdgradT; + dfluxTdT = src.dfluxTdT; + dfluxTdgradV = src.dfluxTdgradV; + dfluxVdF = src.dfluxVdF; + dfluxVdG = src.dfluxVdG; + dfluxVdgradT = src.dfluxVdgradT; + dfluxVdT = src.dfluxVdT; + dfluxVdgradV = src.dfluxVdgradV; + dsrcTdF = src.dsrcTdF; + dsrcTdG = src.dsrcTdG; + dsrcTdgradT = src.dsrcTdgradT; + dsrcTdT = src.dsrcTdT; + dsrcTdgradV = src.dsrcTdgradV; + _cohesiveJump = src._cohesiveJump; + _cohesiveTraction = src._cohesiveTraction; + _lostSolutionUniquenssCriterion = src._lostSolutionUniquenssCriterion; + _isBroken = src._isBroken; + _damageVolume = src._damageVolume; + _Fdam = src._Fdam; + _stressDam = src._stressDam; + _averageCohesiveBandWidth = src._averageCohesiveBandWidth; + _DamageActiveZone = src._DamageActiveZone; + dCohesivejumpdF = src.dCohesivejumpdF; + dCohesivejumpdG = src.dCohesivejumpdG; + dCohesivejumpdgradT = src.dCohesivejumpdgradT; + dCohesivejumpdT = src.dCohesivejumpdT; + dCohesivejumpdgradV = src.dCohesivejumpdgradV; + dFdamdF = src.dFdamdF; + dFdamdG = src.dFdamdG; + dFdamdgradT = src.dFdamdgradT; + dFdamdT = src.dFdamdT; + dFdamdgradV = src.dFdamdgradV; + deformationEnergy = src.deformationEnergy; + plasticEnergy = src.plasticEnergy; + irreversibleEnergy = src.irreversibleEnergy; + dIrreversibleEnergydF = src.dIrreversibleEnergydF; + dIrreversibleEnergydG = src.dIrreversibleEnergydG; + dIrreversibleEnergydgradT = src.dIrreversibleEnergydgradT; + dIrreversibleEnergydT = src.dIrreversibleEnergydT; + dIrreversibleEnergydgradV = src.dIrreversibleEnergydgradV; + + irreversibleEnergyExtraction = src.irreversibleEnergyExtraction; + cohesiveLawExtraction = src.cohesiveLawExtraction; + return *this; +}; + +void allFirstOrderMechanicsFiles::openFiles(const int elnum, const int gnum, const nonLinearMechSolver* solver,const bool strainToFile, const bool stressToFile, const bool failureToFile){ + if (strainToFile){ + std::string filename = "E_"+int2str(elnum)+"_GP_"+int2str(gnum)+"_strain.csv"; + F_File = Tensor23::createFile(filename); + } + if (stressToFile){ + std::string filename = "E_"+int2str(elnum)+"_GP_"+int2str(gnum)+"_stress.csv"; + P_File= Tensor23::createFile(filename); + + filename = "E_"+int2str(elnum)+"_GP_"+int2str(gnum)+"_tangent.csv"; + dPdF_File = Tensor43::createFile(filename); + + filename = "E_"+int2str(elnum)+"_GP_"+int2str(gnum)+"_defoEnergy.csv"; + defoEnerg_File = Tensor11::createFile(filename); + + filename = "E_"+int2str(elnum)+"_GP_"+int2str(gnum)+"_plasticEnergy.csv"; + plasticEnerg_File = Tensor11::createFile(filename); + + filename = "E_"+int2str(elnum)+"_GP_"+int2str(gnum)+"_irreversibleEnergy.csv"; + irreversibleEnergFile =Tensor11::createFile(filename); + + filename = "E_"+int2str(elnum)+"_GP_"+int2str(gnum)+"_lostSolutionUniquenssCriterion.csv"; + lostSolutionUniquenssCriterion_File = Tensor11::createFile(filename); + } +}; +void allFirstOrderMechanicsFiles::dataToFile(const double time, const nonLinearMechSolver* solver, const homogenizedData* data){ + if (F_File!=NULL){ + Tensor23::writeData(F_File,solver->getMicroBC()->getFirstOrderKinematicalVariable(),time); + } + if (P_File !=NULL){ + Tensor23::writeData(P_File,data->getHomogenizedStress(),time); + } + if (dPdF_File !=NULL){ + Tensor43::writeData(dPdF_File,data->getHomogenizedTangentOperator_F_F(),time); + } + if (defoEnerg_File != NULL){ + Tensor11::writeData(defoEnerg_File,data->getDeformationEnergy(),time); + } + if (plasticEnerg_File !=NULL){ + Tensor11::writeData(plasticEnerg_File,data->getPlasticEnergy(),time); + } + if (irreversibleEnergFile!=NULL){ + Tensor11::writeData(irreversibleEnergFile,data->getIrreversibleEnergy(),time); + } + if (lostSolutionUniquenssCriterion_File!=NULL){ + Tensor11::writeData(lostSolutionUniquenssCriterion_File,data->getLostOfSolutionUniquenessCriterion(),time); + }; +} + +void allFailureFiles::openFiles(const int _enum, const int _gnum, const nonLinearMechSolver* solver,const bool strainToFile, const bool stressToFile, const bool failureToFile){ + if (failureToFile){ + std::string filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_cohesiveJump.csv"; + cohesiveJump_File = Tensor13::createFile(filename); + + filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_damageVolume.csv"; + damageVolume_File = Tensor11::createFile(filename); + + filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_cohesiveTraction.csv"; + cohesiveTraction_File = Tensor13::createFile(filename); + + filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_averageCohesiveBandWidth.csv"; + averageCohesiveBandWidth_File = Tensor11::createFile(filename); + + filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_Fdam.csv"; + FDam_File = Tensor11::createFile(filename); + + filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_DamageActiveZone.csv"; + DamageActiveZone_File = Tensor11::createFile(filename); + + filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_tangentCohesiveJumpDF.csv"; + dCohesiveJumpDF_File = Tensor33::createFile(filename); + } +}; +void allFailureFiles::dataToFile(const double time, const nonLinearMechSolver* solver, const homogenizedData* data){ + if (cohesiveJump_File!=NULL){ + Tensor13::writeData(cohesiveJump_File,data->getHomogenizedCohesiveJump(),time); + }; + + if (damageVolume_File!=NULL){ + Tensor11::writeData(damageVolume_File,data->getActiveDamageVolume(),time); + }; + if (cohesiveTraction_File!=NULL){ + Tensor13::writeData(cohesiveTraction_File,data->getHomogenizedCohesiveTraction(),time); + }; + if (averageCohesiveBandWidth_File!=NULL) { + Tensor11::writeData(averageCohesiveBandWidth_File,data->getAverageLocalizationBandWidth(),time); + }; + if (FDam_File != NULL){ + Tensor23::writeData(FDam_File,data->getHomogenizedActiveDamageDeformationGradient(),time); + } + if (DamageActiveZone_File!=NULL){ + Tensor11::writeData(DamageActiveZone_File,data->getActiveDamage(),time); + }; + if (dCohesiveJumpDF_File!=NULL){ + Tensor33::writeData(dCohesiveJumpDF_File,data->getHomogenizedTangentOperator_CohesiveJump_F(),time); + } +}; + +void allSecondOrderMechanicsFiles::openFiles(const int elnum, const int gnum, const nonLinearMechSolver* solver,const bool strainToFile, const bool stressToFile, const bool failureToFile){ + if (strainToFile){ + std::string filename = "E_"+int2str(elnum)+"_GP_"+int2str(gnum)+"_second_strain.csv"; + G_File = Tensor33::createFile(filename); + } + + if (stressToFile){ + std::string filename = "E_"+int2str(elnum)+"_GP_"+int2str(gnum)+"_second_stress.csv"; + Q_File = Tensor33::createFile(filename); + + filename = "E_"+int2str(elnum)+"_GP_"+int2str(gnum)+"_firstsecond_tangent.csv"; + dPdG_File = Tensor53::createFile(filename); + + filename = "E_"+int2str(elnum)+"_GP_"+int2str(gnum)+"_secondfirst_tangent.csv"; + dQdF_File = Tensor53::createFile(filename); + + filename = "E_"+int2str(elnum)+"_GP_"+int2str(gnum)+"_second_tangent.csv"; + dQdG_File = Tensor63::createFile(filename); + } +}; + +void allSecondOrderMechanicsFiles::dataToFile(const double time, const nonLinearMechSolver* solver, const homogenizedData* data){ + if (G_File!=NULL){ + Tensor33::writeData(G_File,solver->getMicroBC()->getSecondOrderKinematicalVariable(),time); + } + if (Q_File!=NULL){ + Tensor33::writeData(Q_File,data->getHomogenizedSecondOrderStress(),time); + } + if (dPdG_File!=NULL){ + Tensor53::writeData(dPdG_File,data->getHomogenizedTangentOperator_F_G(),time); + } + if (dQdF_File!=NULL){ + Tensor53::writeData(dQdF_File,data->getHomogenizedTangentOperator_G_F(),time); + } + if (dQdG_File!=NULL){ + Tensor63::writeData(dQdF_File,data->getHomogenizedTangentOperator_G_G(),time); + } +}; + +void allConExtraDofFiles::openFiles(const int _enum, const int _gnum, const nonLinearMechSolver* solver,const bool strainToFile, const bool stressToFile, const bool failureToFile){ + if (solver->getMicroBC()->getTotalNumberOfConDofs() > 1){ + if (strainToFile){ + std::string filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_gradExtraDof_"+int2str(fieldIndex)+".csv"; + gradT_File = Tensor13::createFile(filename); + + filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_ExtraDofValue_"+int2str(fieldIndex)+".csv"; + T_File = Tensor11::createFile(filename); + }; + if (stressToFile){ + std::string filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_ExtraDofFlux_"+int2str(fieldIndex)+".csv"; + fluxT_File = Tensor13::createFile(filename); + + filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_InternalEnergyExtraDof_"+int2str(fieldIndex)+".csv"; + eT_File = Tensor11::createFile(filename); + + filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_TangentFluxF_"+int2str(fieldIndex)+".csv"; + dFluxTdF_File = Tensor33::createFile(filename); + + filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_TangentFluxGradExtraDof_"+int2str(fieldIndex)+".csv"; + dFluxTdGradT_File = Tensor23::createFile(filename); + + filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_TangentFluxExtraDof_"+int2str(fieldIndex)+".csv"; + dFluxTdT_File = Tensor13::createFile(filename); + + filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_TangentStressGradExtraDof_"+int2str(fieldIndex)+".csv"; + dPdGradT_File = Tensor33::createFile(filename); + + filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_TangentStressExtraDofValue_"+int2str(fieldIndex)+".csv"; + dPdT_File = Tensor23::createFile(filename); + + filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_mechanicalSource_"+int2str(fieldIndex)+".csv"; + mecaSource_File = Tensor11::createFile(filename); + + filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_fieldCapacity_"+int2str(fieldIndex)+".csv"; + Cp_File = Tensor11::createFile(filename); + } + } + else if (solver->getMicroBC()->getTotalNumberOfConDofs() == 1){ + if (strainToFile){ + std::string filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_gradExtraDof.csv"; + gradT_File = Tensor13::createFile(filename); + + filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_ExtraDofValue.csv"; + T_File = Tensor11::createFile(filename); + }; + if (stressToFile){ + std::string filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_ExtraDofFlux.csv"; + fluxT_File = Tensor13::createFile(filename); + + filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_InternalEnergyExtraDof.csv"; + eT_File = Tensor11::createFile(filename); + + filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_TangentFluxF.csv"; + dFluxTdF_File = Tensor33::createFile(filename); + + filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_TangentFluxGradExtraDof.csv"; + dFluxTdGradT_File = Tensor23::createFile(filename); + + filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_TangentFluxExtraDof.csv"; + dFluxTdT_File = Tensor13::createFile(filename); + + filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_TangentStressGradExtraDof.csv"; + dPdGradT_File = Tensor33::createFile(filename); + + filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_TangentStressExtraDofValue.csv"; + dPdT_File = Tensor23::createFile(filename); + + filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_mechanicalSource.csv"; + mecaSource_File = Tensor11::createFile(filename); + + filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_fieldCapacity.csv"; + Cp_File = Tensor11::createFile(filename); + } + } +}; +void allConExtraDofFiles::dataToFile(const double time, const nonLinearMechSolver* solver, const homogenizedData* data){ + if (gradT_File !=NULL){ + Tensor13::writeData(gradT_File,solver->getMicroBC()->getConstitutiveExtraDofDiffusionKinematicalVariable(fieldIndex),time); + }; + if (T_File!=NULL){ + Tensor11::writeData(T_File,solver->getMicroBC()->getConstitutiveExtraDofDiffusionConstantVariable(fieldIndex),time); + }; + if (fluxT_File!=NULL){ + Tensor13::writeData(fluxT_File,data->getHomogenizedConstitutiveExtraDofFlux(fieldIndex),time); + }; + if (eT_File!=NULL){ + Tensor11::writeData(eT_File,data->getHomogenizedConstitutiveExtraDofInternalEnergy(fieldIndex),time); + }; + if (dFluxTdGradT_File!=NULL){ + Tensor23::writeData(dFluxTdGradT_File,data->getHomogenizedTangentOperator_gradT_gradT(fieldIndex,fieldIndex),time); + } + if (dFluxTdT_File!=NULL) { + Tensor13::writeData(dFluxTdT_File,data->getHomogenizedTangentOperator_gradT_T(fieldIndex,fieldIndex),time); + }; + if (dPdGradT_File!=NULL) { + Tensor33::writeData(dPdGradT_File,data->getHomogenizedTangentOperator_F_gradT(fieldIndex),time); + }; + if (dFluxTdF_File!=NULL) { + Tensor33::writeData(dFluxTdF_File,data->getHomogenizedTangentOperator_gradT_F(fieldIndex),time); + }; + if (dPdT_File !=NULL){ + Tensor23::writeData(dPdT_File,data->getHomogenizedTangentOperator_F_T(fieldIndex),time); + }; + if (mecaSource_File!=NULL){ + Tensor11::writeData(mecaSource_File,data->getHomogenizedConstitutiveExtraDofMechanicalSource(fieldIndex),time); + } + if (Cp_File!=NULL){ + Tensor11::writeData(Cp_File,data->getHomogenizedConstitutiveExtraDofFieldCapacityPerUnitField(fieldIndex),time); + } +}; + +void allNonConExtraDofFiles::openFiles(const int _enum, const int _gnum, const nonLinearMechSolver* solver, const bool strainToFile, const bool stressToFile, const bool failureToFile){ + if (solver->getMicroBC()->getTotalNumberOfNonConDofs() > 1){ + if (strainToFile){ + std::string filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_gradNonConExtraDof_"+int2str(fieldIndex)+".csv"; + gradV_File = Tensor13::createFile(filename); + }; + if (stressToFile){ + std::string filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_NonConExtraDofFlux_"+int2str(fieldIndex)+".csv"; + fluxV_File = Tensor13::createFile(filename); + + filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_TangentNonConFluxGradNonConExtraDof_"+int2str(fieldIndex)+".csv"; + dfluxVdgradV_File = Tensor23::createFile(filename); + } + + } + else if (solver->getMicroBC()->getTotalNumberOfNonConDofs() == 1){ + if (strainToFile){ + std::string filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_gradNonConExtraDof.csv"; + gradV_File = Tensor13::createFile(filename); + }; + if (stressToFile){ + std::string filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_NonConExtraDofFlux.csv"; + fluxV_File = Tensor13::createFile(filename); + + filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_TangentNonConFluxGradNonConExtraDof.csv"; + dfluxVdgradV_File = Tensor23::createFile(filename); + } + + + } +}; + +void allNonConExtraDofFiles::dataToFile(const double time, const nonLinearMechSolver* solver, const homogenizedData* data){ + if (gradV_File!=NULL){ + Tensor13::writeData(gradV_File,solver->getMicroBC()->getNonConstitutiveExtraDofDiffusionKinematicalVariable(fieldIndex),time); + }; + if (fluxV_File!=NULL){ + Tensor13::writeData(fluxV_File,data->getHomogenizedNonConstitutiveExtraDofFlux(fieldIndex),time); + }; + if (dfluxVdgradV_File!=NULL){ + Tensor23::writeData(dfluxVdgradV_File,data->getHomogenizedTangentOperator_gradV_gradV(fieldIndex,fieldIndex),time); + }; +}; + + +homogenizedDataFiles::homogenizedDataFiles(const nonLinearMechSolver* solver): _allFirstOrderFiles(), _allSecondOrderFiles(),_allFailureFiles(){ + for (int index=0; index< solver->getMicroBC()->getTotalNumberOfConDofs(); index++){ + _allConFiles.push_back(allConExtraDofFiles(index)); + } + for (int index=0; index< solver->getMicroBC()->getTotalNumberOfNonConDofs(); index++){ + _allNonConFiles.push_back(allNonConExtraDofFiles(index)); + } + +}; + +void homogenizedDataFiles::openFiles(const int elnum, const int gnum, const nonLinearMechSolver* solver, + const bool strainToFile, const bool stressToFile, const bool failureToFile){ + if (solver->getMicroBC()->getTotalNumberOfMechanicalDofs()>0){ + _allFirstOrderFiles.openFiles(elnum,gnum,solver,strainToFile,stressToFile,failureToFile); + if (solver->getMicroBC()->getOrder()==2){ + _allSecondOrderFiles.openFiles(elnum,gnum,solver,strainToFile,stressToFile,failureToFile); + } + if (failureToFile){ + _allFailureFiles.openFiles(elnum,gnum,solver,strainToFile,stressToFile,failureToFile); + } + } + if (solver->getMicroBC()->getTotalNumberOfConDofs()>0){ + for (int index=0; index < solver->getMicroBC()->getTotalNumberOfConDofs(); index++){ + _allConFiles[index].openFiles(elnum,gnum,solver,strainToFile,stressToFile,failureToFile); + } + } + if (solver->getMicroBC()->getTotalNumberOfNonConDofs()>0){ + for (int index=0; index < solver->getMicroBC()->getTotalNumberOfNonConDofs(); index++){ + _allNonConFiles[index].openFiles(elnum,gnum,solver,strainToFile,stressToFile,failureToFile); + } + } +}; + +void homogenizedDataFiles::dataToFile(const double time, const nonLinearMechSolver* solver, const homogenizedData* data){ + _allFirstOrderFiles.dataToFile(time,solver,data); + _allSecondOrderFiles.dataToFile(time,solver,data); + _allFailureFiles.dataToFile(time,solver,data); + + for (int index=0; index <_allConFiles.size(); index++){ + _allConFiles[index].dataToFile(time,solver,data); + } + + for (int index=0; index < _allNonConFiles.size(); index++){ + _allNonConFiles[index].dataToFile(time,solver,data); + } + +}; \ No newline at end of file diff --git a/NonLinearSolver/nlsolver/homogenizedData.h b/NonLinearSolver/nlsolver/homogenizedData.h index e2b5bb791f018e3dfe1cf1d09c9936cadd6c3e51..ab108393f834f9ef7534f2891c272e81b5fe7020 100644 --- a/NonLinearSolver/nlsolver/homogenizedData.h +++ b/NonLinearSolver/nlsolver/homogenizedData.h @@ -27,6 +27,8 @@ // P, Q, fluxT, fluxV, mecaSourceT // fieldCapacity, _internalEnergyExtraDof are assumed to be constant in current time step +class nonLinearMechSolver; + class homogenizedData { friend class homogenizedDataFiles; private: @@ -111,206 +113,9 @@ class homogenizedData { std::vector<SVector3> dIrreversibleEnergydgradV; public: - homogenizedData(nonLinearMicroBC* mbc, const bool failureExtr, const bool irrEnergExtract): _isBroken(false),deformationEnergy(0.),plasticEnergy(0.), - irreversibleEnergyExtraction(irrEnergExtract), cohesiveLawExtraction(failureExtr),irreversibleEnergy(0.){ - int numMecaDof = mbc->getTotalNumberOfMechanicalDofs(); - int numConDof = mbc->getTotalNumberOfConDofs(); - int numNonConDof = mbc->getTotalNumberOfNonConDofs(); - - if (numMecaDof > 0){ - for (int i=0; i< numConDof; i++){ - dPdgradT.push_back(STensor33(0.)); - dPdT.push_back(STensor3(0.)); - if (mbc->getOrder() == 2){ - dQdgradT.push_back(STensor43(0.)); - dQdT.push_back(STensor33(0.)); - } - if (cohesiveLawExtraction){ - dCohesivejumpdgradT.push_back(STensor3(0.)); - dCohesivejumpdT.push_back(SVector3(0.)); - - dFdamdgradT.push_back(STensor33(0.)); - dFdamdT.push_back(STensor3(0.)); - } - - if (irreversibleEnergyExtraction){ - dIrreversibleEnergydgradT.push_back(SVector3(0.)); - dIrreversibleEnergydT.push_back(0.); - } - - } - for (int i=0; i< numNonConDof; i++){ - dPdgradV.push_back(STensor33(0.)); - if (mbc->getOrder() == 2){ - dQdgradV.push_back(STensor43(0.)); - } - if (cohesiveLawExtraction){ - dCohesivejumpdgradV.push_back(STensor3(0.)); - dFdamdgradV.push_back(STensor33(0.)); - } - - if (irreversibleEnergyExtraction){ - dIrreversibleEnergydgradV.push_back(SVector3(0.)); - } - } - } - - if (numConDof > 0){ - for (int index=0; index< numConDof; index++){ - fluxT.push_back(SVector3(0.)); - eT.push_back(0.); - srcT.push_back(0.); - Cp.push_back(0.); - - if (numMecaDof > 0){ - dfluxTdF.push_back(STensor33(0.)); - dsrcTdF.push_back(STensor3(0.)); - - if (mbc->getOrder() == 2){ - dfluxTdG.push_back(STensor43(0.)); - dsrcTdG.push_back(STensor33(0.)); - } - } - - std::vector<STensor3> vecSTensor3; - std::vector<SVector3> vecSVector3; - std::vector<double> vecValue; - for (int fieldIndex=0; fieldIndex< numConDof; fieldIndex++){ - vecSTensor3.push_back(STensor3(0.)); - vecSVector3.push_back(SVector3(0.)); - vecValue.push_back(0.); - } - dfluxTdgradT.push_back(vecSTensor3); - dfluxTdT.push_back(vecSVector3); - dsrcTdgradT.push_back(vecSVector3); - dsrcTdT.push_back(vecValue); - - if (numNonConDof > 0){ - vecSTensor3.clear(); - vecSVector3.clear(); - for (int fieldIndex=0; fieldIndex< numNonConDof; fieldIndex++){ - vecSTensor3.push_back(STensor3(0.)); - vecSVector3.push_back(SVector3(0.)); - }; - dfluxTdgradV.push_back(vecSTensor3); - dsrcTdgradV.push_back(vecSVector3); - - } - } - - } - - if (numNonConDof > 0){ - for (int index=0; index< numNonConDof; index++){ - fluxV.push_back(SVector3(0.)); - if (numMecaDof > 0){ - dfluxVdF.push_back(STensor33(0.)); - if (mbc->getOrder() == 2){ - dfluxVdG.push_back(STensor43(0.)); - } - } - if (numConDof > 0){ - std::vector<STensor3> vecSTensor3; - std::vector<SVector3> vecSVector3; - for (int fieldIndex = 0; fieldIndex < numConDof; fieldIndex++){ - vecSTensor3.push_back(STensor3(0.)); - vecSVector3.push_back(SVector3(0.)); - } - dfluxVdgradT.push_back(vecSTensor3); - dfluxVdT.push_back(vecSVector3); - } - std::vector<STensor3> vecSTensor3; - for (int fieldIndex = 0; fieldIndex < numNonConDof; fieldIndex++){ - vecSTensor3.push_back(STensor3(0.)); - } - dfluxVdgradV.push_back(vecSTensor3); - } - } - }; - homogenizedData(const homogenizedData& src): - P(src.P),Q(src.Q),fluxT(src.fluxT),eT(src.eT),srcT(src.srcT),Cp(src.Cp),fluxV(src.fluxV), - dPdF(src.dPdF),dPdG(src.dPdG),dPdgradT(src.dPdgradT),dPdT(src.dPdT),dPdgradV(src.dPdgradV), - dQdF(src.dQdF),dQdG(src.dQdG),dQdgradT(src.dQdgradT),dQdT(src.dQdT),dQdgradV(src.dQdgradV), - dfluxTdF(src.dfluxTdF),dfluxTdG(src.dfluxTdG),dfluxTdgradT(src.dfluxTdgradT),dfluxTdT(src.dfluxTdT),dfluxTdgradV(src.dfluxTdgradV), - dfluxVdF(src.dfluxVdF),dfluxVdG(src.dfluxVdG),dfluxVdgradT(src.dfluxVdgradT),dfluxVdT(src.dfluxVdT),dfluxVdgradV(src.dfluxVdgradV), - dsrcTdF(src.dsrcTdF),dsrcTdG(src.dsrcTdG),dsrcTdgradT(src.dsrcTdgradT),dsrcTdT(src.dsrcTdT),dsrcTdgradV(src.dsrcTdgradV), - _cohesiveJump(src._cohesiveJump),_cohesiveTraction(src._cohesiveTraction),_lostSolutionUniquenssCriterion(src._lostSolutionUniquenssCriterion), - _isBroken(src._isBroken),_damageVolume(src._damageVolume),_Fdam(src._Fdam),_stressDam(src._stressDam), - _averageCohesiveBandWidth(src._averageCohesiveBandWidth),_DamageActiveZone(src._DamageActiveZone), - dCohesivejumpdF(src.dCohesivejumpdF),dCohesivejumpdG(src.dCohesivejumpdG),dCohesivejumpdgradT(src.dCohesivejumpdgradT), - dCohesivejumpdT(src.dCohesivejumpdT),dCohesivejumpdgradV(src.dCohesivejumpdgradV), - dFdamdF(src.dFdamdF),dFdamdG(src.dFdamdG),dFdamdgradT(src.dFdamdgradT),dFdamdT(src.dFdamdT),dFdamdgradV(src.dFdamdgradV), - deformationEnergy(src.deformationEnergy),plasticEnergy(src.plasticEnergy),irreversibleEnergy(src.irreversibleEnergy), - dIrreversibleEnergydF(src.dIrreversibleEnergydF), dIrreversibleEnergydG(src.dIrreversibleEnergydG), - dIrreversibleEnergydgradT(src.dIrreversibleEnergydgradT),dIrreversibleEnergydT(src.dIrreversibleEnergydT), - dIrreversibleEnergydgradV(src.dIrreversibleEnergydgradV),irreversibleEnergyExtraction(src.irreversibleEnergyExtraction), - cohesiveLawExtraction(src.cohesiveLawExtraction) - {}; - homogenizedData& operator = (const homogenizedData& src){ - P = src.P; - Q = src.Q; - fluxT = src.fluxT; - eT = src.eT; - srcT = src.srcT; - Cp = src.Cp; - fluxV = src.fluxV; - dPdF = src.dPdF; - dPdG = src.dPdG; - dPdgradT = src.dPdgradT; - dPdT = src.dPdT; - dPdgradV = src.dPdgradV; - dQdF = src.dQdF; - dQdG =src.dQdG; - dQdgradT = src.dQdgradT; - dQdT = src.dQdT; - dQdgradV = src.dQdgradV; - dfluxTdF = src.dfluxTdF; - dfluxTdG = src.dfluxTdG; - dfluxTdgradT = src.dfluxTdgradT; - dfluxTdT = src.dfluxTdT; - dfluxTdgradV = src.dfluxTdgradV; - dfluxVdF = src.dfluxVdF; - dfluxVdG = src.dfluxVdG; - dfluxVdgradT = src.dfluxVdgradT; - dfluxVdT = src.dfluxVdT; - dfluxVdgradV = src.dfluxVdgradV; - dsrcTdF = src.dsrcTdF; - dsrcTdG = src.dsrcTdG; - dsrcTdgradT = src.dsrcTdgradT; - dsrcTdT = src.dsrcTdT; - dsrcTdgradV = src.dsrcTdgradV; - _cohesiveJump = src._cohesiveJump; - _cohesiveTraction = src._cohesiveTraction; - _lostSolutionUniquenssCriterion = src._lostSolutionUniquenssCriterion; - _isBroken = src._isBroken; - _damageVolume = src._damageVolume; - _Fdam = src._Fdam; - _stressDam = src._stressDam; - _averageCohesiveBandWidth = src._averageCohesiveBandWidth; - _DamageActiveZone = src._DamageActiveZone; - dCohesivejumpdF = src.dCohesivejumpdF; - dCohesivejumpdG = src.dCohesivejumpdG; - dCohesivejumpdgradT = src.dCohesivejumpdgradT; - dCohesivejumpdT = src.dCohesivejumpdT; - dCohesivejumpdgradV = src.dCohesivejumpdgradV; - dFdamdF = src.dFdamdF; - dFdamdG = src.dFdamdG; - dFdamdgradT = src.dFdamdgradT; - dFdamdT = src.dFdamdT; - dFdamdgradV = src.dFdamdgradV; - deformationEnergy = src.deformationEnergy; - plasticEnergy = src.plasticEnergy; - irreversibleEnergy = src.irreversibleEnergy; - dIrreversibleEnergydF = src.dIrreversibleEnergydF; - dIrreversibleEnergydG = src.dIrreversibleEnergydG; - dIrreversibleEnergydgradT = src.dIrreversibleEnergydgradT; - dIrreversibleEnergydT = src.dIrreversibleEnergydT; - dIrreversibleEnergydgradV = src.dIrreversibleEnergydgradV; - - irreversibleEnergyExtraction = src.irreversibleEnergyExtraction; - cohesiveLawExtraction = src.cohesiveLawExtraction; - return *this; - }; + homogenizedData(const nonLinearMechSolver* solver, const bool failureExtr, const bool irrEnergExtract); + homogenizedData(const homogenizedData& src); + homogenizedData& operator = (const homogenizedData& src); bool getIrreversibleEnergyExtractionFlag() const {return irreversibleEnergyExtraction;}; bool getCohesiveLawExtractionFlag() const {return cohesiveLawExtraction;}; @@ -497,54 +302,8 @@ class allFirstOrderMechanicsFiles{ allFirstOrderMechanicsFiles():F_File(NULL),P_File(NULL),dPdF_File(NULL),defoEnerg_File(NULL),plasticEnerg_File(NULL), irreversibleEnergFile(NULL),lostSolutionUniquenssCriterion_File(NULL){}; ~allFirstOrderMechanicsFiles(){}; - void openFiles(const int elnum, const int gnum, const nonLinearMicroBC* mbc,const bool strainToFile, const bool stressToFile, const bool failureToFile){ - if (strainToFile){ - std::string filename = "E_"+int2str(elnum)+"_GP_"+int2str(gnum)+"_strain.csv"; - F_File = Tensor23::createFile(filename); - } - if (stressToFile){ - std::string filename = "E_"+int2str(elnum)+"_GP_"+int2str(gnum)+"_stress.csv"; - P_File= Tensor23::createFile(filename); - - filename = "E_"+int2str(elnum)+"_GP_"+int2str(gnum)+"_tangent.csv"; - dPdF_File = Tensor43::createFile(filename); - - filename = "E_"+int2str(elnum)+"_GP_"+int2str(gnum)+"_defoEnergy.csv"; - defoEnerg_File = Tensor11::createFile(filename); - - filename = "E_"+int2str(elnum)+"_GP_"+int2str(gnum)+"_plasticEnergy.csv"; - plasticEnerg_File = Tensor11::createFile(filename); - - filename = "E_"+int2str(elnum)+"_GP_"+int2str(gnum)+"_irreversibleEnergy.csv"; - irreversibleEnergFile =Tensor11::createFile(filename); - - filename = "E_"+int2str(elnum)+"_GP_"+int2str(gnum)+"_lostSolutionUniquenssCriterion.csv"; - lostSolutionUniquenssCriterion_File = Tensor11::createFile(filename); - } - }; - void dataToFile(const double time, const nonLinearMicroBC* mbc, const homogenizedData* data){ - if (F_File!=NULL){ - Tensor23::writeData(F_File,mbc->getFirstOrderKinematicalVariable(),time); - } - if (P_File !=NULL){ - Tensor23::writeData(P_File,data->getHomogenizedStress(),time); - } - if (dPdF_File !=NULL){ - Tensor43::writeData(dPdF_File,data->getHomogenizedTangentOperator_F_F(),time); - } - if (defoEnerg_File != NULL){ - Tensor11::writeData(defoEnerg_File,data->getDeformationEnergy(),time); - } - if (plasticEnerg_File !=NULL){ - Tensor11::writeData(plasticEnerg_File,data->getPlasticEnergy(),time); - } - if (irreversibleEnergFile!=NULL){ - Tensor11::writeData(irreversibleEnergFile,data->getIrreversibleEnergy(),time); - } - if (lostSolutionUniquenssCriterion_File!=NULL){ - Tensor11::writeData(lostSolutionUniquenssCriterion_File,data->getLostOfSolutionUniquenessCriterion(),time); - }; - } + void openFiles(const int elnum, const int gnum, const nonLinearMechSolver* solver,const bool strainToFile, const bool stressToFile, const bool failureToFile); + void dataToFile(const double time, const nonLinearMechSolver* solver, const homogenizedData* data); void closeFiles(){ if (F_File!=NULL) {fclose(F_File); F_File = NULL;}; if (P_File!=NULL) {fclose(P_File); P_File = NULL;}; @@ -569,54 +328,8 @@ class allFailureFiles{ damageVolume_File(NULL),cohesiveTraction_File(NULL),averageCohesiveBandWidth_File(NULL), FDam_File(NULL), DamageActiveZone_File(NULL),dCohesiveJumpDF_File(NULL){}; ~allFailureFiles(){}; - void openFiles(const int _enum, const int _gnum, const nonLinearMicroBC* mbc,const bool strainToFile, const bool stressToFile, const bool failureToFile){ - if (failureToFile){ - std::string filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_cohesiveJump.csv"; - cohesiveJump_File = Tensor13::createFile(filename); - - filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_damageVolume.csv"; - damageVolume_File = Tensor11::createFile(filename); - - filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_cohesiveTraction.csv"; - cohesiveTraction_File = Tensor13::createFile(filename); - - filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_averageCohesiveBandWidth.csv"; - averageCohesiveBandWidth_File = Tensor11::createFile(filename); - - filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_Fdam.csv"; - FDam_File = Tensor11::createFile(filename); - - filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_DamageActiveZone.csv"; - DamageActiveZone_File = Tensor11::createFile(filename); - - filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_tangentCohesiveJumpDF.csv"; - dCohesiveJumpDF_File = Tensor33::createFile(filename); - } - }; - void dataToFile(const double time, const nonLinearMicroBC* mbc, const homogenizedData* data){ - if (cohesiveJump_File!=NULL){ - Tensor13::writeData(cohesiveJump_File,data->getHomogenizedCohesiveJump(),time); - }; - - if (damageVolume_File!=NULL){ - Tensor11::writeData(damageVolume_File,data->getActiveDamageVolume(),time); - }; - if (cohesiveTraction_File!=NULL){ - Tensor13::writeData(cohesiveTraction_File,data->getHomogenizedCohesiveTraction(),time); - }; - if (averageCohesiveBandWidth_File!=NULL) { - Tensor11::writeData(averageCohesiveBandWidth_File,data->getAverageLocalizationBandWidth(),time); - }; - if (FDam_File != NULL){ - Tensor23::writeData(FDam_File,data->getHomogenizedActiveDamageDeformationGradient(),time); - } - if (DamageActiveZone_File!=NULL){ - Tensor11::writeData(DamageActiveZone_File,data->getActiveDamage(),time); - }; - if (dCohesiveJumpDF_File!=NULL){ - Tensor33::writeData(dCohesiveJumpDF_File,data->getHomogenizedTangentOperator_CohesiveJump_F(),time); - } - }; + void openFiles(const int _enum, const int _gnum, const nonLinearMechSolver* solver,const bool strainToFile, const bool stressToFile, const bool failureToFile); + void dataToFile(const double time, const nonLinearMechSolver* solver, const homogenizedData* data); void closeFiles(){ if (cohesiveJump_File!=NULL){fclose(cohesiveJump_File);cohesiveJump_File=NULL;}; if (damageVolume_File!=NULL){fclose(damageVolume_File);damageVolume_File=NULL;}; @@ -638,44 +351,9 @@ class allSecondOrderMechanicsFiles{ *dQdF_File; allSecondOrderMechanicsFiles():G_File(NULL),Q_File(NULL),dQdG_File(NULL),dPdG_File(NULL),dQdF_File(NULL){}; ~allSecondOrderMechanicsFiles(){}; - void openFiles(const int elnum, const int gnum, const nonLinearMicroBC* mbc,const bool strainToFile, const bool stressToFile, const bool failureToFile){ - if (strainToFile){ - std::string filename = "E_"+int2str(elnum)+"_GP_"+int2str(gnum)+"_second_strain.csv"; - G_File = Tensor33::createFile(filename); - } - - if (stressToFile){ - std::string filename = "E_"+int2str(elnum)+"_GP_"+int2str(gnum)+"_second_stress.csv"; - Q_File = Tensor33::createFile(filename); - - filename = "E_"+int2str(elnum)+"_GP_"+int2str(gnum)+"_firstsecond_tangent.csv"; - dPdG_File = Tensor53::createFile(filename); - - filename = "E_"+int2str(elnum)+"_GP_"+int2str(gnum)+"_secondfirst_tangent.csv"; - dQdF_File = Tensor53::createFile(filename); - - filename = "E_"+int2str(elnum)+"_GP_"+int2str(gnum)+"_second_tangent.csv"; - dQdG_File = Tensor63::createFile(filename); - } - }; + void openFiles(const int elnum, const int gnum, const nonLinearMechSolver* solver,const bool strainToFile, const bool stressToFile, const bool failureToFile); - void dataToFile(const double time, nonLinearMicroBC* mbc, const homogenizedData* data){ - if (G_File!=NULL){ - Tensor33::writeData(G_File,mbc->getSecondOrderKinematicalVariable(),time); - } - if (Q_File!=NULL){ - Tensor33::writeData(Q_File,data->getHomogenizedSecondOrderStress(),time); - } - if (dPdG_File!=NULL){ - Tensor53::writeData(dPdG_File,data->getHomogenizedTangentOperator_F_G(),time); - } - if (dQdF_File!=NULL){ - Tensor53::writeData(dQdF_File,data->getHomogenizedTangentOperator_G_F(),time); - } - if (dQdG_File!=NULL){ - Tensor63::writeData(dQdF_File,data->getHomogenizedTangentOperator_G_G(),time); - } - }; + void dataToFile(const double time, const nonLinearMechSolver* solver, const homogenizedData* data); void closeFiles(){ if (G_File!=NULL){fclose(G_File); G_File=NULL;}; if (Q_File!=NULL){fclose(Q_File); Q_File=NULL;}; @@ -702,117 +380,8 @@ class allConExtraDofFiles{ allConExtraDofFiles(const int index):fieldIndex(index), gradT_File(NULL),T_File(NULL),fluxT_File(NULL),eT_File(NULL),dFluxTdF_File(NULL),dFluxTdGradT_File(NULL), dFluxTdT_File(NULL),dPdGradT_File(NULL),dPdT_File(NULL),mecaSource_File(NULL),Cp_File(NULL){}; ~allConExtraDofFiles(){}; - void openFiles(const int _enum, const int _gnum, const nonLinearMicroBC* mbc,const bool strainToFile, const bool stressToFile, const bool failureToFile){ - if (mbc->getTotalNumberOfConDofs() > 1){ - if (strainToFile){ - std::string filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_gradExtraDof_"+int2str(fieldIndex)+".csv"; - gradT_File = Tensor13::createFile(filename); - - filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_ExtraDofValue_"+int2str(fieldIndex)+".csv"; - T_File = Tensor11::createFile(filename); - }; - if (stressToFile){ - std::string filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_ExtraDofFlux_"+int2str(fieldIndex)+".csv"; - fluxT_File = Tensor13::createFile(filename); - - filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_InternalEnergyExtraDof_"+int2str(fieldIndex)+".csv"; - eT_File = Tensor11::createFile(filename); - - filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_TangentFluxF_"+int2str(fieldIndex)+".csv"; - dFluxTdF_File = Tensor33::createFile(filename); - - filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_TangentFluxGradExtraDof_"+int2str(fieldIndex)+".csv"; - dFluxTdGradT_File = Tensor23::createFile(filename); - - filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_TangentFluxExtraDof_"+int2str(fieldIndex)+".csv"; - dFluxTdT_File = Tensor13::createFile(filename); - - filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_TangentStressGradExtraDof_"+int2str(fieldIndex)+".csv"; - dPdGradT_File = Tensor33::createFile(filename); - - filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_TangentStressExtraDofValue_"+int2str(fieldIndex)+".csv"; - dPdT_File = Tensor23::createFile(filename); - - filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_mechanicalSource_"+int2str(fieldIndex)+".csv"; - mecaSource_File = Tensor11::createFile(filename); - - filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_fieldCapacity_"+int2str(fieldIndex)+".csv"; - Cp_File = Tensor11::createFile(filename); - } - } - else if (mbc->getTotalNumberOfConDofs() == 1){ - if (strainToFile){ - std::string filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_gradExtraDof.csv"; - gradT_File = Tensor13::createFile(filename); - - filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_ExtraDofValue.csv"; - T_File = Tensor11::createFile(filename); - }; - if (stressToFile){ - std::string filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_ExtraDofFlux.csv"; - fluxT_File = Tensor13::createFile(filename); - - filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_InternalEnergyExtraDof.csv"; - eT_File = Tensor11::createFile(filename); - - filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_TangentFluxF.csv"; - dFluxTdF_File = Tensor33::createFile(filename); - - filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_TangentFluxGradExtraDof.csv"; - dFluxTdGradT_File = Tensor23::createFile(filename); - - filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_TangentFluxExtraDof.csv"; - dFluxTdT_File = Tensor13::createFile(filename); - - filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_TangentStressGradExtraDof.csv"; - dPdGradT_File = Tensor33::createFile(filename); - - filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_TangentStressExtraDofValue.csv"; - dPdT_File = Tensor23::createFile(filename); - - filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_mechanicalSource.csv"; - mecaSource_File = Tensor11::createFile(filename); - - filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_fieldCapacity.csv"; - Cp_File = Tensor11::createFile(filename); - } - } - }; - void dataToFile(const double time, nonLinearMicroBC* mbc, const homogenizedData* data){ - if (gradT_File !=NULL){ - Tensor13::writeData(gradT_File,mbc->getConstitutiveExtraDofDiffusionKinematicalVariable(fieldIndex),time); - }; - if (T_File!=NULL){ - Tensor11::writeData(T_File,mbc->getConstitutiveExtraDofDiffusionConstantVariable(fieldIndex),time); - }; - if (fluxT_File!=NULL){ - Tensor13::writeData(fluxT_File,data->getHomogenizedConstitutiveExtraDofFlux(fieldIndex),time); - }; - if (eT_File!=NULL){ - Tensor11::writeData(eT_File,data->getHomogenizedConstitutiveExtraDofInternalEnergy(fieldIndex),time); - }; - if (dFluxTdGradT_File!=NULL){ - Tensor23::writeData(dFluxTdGradT_File,data->getHomogenizedTangentOperator_gradT_gradT(fieldIndex,fieldIndex),time); - } - if (dFluxTdT_File!=NULL) { - Tensor13::writeData(dFluxTdT_File,data->getHomogenizedTangentOperator_gradT_T(fieldIndex,fieldIndex),time); - }; - if (dPdGradT_File!=NULL) { - Tensor33::writeData(dPdGradT_File,data->getHomogenizedTangentOperator_F_gradT(fieldIndex),time); - }; - if (dFluxTdF_File!=NULL) { - Tensor33::writeData(dFluxTdF_File,data->getHomogenizedTangentOperator_gradT_F(fieldIndex),time); - }; - if (dPdT_File !=NULL){ - Tensor23::writeData(dPdT_File,data->getHomogenizedTangentOperator_F_T(fieldIndex),time); - }; - if (mecaSource_File!=NULL){ - Tensor11::writeData(mecaSource_File,data->getHomogenizedConstitutiveExtraDofMechanicalSource(fieldIndex),time); - } - if (Cp_File!=NULL){ - Tensor11::writeData(Cp_File,data->getHomogenizedConstitutiveExtraDofFieldCapacityPerUnitField(fieldIndex),time); - } - }; + void openFiles(const int _enum, const int _gnum, const nonLinearMechSolver* solver,const bool strainToFile, const bool stressToFile, const bool failureToFile); + void dataToFile(const double time, const nonLinearMechSolver* solver, const homogenizedData* data); void closeFiles(){ if (gradT_File !=NULL){ fclose(gradT_File);gradT_File=NULL;}; if (T_File!=NULL){fclose(T_File); T_File = NULL;}; @@ -838,49 +407,8 @@ class allNonConExtraDofFiles{ allNonConExtraDofFiles(const int index):fieldIndex(index),gradV_File(NULL),fluxV_File(NULL),dfluxVdgradV_File(NULL){}; ~allNonConExtraDofFiles(){}; - void openFiles(const int _enum, const int _gnum, const nonLinearMicroBC* mbc,const bool strainToFile, const bool stressToFile, const bool failureToFile){ - if (mbc->getTotalNumberOfNonConDofs() > 1){ - if (strainToFile){ - std::string filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_gradNonConExtraDof_"+int2str(fieldIndex)+".csv"; - gradV_File = Tensor13::createFile(filename); - }; - if (stressToFile){ - std::string filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_NonConExtraDofFlux_"+int2str(fieldIndex)+".csv"; - fluxV_File = Tensor13::createFile(filename); - - filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_TangentNonConFluxGradNonConExtraDof_"+int2str(fieldIndex)+".csv"; - dfluxVdgradV_File = Tensor23::createFile(filename); - } - - } - else if (mbc->getTotalNumberOfNonConDofs() == 1){ - if (strainToFile){ - std::string filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_gradNonConExtraDof.csv"; - gradV_File = Tensor13::createFile(filename); - }; - if (stressToFile){ - std::string filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_NonConExtraDofFlux.csv"; - fluxV_File = Tensor13::createFile(filename); - - filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_TangentNonConFluxGradNonConExtraDof.csv"; - dfluxVdgradV_File = Tensor23::createFile(filename); - } - - - } - }; - - void dataToFile(const double time, nonLinearMicroBC* mbc, const homogenizedData* data){ - if (gradV_File!=NULL){ - Tensor13::writeData(gradV_File,mbc->getNonConstitutiveExtraDofDiffusionKinematicalVariable(fieldIndex),time); - }; - if (fluxV_File!=NULL){ - Tensor13::writeData(fluxV_File,data->getHomogenizedNonConstitutiveExtraDofFlux(fieldIndex),time); - }; - if (dfluxVdgradV_File!=NULL){ - Tensor23::writeData(dfluxVdgradV_File,data->getHomogenizedTangentOperator_gradV_gradV(fieldIndex,fieldIndex),time); - }; - }; + void openFiles(const int _enum, const int _gnum, const nonLinearMechSolver* solver,const bool strainToFile, const bool stressToFile, const bool failureToFile); + void dataToFile(const double time, const nonLinearMechSolver* solver, const homogenizedData* data); void closeFiles(){ if (gradV_File!=NULL){fclose(gradV_File);gradV_File=NULL;}; if (fluxV_File!=NULL){fclose(fluxV_File);fluxV_File=NULL;}; @@ -898,53 +426,11 @@ class homogenizedDataFiles{ std::vector<allNonConExtraDofFiles> _allNonConFiles; public: - homogenizedDataFiles(const nonLinearMicroBC* mbc): _allFirstOrderFiles(), _allSecondOrderFiles(),_allFailureFiles(){ - for (int index=0; index< mbc->getTotalNumberOfConDofs(); index++){ - _allConFiles.push_back(allConExtraDofFiles(index)); - } - for (int index=0; index< mbc->getTotalNumberOfNonConDofs(); index++){ - _allNonConFiles.push_back(allNonConExtraDofFiles(index)); - } - - }; + homogenizedDataFiles(const nonLinearMechSolver* solver), ~homogenizedDataFiles(){} - void openFiles(const int elnum, const int gnum, nonLinearMicroBC* mbc, - const bool strainToFile, const bool stressToFile, const bool failureToFile){ - if (mbc->getTotalNumberOfMechanicalDofs()>0){ - _allFirstOrderFiles.openFiles(elnum,gnum,mbc,strainToFile,stressToFile,failureToFile); - if (mbc->getOrder()==2){ - _allSecondOrderFiles.openFiles(elnum,gnum,mbc,strainToFile,stressToFile,failureToFile); - } - if (failureToFile){ - _allFailureFiles.openFiles(elnum,gnum,mbc,strainToFile,stressToFile,failureToFile); - } - } - if (mbc->getTotalNumberOfConDofs()>0){ - for (int index=0; index < mbc->getTotalNumberOfConDofs(); index++){ - _allConFiles[index].openFiles(elnum,gnum,mbc,strainToFile,stressToFile,failureToFile); - } - } - if (mbc->getTotalNumberOfNonConDofs()>0){ - for (int index=0; index < mbc->getTotalNumberOfNonConDofs(); index++){ - _allNonConFiles[index].openFiles(elnum,gnum,mbc,strainToFile,stressToFile,failureToFile); - } - } - }; - - void dataToFile(const double time, nonLinearMicroBC* mbc, const homogenizedData* data){ - _allFirstOrderFiles.dataToFile(time,mbc,data); - _allSecondOrderFiles.dataToFile(time,mbc,data); - _allFailureFiles.dataToFile(time,mbc,data); - - for (int index=0; index <_allConFiles.size(); index++){ - _allConFiles[index].dataToFile(time,mbc,data); - } - - for (int index=0; index < _allNonConFiles.size(); index++){ - _allNonConFiles[index].dataToFile(time,mbc,data); - } - - }; + void openFiles(const int elnum, const int gnum, const nonLinearMechSolver* solver, + const bool strainToFile, const bool stressToFile, const bool failureToFile); + void dataToFile(const double time, const nonLinearMechSolver* solver, const homogenizedData* data); void closeFiles(){ _allFirstOrderFiles.closeFiles(); diff --git a/NonLinearSolver/nlsolver/nonLinearMechSolver.cpp b/NonLinearSolver/nlsolver/nonLinearMechSolver.cpp index 8c12efcbca49c940d1ad82b70d03a7a6dd8fccaf..92267bb8baf0d5331bd4bf5b1e7c30242ad4b21e 100644 --- a/NonLinearSolver/nlsolver/nonLinearMechSolver.cpp +++ b/NonLinearSolver/nlsolver/nonLinearMechSolver.cpp @@ -65,6 +65,9 @@ #include "failureDetection.h" //#include "linearSystemGMRESk.h" #include "restartManager.h" +#include "geometryRotation.h" +#include "interfaceReferenceLocalBasis.h" +#include "numericalMaterial.h" #if defined(HAVE_POST) #include "PView.h" @@ -121,7 +124,10 @@ _pathFollowingLocation(BULK_INTERFACE), _homogenizedStressLastActiveDamage(0.),_homogenizedStrainLastActiveDamage(0.), _homogenizedCohesiveJumpLastActiveDamage(0.), - _lostSolutionUniquenssTolerance(0.) + _lostSolutionUniquenssTolerance(0.), _voidPartInLocalizationBand(0.), + _GModelIsRotated(false), _checkFailureOnset(false), + _damageVolumeCenter(0.,0.,0.),_homogenizedCrackSurface(0.), + _microBCOld(NULL),_microFailureBC(NULL), _failureBCIsSwitched(false) { // check parallelization of dofManager #if defined(HAVE_MPI) @@ -174,19 +180,17 @@ nonLinearMechSolver::~nonLinearMechSolver() delete _microBC; _microBC = NULL; } + if (_microBCOld) delete _microBCOld; + if (_microFailureBC) delete _microFailureBC; if (_erosionGlobalCriterion!=NULL){ delete _erosionGlobalCriterion; } -// if(_ipf != NULL) delete _ipf; -// for(std::map<int,materialLaw*>::iterator it = maplaw.begin(); it!=maplaw.end();++it){ delete it->second;} - // I can't delete otherwise problem at the end since swig. -// for(std::vector<partDomain*>::iterator it = domainVector.begin(); it!=domainVector.end(); ++it){delete *it;} - // proper finalize? - if(!_microFlag) // only on the master solver? + if(_ipf != NULL) delete _ipf; + + if(!_microFlag) // only on the master solver? -->ok, we need to pass once only to finish everything (PETSc, SLEPc, ...) Msg::Exit(0); - - } +} void nonLinearMechSolver::createRestartByTime(const int day,const int hour,const int minute,const int second) { @@ -246,9 +250,12 @@ void nonLinearMechSolver::loadModel(const std::string &meshFileName) if(restartManager::available()) { pModel = new GModel(); + pModel->setFileName(meshFileName); pModel->setAsCurrent(); pModel->readMSH(_restartMshFileName.c_str()); _dim = pModel->getNumRegions() ? 3 : 2; + pModel->setFileName(meshFileName); + pModel->setName(SplitFileName(meshFileName)[1]); return; } @@ -256,6 +263,8 @@ void nonLinearMechSolver::loadModel(const std::string &meshFileName) pModel->setAsCurrent(); pModel->readMSH(meshFileName.c_str()); _meshFileName = meshFileName; + pModel->setFileName(meshFileName); + pModel->setName(SplitFileName(meshFileName)[1]); this->commonModel(); } @@ -465,6 +474,30 @@ bool nonLinearMechSolver::isDgDomain() const{ return false; }; +IPField* nonLinearMechSolver::getIPField() {return _ipf;}; +const IPField* nonLinearMechSolver::getIPField() const {return _ipf;}; + +unknownField* nonLinearMechSolver::getUnknownField() {return _ufield;}; +const unknownField* nonLinearMechSolver::getUnknownField() const {return _ufield;}; + +dofManager<double>* nonLinearMechSolver::getDofManager() {return pAssembler;}; +const dofManager<double>* nonLinearMechSolver::getDofManager() const {return pAssembler;}; + +staticDofManager<double>* nonLinearMechSolver::getStaticDofManager() {return dynamic_cast<staticDofManager<double>*>(pAssembler);}; +const staticDofManager<double>* nonLinearMechSolver::getStaticDofManager() const {return dynamic_cast<const staticDofManager<double>*>(pAssembler);}; + +std::vector<partDomain*>* nonLinearMechSolver::getDomainVector() {return &domainVector;} +const std::vector<partDomain*>* nonLinearMechSolver::getDomainVector() const {return &domainVector;} + +std::vector<partDomain*>* nonLinearMechSolver::getGhostDomainMPI(){return &_ghostDomainMPI;}; +const std::vector<partDomain*>* nonLinearMechSolver::getGhostDomainMPI() const {return &_ghostDomainMPI;}; + +nonLinearMechSolver::contactContainer* nonLinearMechSolver::getAllContactDomain(){return &_allContact;}; +const nonLinearMechSolver::contactContainer* nonLinearMechSolver::getAllContactDomain() const{return &_allContact;}; + +GModel* nonLinearMechSolver::getGModel(){return pModel;}; +const GModel* nonLinearMechSolver::getGModel() const {return pModel;}; + void nonLinearMechSolver::init(){ if(!_previousInit) @@ -524,12 +557,113 @@ void nonLinearMechSolver::init(){ // set Solver dom->setSolver(this); // some options in domaian come from solver } + + // add create new material cerate inside solver + for(std::vector<partDomain*>::iterator it = domainVector.begin(); it!=domainVector.end(); ++it){ + dgPartDomain *dom = dynamic_cast<dgPartDomain*>(*it); + if (dom != NULL){ + materialLaw* mlawMinus = dom->getMaterialLawMinus(); + if (maplaw.find(mlawMinus->getNum()) == maplaw.end()){ + maplaw[mlawMinus->getNum()] = mlawMinus; + } + + materialLaw* mlawPlus = dom->getMaterialLawPlus(); + if (maplaw.find(mlawPlus->getNum()) == maplaw.end()){ + maplaw[mlawPlus->getNum()] = mlawPlus; + } + } + }; for (std::map<int,materialLaw*>::iterator it = maplaw.begin(); it!= maplaw.end(); it++){ it->second->setSolver(this); } if (isMultiscale() and isDgDomain()){ + // full all interface local basis + this->fillLocalReferenceBasisForAllInterfaceElement(); + + + #if defined(HAVE_MPI) + int rank = Msg::GetCommRank(); + if (_mapRanks.find(rank) != _mapRanks.end()){ + const std::set<int>& otherRanks = _mapRanks[rank]; + // set data + // fill to send + if (otherRanks.size() > 0){ + int bufferSize = 10*allInterfaceLocalBasis.size(); + double* buffer = NULL; + if (bufferSize > 0){ + buffer= new double[bufferSize]; + int row =0; + for (std::map<int,STensor3>::const_iterator it = allInterfaceLocalBasis.begin(); it != allInterfaceLocalBasis.end(); it++){ + double type = (double)it->first; + const STensor3& mat = it->second; + buffer[row] = type; row++; + for (int index = 0; index< 9; index++){ + int i,j; + Tensor23::getIntsFromIndex(index,i,j); + buffer[row] = mat(i,j); row++; + } + } + } + for (std::set<int>::const_iterator itrank = otherRanks.begin(); itrank != otherRanks.end(); itrank++){ + int rRank = *itrank; + int tag = numericalMaterialBase::createTypeWithTwoInts(rRank,0); + MPI_Send(&bufferSize, 1, MPI_INT, rRank , tag, MPI_COMM_WORLD); + + if (bufferSize > 0){ + tag = numericalMaterialBase::createTypeWithTwoInts(rRank,1); + MPI_Send(buffer, bufferSize, MPI_DOUBLE, rRank , tag, MPI_COMM_WORLD); + } + } + + if (bufferSize > 0){ + delete buffer; + } + + } + } + else{ + // receive data + int rootRank = -1; + for (std::map<int, std::set<int> >::const_iterator it = _mapRanks.begin(); it != _mapRanks.end(); it++){ + const std::set<int> otherRanks = it->second; + if (otherRanks.find(rank) != otherRanks.end()){ + rootRank = it->first; + break; + } + } + + if (rootRank == -1) Msg::Fatal("init map is wrong"); + + MPI_Status status; + + int bufferSize = 0; + int tag = numericalMaterialBase::createTypeWithTwoInts(rank,0); + MPI_Recv(&bufferSize,1,MPI_INT,rootRank,tag,MPI_COMM_WORLD,&status); + + if (bufferSize > 0){ + double* buffer = new double[bufferSize]; + tag = numericalMaterialBase::createTypeWithTwoInts(rank,1); + MPI_Recv(buffer,bufferSize,MPI_DOUBLE,rootRank,tag,MPI_COMM_WORLD,&status); + + for (int idx = 0; idx < bufferSize; idx+=10){ + int firstRow = idx; + int type = (int)(buffer[idx]); + STensor3 mat(0.); + for (int index = 0; index< 9; index++){ + int i,j; + Tensor23::getIntsFromIndex(index,i,j); + mat(i,j) = buffer[firstRow+index+1]; + } + + allInterfaceLocalBasis[type] = mat; + } + } + } + #endif //HAVE_MPI + + // extract interface element int totalInterfaceElem = 0; for(std::vector<partDomain*>::iterator it = domainVector.begin(); it!=domainVector.end(); ++it){ dgPartDomain *dom = dynamic_cast<dgPartDomain*>(*it); @@ -622,7 +756,7 @@ void nonLinearMechSolver::init(){ } if(firsthostname) { - Msg::Error("File are moved on rank %d, hostname %s",Msg::GetCommRank(),vhostname[Msg::GetCommRank()]); + Msg::Warning("File are moved on rank %d, hostname %s",Msg::GetCommRank(),vhostname[Msg::GetCommRank()]); system("rm -rf previousScheme"); // reserved name folder ? system("mkdir previousScheme"); system("mv *.csv previousScheme"); // no support for other format for now @@ -636,7 +770,7 @@ void nonLinearMechSolver::init(){ } else { - Msg::Error("Nothing moved on rank %d, hostname %s",Msg::GetCommRank(),vhostname[Msg::GetCommRank()]); + Msg::Warning("Nothing moved on rank %d, hostname %s",Msg::GetCommRank(),vhostname[Msg::GetCommRank()]); } Msg::Barrier(); // delete array @@ -708,7 +842,7 @@ void nonLinearMechSolver::initAllBCsOnDofs(){ }; -void nonLinearMechSolver::init2(unknownField* &ufield, energeticField* &efield) +void nonLinearMechSolver::init2() { // initialize the system and dofManager this->createSystem(); @@ -762,25 +896,26 @@ void nonLinearMechSolver::init2(unknownField* &ufield, energeticField* &efield) } #endif // HAVE_MPI - /* fields creation */ - if(ufield) delete ufield; - ufield = new unknownField(pAssembler,domainVector,_ghostDomainMPI,&_allContact,3,anoded,unknownView); - // this->restart(ufield); // CHANGE THIS - - if (OneUnknownView.size() > 0){ - _oneUnknownField = new OneUnknownField(pAssembler,&domainVector,OneUnknownView); - } bool stiffcomputation=true; if(whatScheme==Explicit) stiffcomputation=false; if(!_previousInit){ + /* fields creation */ + if(_ufield) delete _ufield; + _ufield = new unknownField(this,3,anoded,unknownView); + // this->restart(ufield); // CHANGE THIS + + if (OneUnknownView.size() > 0){ + if (_oneUnknownField) delete _oneUnknownField; + _oneUnknownField = new OneUnknownField(this,OneUnknownView); + } + Msg::Info("Creation of IPVariable"); - _ipf = new IPField(this,&domainVector,pAssembler,ufield,vaip,ipView); // Field for GaussPoint + _ipf = new IPField(this,vaip,ipView); // Field for GaussPoint Msg::Info("IPVariable are created"); - + _ipf->compute1state(IPStateBase::initial,stiffcomputation); _ipf->initialBroken(pModel, initbrokeninter); - if(whatScheme==StaticNonLinear) _ipf->copy(IPStateBase::initial,IPStateBase::previous); else @@ -796,21 +931,44 @@ void nonLinearMechSolver::init2(unknownField* &ufield, energeticField* &efield) } } - + + if(_energField) delete _energField; + _energField = new energeticField(this, energyView,_energyComputation,_fractureEnergyComputation,getScheme()); } else{ // as nextStep is performed at the end of previous scheme the last step is in previous (and not in current) !! - _ipf->resetUnknownField(ufield); + // all files are closed from previous scheme + // archived files need to be reopenned + _ipf->resetFile(); _ipf->copy(IPStateBase::previous,IPStateBase::initial); _ipf->copy(IPStateBase::previous,IPStateBase::current); // same value to avois initialization problem ?? - _ipf->openArchivingFiles(); + + if (_unresetUnknowns){ + _ufield->resetFile(); + if (_energField){ + _energField->resetFile(); + } + if (_oneUnknownField){ + _oneUnknownField->resetFile(); + } + } + else{ + // recreate fields as unknowns are changed + if(_ufield) delete _ufield; + _ufield = new unknownField(this,3,anoded,unknownView); + // this->restart(ufield); // CHANGE THIS + + if (OneUnknownView.size() > 0){ + if (_oneUnknownField) delete _oneUnknownField; + _oneUnknownField = new OneUnknownField(this,OneUnknownView); + } + + if(_energField) delete _energField; + _energField = new energeticField(this, energyView,_energyComputation,_fractureEnergyComputation,getScheme()); + } } - if(efield) delete efield; - efield = new energeticField(_ipf,ufield,pAssembler,domainVector,_allContact, - energyView,_energyComputation,_fractureEnergyComputation,getScheme()); - /* terms initialization */ - this->initTerms(ufield,_ipf); + this->initTerms(_ufield,_ipf); _previousInit = true; Msg::Info("End of initialization"); #if defined(HAVE_MPI) && defined(_DEBUG) @@ -847,6 +1005,7 @@ void nonLinearMechSolver::endOfScheme(unknownField *ufield,energeticField *efiel if (_oneUnknownField!= NULL){ _oneUnknownField->forceView(); _oneUnknownField->archive(curtime,step); + _oneUnknownField->closeFile(); } _ipf->forceView(); @@ -953,7 +1112,7 @@ void nonLinearMechSolver::oneStepPostSolve(const double curtime, const int numst } if (_pbcGroup != NULL){ - homogenizedData homoData(_microBC,false,false); + homogenizedData homoData(this,false,false); this->extractAverageStressByVolumeIntegral(&homoData); homoData.getHomogenizedStress().print("average stress"); if (_homogenizedStressPBC != NULL){ @@ -2487,6 +2646,13 @@ void nonLinearMechSolver::createInterfaceElement_2() }*/ } +void nonLinearMechSolver::rotateModel(const SVector3& n1, const SVector3& n2, const SVector3& n3){ + if (!_GModelIsRotated){ + _GModelIsRotated = true; + GeometryRotation::rotateGModel(_enum,_gnum,pModel,n1,n2,n3); + } +}; + void nonLinearMechSolver::initTerms(unknownField *ufield, IPField *ipf){ // resize _vterm in NeumannBC if(_previousInit){ // if previous computation delete first the terms @@ -2544,11 +2710,10 @@ double nonLinearMechSolver::solveStaticLinear() { /* init data */ this->init(); - unknownField *ufield=NULL; - energeticField *efield=NULL; - this->init2(ufield,efield); - delete efield; efield=NULL; // energy cannot be computed with this scheme as the system does not computed the forces of fixed ddl!! - + this->init2(); + if (_energField != NULL){ + delete _energField; _energField=NULL; // energy cannot be computed with this scheme as the system does not computed the forces of fixed ddl!! + } /* time initialization */ double curtime = 1.; @@ -2558,7 +2723,7 @@ double nonLinearMechSolver::solveStaticLinear() /* solving */ this->setTimeForLaw(curtime,timestep); std::cout << "Neumann BC"<< std::endl; - this->computeExternalForces(ufield); + this->computeExternalForces(_ufield); this->computeStiffMatrix(pAssembler); printf("-- done assembling!\n"); pAssembler->systemSolve(); @@ -2567,7 +2732,7 @@ double nonLinearMechSolver::solveStaticLinear() /* compute stress after solve */ _ipf->compute1state(IPStateBase::current,true); /* end of scheme */ - this->endOfScheme(ufield,efield,curtime,step); + this->endOfScheme(_ufield,_energField,curtime,step); Msg::Info("StaticLinear OK"); return curtime; } @@ -2576,11 +2741,10 @@ double nonLinearMechSolver::solveEigen() { /* init data */ this->init(); - unknownField *ufield=NULL; - energeticField *efield=NULL; - this->init2(ufield,efield); - delete efield; efield=NULL; // energy cannot be computed with this scheme as the system does not computed the forces of fixed ddl!! - + this->init2(); + if (_energField){ + delete _energField; _energField=NULL; // energy cannot be computed with this scheme as the system does not computed the forces of fixed ddl!! + } /* time initialization */ double curtime = 1.; @@ -2660,7 +2824,7 @@ double nonLinearMechSolver::solveEigen() printf("-- done solving!\n"); /* end of scheme */ - this->endOfScheme(ufield,efield,curtime,step); + this->endOfScheme(_ufield,_energField,curtime,step); Msg::Info("EigenSolve OK"); return curtime; } @@ -3356,7 +3520,7 @@ void nonLinearMechSolver::initArchiveForce(){ } } else { - for(nonLinearMechSolver::contactContainer::const_iterator itc = _allContact.begin(); itc!=_allContact.end(); ++itc){ + for(nonLinearMechSolver::contactContainer::const_iterator itc = _allContact.begin(); itc!=_allContact.end(); ++itc){ contactDomain *cdom = *itc; if(cdom->getPhys() != af.numphys) continue; @@ -4931,7 +5095,7 @@ void nonLinearMechSolver::initializeExplicitScheme() /* init data */ this->init(); - this->init2(_ufield,_energField); + this->init2(); staticDofManager<double> *sAssembler = static_cast<staticDofManager<double>*>(pAssembler); /* mass matrix computation outside the loop */ @@ -5022,7 +5186,7 @@ void nonLinearMechSolver::initializeStaticScheme() Msg::Info("SNL Data : nstep =%d endtime=%f",_numstepImpl,this->getEndTime()); /* init data */ this->init(); - this->init2(_ufield,_energField); + this->init2(); // iterative scheme (loop on timestep) staticDofManager<double> *sAssembler = static_cast<staticDofManager<double>*>(pAssembler); @@ -6206,7 +6370,7 @@ double nonLinearMechSolver::solveMulti() // set the first time step to 1 if previous computation to avoid initialization problem int step = 0; // iteration counter if(_previousInit) step = 1; - this->init2(_ufield,_energField); + this->init2(); // iterative scheme (loop on timestep) staticDofManager<double> *sAssembler = static_cast<staticDofManager<double>*>(pAssembler); @@ -7449,6 +7613,53 @@ void nonLinearMechSolver::fillMapOfInterfaceElementsInOneDomain(MElement *e, std } } +void nonLinearMechSolver::fillLocalReferenceBasisForAllInterfaceElement(){ + printf("begin filling reference local basis\n"); + for (int idom= 0; idom < domainVector.size(); idom++){ + const dgPartDomain* dgdom = dynamic_cast<const dgPartDomain*>(domainVector[idom]); + if (dgdom != NULL){ + IntPt* GP; + for (groupOfElements::elementContainer::iterator ite = dgdom->gi->begin(); ite != dgdom->gi->end(); ite++){ + MElement* ele = *ite; + int npts = dgdom->getInterfaceGaussIntegrationRule()->getIntPoints(ele,&GP); + for (int i=0; i< npts; i++){ + int type = numericalMaterialBase::createTypeWithTwoInts(ele->getNum(), i); + SVector3 n, b, t; + computeInterfaceReferenceLocalBasis(ele,&GP[i],n,t,b); + + STensor3 mat; + mat(0,0) = n(0); mat(1,0) = n(1); mat(2,0) = n(2); + mat(0,1) = t(0); mat(1,1) = t(1); mat(2,1) = t(2); + mat(0,2) = b(0); mat(1,2) = b(1); mat(2,2) = b(2); + + allInterfaceLocalBasis[type] = mat; // negative + type = numericalMaterialBase::createTypeWithTwoInts(ele->getNum(), i+npts); + allInterfaceLocalBasis[type] = mat; // positive + } + } + } + } + printf("done filling reference local basis size = %d\n",allInterfaceLocalBasis.size()); +}; + +void nonLinearMechSolver::getLocalBasis(const MElement* ele, const int gpt, SVector3& n, SVector3& t, SVector3& b) const { + int type = numericalMaterialBase::createTypeWithTwoInts(ele->getNum(), gpt); + std::map<int,STensor3>::const_iterator itfind = allInterfaceLocalBasis.find(type); + if ( itfind == allInterfaceLocalBasis.end()){ + Msg::Fatal(" rank %d local basis at interface element %d gpt %d does not exist",Msg::GetCommRank(), ele->getNum(),gpt); + } + else{ + const STensor3& mat = itfind->second; + n(0) = mat(0,0); n(1) = mat(1,0); n(2) = mat(2,0); + t(0) = mat(0,1); t(1) = mat(1,1); t(2) = mat(2,1); + b(0) = mat(0,2); b(1) = mat(1,2); b(2) = mat(2,2); + + mat.print("found basis"); + } +}; + + + void nonLinearMechSolver::createStrainMapping(const std::string filename){ if (_strainMap) delete _strainMap; _strainMap = new strainMapping(domainVector); @@ -7503,7 +7714,7 @@ void nonLinearMechSolver::microNumberDof(){ else{ if (_controlType == LOAD_CONTROL){ // number normally dof - _pAl->numberDof(_systemType); + _pAl->numberDof(_systemType); // allocate micro system } else if (_controlType == ARC_CONTROL_EULER){ @@ -7648,9 +7859,36 @@ void nonLinearMechSolver::setPeriodicity(const SVector3& xd, const SVector3& yd, void nonLinearMechSolver::addMicroBC(const nonLinearMicroBC* bc){ _microFlag = true; - if (_microBC !=NULL) delete _microBC; + if (_microBCOld) delete _microBCOld; + _microBCOld = _microBC; _microBC = bc->clone(); -} + if (_microBCOld != NULL){ + _microBC->collecDataFromPrevious(*_microBCOld); + } + + // set highorder flag + if (_microBC->getOrder() >1){ + _highOrderFlag = true; + } + else{ + _highOrderFlag = false; + } + + // add BC suppport + std::vector<groupOfElements*>& bgroup = _microBC->getBoundaryGroupOfElements(); + const std::vector<int>& bphysical = _microBC->getBoundaryPhysicals(); + bgroup.clear(); + for (int i=0; i< bphysical.size(); i++){ + groupOfElements* gr = new groupOfElements(_dim-1,bphysical[i]); + bgroup.push_back(gr); + } +}; +void nonLinearMechSolver::addMicroBCForFailure(const nonLinearMicroBC* mbc){ + // this BC sleeps util failure + // once failure occurs, _microBC is replaced by _microFailureBC using addMicroBC + if (_microFailureBC!=NULL) delete _microFailureBC; + _microFailureBC = mbc->clone(); +}; double nonLinearMechSolver::getRVEVolume() const{ return _rveVolume; @@ -7730,6 +7968,20 @@ const SVector3& nonLinearMechSolver::getLostSolutionUniquenssNormal() const{ return _lostSolutionUniquenssNormal; }; +SPoint3& nonLinearMechSolver::getHomogenizedDamageVolumeCenter(){ + return _damageVolumeCenter; +}; +const SPoint3& nonLinearMechSolver::getHomogenizedDamageVolumeCenter() const{ + return _damageVolumeCenter; +}; + +double& nonLinearMechSolver::getHomogenizedCrackFace(){ + return _homogenizedCrackSurface; +}; +const double& nonLinearMechSolver::getHomogenizedCrackFace() const{ + return _homogenizedCrackSurface; +}; + STensor3& nonLinearMechSolver::getFdamOnset() {return _FdamOnset;}; const STensor3& nonLinearMechSolver::getFdamOnset() const {return _FdamOnset;}; @@ -7742,6 +7994,10 @@ bool nonLinearMechSolver::isDamage() const{ return false; }; +bool nonLinearMechSolver::checkFailureOnset() const{ + return _checkFailureOnset; +}; + const elementErosionFilter& nonLinearMechSolver::getElementErosionFilter() const{ return _elementErosionFilter; }; @@ -7781,8 +8037,24 @@ void nonLinearMechSolver::extractAverageStressByVolumeIntegral(homogenizedData* for (int i=0; i<domainVector.size(); i++){ damageVolume += domainVector[i]->computeVolumeActiveDamageDomain(_ipf); } - double trueDamageVolume = (damageVolume/_surfaceReductionRatio); // in order to take into account void part - clength = _RVELengthInCohesiveNormal*trueDamageVolume*volumeRVEInv; + + // active damage center + _damageVolumeCenter *= 0.; + if (damageVolume > 0.){ + for (int i=0; i<domainVector.size(); i++){ + domainVector[i]->computeActiveDamageCenter(_ipf,_damageVolumeCenter); + } + _damageVolumeCenter *= (1./damageVolume); + + Msg::Info("center of active damage zone : %f %f %f \n",_damageVolumeCenter[0],_damageVolumeCenter[1],_damageVolumeCenter[2]); + + // compute homogenized crack length + this->computeHomogenizedCrackFace(); + + double trueDamageVolume = ((damageVolume+ _voidPartInLocalizationBand) /_surfaceReductionRatio); // in order to take into account void part + //clength = _RVELengthInCohesiveNormal*trueDamageVolume*volumeRVEInv; + clength = trueDamageVolume/_homogenizedCrackSurface; + } } STensor3& P = homoData->getHomogenizedStress(); @@ -7935,7 +8207,7 @@ void nonLinearMechSolver::extractAverageStressByVolumeIntegral(homogenizedData* void nonLinearMechSolver::homogenizedDataToFile(const double time){ homogenizedData* data = this->getHomogenizationState(IPStateBase::current); - _homogenizedFiles->dataToFile(time, _microBC, data); + _homogenizedFiles->dataToFile(time, this, data); }; void nonLinearMechSolver::extractAverageStressByCondensation(homogenizedData* homoData){ @@ -8751,7 +9023,7 @@ stiffnessCondensation* nonLinearMechSolver::createStiffnessCondensation(const bo /**condensation require **/ if (_pAl == NULL){ - _pAl = new pbcAlgorithm(_microBC,domainVector,pAssembler); + _pAl = new pbcAlgorithm(this); }; if (!_pAl->isSplittedDof()) _pAl->splitDofs(); @@ -9342,6 +9614,84 @@ void nonLinearMechSolver::checkFailureOnset_withNormalVector(){ } }; +void nonLinearMechSolver::computeHomogenizedCrackFace(){ + if (_pAl == NULL){ + Msg::Fatal("pbcAlgorithm object must be created"); + } + + if (_lostSolutionUniquenssNormal.norm() < 1e-6){ + // normally, _lostSolutionUniquenssNormal.norm() == 1 + _homogenizedCrackSurface = std::max(_Lx.norm(),_Ly.norm()); // nothing to do + return; + } + + SPoint3 v1 = _pAl->getPBCConstraintGroup()->getRootPoint(); + Msg::Info("rootPoint %f %f %f ",v1[0],v1[1],v1[2]); + + _homogenizedCrackSurface = 0.; + + if (getDim() == 2){ + SPoint3 v2(v1); + v2 += (_Lx.point()); + SPoint3 v4(v1); + v4 += (_Ly.point()); + SPoint3 v3(v1); + v3 += (_Lx.point()); + v3 += (_Ly.point()); + + if (dot(_lostSolutionUniquenssNormal,_Lx)/(_Lx.norm()) < 1e-8){ + _homogenizedCrackSurface = _Lx.norm(); + Msg::Info("_homogenizedCrackSurface following Lx = %f",_homogenizedCrackSurface); + } + else if (dot(_lostSolutionUniquenssNormal,_Ly)/(_Ly.norm()) < 1e-8){ + _homogenizedCrackSurface = _Ly.norm(); + Msg::Info("_homogenizedCrackSurface following Ly = %f",_homogenizedCrackSurface); + } + else{ + std::vector<SPoint3> twoPoint; + SPoint3 prCenterTo12 = planeDirProject(_damageVolumeCenter,v1,v2,_lostSolutionUniquenssNormal); + if (inside(prCenterTo12,v1,v2)){ + twoPoint.push_back(prCenterTo12); + } + SPoint3 prCenterTo41 = planeDirProject(_damageVolumeCenter,v1,v4,_lostSolutionUniquenssNormal); + if (inside(prCenterTo41,v1,v4)){ + twoPoint.push_back(prCenterTo41); + } + if (twoPoint.size() < 2){ + SPoint3 prCenterTo23 = planeDirProject(_damageVolumeCenter,v2,v3,_lostSolutionUniquenssNormal); + if (inside(prCenterTo23,v2,v3)){ + twoPoint.push_back(prCenterTo23); + } + } + if (twoPoint.size() < 2){ + SPoint3 prCenterTo34 = planeDirProject(_damageVolumeCenter,v3,v4,_lostSolutionUniquenssNormal); + if (inside(prCenterTo34,v3,v4)){ + twoPoint.push_back(prCenterTo34); + } + } + + if (twoPoint.size() == 2){ + _homogenizedCrackSurface = twoPoint[0].distance(twoPoint[1]); + Msg::Info("_homogenizedCrackSurface = %f ",_homogenizedCrackSurface); + } + else{ + Msg::Error("computeHomogenizedCrackLength is wrong ele %d, gp %d _lostSolutionUniquenssNormal = [%f %f %f]",_enum,_gnum, + _lostSolutionUniquenssNormal[0],_lostSolutionUniquenssNormal[1],_lostSolutionUniquenssNormal[2]); + } + + } + _homogenizedCrackSurface *= (_Lz.norm()); // generally, _LzNorm = 1 + + } + else if (getDim() == 3){ + + } + else{ + Msg::Fatal("computeHomogenizedCrackLength has not been implemented for %d D problems"); + + } +}; + void nonLinearMechSolver::setMessageView(const bool view){ _messageView = view; @@ -9370,26 +9720,30 @@ void nonLinearMechSolver::createEigenvalueSolver(){ linearSystem<double>* lsysB = pAssembler->getLinearSystem(strB); linearSystemPETSc<double>* lpetB = dynamic_cast<linearSystemPETSc<double>*>(lsysB); - if (lpetA != NULL ){ - if (lpetB) - _eigenSolver = new eigenSolver(lpetA,lpetB); - else - _eigenSolver = new eigenSolver(lpetA); + if (lpetA != NULL ){ + if (lpetB) + _eigenSolver = new eigenSolver(lpetA,lpetB); + else + _eigenSolver = new eigenSolver(lpetA); // for eigen mode view - _eigfield.clear(); + if (_eigfield.size() > 0){ + for (int i= 0; i< _eigfield.size(); i++){ + delete _eigfield[i]; + } + _eigfield.clear(); + } for (int i=0; i<_modeview.size(); i++){ std::string modefilename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_mode"; - unknownField* field = new eigenVectorField(pAssembler,domainVector,_ghostDomainMPI, - &_allContact,3,anoded,_eigview[i],_eigenSolver,_modeview[i],modefilename); + unknownField* field = new eigenVectorField(this,3,anoded,_eigview[i],_eigenSolver,_modeview[i],modefilename); _eigfield.push_back(field); }; std::string eigfilename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_eigenValue.csv"; _eigenValueFile = fopen(eigfilename.c_str(),"w"); } - else{ - Msg::Fatal("eigensolver requires PETSc"); - } + else{ + Msg::Fatal("eigensolver requires PETSc"); + } }; }; @@ -9497,9 +9851,27 @@ void nonLinearMechSolver::closeAllFile(){ void nonLinearMechSolver::nextStep(){ // in microBC - if (_microBC!=NULL){ + bool BCIsChanged = false; + if (_failureBCIsSwitched){ + + if (_microFailureBC == NULL) { + Msg::Error("_microFailureBC is null in nonLinearMechSolver::nextStep"); + } + else{ + const homogenizedData* homodataPrev = this->getHomogenizationState(IPStateBase::initial); + const homogenizedData* homodata = this->getHomogenizationState(IPStateBase::current); + if ((!homodataPrev->getBrokenFlag()) and (homodata->getBrokenFlag())){ + this->switchMicroBC(_microFailureBC); + printf("ranks %d microBC has just been changed \n",Msg::GetCommRank()); + BCIsChanged = true; + } + } + } + + if (!BCIsChanged){ _microBC->nextStep(); } + // archive data this->archiveData(0.,0.); @@ -9678,132 +10050,116 @@ linearSystem<double>* nonLinearMechSolver::createMicroSNLSystem(){ }; void nonLinearMechSolver::createMicroSystem(){ - if (!_previousInit){ - linearSystem<double>* lsys = createMicroSNLSystem(); - if (_controlType == ARC_CONTROL_EULER or whatScheme == StaticLinear) - pAssembler = new dofManager<double>(lsys); - else - pAssembler = new staticDofManager<double>(lsys,whatScheme,false,false); - }; + linearSystem<double>* lsys = createMicroSNLSystem(); + dofManager<double>* oldManager = pAssembler; // store old manager + + // create a new one + if (_controlType == ARC_CONTROL_EULER or whatScheme == StaticLinear){ + pAssembler = new dofManager<double>(lsys,false); + } + else{ + pAssembler = new staticDofManager<double>(lsys,whatScheme,false,false); + } + + // transfer data if needed + if (oldManager != NULL){ + staticDofManager<double>* oldSmanager = dynamic_cast<staticDofManager<double>*>(oldManager); + if (oldSmanager != NULL){ + staticDofManager<double>* sAssembler = dynamic_cast<staticDofManager<double>*>(pAssembler); + if (sAssembler != NULL){ + sAssembler->collecDataFromPrevious(oldSmanager); + } + delete oldSmanager; + } + } }; -void nonLinearMechSolver::initMicroSolver(){ - if (_messageView){ - std::string filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_out.txt"; - _outputFile = fopen(filename.c_str(),"w"); - - fprintf(_outputFile,"Initializing on processor %d of %d \nMicro-problem: element %d, gauss point %d \nMicro SNL Data : nstep =%d endtime = %f\n", - Msg::GetCommRank(),Msg::GetCommSize(),this->getElementSolverNumber(),this->getGaussPointSolverNumber(), - _numstepImpl,endtime); - } - - // read mesh file - this->init(); - - +void nonLinearMechSolver::init2Micro(){ // get quantities for micro BC if (_microBC == NULL){ - Msg::Fatal("Microscopic BC must be specified nonLinearMechSolver::initMicroSolver"); - } - - if (_microBC->getOrder() >1) - _highOrderFlag = true; - else - _highOrderFlag = false; - - - - // add BC suppport - std::vector<groupOfElements*>& bgroup = _microBC->getBoundaryGroupOfElements(); - const std::vector<int>& bphysical = _microBC->getBoundaryPhysicals(); - bgroup.clear(); - for (int i=0; i< bphysical.size(); i++){ - groupOfElements* gr = new groupOfElements(_dim-1,bphysical[i]); - bgroup.push_back(gr); + Msg::Fatal("Microscopic BC must be specified nonLinearMechSolver::init2Micro"); } - + // create system, dofManager this->createMicroSystem(); + + // init all other BC + this->initAllBCsOnDofs(); // create periodic algorithm - if (_pAl) delete _pAl; - _pAl = new pbcAlgorithm(_microBC,domainVector,pAssembler); - - //pbc data from file - if (bgroup.size() == 0){ - _pAl->getPBCConstraintGroup()->createPBCFromFile(_pbcNodeData,pModel); + if (_pAl != NULL){ + delete _pAl; Msg::Info("pbcAlgorithm is deleted"); } - - // set initial time for micro BC - this->setTimeForBC(0.); - double dtInit = endtime/double(_numstepImpl); - this->setTimeForLaw(0.,dtInit); - - // init all other BC - this->initAllBCsOnDofs(); - - // split dofs - if (!_pAl->isSplittedDof()) _pAl->splitDofs(); - + _pAl = new pbcAlgorithm(this); // create all constraints, etc + // number Dof and allocate the system this->microNumberDof(); + + if (_previousInit){ + staticDofManager<double>* sAssembler = static_cast<staticDofManager<double>*>(pAssembler); + sAssembler->updateFromPrevious(); + } /* initialization of Dof value */ this->setInitialCondition(); + + if (!_archive){ + unknownView.clear(); + ipView.clear(); + energyView.clear(); + OneUnknownView.clear(); + } + + if (_ufield) delete _ufield; + std::string dispfile ="E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_disp.msh"; + _ufield = new unknownField(this,3,anoded,unknownView,dispfile); // 3 components by nodes User choice ?? + + if (OneUnknownView.size() > 0){ + std::string Onedispfile ="E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_dispComponent.msh"; + if (_oneUnknownField) delete _oneUnknownField; + _oneUnknownField = new OneUnknownField(this,OneUnknownView,Onedispfile); + } + + if (!_previousInit){ + if (_ipf) delete _ipf; + std::string ipfile = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_stress.msh"; + _ipf = new IPField(this,vaip,ipView,ipfile); // Field for GaussPoint + + _ipf->compute1state(IPStateBase::current,true); + _ipf->copy(IPStateBase::current,IPStateBase::previous); + _ipf->copy(IPStateBase::current,IPStateBase::initial); + + _ipf->initialBroken(pModel, initbrokeninter); + // initially broken on whole domain + for (int idom=0; idom< domainVector.size(); idom++){ + dgPartDomain* dgdom = dynamic_cast<dgPartDomain*>(domainVector[idom]); + if (dgdom != NULL) { + if (dgdom->allInterfaceIPsAreBrokenFromBeginning()){ + dgdom->initiallyBreakAllInterfaceIP(_ipf->getAips()); + } - // create ufield, ipfield - if (_ufield) delete _ufield; - if (_ipf) delete _ipf; - if (_energField) delete _energField; - // clear all view if non archive - if (!_archive){ - unknownView.clear(); - ipView.clear(); - energyView.clear(); - } - - std::string dispfile ="E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_disp.msh"; - _ufield = new unknownField(pAssembler,domainVector,_ghostDomainMPI,&_allContact,3,anoded,unknownView,dispfile); // 3 components by nodes User choice ?? - - - if (OneUnknownView.size() > 0){ - std::string Onedispfile ="E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_dispComponent.msh"; - _oneUnknownField = new OneUnknownField(pAssembler,&domainVector,OneUnknownView,Onedispfile); - } - - std::string ipfile = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_stress.msh"; - _ipf = new IPField(this,&domainVector,pAssembler,_ufield,vaip,ipView,ipfile); // Field for GaussPoint - - _energyComputation = 0; - _fractureEnergyComputation = 0; - _energField = new energeticField(_ipf,_ufield,pAssembler,domainVector,_allContact,energyView, - _energyComputation,_fractureEnergyComputation,getScheme()); - - - if (_eigflag){ - if (_outputFile) - fprintf(_outputFile,"Create EigenSolver \n"); - createEigenvalueSolver(); - if (_outputFile) - fprintf(_outputFile,"EigenSolver created \n"); - }; - - _ipf->compute1state(IPStateBase::current,true); - _ipf->copy(IPStateBase::current,IPStateBase::previous); - _ipf->copy(IPStateBase::current,IPStateBase::initial); - - _ipf->initialBroken(pModel, initbrokeninter); - // initially broken on whole domain - for (int idom=0; idom< domainVector.size(); idom++){ - dgPartDomain* dgdom = dynamic_cast<dgPartDomain*>(domainVector[idom]); - if (dgdom != NULL) { - if (dgdom->allInterfaceIPsAreBrokenFromBeginning()){ - dgdom->initiallyBreakAllInterfaceIP(_ipf->getAips()); - } - - } - } + } + } + } + else{ + _ipf->resetFile(); + _ipf->copy(IPStateBase::current,IPStateBase::initial); + _ipf->copy(IPStateBase::current,IPStateBase::previous); + } + + if (_energField) delete _energField; + _energyComputation = 0; + _fractureEnergyComputation = 0; + _energField = new energeticField(this,energyView,_energyComputation,_fractureEnergyComputation,getScheme()); + if (_eigflag){ + if (_outputFile) + fprintf(_outputFile,"Create EigenSolver \n"); + createEigenvalueSolver(); + if (_outputFile) + fprintf(_outputFile,"EigenSolver created \n"); + }; + // init terms this->initTerms(_ufield,_ipf); @@ -9813,62 +10169,110 @@ void nonLinearMechSolver::initMicroSolver(){ if (_stabilityCriterionFollowing == true){ std::string filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_stabilityCriterion.csv"; + if (_criterionFile != NULL) fclose(_criterionFile); _criterionFile = fopen(filename.c_str(),"w"); } // rve_volume from periodicity - if (_rveVolume <= 0.){ - SVector3 vec = crossprod(_Lx,_Ly); - _rveVolume = dot(vec,_Lz); - } + if (!_previousInit){ + if (_rveVolume <= 0.){ + SVector3 vec = crossprod(_Lx,_Ly); + _rveVolume = dot(vec,_Lz); + } + // compute density + this->computeDensity(); + if (_isHommProSaveToFile){ + std::string denfile = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_density.csv"; + FILE* fileden = fopen(denfile.c_str(),"w"); + fprintf(fileden,"%e",this->_rho); + fclose(fileden); + } + + + _initialState = new homogenizedData(this,_damageToCohesiveJump,_extractIrreversibleEnergy); + _currentState = new homogenizedData(this,_damageToCohesiveJump,_extractIrreversibleEnergy);; - // compute density - this->computeDensity(); - if (_isHommProSaveToFile){ - std::string denfile = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_density.csv"; - FILE* fileden = fopen(denfile.c_str(),"w"); - fprintf(fileden,"%e",this->_rho); - fclose(fileden); - } + /** initial tangent**/ - _initialState = new homogenizedData(_microBC,_damageToCohesiveJump,_extractIrreversibleEnergy); - _currentState = new homogenizedData(_microBC,_damageToCohesiveJump,_extractIrreversibleEnergy);; + this->extractAverageProperties(_tangentflag); - /** initial tangent**/ + (*_initialState) = (*_currentState); - this->extractAverageProperties(_tangentflag); + if (_multiscaleFlag == false){ + if (_microBC->getTotalNumberOfMechanicalDofs() > 0) { + _currentState->getHomogenizedStress().print("stress"); + if (_tangentflag){ + _currentState->getHomogenizedTangentOperator_F_F().print("tangent"); + } + if (_microBC->getOrder() == 2) + _currentState->getHomogenizedSecondOrderStress().print("ho stress"); + } - (*_initialState) = (*_currentState); + for (int index=0; index< _microBC->getTotalNumberOfConDofs(); index++){ + _currentState->getHomogenizedConstitutiveExtraDofFlux(index).print("ConExtraDof flux"); + printf("_currentState constitutive extra dof %d internal energy: %f \n", index, _currentState->getHomogenizedConstitutiveExtraDofInternalEnergy(index)); + } - if (_multiscaleFlag == false){ - if (_microBC->getTotalNumberOfMechanicalDofs() > 0) { - _currentState->getHomogenizedStress().print("stress"); - if (_tangentflag){ - _currentState->getHomogenizedTangentOperator_F_F().print("tangent"); + for (int index=0; index< _microBC->getTotalNumberOfNonConDofs(); index++){ + _currentState->getHomogenizedNonConstitutiveExtraDofFlux(index).print("nonConExtraDof flux"); } - if (_microBC->getOrder() == 2) - _currentState->getHomogenizedSecondOrderStress().print("ho stress"); } - for (int index=0; index< _microBC->getTotalNumberOfConDofs(); index++){ - _currentState->getHomogenizedConstitutiveExtraDofFlux(index).print("ConExtraDof flux"); - printf("_currentState constitutive extra dof %d internal energy: %f \n", index, _currentState->getHomogenizedConstitutiveExtraDofInternalEnergy(index)); - } + _homogenizedFiles = new homogenizedDataFiles(this); + bool saveCohesiveLawFile = (_isHommProSaveToFile and _damageToCohesiveJump); + _homogenizedFiles->openFiles(_enum,_gnum,this,_isHommStrainSaveToFile,_isHommProSaveToFile,saveCohesiveLawFile); + this->homogenizedDataToFile(0.); + + } + else{ + // extract with new BC + this->extractAverageProperties(_tangentflag); + if (_multiscaleFlag == false){ + if (_microBC->getTotalNumberOfMechanicalDofs() > 0) { + _currentState->getHomogenizedStress().print("stress"); + if (_tangentflag){ + _currentState->getHomogenizedTangentOperator_F_F().print("tangent"); + } + if (_microBC->getOrder() == 2) + _currentState->getHomogenizedSecondOrderStress().print("ho stress"); + } - for (int index=0; index< _microBC->getTotalNumberOfNonConDofs(); index++){ - _currentState->getHomogenizedNonConstitutiveExtraDofFlux(index).print("nonConExtraDof flux"); + for (int index=0; index< _microBC->getTotalNumberOfConDofs(); index++){ + _currentState->getHomogenizedConstitutiveExtraDofFlux(index).print("ConExtraDof flux"); + printf("_currentState constitutive extra dof %d internal energy: %f \n", index, _currentState->getHomogenizedConstitutiveExtraDofInternalEnergy(index)); + } + + for (int index=0; index< _microBC->getTotalNumberOfNonConDofs(); index++){ + _currentState->getHomogenizedNonConstitutiveExtraDofFlux(index).print("nonConExtraDof flux"); + } } - } + + bool saveCohesiveLawFile = (_isHommProSaveToFile and _damageToCohesiveJump); + _homogenizedFiles->openFiles(_enum,_gnum,this,_isHommStrainSaveToFile,_isHommProSaveToFile,saveCohesiveLawFile); + this->homogenizedDataToFile(0.); + } + + _previousInit = true; + +}; - _homogenizedFiles = new homogenizedDataFiles(_microBC); - bool saveCohesiveLawFile = (_isHommProSaveToFile and _damageToCohesiveJump); - _homogenizedFiles->openFiles(_enum,_gnum,_microBC,_isHommStrainSaveToFile,_isHommProSaveToFile,saveCohesiveLawFile); - this->homogenizedDataToFile(0.); - _previousInit = true; +void nonLinearMechSolver::initMicroSolver(){ + if (_messageView){ + std::string filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_out.txt"; + if (_outputFile != NULL) fclose(_outputFile); + _outputFile = fopen(filename.c_str(),"w"); - if (_outputFile) { - fprintf(_outputFile,"---------End of initialization-------- \n"); - fflush(_outputFile); + fprintf(_outputFile,"Initializing on processor %d of %d \nMicro-problem: element %d, gauss point %d \nMicro SNL Data : nstep =%d endtime = %f\n", + Msg::GetCommRank(),Msg::GetCommSize(),this->getElementSolverNumber(),this->getGaussPointSolverNumber(), + _numstepImpl,endtime); } + // read mesh file + this->init(); + this->init2Micro(); + + if (_outputFile) { + fprintf(_outputFile,"---------End of initialization-------- \n"); + fflush(_outputFile); + } }; double nonLinearMechSolver::microSolve(){ @@ -10899,7 +11303,7 @@ void nonLinearMechSolver::constraint_test(const double time){ FunctionSpaceBase* lagspace = domainVector[0]->getFunctionSpace(); - _pbcGroup = new pbcConstraintElementGroup(_microBC,domainVector,lagspace,NULL); + _pbcGroup = new pbcConstraintElementGroup(this,lagspace,NULL); /*create all linear constraints*/ _pbcGroup->createConstraintForTest(); /*enforce constraints to system*/ @@ -10954,6 +11358,10 @@ void nonLinearMechSolver::setRVELengthInNormalDirection(const double l, const do _surfaceReductionRatio = sfR; }; +void nonLinearMechSolver::setVoidPartInLocalizationBand(const double vp){ + _voidPartInLocalizationBand = vp; +}; + void nonLinearMechSolver::setLocationForStressExtraction(const int loc){ _stressExtractLocation = (STRESS_EXTRACT_LOCATION)loc; @@ -10970,3 +11378,37 @@ void nonLinearMechSolver::setLocationForStressExtraction(const int loc){ Msg::Fatal("cohesive traction location %d has not been implemeneted",loc); } }; + +void nonLinearMechSolver::setCheckFailureOnset(const bool fl){ + _checkFailureOnset = fl; +}; + +void nonLinearMechSolver::switchMicroBC(const nonLinearMicroBC* mbc){ + this->addMicroBC(mbc); + // recreate system, + this->createMicroSystem(); + + // init all other BC, fixed DOf, etc + this->initAllBCsOnDofs(); + + // create new pbcAlgorithm + if (_pAl != NULL){ + delete _pAl; + } + _pAl = new pbcAlgorithm(this); // create all constraints, etc + + // renumber Dof and reallocate the system + this->microNumberDof(); + + // update unknown from previous system + staticDofManager<double>* sAssembler = this->getStaticDofManager(); + if (sAssembler != NULL){ + sAssembler->updateFromPrevious(); + } + _ipf->copy(IPStateBase::current,IPStateBase::initial); + _ipf->copy(IPStateBase::current,IPStateBase::previous); +}; + +void nonLinearMechSolver::setSwitchMicroBCFlag(const bool fl){ + _failureBCIsSwitched = fl; +}; \ No newline at end of file diff --git a/NonLinearSolver/nlsolver/nonLinearMechSolver.h b/NonLinearSolver/nlsolver/nonLinearMechSolver.h index 770fc7faf5d997cfe733fb7cea46858209c39e65..660bd9cd6f4fc304e90c35d5ad3ba6232ad56741 100644 --- a/NonLinearSolver/nlsolver/nonLinearMechSolver.h +++ b/NonLinearSolver/nlsolver/nonLinearMechSolver.h @@ -178,7 +178,13 @@ class nonLinearMechSolver dofManager<double> *pAssembler; // IPField declared here to allow to pass it from one scheme to an other scheme IPField* _ipf; - + // unknown field + unknownField* _ufield; + // + OneUnknownField* _oneUnknownField; // for viewer + // energetic field + energeticField* _energField; + // dgGroupCollection _groups; // specific data int _numstepImpl, _numstepExpl; // Number of step not used for StaticLinearScheme and number of step between time step evaluation for Explicit Scheme @@ -326,11 +332,15 @@ class nonLinearMechSolver bool _globalCheckFlag; // true if global verification based on _erosionGlobalCriterion elementErosionFilter _elementErosionFilter; // a set consists of all erosion elements + // + bool _GModelIsRotated; // + std::map<int, STensor3> allInterfaceLocalBasis; // ele+ gp, [n b t] + #ifndef SWIG void commonModel(); // common operation for loadModel and createModel void initMapRanks(const std::set<int>& parts); void init(); - void init2(unknownField* &ufield, energeticField* &efield); // Has to be regrouped with init() Van Dung ?? + void init2(); // Has to be regrouped with init() Van Dung ?? void initAllBCsOnDofs(); void initTerms(unknownField *ufield, IPField *ipf); void endOfScheme(unknownField *ufield,energeticField *efield,const double endtime, const int endstep); // common operation at the end of a scheme @@ -340,6 +350,10 @@ class nonLinearMechSolver void computeIPCompDamageZoneAveraging(const double time); void fillMapOfInterfaceElementsInOneDomain(MElement *e, std::vector<MElement*> &eleFound, const groupOfElements *g) const; + + void fillLocalReferenceBasisForAllInterfaceElement(); + + void setPairSpaceElementForBoundaryConditions(); // new implementation // Function used by non linear solver (return the number of iteration to converge) @@ -420,6 +434,7 @@ class nonLinearMechSolver bool isMultiscale() const; bool isDgDomain() const; bool isDamage() const; + void getLocalBasis(const MElement* ele, const int gpt, SVector3& n, SVector3& t, SVector3& b) const; int getDim() const {return _dim;}; int getStepBetweenArchiving() const{return nsba;} @@ -442,6 +457,34 @@ class nonLinearMechSolver virtual bool mustRestart(const int numstep); pathFollowingLocalIncrementType getPathFollowingLocalIncrementType() const{return _pathFollowingIncrementType;}; pathFollowingLocation getPathFollowingLocation() const {return _pathFollowingLocation;}; + + void rotateModel(const SVector3& n1, const SVector3& n2, const SVector3& n3); + bool GModelIsRotated() const {return _GModelIsRotated;} + + IPField* getIPField(); + const IPField* getIPField() const ; + + unknownField* getUnknownField(); + const unknownField* getUnknownField() const; + + dofManager<double>* getDofManager() ; + const dofManager<double>* getDofManager() const; + + staticDofManager<double>* getStaticDofManager(); + const staticDofManager<double>* getStaticDofManager() const ; + + std::vector<partDomain*>* getDomainVector(); + const std::vector<partDomain*>* getDomainVector() const; + + std::vector<partDomain*>* getGhostDomainMPI(); + const std::vector<partDomain*>* getGhostDomainMPI() const; + + contactContainer* getAllContactDomain(); + const contactContainer* getAllContactDomain() const; + + GModel* getGModel(); + const GModel* getGModel() const; + #endif virtual double solveStaticLinear(); virtual double solveSNL(); @@ -635,6 +678,8 @@ class nonLinearMechSolver SVector3 _Lx, _Ly, _Lz; //micro BC nonLinearMicroBC* _microBC; + nonLinearMicroBC* _microBCOld; + nonLinearMicroBC* _microFailureBC; //stress flag and tangent flag bool _stressflag, _tangentflag; // homogenized density @@ -652,12 +697,6 @@ class nonLinearMechSolver pbcAlgorithm* _pAl; // for tangent estimation stiffnessCondensation* _condensation; - // unknown field - unknownField* _ufield; - // - OneUnknownField* _oneUnknownField; // for viewer - // energetic field - energeticField* _energField; // eigensolver using for stability analysis bool _eigflag; eigenSolver* _eigenSolver; @@ -701,7 +740,7 @@ class nonLinearMechSolver FILE* _homogenizedStressPBC; bool _damageIsBlocked; - + bool _checkFailureOnset; bool _damageToCohesiveJump; // true if extracting cohsive law STensor3 _FdamOnset; // average damage deformation at failure onset @@ -711,6 +750,7 @@ class nonLinearMechSolver double _maximalLostEllipticityCriterion; // maximal value double _lostSolutionUniquenssTolerance; + double _voidPartInLocalizationBand; // void part in localization band bool _extractIrreversibleEnergy; // flag STRESS_EXTRACT_LOCATION _stressExtractLocation; @@ -719,13 +759,18 @@ class nonLinearMechSolver STensor3 _homogenizedStressLastActiveDamage; STensor3 _homogenizedStrainLastActiveDamage; SVector3 _homogenizedCohesiveJumpLastActiveDamage; - + SPoint3 _damageVolumeCenter; + double _homogenizedCrackSurface; bool _useMatMatSolveToInvertMatrix; - + + // + bool _failureBCIsSwitched; // true if FailureBC is switsched after failure, #endif //SWIG protected: #ifndef SWIG + void init2Micro(); + void switchMicroBC(const nonLinearMicroBC* mbc); void setTimeForMicroBC(const double time); void microNumberDof(); @@ -790,12 +835,18 @@ class nonLinearMechSolver nonLinearMicroBC* getMicroBC() {return _microBC;}; const nonLinearMicroBC* getMicroBC() const {return _microBC;}; + + nonLinearMicroBC* getMicroBCFailure() {return _microFailureBC;}; + const nonLinearMicroBC* getMicroBCFailure() const {return _microFailureBC;}; + void resetSolverToInitialStep(); void closeAllFile(); void checkFailureOnset_withoutNormalVector(); void checkFailureOnset_withNormalVector(); + + void computeHomogenizedCrackFace(); double getConstitutiveExtraDofEquationRatio(const int index) const; double getNonConstitutiveExtraDofEquationRatio(const int index) const; @@ -810,10 +861,18 @@ class nonLinearMechSolver SVector3& getLostSolutionUniquenssNormal(); const SVector3& getLostSolutionUniquenssNormal() const; + + SPoint3& getHomogenizedDamageVolumeCenter(); + const SPoint3& getHomogenizedDamageVolumeCenter() const; + + double& getHomogenizedCrackFace(); + const double& getHomogenizedCrackFace() const; STensor3& getFdamOnset(); const STensor3& getFdamOnset() const; - + bool checkFailureOnset() const; + + FILE * getPBCFile() {return _pbcNodeData;}; #endif // SWIG void createMicroModel(const std::string geoFile, const int dim, const int order, const bool incomplte = false); @@ -827,6 +886,7 @@ class nonLinearMechSolver void setMessageView(const bool view); void setPeriodicity(const double x, const double y, const double z, const std::string direction); void addMicroBC(const nonLinearMicroBC* bc); + void addMicroBCForFailure(const nonLinearMicroBC* bc); // for instability void eigenValueSolver(const int num = 10, const bool fl = true); // number of eigenvalue void setEigenSolverParamerters(const int type, const int numiter, const std::string method, const double tol, const bool mktofile = false); @@ -881,8 +941,13 @@ class nonLinearMechSolver void setLocalizationNormal(const SVector3& normal); void setLocalizationNormal(const double n1, const double n2, const double n3); void setRVELengthInNormalDirection(const double l, const double surfaceReductionRatio=1.); // surface ratio + void setVoidPartInLocalizationBand(const double vp); void setLocationForStressExtraction(const int loc); + void setCheckFailureOnset(const bool fl); + + + void setSwitchMicroBCFlag(const bool fl); }; #endif //_NONLINEARMECHSOLVER_H_ diff --git a/NonLinearSolver/periodicBC/CMakeLists.txt b/NonLinearSolver/periodicBC/CMakeLists.txt index b01a762fb346e6285ddb766e3f2e7710615fbb2c..f35e67d09af2574281bb5c076d66b4e3d1154c54 100644 --- a/NonLinearSolver/periodicBC/CMakeLists.txt +++ b/NonLinearSolver/periodicBC/CMakeLists.txt @@ -32,6 +32,7 @@ set(SRC pbcVertex.cpp pbcSupplementConstraintExtraDofDiffusion.cpp geometryRotation.cpp + directionalConstraintElement.cpp ) file(GLOB HDR RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.h) diff --git a/NonLinearSolver/periodicBC/directionalConstraintElement.cpp b/NonLinearSolver/periodicBC/directionalConstraintElement.cpp new file mode 100644 index 0000000000000000000000000000000000000000..8ecaf5d5b65ce018b99d3c8060717a0f2ab3f101 --- /dev/null +++ b/NonLinearSolver/periodicBC/directionalConstraintElement.cpp @@ -0,0 +1,1018 @@ +// +// +// Description: directional mixed BC +// +// Author: <Van Dung NGUYEN>, (C) 2017 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#include "directionalConstraintElement.h" +#include "pbcConstraintElement.h" +#include "pbcSupplementConstraint.h" + +directionalPeriodicMeshConstraint::directionalPeriodicMeshConstraint(nonLinearMicroBC* mbc,FunctionSpaceBase* spacePlus, FunctionSpaceBase* spaceMinus, FunctionSpaceBase* multspace, + MVertex* vp, MVertex* vn, const SVector3& dir): constraintElement(mbc,-1),_periodicSpacePlus(spacePlus), + _periodicSpaceMinus(spaceMinus), _multSpace(multspace),_vp(vp),_vn(vn){ + + if (_mbc->getOrder() == 2){ + Msg::Fatal("directionalPeriodicMeshConstraint has not been implemented for SecondOrder"); + } + + const std::vector<int>& comp = this->getComp(); + SVector3 L(0.); + if (_vn){ + L(0) = _vp->x() - _vn->x(); + L(1) = _vp->y() - _vn->y(); + L(2) = _vp->z() - _vn->z(); + + _C.resize(1,2*_ndofs); + _C.setAll(0.0); + for (int i=0; i< _ndofs; i++){ + _C(0,i) = dir[i]; + _C(0,i+_ndofs) = -dir[i]; + } + + } + else{ + L(0) = _vp->x(); + L(1) = _vp->y(); + L(2) = _vp->z(); + _C.resize(1,_ndofs); + _C.setAll(0.0); + for (int i=0; i< _ndofs; i++){ + _C(0,i) = dir[i]; + } + } + + // find maximal value for + _positive = -1; + double maxCoeff = 0.; + bool found = false; + std::vector<Dof> keys; + getKeysFromVertex(_periodicSpacePlus,_vp, getComp(),keys); // all keys + // find all in positive Dofs + for (int i=0; i< _ndofs; i++){ + if ((fabs(_C(0,i)) > fabs(maxCoeff)) and + (constraintElement::allPositiveDof.find(keys[i]) == constraintElement::allPositiveDof.end())){ + maxCoeff = _C(0,i); + _positive = i; + found = true; + } + } + if (found){ + constraintElement::allPositiveDof.insert(keys[_positive]); + } + else{ + Msg::Fatal("all positive vertex is considered"); + } + _C.scale(1./maxCoeff); + + _Cbc.resize(1,_C.size2()-1); + _Cbc.setAll(0.); + int colCbc = 0; + for (int i=0; i<_C.size2(); i++){ + if (i !=_positive){ + _Cbc(0,colCbc) = -_C(0,i); + colCbc++; + } + }; + + _S.resize(1,9); + _S.scale(0.); + for (int i=0; i<3; i++){ + for (int j=0; j<3; j++){ + int index = Tensor23::getIndex(i,j); + _S(0,index) = dir[i]*L(j)/maxCoeff; + } + } +}; + +void directionalPeriodicMeshConstraint::print() const{ + if (_vn) + printf("directional constraint Postive = %d, negative = %d \n", _vp->getNum(), _vn->getNum()); + else{ + printf("directional constraint Periodic point = %d \n", _vp->getNum()); + } +}; + +void directionalPeriodicMeshConstraint::getConstraintKeys(std::vector<Dof>& key) const{ + getKeysFromVertex(_periodicSpacePlus,_vp, getComp(),key); + if (_vn) getKeysFromVertex(_periodicSpaceMinus,_vn,getComp(),key); +}; + +void directionalPeriodicMeshConstraint::getMultiplierKeys(std::vector<Dof>& key) const{ + std::vector<int> comp; + comp.push_back(_positive); + getKeysFromVertex(_multSpace,_vp, comp,key); +}; +void directionalPeriodicMeshConstraint::getConstraintMatrix(fullMatrix<double>& m) const{ + m = _C; +}; + +void directionalPeriodicMeshConstraint::getDependentMatrix(fullMatrix<double>& m) const{ + m = _Cbc; +}; + +void directionalPeriodicMeshConstraint::getDependentKeys(std::vector<Dof>& key) const{ + std::vector<Dof> allkeys; + getConstraintKeys(allkeys); + key.push_back(allkeys[_positive]); +}; + +void directionalPeriodicMeshConstraint::getIndependentKeys(std::vector<Dof>& key) const{ + std::vector<Dof> allkeys; + getConstraintKeys(allkeys); + for (int i=0; i< allkeys.size(); i++){ + if (i != _positive){ + key.push_back(allkeys[i]); + } + } +}; + +bool directionalPeriodicMeshConstraint::isDirect() const { + return false; +} + +void directionalPeriodicMeshConstraint::getLinearConstraints(const fullVector<double>& g, + std::map<Dof,DofAffineConstraint<double> >& con) const +{ + std::vector<Dof> kP, kN; + getDependentKeys(kP); + getIndependentKeys(kN); + + DofAffineConstraint<double> cons; + for (int i=0; i< kN.size(); i++){ + cons.linear.push_back(std::pair<Dof,double>(kN[i],_Cbc(0,i))); + } + cons.shift=g(0); + con[kP[0]] = cons; +} + +void directionalPeriodicMeshConstraint::getLinearConstraintsByVertices(std::map<Dof,DofAffineConstraint<double> >& con) const{ + Msg::Fatal("this function is not used for directionalPeriodicMeshConstraint::getLinearConstraintsByVertices"); +}; + +void directionalPeriodicMeshConstraint::getKinematicalVector(fullVector<double>& m) const{ + fullVector<double> kinVec; + _mbc->getKinematicalVector(kinVec); + m.resize(1); + m.setAll(0.); + _S.mult(kinVec,m); +}; +void directionalPeriodicMeshConstraint::getKinematicalMatrix(fullMatrix<double>& m) const{ + m = _S; +}; +void directionalPeriodicMeshConstraint::getLinearConstraints(std::map<Dof,DofAffineConstraint<double> >& con) const{ + fullVector<double> g; + getKinematicalVector(g); + getLinearConstraints(g, con); +}; + +directionalSupplementConstraint::directionalSupplementConstraint(nonLinearMicroBC* mbc, FunctionSpaceBase* space, FunctionSpaceBase* mspace, + groupOfElements* g, const SVector3& dir): constraintElement(mbc,-1), _periodicSpace(space),_multSpace(mspace),_g(g){ + + if (_mbc->getOrder() == 2){ + Msg::Fatal("directionalPeriodicMeshConstraint has not been implemented for SecondOrder"); + } + int sizever = _g->vsize(); + fullVector<double> weight; + supplementConstraint::computeWeight(_g,_v,weight); + + SVector3 Xmean(0.); + for (int i=0; i<_v.size();i++){ + MVertex* v = _v[i]; + SPoint3 pnt = v->point(); + for( int j=0; j<3; j++){ + Xmean[j] += weight(i)*pnt[j]; + } + } + // + _C.resize(1,sizever*_ndofs); + _C.setAll(0.); + int colC = 0; + for (int i=0; i< sizever; i++){ + for (int j=0; j<_ndofs; j++){ + _C(0,colC) = weight(i)*dir(j); + colC++; + } + } + + // find positive in order to obatain a good positive vertex + std::vector<Dof> keys; + for (int i=0; i<_v.size(); i++){ + getKeysFromVertex(_periodicSpace,_v[i],getComp(),keys); + } + + _positive = -1; + double maxVal = 0.; + bool found = false; + for (int i=0; i<keys.size(); i++){ + if ((fabs(_C(0,i))> fabs(maxVal)) && + (constraintElement::allPositiveDof.find(keys[i]) == constraintElement::allPositiveDof.end())){ + _positive = i; + maxVal = _C(0,i); + found = true; + _positiveVertex = i/_ndofs; + _positiveComp = i - _positiveVertex*_ndofs; + } + }; + if (!found){ + Msg::Fatal("All Dof are numerated as positive dof in other constraints supplementConstraint::supplementConstraint"); + } + else{ + constraintElement::allPositiveDof.insert(keys[_positive]); + } + + //Msg::Info("positive vertex %d positive comp %d",_positiveVertex,_positiveComp); + + + double invs = 1./maxVal; + _C.scale(invs); + + _Cbc.resize(1, keys.size() -1); + _Cbc.setAll(0.); + + int colCbc = 0; + for (int i=0; i<keys.size(); i++){ + if (i !=_positive){ + _Cbc(0,colCbc) = -_C(0,i); + colCbc++; + } + }; + + _S.resize(1,9); + _S.scale(0.); + for (int i=0; i<3; i++){ + for (int j=0; j<3; j++){ + int index = Tensor23::getIndex(i,j); + _S(0,index) = dir[i]*Xmean(j)*invs; + } + } + + //_C.print("C"); + //_Cbc.print("CBC"); + //_S.print("S"); +}; + + +void directionalSupplementConstraint::getConstraintKeys(std::vector<Dof>& key) const { + for (int i=0; i<_v.size(); i++) + getKeysFromVertex(_periodicSpace,_v[i],getComp(),key); +} +void directionalSupplementConstraint::getMultiplierKeys(std::vector<Dof>& key) const{ + std::vector<int> comp; + comp.push_back(_positiveComp); + getKeysFromVertex(_multSpace,_v[_positiveVertex], comp,key); +} +void directionalSupplementConstraint::getConstraintMatrix(fullMatrix<double>& m) const { + m = _C; +}; // matrix C +void directionalSupplementConstraint::getDependentMatrix(fullMatrix<double>& m) const{ + m = _Cbc; +} + +void directionalSupplementConstraint::getDependentKeys(std::vector<Dof>& key) const{ + std::vector<Dof> allkeys; + getConstraintKeys(allkeys); + key.push_back(allkeys[_positive]); +}; + +void directionalSupplementConstraint::getIndependentKeys(std::vector<Dof>& key) const{ + std::vector<Dof> allkeys; + getConstraintKeys(allkeys); + for (int i=0; i< allkeys.size(); i++){ + if (i != _positive){ + key.push_back(allkeys[i]); + } + } +}; + + +void directionalSupplementConstraint::getLinearConstraints(const fullVector<double>& g, + std::map<Dof,DofAffineConstraint<double> >& con) const +{ + std::vector<Dof> kP, kN; + getDependentKeys(kP); + getIndependentKeys(kN); + + DofAffineConstraint<double> cons; + for (int i=0; i< kN.size(); i++){ + cons.linear.push_back(std::pair<Dof,double>(kN[i],_Cbc(0,i))); + } + cons.shift=g(0); + con[kP[0]] = cons; +}; + +void directionalSupplementConstraint::print() const{ + Msg::Info("directional constraint Positive = %d",_v[_positiveVertex]->getNum()); + for (int i=0; i<_v.size(); i++){ + printf("%d \t",_v[i]->getNum()); + } + printf("\n"); +}; + +void directionalSupplementConstraint::getKinematicalVector(fullVector<double>& m) const{ + fullVector<double> kinVec; + _mbc->getKinematicalVector(kinVec); + m.resize(1); + m.setAll(0.); + _S.mult(kinVec,m); +}; +void directionalSupplementConstraint::getKinematicalMatrix(fullMatrix<double>& m) const{ + m = _S; +}; +void directionalSupplementConstraint::getLinearConstraints(std::map<Dof,DofAffineConstraint<double> >& con) const{ + + fullVector<double> g; + getKinematicalVector(g); + getLinearConstraints(g, con); +}; + +directionalPBCSupplementConstraint::directionalPBCSupplementConstraint(nonLinearMicroBC* mbc, FunctionSpaceBase* space, FunctionSpaceBase* mspace, + groupOfElements* gPlus, groupOfElements* gMinus, const SVector3& dir): + constraintElement(mbc,-1), _periodicSpace(space),_multSpace(mspace),_gPlus(gPlus),_gMinus(gMinus){ + + if (_mbc->getOrder() == 2){ + Msg::Fatal("directionalPBCSupplementConstraint has not been implemented for SecondOrder"); + } + + fullVector<double> weightPlus, weightMinus; + supplementConstraint::computeWeight(_gPlus,_vPlus,weightPlus); + supplementConstraint::computeWeight(_gMinus,_vMinus,weightMinus); + + SVector3 XmeanPlus(0.); + for (int i=0; i<_vPlus.size();i++){ + MVertex* vv = _vPlus[i]; + SPoint3 pnt = vv->point(); + for( int j=0; j<3; j++){ + XmeanPlus[j] += weightPlus(i)*pnt[j]; + } + } + SVector3 XmeanMinus(0.); + for (int i=0; i<_vMinus.size();i++){ + MVertex* vv = _vMinus[i]; + SPoint3 pnt = vv->point(); + for( int j=0; j<3; j++){ + XmeanMinus[j] += weightMinus(i)*pnt[j]; + } + } + + int csize = (_vPlus.size() + _vMinus.size())*_ndofs; + // + _C.resize(1,csize); + _C.setAll(0.); + int colC = 0; + for (int i=0; i< _vPlus.size(); i++){ + for (int j=0; j<_ndofs; j++){ + _C(0,colC) = weightPlus(i)*dir(j); + colC++; + } + } + for (int i=0; i< _vMinus.size(); i++){ + for (int j=0; j<_ndofs; j++){ + _C(0,colC) = -weightMinus(i)*dir(j); + colC++; + } + } + + + // find positive in order to obatain a good positive vertex + std::vector<Dof> keys; + for (int i=0; i<_vPlus.size(); i++){ + getKeysFromVertex(_periodicSpace,_vPlus[i],getComp(),keys); + } + + _positive = -1; + double maxVal = 0.; + bool found = false; + for (int i=0; i<keys.size(); i++){ + if ((fabs(_C(0,i))> fabs(maxVal)) && + (constraintElement::allPositiveDof.find(keys[i]) == constraintElement::allPositiveDof.end())){ + _positive = i; + maxVal = _C(0,i); + found = true; + _positiveVertex = i/_ndofs; + _positiveComp = i - _positiveVertex*_ndofs; + } + }; + if (!found){ + Msg::Fatal("All Dof are numerated as positive dof in other constraints directionalPBCSupplementConstraint::directionalPBCSupplementConstraint"); + } + else{ + constraintElement::allPositiveDof.insert(keys[_positive]); + } + + //Msg::Info("positive vertex %d positive comp %d",_positiveVertex,_positiveComp); + + + double invs = 1./maxVal; + _C.scale(invs); + + _Cbc.resize(1, csize -1); + _Cbc.setAll(0.); + + int colCbc = 0; + for (int i=0; i<csize; i++){ + if (i !=_positive){ + _Cbc(0,colCbc) = -_C(0,i); + colCbc++; + } + }; + + _S.resize(1,9); + _S.scale(0.); + for (int i=0; i<3; i++){ + for (int j=0; j<3; j++){ + int index = Tensor23::getIndex(i,j); + _S(0,index) = dir[i]*(XmeanPlus(j) - XmeanMinus(j))*invs; + } + } + + //_C.print("C"); + //_Cbc.print("CBC"); + //_S.print("S"); +}; + + +void directionalPBCSupplementConstraint::getConstraintKeys(std::vector<Dof>& key) const { + for (int i=0; i<_vPlus.size(); i++) + getKeysFromVertex(_periodicSpace,_vPlus[i],getComp(),key); + for (int i=0; i<_vMinus.size(); i++) + getKeysFromVertex(_periodicSpace,_vMinus[i],getComp(),key); +} +void directionalPBCSupplementConstraint::getMultiplierKeys(std::vector<Dof>& key) const{ + std::vector<int> comp; + comp.push_back(_positiveComp); + getKeysFromVertex(_multSpace,_vPlus[_positiveVertex], comp,key); +} +void directionalPBCSupplementConstraint::getConstraintMatrix(fullMatrix<double>& m) const { + m = _C; +}; // matrix C +void directionalPBCSupplementConstraint::getDependentMatrix(fullMatrix<double>& m) const{ + m = _Cbc; +} + +void directionalPBCSupplementConstraint::getDependentKeys(std::vector<Dof>& key) const{ + std::vector<Dof> allkeys; + getConstraintKeys(allkeys); + key.push_back(allkeys[_positive]); +}; + +void directionalPBCSupplementConstraint::getIndependentKeys(std::vector<Dof>& key) const{ + std::vector<Dof> allkeys; + getConstraintKeys(allkeys); + for (int i=0; i< allkeys.size(); i++){ + if (i != _positive){ + key.push_back(allkeys[i]); + } + } +}; + + +void directionalPBCSupplementConstraint::getLinearConstraints(const fullVector<double>& g, + std::map<Dof,DofAffineConstraint<double> >& con) const +{ + std::vector<Dof> kP, kN; + getDependentKeys(kP); + getIndependentKeys(kN); + + DofAffineConstraint<double> cons; + for (int i=0; i< kN.size(); i++){ + cons.linear.push_back(std::pair<Dof,double>(kN[i],_Cbc(0,i))); + } + cons.shift=g(0); + con[kP[0]] = cons; +}; + +void directionalPBCSupplementConstraint::print() const{ + Msg::Info("directional constraint Positive = %d",_vPlus[_positiveVertex]->getNum()); + for (int i=0; i<_vPlus.size(); i++){ + printf("%d \t",_vPlus[i]->getNum()); + } + for (int i=0; i<_vMinus.size(); i++){ + printf("%d \t",_vMinus[i]->getNum()); + } + printf("\n"); +}; + +void directionalPBCSupplementConstraint::getKinematicalVector(fullVector<double>& m) const{ + fullVector<double> kinVec; + _mbc->getKinematicalVector(kinVec); + m.resize(1); + m.setAll(0.); + _S.mult(kinVec,m); +}; +void directionalPBCSupplementConstraint::getKinematicalMatrix(fullMatrix<double>& m) const{ + m = _S; +}; +void directionalPBCSupplementConstraint::getLinearConstraints(std::map<Dof,DofAffineConstraint<double> >& con) const{ + + fullVector<double> g; + getKinematicalVector(g); + getLinearConstraints(g, con); +}; + +directionalPBCLagrangeConstraintElement::directionalPBCLagrangeConstraintElement(nonLinearMicroBC* mbc, FunctionSpaceBase* space, FunctionSpaceBase* mspace, + MVertex* v1, std::vector<MVertex*>& vlist, const SVector3& dir): + constraintElement(mbc,-1), _periodicSpace(space),_multSpace(mspace), + _vp(v1),_vn(vlist){ + if (_mbc->getOrder() == 2){ + Msg::Fatal("directionalPBCLagrangeConstraintElement has not been implemented for SecondOrder"); + } + for (int i=0; i<_vn.size(); i++){ + double dist = _vn[i]->distance(_vn[0]); + _distance.push_back(dist); + }; + + SPoint3 pp = _vp->point(); + SPoint3 np1 = _vn[0]->point(); + SPoint3 np2 = _vn[_vn.size()-1]->point(); + SPoint3 point = planeDirProject(pp,np1,np2,dir); + + SVector3 VecFollowed(pp,point); + + _s = point.distance(np1); + + int csize = (_vn.size()+1)*_ndofs; + + _C.resize(1.,csize); _C.setAll(0.0); + int col = 0; + for (int i=0; i<_ndofs; i++){ + _C(0,col) = 1.0*VecFollowed[i]; + col++; + }; + lagrangeConstraintElement::getFF(_s,_distance,_FF); + for (int i=0; i<_FF.size(); i++){ + for (int j=0; j<_ndofs; j++){ + _C(0,col) = -1.*_FF(i)*VecFollowed[j]; + col++; + }; + }; + + // find maximal value for + _positiveComp = -1; + double maxCoeff = 0.; + bool found = false; + std::vector<Dof> keys; + getKeysFromVertex(_periodicSpace,_vp, getComp(),keys); // all keys + // find all in positive Dofs + for (int i=0; i< _ndofs; i++){ + if ((fabs(_C(0,i)) > fabs(maxCoeff)) and + (constraintElement::allPositiveDof.find(keys[i]) == constraintElement::allPositiveDof.end())){ + maxCoeff = _C(0,i); + _positiveComp = i; + found = true; + } + } + if (found){ + constraintElement::allPositiveDof.insert(keys[_positiveComp]); + } + else{ + Msg::Fatal("all positive vertex is considered directionalPBCLagrangeConstraintElement vp = %d",_vp->getNum()); + } + _C.scale(1./maxCoeff); + + _Cbc.resize(1,_C.size2()-1); + _Cbc.setAll(0.); + int colCbc = 0; + for (int i=0; i<_C.size2(); i++){ + if (i !=_positiveComp){ + _Cbc(0,colCbc) = -_C(0,i); + colCbc++; + } + }; + + // periodic vector + for (int j=0; j<3; j++){ + _L[j] = pp[j]; + for (int i=0; i<_FF.size(); i++){ + SPoint3 pt = _vn[i]->point(); + _L[j] -= _FF(i)*pt[j]; + } + } + + _S.resize(1,9); + _S.scale(0.); + for (int i=0; i<3; i++){ + for (int j=0; j<3; j++){ + int index = Tensor23::getIndex(i,j); + _S(0,index) = VecFollowed[i]*_L[j]/maxCoeff; + } + } +}; + +void directionalPBCLagrangeConstraintElement::getConstraintKeys(std::vector<Dof>& keys) const{ + getKeysFromVertex(_periodicSpace,_vp, getComp(), keys); + for (int i=0; i<_vn.size(); i++){ + getKeysFromVertex(_periodicSpace,_vn[i], getComp(), keys); + }; +}; + +void directionalPBCLagrangeConstraintElement::getConstraintMatrix(fullMatrix<double>& m)const{ + m = _C; +}; +void directionalPBCLagrangeConstraintElement::getDependentMatrix(fullMatrix<double>& m) const{ + m = _Cbc; +}; + +void directionalPBCLagrangeConstraintElement::print() const{ + printf("Directional Lagrange constraint element \n"); + printf("Directional Positive = %d\n",_vp->getNum()); + for (int i=0; i<_vn.size(); i++){ + printf("%d \t", _vn[i]->getNum()); + } + printf("\n"); +}; + +void directionalPBCLagrangeConstraintElement::getMultiplierKeys(std::vector<Dof>& key) const{ + std::vector<int> comp; + comp.push_back(_positiveComp); + getKeysFromVertex(_multSpace,_vp, comp,key); +}; + +void directionalPBCLagrangeConstraintElement::getDependentKeys(std::vector<Dof>& key) const{ + std::vector<Dof> allkeys; + getConstraintKeys(allkeys); + key.push_back(allkeys[_positiveComp]); +}; + +void directionalPBCLagrangeConstraintElement::getIndependentKeys(std::vector<Dof>& key) const{ + std::vector<Dof> allkeys; + getConstraintKeys(allkeys); + for (int i=0; i< allkeys.size(); i++){ + if (i != _positiveComp){ + key.push_back(allkeys[i]); + } + } +}; + +void directionalPBCLagrangeConstraintElement::getLinearConstraints(const fullVector<double>& g, + std::map<Dof,DofAffineConstraint<double> >& con) const +{ + std::vector<Dof> kP, kN; + getDependentKeys(kP); + getIndependentKeys(kN); + + DofAffineConstraint<double> cons; + for (int i=0; i< kN.size(); i++){ + cons.linear.push_back(std::pair<Dof,double>(kN[i],_Cbc(0,i))); + } + cons.shift=g(0); + con[kP[0]] = cons; +} + +void directionalPBCLagrangeConstraintElement::getLinearConstraintsByVertices(std::map<Dof,DofAffineConstraint<double> >& con) const{ + Msg::Fatal("this function is not used for directionalPeriodicMeshConstraint::getLinearConstraintsByVertices"); +}; + +void directionalPBCLagrangeConstraintElement::getKinematicalVector(fullVector<double>& m) const{ + fullVector<double> kinVec; + _mbc->getKinematicalVector(kinVec); + m.resize(1); + m.setAll(0.); + _S.mult(kinVec,m); +}; +void directionalPBCLagrangeConstraintElement::getKinematicalMatrix(fullMatrix<double>& m) const{ + m = _S; +}; +void directionalPBCLagrangeConstraintElement::getLinearConstraints(std::map<Dof,DofAffineConstraint<double> >& con) const{ + fullVector<double> g; + getKinematicalVector(g); + getLinearConstraints(g, con); +}; + + +directionalFormLagrangeConstraintElement::directionalFormLagrangeConstraintElement(nonLinearMicroBC* mbc, FunctionSpaceBase* space, FunctionSpaceBase* mspace, + MVertex* v1, std::vector<MVertex*>& vlist, const SVector3& dir): + constraintElement(mbc,-1), _periodicSpace(space),_multSpace(mspace), + _vp(v1),_vn(vlist){ + if (_mbc->getOrder() == 2){ + Msg::Fatal("directionalPBCLagrangeConstraintElement has not been implemented for SecondOrder"); + } + for (int i=0; i<_vn.size(); i++){ + double dist = _vn[i]->distance(_vn[0]); + _distance.push_back(dist); + }; + _s = _vp->distance(_vn[0]); + + int csize = (_vn.size()+1)*_ndofs; + + _C.resize(1.,csize); _C.setAll(0.0); + int col = 0; + for (int i=0; i<_ndofs; i++){ + _C(0,col) = 1.0*dir[i]; + col++; + }; + lagrangeConstraintElement::getFF(_s,_distance,_FF); + for (int i=0; i<_FF.size(); i++){ + for (int j=0; j<_ndofs; j++){ + _C(0,col) = -1.*_FF(i)*dir[j]; + col++; + }; + }; + + // find maximal value for + _positiveComp = -1; + double maxCoeff = 0.; + bool found = false; + std::vector<Dof> keys; + getKeysFromVertex(_periodicSpace,_vp, getComp(),keys); // all keys + // find all in positive Dofs + for (int i=0; i< _ndofs; i++){ + if ((fabs(_C(0,i)) > fabs(maxCoeff)) and + (constraintElement::allPositiveDof.find(keys[i]) == constraintElement::allPositiveDof.end())){ + maxCoeff = _C(0,i); + _positiveComp = i; + found = true; + } + } + if (found){ + constraintElement::allPositiveDof.insert(keys[_positiveComp]); + } + else{ + Msg::Fatal("all positive vertex is considered directionalFormLagrangeConstraintElement vp = %d",_vp->getNum()); + } + _C.scale(1./maxCoeff); + + _Cbc.resize(1,_C.size2()-1); + _Cbc.setAll(0.); + int colCbc = 0; + for (int i=0; i<_C.size2(); i++){ + if (i !=_positiveComp){ + _Cbc(0,colCbc) = -_C(0,i); + colCbc++; + } + }; + + // periodic vector + SPoint3 pp = _vp->point(); + for (int j=0; j<3; j++){ + _L[j] = pp[j]; + for (int i=0; i<_FF.size(); i++){ + SPoint3 pt = _vn[i]->point(); + _L[j] -= _FF(i)*pt[j]; + } + } + + _S.resize(1,9); + _S.scale(0.); + for (int i=0; i<3; i++){ + for (int j=0; j<3; j++){ + int index = Tensor23::getIndex(i,j); + _S(0,index) = dir[i]*_L[j]/maxCoeff; + } + } +}; + +void directionalFormLagrangeConstraintElement::getConstraintKeys(std::vector<Dof>& keys) const{ + getKeysFromVertex(_periodicSpace,_vp, getComp(), keys); + for (int i=0; i<_vn.size(); i++){ + getKeysFromVertex(_periodicSpace,_vn[i], getComp(), keys); + }; +}; + +void directionalFormLagrangeConstraintElement::getConstraintMatrix(fullMatrix<double>& m)const{ + m = _C; +}; +void directionalFormLagrangeConstraintElement::getDependentMatrix(fullMatrix<double>& m) const{ + m = _Cbc; +}; + +void directionalFormLagrangeConstraintElement::print() const{ + printf("Directional Lagrange constraint element \n"); + printf("Directional Positive = %d\n",_vp->getNum()); + for (int i=0; i<_vn.size(); i++){ + printf("%d \t", _vn[i]->getNum()); + } + printf("\n"); +}; + +void directionalFormLagrangeConstraintElement::getMultiplierKeys(std::vector<Dof>& key) const{ + std::vector<int> comp; + comp.push_back(_positiveComp); + getKeysFromVertex(_multSpace,_vp, comp,key); +}; + +void directionalFormLagrangeConstraintElement::getDependentKeys(std::vector<Dof>& key) const{ + std::vector<Dof> allkeys; + getConstraintKeys(allkeys); + key.push_back(allkeys[_positiveComp]); +}; + +void directionalFormLagrangeConstraintElement::getIndependentKeys(std::vector<Dof>& key) const{ + std::vector<Dof> allkeys; + getConstraintKeys(allkeys); + for (int i=0; i< allkeys.size(); i++){ + if (i != _positiveComp){ + key.push_back(allkeys[i]); + } + } +}; + +void directionalFormLagrangeConstraintElement::getLinearConstraints(const fullVector<double>& g, + std::map<Dof,DofAffineConstraint<double> >& con) const +{ + std::vector<Dof> kP, kN; + getDependentKeys(kP); + getIndependentKeys(kN); + + DofAffineConstraint<double> cons; + for (int i=0; i< kN.size(); i++){ + cons.linear.push_back(std::pair<Dof,double>(kN[i],_Cbc(0,i))); + } + cons.shift=g(0); + con[kP[0]] = cons; +} + +void directionalFormLagrangeConstraintElement::getLinearConstraintsByVertices(std::map<Dof,DofAffineConstraint<double> >& con) const{ + Msg::Fatal("this function is not used for directionalPeriodicMeshConstraint::getLinearConstraintsByVertices"); +}; + +void directionalFormLagrangeConstraintElement::getKinematicalVector(fullVector<double>& m) const{ + fullVector<double> kinVec; + _mbc->getKinematicalVector(kinVec); + m.resize(1); + m.setAll(0.); + _S.mult(kinVec,m); +}; +void directionalFormLagrangeConstraintElement::getKinematicalMatrix(fullMatrix<double>& m) const{ + m = _S; +}; +void directionalFormLagrangeConstraintElement::getLinearConstraints(std::map<Dof,DofAffineConstraint<double> >& con) const{ + fullVector<double> g; + getKinematicalVector(g); + getLinearConstraints(g, con); +}; + +shiftedLagrangeConstraintElement::shiftedLagrangeConstraintElement(nonLinearMicroBC* mbc, FunctionSpaceBase* space, FunctionSpaceBase* mspace, + const int c, MVertex* v1, std::vector<MVertex*>& vlist, const SVector3& normal): + constraintElement(mbc,c), _periodicSpace(space),_multSpace(mspace), + _vp(v1),_vn(vlist){ + + std::vector<Dof> Keys; + getKeysFromVertex(_periodicSpace,_vp, getComp(),Keys); + for (int ik=0; ik < Keys.size(); ik++){ + if (constraintElement::allPositiveDof.find(Keys[ik]) == constraintElement::allPositiveDof.end()){ + constraintElement::allPositiveDof.insert(Keys[ik]); + } + else{ + Msg::Fatal("shiftedLagrangeConstraintElement Dof on vertex was chosen as positive one in other constraint element: vp = %d",_vp->getNum()); + } + } + + for (int i=0; i<vlist.size(); i++){ + double dist = _vn[i]->distance(_vn[0]); + _distance.push_back(dist); + }; + SPoint3 pp = _vp->point(); + SPoint3 np1 = _vn[0]->point(); + SPoint3 np2 = _vn[_vn.size()-1]->point(); + SPoint3 point = planeDirProject(pp,np1,np2,normal); + + SVector3 pnp1(point,np1); + SVector3 pnp2(point,np2); + if (dot(pnp1,pnp2) >= 0.){ + if (pnp2.norm() > pnp1.norm()){ + for (int i=0; i<3; i++){ + point[i] += (np2[i] - np1[i]); + } + } + else{ + for (int i=0; i<3; i++){ + point[i] += (np1[i] - np2[i]); + } + } + } + _s = point.distance(np1); + + int size = _vn.size(); + _C.resize(_ndofs,(1+size)*_ndofs); _C.setAll(0.0); + int col = 0; + for (int i=0; i<_ndofs; i++){ + _C(i,col) = 1.0; + col++; + }; + lagrangeConstraintElement::getFF(_s,_distance,_FF); + _Cbc.resize(_ndofs,size*_ndofs); + _Cbc.setAll(0.); + for (int i=0; i<_FF.size(); i++){ + for (int j=0; j<_ndofs; j++){ + _C(j,col) = -1.*_FF(i); + _Cbc(j,col-_ndofs) = _FF(i); + col++; + }; + }; + for (int j=0; j<3; j++){ + _L[j] = pp[j]; + for (int i=0; i<_FF.size(); i++){ + SPoint3 pt = _vn[i]->point(); + _L[j] -= _FF(i)*pt[j]; + } + } + + if (_mbc->getOrder() == 2){ + SPoint3 positive = _vp->point(); + SPoint3 np1 = _vn[0]->point(); + SPoint3 np2 = _vn[_vn.size()-1]->point(); + SPoint3 negative = project(positive,np1,np2); + + for (int i=0; i<3; i++) + for (int j=0; j<3; j++) + _XX(i,j) = 0.5*(positive[i]*positive[j]); + + for (int k=0; k<_FF.size(); k++){ + SPoint3 pt = _vn[k]->point(); + for (int i=0; i<3; i++) + for (int j=0; j<3; j++) + _XX(i,j) -= _FF(k)*0.5*(pt[i]*pt[j]); + } + } + + getPBCKinematicMatrix(_L,_XX,_S); +}; + +void shiftedLagrangeConstraintElement::getConstraintKeys(std::vector<Dof>& keys) const{ + getKeysFromVertex(_periodicSpace,_vp, getComp(), keys); + for (int i=0; i<_vn.size(); i++){ + getKeysFromVertex(_periodicSpace,_vn[i], getComp(), keys); + }; +}; + +void shiftedLagrangeConstraintElement::getMultiplierKeys(std::vector<Dof>& keys) const{ + getKeysFromVertex(_multSpace,_vp, getComp(), keys); +}; + +void shiftedLagrangeConstraintElement::getConstraintMatrix(fullMatrix<double>& m)const{ + m = _C; +}; +void shiftedLagrangeConstraintElement::getDependentMatrix(fullMatrix<double>& m) const{ + m = _Cbc; +}; + +void shiftedLagrangeConstraintElement::print() const{ + printf("Lagrange constraint element \n"); + printf("Positive = %d\n",_vp->getNum()); + for (int i=0; i<_vn.size(); i++){ + printf("%d \t", _vn[i]->getNum()); + } + printf("\n"); +}; + + + +void shiftedLagrangeConstraintElement::getDependentKeys(std::vector<Dof>& keys) const{ + getKeysFromVertex(_periodicSpace,_vp, getComp(),keys); +}; // left real dofs + +void shiftedLagrangeConstraintElement::getIndependentKeys(std::vector<Dof>& keys) const{ + for (int i=0; i<_vn.size(); i++){ + getKeysFromVertex(_periodicSpace,_vn[i], getComp(), keys); + }; +}; + +void shiftedLagrangeConstraintElement::getLinearConstraints(const fullVector<double>& g, + std::map<Dof,DofAffineConstraint<double> >& con) const +{ + std::vector<std::vector<Dof> > k; + for (int i=0; i<_vn.size(); i++){ + std::vector<Dof> ktemp; + getKeysFromVertex(_periodicSpace,_vn[i], getComp(),ktemp); + k.push_back(ktemp); + }; + + std::vector<Dof> kp; + getKeysFromVertex(_periodicSpace,_vp, getComp(),kp); + + DofAffineConstraint<double> cons; + for (int i=0; i<_ndofs; i++){ + for (int j=0; j<_vn.size(); j++){ + cons.linear.push_back(std::pair<Dof,double>(k[j][i],_FF(j))); + }; + cons.shift=g(i); + con[kp[i]] = cons; + cons.linear.clear(); + }; +}; + +void shiftedLagrangeConstraintElement::getLinearConstraintsByVertices(std::map<Dof,DofAffineConstraint<double> >& con) const{ + Msg::Error("the root vertices are not defined shiftedLagrangeConstraintElement::getLinearConstraintsByVertices"); + return; +}; + +void shiftedLagrangeConstraintElement::getKinematicalVector(fullVector<double>& m) const{ + fullVector<double> kinVec; + _mbc->getKinematicalVector(kinVec); + m.resize(_ndofs); + m.setAll(0.); + _S.mult(kinVec,m); +}; +void shiftedLagrangeConstraintElement::getKinematicalMatrix(fullMatrix<double>& m) const{ + m = _S; +}; +void shiftedLagrangeConstraintElement::getLinearConstraints(std::map<Dof,DofAffineConstraint<double> >& con) const{ + fullVector<double> g; + getKinematicalVector(g); + getLinearConstraints(g, con); +}; \ No newline at end of file diff --git a/NonLinearSolver/periodicBC/directionalConstraintElement.h b/NonLinearSolver/periodicBC/directionalConstraintElement.h new file mode 100644 index 0000000000000000000000000000000000000000..160283e529927294f099996567956188451b9f9e --- /dev/null +++ b/NonLinearSolver/periodicBC/directionalConstraintElement.h @@ -0,0 +1,262 @@ +// +// +// Description: directional mixed BC +// +// Author: <Van Dung NGUYEN>, (C) 2017 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#include "pbcConstraintElementBase.h" +#include "pbcCreateConstraints.h" + +class directionalPeriodicMeshConstraint : public constraintElement{ + protected: + MVertex* _vp, *_vn; // two periodic vertex + fullMatrix<double> _C, _S, _Cbc; // all constraint matrix + FunctionSpaceBase* _periodicSpacePlus, *_periodicSpaceMinus, *_multSpace; + int _positive; + + public: + directionalPeriodicMeshConstraint(nonLinearMicroBC* mbc,FunctionSpaceBase* spacePlus, FunctionSpaceBase* spaceMinus, FunctionSpaceBase* multspace, + MVertex* vp, MVertex* vn, const SVector3& dir); + + virtual ~directionalPeriodicMeshConstraint(){}; + virtual void getConstraintKeys(std::vector<Dof>& key) const; + virtual void getMultiplierKeys(std::vector<Dof>& key) const; + virtual void getConstraintMatrix(fullMatrix<double>& m) const; + virtual void getDependentMatrix(fullMatrix<double>& m) const; + virtual void print() const; + virtual void getDependentKeys(std::vector<Dof>& keys) const; // left real dofs + virtual void getIndependentKeys(std::vector<Dof>& keys) const; + virtual void getLinearConstraints(const fullVector<double>& g, + std::map<Dof,DofAffineConstraint<double> >& con) const; + virtual void getLinearConstraintsByVertices(std::map<Dof,DofAffineConstraint<double> >& con) const; + virtual constraintElement::ElementType getType() const { + return constraintElement::DirectionalPeriodic; + }; + virtual bool isActive(const MVertex* v) const { + if (_vp->getNum() == v->getNum()) return true; + if (_vn) { + if (_vn->getNum() == v->getNum()) return true; + } + return false; + }; + + virtual bool isDirect() const; + + virtual void getKinematicalVector(fullVector<double>& m) const; + virtual void getKinematicalMatrix(fullMatrix<double>& m) const; + virtual void getLinearConstraints(std::map<Dof,DofAffineConstraint<double> >& con) const; +}; + +class directionalSupplementConstraint : public constraintElement{ + protected: + FunctionSpaceBase* _periodicSpace, *_multSpace; + groupOfElements* _g; + fullMatrix<double> _C, _S, _Cbc; // constraint matrix + std::vector<MVertex*> _v; // all Vertex + int _positive; // positive position + int _positiveComp; + int _positiveVertex; + + public: + directionalSupplementConstraint(nonLinearMicroBC* Mbc, FunctionSpaceBase* space, FunctionSpaceBase* mspace, + groupOfElements* g, const SVector3& dir); + virtual ~directionalSupplementConstraint(){ + } + virtual void getConstraintKeys(std::vector<Dof>& key) const ; // real dofs on constraint elements + virtual void getMultiplierKeys(std::vector<Dof>& key) const ; // multiplier dof on constraint element + virtual void getConstraintMatrix(fullMatrix<double>& m) const ; // matrix C + virtual void getDependentMatrix(fullMatrix<double>& m) const; + virtual void getDependentKeys(std::vector<Dof>& keys) const; // left real dofs + virtual void getIndependentKeys(std::vector<Dof>& keys) const; // for spline interpolation + virtual void getLinearConstraints(const fullVector<double>& g, + std::map<Dof,DofAffineConstraint<double> >& con) const; + virtual constraintElement::ElementType getType() const{return constraintElement::Supplement;}; + virtual void print() const; + + virtual bool isActive(const MVertex* v) const { + for (int i=0; i<_v.size(); i++){ + if (_v[i]->getNum() == v->getNum()) return true; + } + return false; + }; + + virtual void getKinematicalVector(fullVector<double>& m) const; + virtual void getKinematicalMatrix(fullMatrix<double>& m) const; + virtual void getLinearConstraints(std::map<Dof,DofAffineConstraint<double> >& con) const; +}; + +class directionalPBCSupplementConstraint : public constraintElement{ + protected: + FunctionSpaceBase* _periodicSpace, *_multSpace; + groupOfElements* _gPlus, *_gMinus; + fullMatrix<double> _C, _S, _Cbc; // constraint matrix + std::vector<MVertex*> _vPlus, _vMinus; // all Vertex + int _positive; // positive position + int _positiveComp; + int _positiveVertex; + + public: + directionalPBCSupplementConstraint(nonLinearMicroBC* Mbc, FunctionSpaceBase* space, FunctionSpaceBase* mspace, + groupOfElements* gplus, groupOfElements* gMinus, const SVector3& dir); + virtual ~directionalPBCSupplementConstraint(){ + } + virtual void getConstraintKeys(std::vector<Dof>& key) const ; // real dofs on constraint elements + virtual void getMultiplierKeys(std::vector<Dof>& key) const ; // multiplier dof on constraint element + virtual void getConstraintMatrix(fullMatrix<double>& m) const ; // matrix C + virtual void getDependentMatrix(fullMatrix<double>& m) const; + virtual void getDependentKeys(std::vector<Dof>& keys) const; // left real dofs + virtual void getIndependentKeys(std::vector<Dof>& keys) const; // for spline interpolation + virtual void getLinearConstraints(const fullVector<double>& g, + std::map<Dof,DofAffineConstraint<double> >& con) const; + virtual constraintElement::ElementType getType() const{return constraintElement::Supplement;}; + virtual void print() const; + + virtual bool isActive(const MVertex* v) const { + for (int i=0; i<_vPlus.size(); i++){ + if (_vPlus[i]->getNum() == v->getNum()) return true; + } + for (int i=0; i<_vMinus.size(); i++){ + if (_vMinus[i]->getNum() == v->getNum()) return true; + } + return false; + }; + + virtual void getKinematicalVector(fullVector<double>& m) const; + virtual void getKinematicalMatrix(fullMatrix<double>& m) const; + virtual void getLinearConstraints(std::map<Dof,DofAffineConstraint<double> >& con) const; +}; + +class directionalPBCLagrangeConstraintElement : public constraintElement{ + protected: + MVertex* _vp; + std::vector<MVertex*> _vn; // sequence vertices + SVector3 _L; + std::vector<double> _distance; + double _s; + fullMatrix<double> _C, _S, _Cbc; + fullVector<double> _FF; + + FunctionSpaceBase* _periodicSpace, *_multSpace; + int _positiveComp; + + public: + // "dir" is the projection vector + // the periodic BC is applied in the direction perpendicular to "dir" + // this direction is given by the v1 and the projected node --> VecFollowed + directionalPBCLagrangeConstraintElement(nonLinearMicroBC* mbc, FunctionSpaceBase* space, FunctionSpaceBase* mspace, + MVertex* v1, std::vector<MVertex*>& vlist, const SVector3& dir); + + virtual ~directionalPBCLagrangeConstraintElement(){}; + virtual void getConstraintKeys(std::vector<Dof>& key) const; // real dofs on constraint elements + virtual void getMultiplierKeys(std::vector<Dof>& key) const; // multiplier dof on constraint element + virtual void getConstraintMatrix(fullMatrix<double>& m) const; // matrix C + virtual void getDependentMatrix(fullMatrix<double>& m) const; + virtual void print() const; + virtual void getDependentKeys(std::vector<Dof>& keys) const; // left real dofs + virtual void getIndependentKeys(std::vector<Dof>& keys) const; // left real dofs + virtual void getLinearConstraints(const fullVector<double>& g, + std::map<Dof,DofAffineConstraint<double> >& con) const; + virtual void getLinearConstraintsByVertices(std::map<Dof,DofAffineConstraint<double> >& con) const; + virtual constraintElement::ElementType getType() const { return constraintElement::Lagrange;}; + virtual bool isActive(const MVertex* v) const { + if (_vp->getNum() == v->getNum()) return true; + for (int i=0; i<_vn.size(); i++){ + if (_vn[i]->getNum() == v->getNum()) return true; + } + return false; + }; + + virtual void getKinematicalVector(fullVector<double>& m) const; + virtual void getKinematicalMatrix(fullMatrix<double>& m) const; + virtual void getLinearConstraints(std::map<Dof,DofAffineConstraint<double> >& con) const; +}; + +class directionalFormLagrangeConstraintElement : public constraintElement{ + protected: + MVertex* _vp; + std::vector<MVertex*> _vn; // sequence vertices + SVector3 _L; + std::vector<double> _distance; + double _s; + fullMatrix<double> _C, _S, _Cbc; + fullVector<double> _FF; + + FunctionSpaceBase* _periodicSpace, *_multSpace; + int _positiveComp; + +public: + // the periodic BC is applied following "dir" + // this direction is given by the v1 and the projected node --> VecFollowed + directionalFormLagrangeConstraintElement(nonLinearMicroBC* mbc, FunctionSpaceBase* space, FunctionSpaceBase* mspace, + MVertex* v1, std::vector<MVertex*>& vlist, const SVector3& dir); + + virtual ~directionalFormLagrangeConstraintElement(){}; + virtual void getConstraintKeys(std::vector<Dof>& key) const; // real dofs on constraint elements + virtual void getMultiplierKeys(std::vector<Dof>& key) const; // multiplier dof on constraint element + virtual void getConstraintMatrix(fullMatrix<double>& m) const; // matrix C + virtual void getDependentMatrix(fullMatrix<double>& m) const; + virtual void print() const; + virtual void getDependentKeys(std::vector<Dof>& keys) const; // left real dofs + virtual void getIndependentKeys(std::vector<Dof>& keys) const; // left real dofs + virtual void getLinearConstraints(const fullVector<double>& g, + std::map<Dof,DofAffineConstraint<double> >& con) const; + virtual void getLinearConstraintsByVertices(std::map<Dof,DofAffineConstraint<double> >& con) const; + virtual constraintElement::ElementType getType() const { return constraintElement::Lagrange;}; + virtual bool isActive(const MVertex* v) const { + if (_vp->getNum() == v->getNum()) return true; + for (int i=0; i<_vn.size(); i++){ + if (_vn[i]->getNum() == v->getNum()) return true; + } + return false; + }; + + virtual void getKinematicalVector(fullVector<double>& m) const; + virtual void getKinematicalMatrix(fullMatrix<double>& m) const; + virtual void getLinearConstraints(std::map<Dof,DofAffineConstraint<double> >& con) const; +}; + +class shiftedLagrangeConstraintElement : public constraintElement{ + protected: + MVertex* _vp; + std::vector<MVertex*> _vn; // sequence vertices + SVector3 _L; + STensor3 _XX; + std::vector<double> _distance; + double _s; + fullMatrix<double> _C, _S, _Cbc; + fullVector<double> _FF; + + FunctionSpaceBase* _periodicSpace, *_multSpace; + + public: + shiftedLagrangeConstraintElement(nonLinearMicroBC* mbc, FunctionSpaceBase* space, FunctionSpaceBase* mspace, + const int c, MVertex* v1, std::vector<MVertex*>& vlist, const SVector3& normal); + + virtual ~shiftedLagrangeConstraintElement(){}; + virtual void getConstraintKeys(std::vector<Dof>& key) const; // real dofs on constraint elements + virtual void getMultiplierKeys(std::vector<Dof>& key) const; // multiplier dof on constraint element + virtual void getConstraintMatrix(fullMatrix<double>& m) const; // matrix C + virtual void getDependentMatrix(fullMatrix<double>& m) const; + virtual void print() const; + virtual void getDependentKeys(std::vector<Dof>& keys) const; // left real dofs + virtual void getIndependentKeys(std::vector<Dof>& keys) const; // left real dofs + virtual void getLinearConstraints(const fullVector<double>& g, + std::map<Dof,DofAffineConstraint<double> >& con) const; + virtual void getLinearConstraintsByVertices(std::map<Dof,DofAffineConstraint<double> >& con) const; + virtual constraintElement::ElementType getType() const { return constraintElement::Lagrange;}; + virtual bool isActive(const MVertex* v) const { + if (_vp->getNum() == v->getNum()) return true; + for (int i=0; i<_vn.size(); i++){ + if (_vn[i]->getNum() == v->getNum()) return true; + } + return false; + }; + + virtual void getKinematicalVector(fullVector<double>& m) const; + virtual void getKinematicalMatrix(fullMatrix<double>& m) const; + virtual void getLinearConstraints(std::map<Dof,DofAffineConstraint<double> >& con) const; +}; \ No newline at end of file diff --git a/NonLinearSolver/periodicBC/geometryRotation.cpp b/NonLinearSolver/periodicBC/geometryRotation.cpp index abf4e77e0bd075f2992a5ab60a4aefb9e92ea81a..fb91b3243e033b0f4ea4a047420ca2b83dcebeba 100644 --- a/NonLinearSolver/periodicBC/geometryRotation.cpp +++ b/NonLinearSolver/periodicBC/geometryRotation.cpp @@ -11,42 +11,18 @@ #include "geometryRotation.h" #include "SVector3.h" #include "Context.h" +#include <sstream> +GeometryRotation::GeometryRotation(){ -GeometryRotation::GeometryRotation(){} +} GeometryRotation::~GeometryRotation(){ }; -void GeometryRotation::exportRotatedModel(const double e1x, const double e1y, const double e1z, - const double e2x, const double e2y, const double e2z, - const double e3x, const double e3y, const double e3z, - const std::string inMeshFile, - const double n1x, const double n1y, const double n1z, - const double n2x, const double n2y, const double n2z, - const double n3x, const double n3y, const double n3z, - const std::string outMeshFile) const { - SVector3 e1(e1x,e1y,e1z); - SVector3 e2(e2x,e2y,e2z); - SVector3 e3(e3x,e3y,e3z); - - SVector3 n1(n1x,n1y,n1z); - SVector3 n2(n2x,n2y,n2z); - SVector3 n3(n3x,n3y,n3z); - - e1.normalize(); - e2.normalize(); - e3.normalize(); - n1.normalize(); - n2.normalize(); - n3.normalize(); - - exportRotatedModel(e1,e2,e3,inMeshFile,n1,n2,n3,outMeshFile); -}; - void GeometryRotation::exportRotatedModel(const SVector3& e1, const SVector3& e2, const SVector3& e3, // reference coordinate system - const std::string inputMeshFile, - const SVector3& n1, const SVector3& n2, const SVector3& n3, // rotated coordinate system - const std::string outputMeshFile) const{ + GModel* pModel, const int elenum, const int gpt, + const SVector3& n1, const SVector3& n2, const SVector3& n3 // rotated coordinate system + ){ STensor3 LeftHS(0.); STensor3 RightHS(0.); @@ -79,9 +55,6 @@ void GeometryRotation::exportRotatedModel(const SVector3& e1, const SVector3& e2 R.print("Rotation tensor"); */ - Msg::Info("Begin writing rotated mesh"); - GModel* pModel = new GModel(); - pModel->readMSH(inputMeshFile.c_str()); std::vector<GEntity*> entities; pModel->getEntities(entities); @@ -107,9 +80,69 @@ void GeometryRotation::exportRotatedModel(const SVector3& e1, const SVector3& e2 v->z() = newP(2); } + std::string newFileName = ""; + if (pModel->getFileName() != ""){ + std::string modelName = pModel->getFileName(); + size_t ext_pos = modelName.find_last_of('.'); + std::string newname(modelName,0,ext_pos); + newFileName += newname; + } + newFileName += "Rotated_ELE"; + std::ostringstream oss; + oss << elenum; + newFileName += oss.str(); + oss.str(""); + newFileName += "GP"; + oss << gpt; + newFileName += oss.str(); + newFileName += ".msh"; + // write deformed mesh to file - pModel->writeMSH(outputMeshFile, CTX::instance()->mesh.mshFileVersion,CTX::instance()->mesh.binary, CTX::instance()->mesh.saveAll, + printf("Begin writing rotated mesh ele %d gpt %d\n",elenum,gpt); + pModel->writeMSH(newFileName, CTX::instance()->mesh.mshFileVersion,CTX::instance()->mesh.binary, CTX::instance()->mesh.saveAll, CTX::instance()->mesh.saveParametric, CTX::instance()->mesh.scalingFactor); + printf("End writing rotated mesh ele %d gpt %d \n",elenum,gpt); +}; + +void GeometryRotation::exportRotatedModel(const double e1x, const double e1y, const double e1z, + const double e2x, const double e2y, const double e2z, + const double e3x, const double e3y, const double e3z, + const std::string inMeshFile, + const double n1x, const double n1y, const double n1z, + const double n2x, const double n2y, const double n2z, + const double n3x, const double n3y, const double n3z) { + SVector3 e1(e1x,e1y,e1z); + SVector3 e2(e2x,e2y,e2z); + SVector3 e3(e3x,e3y,e3z); + + SVector3 n1(n1x,n1y,n1z); + SVector3 n2(n2x,n2y,n2z); + SVector3 n3(n3x,n3y,n3z); + + e1.normalize(); + e2.normalize(); + e3.normalize(); + n1.normalize(); + n2.normalize(); + n3.normalize(); + + GModel* pModel = new GModel(); + pModel->readMSH(inMeshFile.c_str()); + pModel->setFileName(inMeshFile); + + exportRotatedModel(e1,e2,e3,pModel,0,0,n1,n2,n3); + delete pModel; - Msg::Info("End writing rotated mesh"); +}; + + +void GeometryRotation::rotateGModel(const int elenum, const int gpt, + GModel* pModel, + const SVector3& n1, const SVector3& n2, const SVector3& n3){ + SVector3 e1(1.,0.,0.); + SVector3 e2(0.,1.,0.); + SVector3 e3(0.,0.,1.); + + GeometryRotation obj; + obj.exportRotatedModel(e1,e2,e3,pModel,elenum,gpt,n1,n2,n3); }; diff --git a/NonLinearSolver/periodicBC/geometryRotation.h b/NonLinearSolver/periodicBC/geometryRotation.h index 627d289095a5384b92387c6e45fceb815dc9a516..576364a605880783954f567f57efa0f57c1ae94b 100644 --- a/NonLinearSolver/periodicBC/geometryRotation.h +++ b/NonLinearSolver/periodicBC/geometryRotation.h @@ -17,7 +17,10 @@ class GeometryRotation{ #ifndef SWIG protected: - + virtual void exportRotatedModel(const SVector3& e1, const SVector3& e2, const SVector3& e3, // reference coordinate system + GModel* pModel, const int elenum, const int gpt, + const SVector3& n1, const SVector3& n2, const SVector3& n3 // rotated coordinate system + ); #endif // SWIG public: GeometryRotation(); @@ -27,14 +30,13 @@ class GeometryRotation{ const std::string inMeshFile, const double n1x, const double n1y, const double n1z, const double n2x, const double n2y, const double n2z, - const double n3x, const double n3y, const double n3z, - const std::string outMeshFile) const; + const double n3x, const double n3y, const double n3z); #ifndef SWIG virtual ~GeometryRotation(); - virtual void exportRotatedModel(const SVector3& e1, const SVector3& e2, const SVector3& e3, // reference coordinate system - const std::string inputMeshFile, - const SVector3& n1, const SVector3& n2, const SVector3& n3, // rotated coordinate system - const std::string outputMeshFile) const; + + static void rotateGModel(const int elenum, const int gpt, + GModel* pModel, + const SVector3& n1, const SVector3& n2, const SVector3& n3); #endif // SWIG }; #endif // GEOMETRYROTATION_H_INCLUDED diff --git a/NonLinearSolver/periodicBC/numericalFunctions.h b/NonLinearSolver/periodicBC/numericalFunctions.h index a2af6b92d1593fff07b055475beecb6115ee18ea..8908cbf961e6cd65cfd1482a80acd033eb82224a 100644 --- a/NonLinearSolver/periodicBC/numericalFunctions.h +++ b/NonLinearSolver/periodicBC/numericalFunctions.h @@ -19,7 +19,7 @@ #include "STensor53.h" #include "STensor63.h" -inline void computeSurface(SPoint3 A, SPoint3 B, SPoint3 C,double &a, double& b, double &c, double &d){ +inline void computeSurface(const SPoint3& A, const SPoint3& B, const SPoint3& C,double &a, double& b, double &c, double &d){ SVector3 AB(A,B); SVector3 AC(A,C); SVector3 normal = crossprod(AB,AC); @@ -30,16 +30,24 @@ inline void computeSurface(SPoint3 A, SPoint3 B, SPoint3 C,double &a, double& b, d = a*A[0]+b*A[1]+c*A[2]; }; -inline SPoint3 project(SPoint3 P, SPoint3 A, SPoint3 B){ - SPoint3 root(0,0,0); +inline SPoint3 project(const SPoint3& P, const SPoint3& A, const SPoint3& B){ SVector3 u(A,B); SVector3 Xpa(A,P); double t=dot(u,Xpa)/dot(u,u); SPoint3 temp(A.x()+t*u.x(),A.y()+t*u.y(),A.z()+t*u.z()); return temp; }; + +inline SPoint3 planeDirProject(const SPoint3& P, const SPoint3& A, const SPoint3& B, const SVector3& n){ + // n is normal of plane + SVector3 u(A,B); + SVector3 AP(A,P); + double t=dot(AP,n)/dot(u,n); + SPoint3 temp(A.x()+t*u.x(),A.y()+t*u.y(),A.z()+t*u.z()); + return temp; +}; -inline SPoint3 project(SPoint3 P, SPoint3 A, SPoint3 B, SPoint3 C){ +inline SPoint3 project(const SPoint3 &P, const SPoint3 &A, const SPoint3& B, const SPoint3 & C){ SVector3 vec1(A,B); SVector3 vec2(A,C); SVector3 normal=crossprod(vec1,vec2); @@ -49,26 +57,26 @@ inline SPoint3 project(SPoint3 P, SPoint3 A, SPoint3 B, SPoint3 C){ return temp; }; -inline double distance(SPoint3 P, SPoint3 A, SPoint3 B){ +inline double distance(const SPoint3& P, const SPoint3 &A, const SPoint3& B){ SPoint3 H=project(P,A,B); double temp=P.distance(H); return temp; }; -inline double distance(SPoint3 P, SPoint3 A, SPoint3 B, SPoint3 C){ +inline double distance(const SPoint3& P, const SPoint3 & A, const SPoint3 &B, const SPoint3 & C){ SPoint3 H=project(P,A,B,C); double temp=P.distance(H); return temp; }; // check P inside A, B -inline bool inside(SPoint3 P, SPoint3 A, SPoint3 B){ +inline bool inside(const SPoint3 &P, const SPoint3& A, const SPoint3 &B){ SVector3 PA(P,A);SVector3 PB(P,B); if (dot(PA,PB)<=0) return true; else return false; }; -inline SPoint3 midpoint(SPoint3 A, SPoint3 B){ +inline SPoint3 midpoint(const SPoint3& A, const SPoint3& B){ double x = (A.x()+B.x())/2; double y = (A.y()+B.y())/2; double z = (A.z()+B.z())/2; @@ -77,7 +85,7 @@ inline SPoint3 midpoint(SPoint3 A, SPoint3 B){ } // check same side P, Q via A, B -inline bool sameSide(SPoint3 P, SPoint3 Q, SPoint3 A, SPoint3 B){ +inline bool sameSide(const SPoint3& P, const SPoint3 &Q, const SPoint3& A, const SPoint3& B){ SVector3 PA(P,A);SVector3 PB(P,B); SVector3 n1=crossprod(PA,PB); @@ -108,7 +116,7 @@ inline void getKeysFromVertex(FunctionSpaceBase* space, MVertex* v, const std::v } }; -inline double norm(STensor3& ten){ +inline double norm(const STensor3& ten){ double temp = 0; for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ diff --git a/NonLinearSolver/periodicBC/pbcAlgorithm.cpp b/NonLinearSolver/periodicBC/pbcAlgorithm.cpp index 2cfeb573d0296edcc5ed05861ddbbd157c824e41..c8e943641e10154aec7fd39aa3dbef1d7b02fbf6 100644 --- a/NonLinearSolver/periodicBC/pbcAlgorithm.cpp +++ b/NonLinearSolver/periodicBC/pbcAlgorithm.cpp @@ -16,30 +16,31 @@ void pbcAlgorithm::__int__(){ // create function space within microscopic boundary condition + const std::vector<partDomain*>& allDomain = *(_solver->getDomainVector()); bool fullDG = false; - for (int idom = 0; idom< _allDomain.size(); idom++){ - if (_allDomain[idom]->getFormulation()){ + for (int idom = 0; idom< allDomain.size(); idom++){ + if (allDomain[idom]->getFormulation()){ fullDG = true; - if (_allDomain[idom]->groupOfElementsSize() > 0) Msg::Fatal("The pbcAlgorithm is only implemented for interDomain"); + if (allDomain[idom]->groupOfElementsSize() > 0) Msg::Fatal("The pbcAlgorithm is only implemented for interDomain"); break; } } if (!fullDG){ - _space= _allDomain[0]->getFunctionSpace(); + _space= allDomain[0]->getFunctionSpace(); int lagtag = _space->getId()+1; // to make sure lagtag and microtag are different // create mspace from space _mspace = _space->clone(lagtag); - if (_mspace == NULL) Msg::Fatal("FunctionSpaceBase::clone must be defined for the function space considering in domain %d",_allDomain[0]->getPhysical()); + if (_mspace == NULL) Msg::Fatal("FunctionSpaceBase::clone must be defined for the function space considering in domain %d",allDomain[0]->getPhysical()); } else{ _space = NULL; int maxTag = 0; partDomain* oneDom = NULL; - for (int i=0; i< _allDomain.size(); i++){ - if ((maxTag< _allDomain[i]->getFunctionSpace()->getId()) and (_allDomain[i]->groupOfElementsSize()>0)){ - maxTag = _allDomain[i]->getFunctionSpace()->getId(); - oneDom = _allDomain[i]; + for (int i=0; i< allDomain.size(); i++){ + if ((maxTag< allDomain[i]->getFunctionSpace()->getId()) and (allDomain[i]->groupOfElementsSize()>0)){ + maxTag = allDomain[i]->getFunctionSpace()->getId(); + oneDom = allDomain[i]; } } maxTag ++; // to create a diffrent id for multspace @@ -50,9 +51,15 @@ void pbcAlgorithm::__int__(){ // create PBC group constraint - _pbcConstraint = new pbcConstraintElementGroup(_mbc,_allDomain,_space,_mspace); + _pbcConstraint = new pbcConstraintElementGroup(_solver,_space,_mspace); // create constraint elements within pbcConstraintElementGroup - _pbcConstraint->createConstraintGroup(); + const std::vector<groupOfElements*>& gr = _solver->getMicroBC()->getBoundaryGroupOfElements(); + if (gr.size() >0){ + _pbcConstraint->createConstraintGroup(); + } + else{ + _pbcConstraint->createPBCFromFile(_solver->getPBCFile(),_solver->getGModel()); + } #ifdef _DEBUG _pbcConstraint->print(); #endif @@ -75,15 +82,14 @@ void pbcAlgorithm::__int__(){ length = pow(volume,1.0/3.0); }; }; - _scale = _allDomain[0]->getMaterialLaw()->scaleFactor()*length; + _scale = allDomain[0]->getMaterialLaw()->scaleFactor()*length; } #ifdef _DEBUG printf("scale = %f\n",_scale); #endif }; -pbcAlgorithm::pbcAlgorithm(nonLinearMicroBC* bc,std::vector<partDomain*>& d, dofManager<double>*p) - : _mbc(bc),_allDomain(d), _space(NULL),_mspace(NULL),_pAssembler(p), +pbcAlgorithm::pbcAlgorithm(nonLinearMechSolver* solver): _solver(solver), _space(NULL),_mspace(NULL), _pbcConstraint(NULL),_splittedDofs(NULL), _isSplitted(false),_scale(1.), _isModifiedConstraintMatrix(true){ this->__int__(); @@ -96,6 +102,30 @@ pbcAlgorithm::~pbcAlgorithm(){ _isSplitted = false; }; +nonLinearMicroBC* pbcAlgorithm::getMBC(){ + return _solver->getMicroBC(); +}; + +int pbcAlgorithm::getSystemDofNumber(const Dof& key) {return _solver->getDofManager()->getDofNumber(key);}; +int pbcAlgorithm::getNumberOfMacroToMicroKinematicVariables() const {return _solver->getMicroBC()->getNumberOfMacroToMicroKinematicVariables();}; +int pbcAlgorithm::getNumberMicroToMacroHomogenizedVariables() const{ + // get maximal stress dimension from domain + const std::vector<partDomain*>& allDomain = *(_solver->getDomainVector()); + int dimStress = 0; + for (int i=0; i< allDomain.size(); i++){ + if (allDomain[i]->getStressDimension() > dimStress){ + dimStress = allDomain[i]->getStressDimension(); + } + } + return dimStress; +} + +void pbcAlgorithm::switchMicroBC(){ + _pbcConstraint->switchMicroBC(); + // split dofs + this->splitDofs(); +}; + void pbcAlgorithm::updateConstraint(const IPField* ipfield){ for (std::set<constraintElement*>::iterator it= _pbcConstraint->constraintGroupBegin(); @@ -115,6 +145,7 @@ void pbcAlgorithm::updateConstraint(const IPField* ipfield){ }; void pbcAlgorithm::splitDofs(){ + const std::vector<partDomain*>& allDomain = *(_solver->getDomainVector()); if (_splittedDofs == NULL) _splittedDofs = new pbcDofManager(); @@ -126,7 +157,7 @@ void pbcAlgorithm::splitDofs(){ #endif //_DEBUG std::set<Dof> fixedDof; - _pAssembler->getFixedDof(fixedDof); + _solver->getDofManager()->getFixedDof(fixedDof); for (std::set<Dof>::const_iterator itdof = fixedDof.begin(); itdof!= fixedDof.end(); itdof++){ _splittedDofs->fixDof(*itdof); } @@ -150,8 +181,8 @@ void pbcAlgorithm::splitDofs(){ } }; // internal DOFs - for (int i=0; i<_allDomain.size(); i++){ - partDomain* dom = _allDomain[i]; + for (int i=0; i<allDomain.size(); i++){ + partDomain* dom = allDomain[i]; FunctionSpaceBase* sp = dom->getFunctionSpace(); for (groupOfElements::elementContainer::const_iterator it = dom->g_cbegin(); it!= dom->g_cend(); it++){ MElement* ele = *it; @@ -230,7 +261,7 @@ void pbcAlgorithm::splitDofs(){ }; }; // for virtual keys - std::vector<int> constrainedComp(_mbc->getConstrainedComps().begin(), _mbc->getConstrainedComps().end()); + std::vector<int> constrainedComp(_solver->getMicroBC()->getConstrainedComps().begin(), _solver->getMicroBC()->getConstrainedComps().end()); for (std::set<MVertex*>::iterator it = _pbcConstraint->virtualVertexBegin(); it!= _pbcConstraint->virtualVertexEnd(); it++){ MVertex* v = *it; @@ -292,28 +323,28 @@ void pbcAlgorithm::splitDofs(){ }; void pbcAlgorithm::numberDof(const int type){ - if (this->isSplittedDof() == false) this->splitDofs(); + if (!this->isSplittedDof()) this->splitDofs(); if (type == nonLinearMechSolver::MULT_ELIM){ Msg::Info("Number all displacement dofs"); - _splittedDofs->numberDof(pbcDofManager::INTERNAL,_pAssembler); - _splittedDofs->numberDof(pbcDofManager::BOUNDARY,_pAssembler); + _splittedDofs->numberDof(pbcDofManager::INTERNAL,_solver->getDofManager()); + _splittedDofs->numberDof(pbcDofManager::BOUNDARY,_solver->getDofManager()); } else if (type == nonLinearMechSolver::DISP_ELIM){ Msg::Info("Number all displacement dofs accounting for constraints"); this->applyPBCByConstraintElimination(); - _splittedDofs->numberDof(pbcDofManager::INTERNAL,_pAssembler); - _splittedDofs->numberDof(pbcDofManager::BOUNDARY,_pAssembler); + _splittedDofs->numberDof(pbcDofManager::INTERNAL,_solver->getDofManager()); + _splittedDofs->numberDof(pbcDofManager::BOUNDARY,_solver->getDofManager()); } else if (type == nonLinearMechSolver::DISP_MULT){ Msg::Info("Number all displacement dofs and multiplier dofs"); - _splittedDofs->numberDof(pbcDofManager::INTERNAL,_pAssembler); - _splittedDofs->numberDof(pbcDofManager::BOUNDARY,_pAssembler); - _splittedDofs->numberDof(pbcDofManager::MULTIPLIER,_pAssembler); + _splittedDofs->numberDof(pbcDofManager::INTERNAL,_solver->getDofManager()); + _splittedDofs->numberDof(pbcDofManager::BOUNDARY,_solver->getDofManager()); + _splittedDofs->numberDof(pbcDofManager::MULTIPLIER,_solver->getDofManager()); } else if (type == nonLinearMechSolver::DISP_ELIM_UNIFIED){ Msg::Info("Number all displacement dofs"); - _splittedDofs->numberDof(pbcDofManager::INTERNAL,_pAssembler); - _splittedDofs->numberDof(pbcDofManager::BOUNDARY,_pAssembler); + _splittedDofs->numberDof(pbcDofManager::INTERNAL,_solver->getDofManager()); + _splittedDofs->numberDof(pbcDofManager::BOUNDARY,_solver->getDofManager()); } else{ Msg::Error("system type used in mechanical solver is not valid"); @@ -323,7 +354,7 @@ void pbcAlgorithm::numberDof(const int type){ void pbcAlgorithm::assembleKinematicMatrix(){ std::string name = "A"; - linearSystem<double>* lsys = _pAssembler->getLinearSystem(name); + linearSystem<double>* lsys = _solver->getDofManager()->getLinearSystem(name); pbcSystem<double>* pbcsys = dynamic_cast<pbcSystem<double>*>(lsys); if (!pbcsys){ printf("periodic non linear system is not used! \n"); @@ -359,7 +390,7 @@ void pbcAlgorithm::assembleKinematicMatrix(){ void pbcAlgorithm::zeroStressMatrix(){ std::string name = "A"; - linearSystem<double>* lsys = _pAssembler->getLinearSystem(name); + linearSystem<double>* lsys = _solver->getDofManager()->getLinearSystem(name); pbcSystemBase<double>* pbcsys = dynamic_cast<pbcSystemBase<double>*>(lsys); if (pbcsys == NULL){ Msg::Fatal("pbc system must be used pbcAlgorithm::zeroInSystemHomogenizedTangentMatrix"); @@ -371,7 +402,7 @@ void pbcAlgorithm::zeroStressMatrix(){ int pbcAlgorithm::condensationSolve(fullMatrix<double>& L,double rvevolume){ std::string name = "A"; - linearSystem<double>* lsys = _pAssembler->getLinearSystem(name); + linearSystem<double>* lsys = _solver->getDofManager()->getLinearSystem(name); pbcSystemBase<double>* pbcsys = dynamic_cast<pbcSystemBase<double>*>(lsys); if (pbcsys == NULL){ Msg::Fatal("pbc system must be used pbcAlgorithm::zeroInSystemHomogenizedTangentMatrix"); @@ -392,7 +423,7 @@ void pbcAlgorithm::sparsityLagMultiplierDofs(){ for (int i=0; i< keys.size(); i++){ for (int j=0; j< keys.size(); j++){ - _pAssembler->insertInSparsityPattern(keys[i],keys[j]); + _solver->getDofManager()->insertInSparsityPattern(keys[i],keys[j]); } } @@ -418,7 +449,7 @@ void pbcAlgorithm::assembleConstraintMatrix(){ std::vector<Dof> keys; cele->getConstraintKeys(keys); cele->getMultiplierKeys(keys); - _pAssembler->assemble(keys,m); + _solver->getDofManager()->assemble(keys,m); }; }; void pbcAlgorithm::assembleRightHandSide(){ @@ -429,10 +460,12 @@ void pbcAlgorithm::assembleRightHandSide(){ fullVector<double> vec; cele->getKinematicalVector(vec); vec.scale(_scale); - if (dynamic_cast<staticDofManager<double>* >(_pAssembler)){ - static_cast<staticDofManager<double>* >(_pAssembler)->assemble(keys,vec,nonLinearSystem<double>::Fext); - } else { - _pAssembler->assemble(keys,vec); + staticDofManager<double>* sAssembler = _solver->getStaticDofManager(); + if (sAssembler != NULL){ + sAssembler->assemble(keys,vec,nonLinearSystem<double>::Fext); + } + else { + _solver->getDofManager()->assemble(keys,vec); }; }; }; @@ -456,7 +489,7 @@ void pbcAlgorithm::computeLinearConstraints(){ cele->getMultiplierKeys(keys); fullVector<double> solution(size); for (int i=0; i<size; i++){ - _pAssembler->getDofValue(keys[i],solution(i)); + _solver->getDofManager()->getDofValue(keys[i],solution(i)); }; fullVector<double> val(size); m.mult(solution,val); @@ -468,11 +501,13 @@ void pbcAlgorithm::computeLinearConstraints(){ for (int i=0; i<row; i++) { val(i+col) = val(i+col)-rhs(i); }; - if (dynamic_cast<staticDofManager<double>* >(_pAssembler)){ - static_cast<staticDofManager<double>* >(_pAssembler)->assemble(keys,val,nonLinearSystem<double>::Fint); - } else { + staticDofManager<double>* sAssembler = _solver->getStaticDofManager(); + if (sAssembler!=NULL){ + sAssembler->assemble(keys,val,nonLinearSystem<double>::Fint); + } + else { val.scale(-1.0); - _pAssembler->assemble(keys,val); + _solver->getDofManager()->assemble(keys,val); }; }; }; @@ -483,7 +518,7 @@ void pbcAlgorithm::assembleConstraintResidualToSystem(){ printf("assemble constraint residuals to system \n"); #endif //_DEBUG std::string name = "A"; - linearSystem<double>* lsys = _pAssembler->getLinearSystem(name); + linearSystem<double>* lsys = _solver->getDofManager()->getLinearSystem(name); pbcSystem<double>* pbcsys = dynamic_cast<pbcSystem<double>*>(lsys); if (!pbcsys){ printf("periodic non linear system is not used! \n"); @@ -503,7 +538,7 @@ void pbcAlgorithm::assembleConstraintResidualToSystem(){ cele->getConstraintKeys(keyB); fullVector<double> result(keyB.size()); for (int i=0; i<keyB.size(); i++){ - _pAssembler->getDofValue(keyB[i],result(i)); + _solver->getDofManager()->getDofValue(keyB[i],result(i)); }; fullVector<double> residual(keyL.size()); residual.setAll(0.0); @@ -523,7 +558,7 @@ void pbcAlgorithm::assembleLinearConstraintMatrixToSystem(){ printf("assemble constraint matrix to system \n"); #endif std::string name = "A"; - linearSystem<double>* lsys = _pAssembler->getLinearSystem(name); + linearSystem<double>* lsys = _solver->getDofManager()->getLinearSystem(name); pbcSystem<double>* pbcsys = dynamic_cast<pbcSystem<double>*>(lsys); if (!pbcsys){ printf("periodic non linear system is not used! \n"); @@ -540,7 +575,7 @@ void pbcAlgorithm::assembleLinearConstraintMatrixToSystem(){ for (int i=0; i<keyL.size(); i++){ int row = _splittedDofs->getMultiplierDofNumber(keyL[i]); for (int j=0; j<keyB.size(); j++){ - int col = _pAssembler->getDofNumber(keyB[j]); + int col = _solver->getDofManager()->getDofNumber(keyB[j]); if (fabs(m(i,j))>0.) pbcsys->addToConstraintMatrix(row,col,m(i,j)); }; @@ -554,15 +589,15 @@ void pbcAlgorithm::assembleLinearConstraintMatrixToSystem(){ void pbcAlgorithm::allocateConstraintMatrixToSystem(int kinematicDim, int stressDim, bool tangentFlag){ std::string name = "A"; - linearSystem<double>* lsys = _pAssembler->getLinearSystem(name); + linearSystem<double>* lsys = _solver->getDofManager()->getLinearSystem(name); pbcSystem<double>* pbcsys = dynamic_cast<pbcSystem<double>*>(lsys); int size = dynamic_cast<pbcDofManager*>(_splittedDofs)->sizeOfMultiplierDof(); if (pbcsys){ - pbcsys->allocateConstraintMatrix(size,_pAssembler->sizeOfR()); + pbcsys->allocateConstraintMatrix(size,_solver->getDofManager()->sizeOfR()); pbcsys->setScaleFactor(_scale); if (tangentFlag){ pbcsys->allocateKinematicMatrix(size,kinematicDim); - pbcsys->allocateStressMatrix(stressDim,_pAssembler->sizeOfR()); + pbcsys->allocateStressMatrix(stressDim,_solver->getDofManager()->sizeOfR()); } } }; @@ -576,7 +611,7 @@ void pbcAlgorithm::applyPBCByConstraintElimination(){ cele->getLinearConstraints(linearConstraint); for (std::map<Dof,DofAffineConstraint<double> >::iterator itp = linearConstraint.begin(); itp != linearConstraint.end(); itp++){ - _pAssembler->setLinearConstraint(itp->first, itp->second); + _solver->getDofManager()->setLinearConstraint(itp->first, itp->second); }; linearConstraint.clear(); }; @@ -690,7 +725,7 @@ void pbcAlgorithm::computeIndirectLinearConstraintMatrixForPBCSystem(linearConst void pbcAlgorithm::updateSystemUnknown(){ std::string name = "A"; - linearSystem<double>* lsys = _pAssembler->getLinearSystem(name); + linearSystem<double>* lsys = _solver->getDofManager()->getLinearSystem(name); pbcSystemConden<double>* pbcsys = dynamic_cast<pbcSystemConden<double>*>(lsys); if (pbcsys == NULL){ Msg::Fatal("pbc system must be used pbcAlgorithm::updateSystemUnknown"); @@ -700,7 +735,7 @@ void pbcAlgorithm::computeIndirectLinearConstraintMatrixForPBCSystem(linearConst pbcsys->zeroKinematicVector(); fullVector<double> kinVec; - _mbc->getKinematicalVector(kinVec); + _solver->getMicroBC()->getKinematicalVector(kinVec); for (int i=0; i< kinVec.size(); i++){ double val = kinVec(i); pbcsys->addToKinematicVector(i,val); @@ -1004,7 +1039,7 @@ void pbcAlgorithm::computeLinearConstraintMatrixLDBC(linearConstraintMatrix* lco void pbcAlgorithm::computeLoadVector(){ std::string name = "A"; - linearSystem<double>* lsys = _pAssembler->getLinearSystem(name); + linearSystem<double>* lsys = _solver->getDofManager()->getLinearSystem(name); nonLinearSystem<double>* nonsys = dynamic_cast<nonLinearSystem<double>*>(lsys); if (nonsys == NULL){ Msg::Error("The nonlinear system must be used"); @@ -1019,19 +1054,19 @@ void pbcAlgorithm::computeLoadVector(){ std::vector<Dof> R; cele->getMultiplierKeys(R); - double curtime = _mbc->getTime(); + double curtime = _solver->getMicroBC()->getTime(); fullVector<double> m; - _mbc->setTime(0.); + _solver->getMicroBC()->setTime(0.); fullVector<double> m0; cele->getKinematicalVector(m0); - _mbc->setTime(1.); + _solver->getMicroBC()->setTime(1.); cele->getKinematicalVector(m); for (int i=0; i< m.size(); i++){ m(i) -= m0(i); } // back to current time - _mbc->setTime(curtime); + _solver->getMicroBC()->setTime(curtime); for (int i=0; i< R.size(); i++){ int num = _splittedDofs->getMultiplierDofNumber(R[i]); diff --git a/NonLinearSolver/periodicBC/pbcAlgorithm.h b/NonLinearSolver/periodicBC/pbcAlgorithm.h index 3f307acf09b85e3382e9abe9b3bcbf3515af2368..5e56af6eb1fe0110085854babdb5def04521ad0f 100644 --- a/NonLinearSolver/periodicBC/pbcAlgorithm.h +++ b/NonLinearSolver/periodicBC/pbcAlgorithm.h @@ -18,32 +18,33 @@ #include "pbcDofManager.h" #include "sparsityPattern.h" +class nonLinearMechSolver; class pbcAlgorithm{ protected: - nonLinearMicroBC* _mbc; // for micro BC FunctionSpaceBase* _space, *_mspace; // function space - dofManager<double>* _pAssembler; // dofManager - std::vector<partDomain*>& _allDomain; // alldomain pbcConstraintElementGroup* _pbcConstraint; // all linear periodic groups pbcDofManager* _splittedDofs; double _scale; //factor scale bool _isSplitted; bool _isModifiedConstraintMatrix; + nonLinearMechSolver* _solver; protected: void __int__(); public: - pbcAlgorithm(nonLinearMicroBC* bc,std::vector<partDomain*>& d, dofManager<double>*p); + pbcAlgorithm(nonLinearMechSolver* solver); virtual ~pbcAlgorithm(); + + void switchMicroBC(); pbcDofManager* getSplittedDof() {return _splittedDofs;}; splitStiffnessMatrix* getSplitStiffness() {return _splittedDofs->getSplitStiffnessMatrix();}; pbcConstraintElementGroup* getPBCConstraintGroup() {return _pbcConstraint;}; - nonLinearMicroBC* getMBC() {return _mbc;}; + nonLinearMicroBC* getMBC(); bool isSplittedDof() const {return _isSplitted;}; - int getSystemDofNumber(const Dof& key) {return _pAssembler->getDofNumber(key);}; + int getSystemDofNumber(const Dof& key); bool isModifiedConstraintMatrix() const {return _isModifiedConstraintMatrix;}; void setIsModifiedConstraintMatrixFlag(const bool flag){_isModifiedConstraintMatrix = flag;}; @@ -56,17 +57,8 @@ class pbcAlgorithm{ void numberDof(const int type); // number Dof int getNumberDirectConstraints() const {return _pbcConstraint->sizeOfDirectConstraints();}; - int getNumberOfMacroToMicroKinematicVariables() const {return _mbc->getNumberOfMacroToMicroKinematicVariables();}; - int getNumberMicroToMacroHomogenizedVariables() const{ - // get maximal stress dimension from domain - int dimStress = 0; - for (int i=0; i< _allDomain.size(); i++){ - if (_allDomain[i]->getStressDimension() > dimStress){ - dimStress = _allDomain[i]->getStressDimension(); - } - } - return dimStress; - } + int getNumberOfMacroToMicroKinematicVariables() const;; + int getNumberMicroToMacroHomogenizedVariables() const; // for estimating homogenized tangent in system void assembleKinematicMatrix(); void zeroStressMatrix(); diff --git a/NonLinearSolver/periodicBC/pbcConstraintElement.cpp b/NonLinearSolver/periodicBC/pbcConstraintElement.cpp index 4ab3917c1d0cdcfb8a6b5a34f0d41f9989b793f9..129a74395f77914abc4bf878161c98ef398b8ea8 100644 --- a/NonLinearSolver/periodicBC/pbcConstraintElement.cpp +++ b/NonLinearSolver/periodicBC/pbcConstraintElement.cpp @@ -19,7 +19,7 @@ void periodicMeshConstraint::__init__(const double fact){ constraintElement::allPositiveDof.insert(Keys[ik]); } else{ - Msg::Warning("Dof on vertex was chosen as positive one in other constraint element:"); + Msg::Warning("periodicMeshConstraint Dof on vertex was chosen as positive one in other constraint element:"); } } @@ -194,7 +194,7 @@ cubicSplineConstraintElement::cubicSplineConstraintElement(nonLinearMicroBC* mbc constraintElement::allPositiveDof.insert(Keys[ik]); } else{ - Msg::Warning("Dof on vertex was chosen as positive one in other constraint element:"); + Msg::Warning("cubicSplineConstraintElement Dof on vertex was chosen as positive one in other constraint element:"); } } @@ -342,7 +342,7 @@ lagrangeConstraintElement::lagrangeConstraintElement(nonLinearMicroBC* mbc, Func constraintElement::allPositiveDof.insert(Keys[ik]); } else{ - Msg::Warning("Dof on vertex was chosen as positive one in other constraint element:"); + Msg::Warning("lagrangeConstraintElement Dof on vertex was chosen as positive one in other constraint element:"); } } @@ -401,6 +401,76 @@ lagrangeConstraintElement::lagrangeConstraintElement(nonLinearMicroBC* mbc, Func getPBCKinematicMatrix(_L,_XX,_S); }; +lagrangeConstraintElement::lagrangeConstraintElement(nonLinearMicroBC* mbc, FunctionSpaceBase* space, FunctionSpaceBase* mspace, + const int c, MVertex* v1, std::vector<MVertex*>& vlist, + const SVector3& dir): constraintElement(mbc,c), _periodicSpace(space),_multSpace(mspace), + _vp(v1),_vn(vlist), _vrootP(NULL), _vrootN(NULL){ + std::vector<Dof> Keys; + getKeysFromVertex(_periodicSpace,_vp, getComp(),Keys); + for (int ik=0; ik < Keys.size(); ik++){ + if (constraintElement::allPositiveDof.find(Keys[ik]) == constraintElement::allPositiveDof.end()){ + constraintElement::allPositiveDof.insert(Keys[ik]); + } + else{ + Msg::Warning("lagrangeConstraintElement Dof on vertex was chosen as positive one in other constraint element:"); + } + } + + for (int i=0; i<vlist.size(); i++){ + double dist = _vn[i]->distance(_vn[0]); + _distance.push_back(dist); + }; + SPoint3 pp = _vp->point(); + SPoint3 np1 = _vn[0]->point(); + SPoint3 np2 = _vn[_vn.size()-1]->point(); + SPoint3 point = planeDirProject(pp,np1,np2,dir); + _s = point.distance(np1); + int size = _vn.size(); + _C.resize(_ndofs,(1+size)*_ndofs); _C.setAll(0.0); + int col = 0; + for (int i=0; i<_ndofs; i++){ + _C(i,col) = 1.0; + col++; + }; + lagrangeConstraintElement::getFF(_s,_distance,_FF); + _Cbc.resize(_ndofs,size*_ndofs); + _Cbc.setAll(0.); + for (int i=0; i<_FF.size(); i++){ + for (int j=0; j<_ndofs; j++){ + _C(j,col) = -1.*_FF(i); + _Cbc(j,col-_ndofs) = _FF(i); + col++; + }; + }; + for (int j=0; j<3; j++){ + _L[j] = pp[j]; + for (int i=0; i<_FF.size(); i++){ + SPoint3 pt = _vn[i]->point(); + _L[j] -= _FF(i)*pt[j]; + } + } + + if (_mbc->getOrder() == 2){ + SPoint3 positive = _vp->point(); + SPoint3 np1 = _vn[0]->point(); + SPoint3 np2 = _vn[_vn.size()-1]->point(); + SPoint3 negative = project(positive,np1,np2); + + for (int i=0; i<3; i++) + for (int j=0; j<3; j++) + _XX(i,j) = 0.5*(positive[i]*positive[j]); + + for (int k=0; k<_FF.size(); k++){ + SPoint3 pt = _vn[k]->point(); + for (int i=0; i<3; i++) + for (int j=0; j<3; j++) + _XX(i,j) -= _FF(k)*0.5*(pt[i]*pt[j]); + } + } + + getPBCKinematicMatrix(_L,_XX,_S); +}; + void lagrangeConstraintElement::getConstraintKeys(std::vector<Dof>& keys) const{ getKeysFromVertex(_periodicSpace,_vp, getComp(), keys); @@ -529,7 +599,7 @@ FEConstraintElement::FEConstraintElement(nonLinearMicroBC* mbc, FunctionSpaceBas constraintElement::allPositiveDof.insert(Keys[ik]); } else{ - Msg::Warning("Dof on vertex was chosen as positive one in other constraint element:"); + Msg::Warning("FEConstraintElement Dof on vertex was chosen as positive one in other constraint element:"); } } SPoint3 point; diff --git a/NonLinearSolver/periodicBC/pbcConstraintElement.h b/NonLinearSolver/periodicBC/pbcConstraintElement.h index 874a1be54a3ec0d64b61c9404979cb3f551a1473..41d84118becf9b4f4f532402b3ec5244b1f1919f 100644 --- a/NonLinearSolver/periodicBC/pbcConstraintElement.h +++ b/NonLinearSolver/periodicBC/pbcConstraintElement.h @@ -163,6 +163,11 @@ class lagrangeConstraintElement : public constraintElement{ lagrangeConstraintElement(nonLinearMicroBC* mbc, FunctionSpaceBase* space, FunctionSpaceBase* mspace, const int c, MVertex* v1, std::vector<MVertex*>& vlist, MVertex* vrootP= NULL, MVertex* vrootN = NULL); + + lagrangeConstraintElement(nonLinearMicroBC* mbc, FunctionSpaceBase* space, FunctionSpaceBase* mspace, + const int c, MVertex* v1, std::vector<MVertex*>& vlist, + const SVector3& dir); + virtual ~lagrangeConstraintElement(){}; virtual void getConstraintKeys(std::vector<Dof>& key) const; // real dofs on constraint elements virtual void getMultiplierKeys(std::vector<Dof>& key) const; // multiplier dof on constraint element diff --git a/NonLinearSolver/periodicBC/pbcConstraintElementBase.h b/NonLinearSolver/periodicBC/pbcConstraintElementBase.h index 7c25837d43fb0ca625d58f2dabc7d74dba180371..f0c9572bbfc106922cf06d72a7898f842e83f94f 100644 --- a/NonLinearSolver/periodicBC/pbcConstraintElementBase.h +++ b/NonLinearSolver/periodicBC/pbcConstraintElementBase.h @@ -37,7 +37,8 @@ class constraintElement{ public: - enum ElementType{Periodic =0, CubicSpline=1, Lagrange=2, PeriodicNode = 3, Supplement=4, FE = 5}; + enum ElementType{Periodic =0, CubicSpline=1, Lagrange=2, PeriodicNode = 3, Supplement=4, FE = 5, + DirectionalPeriodic = 6}; static std::set<Dof> allPositiveDof; nonLinearMicroBC* _mbc; // micro BC @@ -87,7 +88,7 @@ class constraintElement{ Msg::Warning("getLinearConstraintsByVertices must be defined for this kind of constraint"); }; /**element type **/ - virtual constraintElement::ElementType getType() const =0; // get element type + virtual constraintElement::ElementType getType() const =0; // get element type /**print the constraint**/ virtual void print() const{ Msg::Info("Print the constraint "); diff --git a/NonLinearSolver/periodicBC/pbcConstraintEliminationNonLinearSystemPETSc.h b/NonLinearSolver/periodicBC/pbcConstraintEliminationNonLinearSystemPETSc.h index 2378300fb30afe19531ce2e55bda41d53ef0b5f7..a73e963ff40b7cbaa57f5edba27b20acde18ed52 100644 --- a/NonLinearSolver/periodicBC/pbcConstraintEliminationNonLinearSystemPETSc.h +++ b/NonLinearSolver/periodicBC/pbcConstraintEliminationNonLinearSystemPETSc.h @@ -270,8 +270,11 @@ class pbcConstraintEliminationNonLinearSystemPETSc : public pbcSystemConden<scal else{ Mat invCd; _try(MatInverse_Naive(Cd,&invCd,this->getComm())); - _try(MatMatMult(invCd,Cf,MAT_INITIAL_MATRIX,PETSC_DECIDE,&Cdf)); - _try(MatScale(Cdf,-1.)); + + if (_pAl->getSplittedDof()->sizeOfIndependentDof()>0){ + _try(MatMatMult(invCd,Cf,MAT_INITIAL_MATRIX,PETSC_DECIDE,&Cdf)); + _try(MatScale(Cdf,-1.)); + }; _try(MatMatMult(invCd,Sbc,MAT_INITIAL_MATRIX,PETSC_DECIDE,&Sdf)); _try(MatDestroy(&invCd)); } @@ -396,7 +399,9 @@ class pbcConstraintEliminationNonLinearSystemPETSc : public pbcSystemConden<scal _isComputedProjectMatrices = true; if (depenDofMap.size() >0){ - _try(MatDestroy(&Cdf)); + if (_pAl->getSplittedDof()->sizeOfIndependentDof()>0){ + _try(MatDestroy(&Cdf)); + } _try(MatDestroy(&Sdf)); } cConMat.clear(); diff --git a/NonLinearSolver/periodicBC/pbcCreateConstraints.cpp b/NonLinearSolver/periodicBC/pbcCreateConstraints.cpp index 86434d4939e1bc3ba56ca1c948cde1dae6ecacef..727cdd0bce1bac516fca184164da175da74fecf7 100644 --- a/NonLinearSolver/periodicBC/pbcCreateConstraints.cpp +++ b/NonLinearSolver/periodicBC/pbcCreateConstraints.cpp @@ -17,6 +17,7 @@ #include "pbcCoonsPatchConstraintElement.h" #include "pbcSupplementConstraint.h" #include "pbcSupplementConstraintExtraDofDiffusion.h" +#include "directionalConstraintElement.h" groupOfElementsDomainDecomposition::groupOfElementsDomainDecomposition(const int phys, groupOfElements* g_, std::vector<partDomain*>& allDomain): g(g_),physical(phys){ @@ -73,12 +74,15 @@ groupOfElementsDomainDecomposition::~groupOfElementsDomainDecomposition(){ decompositionMap.clear(); } -pbcConstraintElementGroup::pbcConstraintElementGroup(nonLinearMicroBC* bc, std::vector<partDomain*>& adm, +pbcConstraintElementGroup::pbcConstraintElementGroup(nonLinearMechSolver* sl, FunctionSpaceBase* lagspace, FunctionSpaceBase* multspace) - :_mbc(bc),_allDomain(adm), _v1(NULL),_v2(NULL),_v4(NULL),_v5(NULL), + :_solver(sl), _v1(NULL),_v2(NULL),_v4(NULL),_v5(NULL), _v3(NULL),_v6(NULL),_v7(NULL),_v8(NULL), _gXY(NULL),_gYZ(NULL),_gZX(NULL), _gX(NULL),_gY(NULL),_gZ(NULL), _g(NULL), - _LagSpace(lagspace),_MultSpace(multspace){ + _LagSpace(lagspace),_MultSpace(multspace), + _periodic12(0.),_periodic14(0.),_periodic15(0.), + _e1(1.,0.,0.),_e2(0.,1.,0.),_e3(0.,0.,1.), + _e1Rotated(1.,0.,0.),_e2Rotated(0.,1.,0.),_e3Rotated(0.,0.,1.){ this->__init__(); }; @@ -166,12 +170,13 @@ void pbcConstraintElementGroup::groupIntersection(std::set<MVertex*>& g1, std::s }; void pbcConstraintElementGroup::__init__(){ + std::vector<partDomain*>& allDomain = *(_solver->getDomainVector()); /**get all element within all domain in CG case**/ _g = new groupOfElements(); _fullDG = false; - for (int idom = 0; idom< _allDomain.size(); idom++){ - partDomain* dom = _allDomain[idom]; + for (int idom = 0; idom< allDomain.size(); idom++){ + partDomain* dom = allDomain[idom]; if (dom->getFormulation()){ _fullDG = true; if (dom->groupOfElementsSize() > 0) Msg::Fatal("The pbcConstraintElementGroup is only implemented for interDomain"); @@ -179,8 +184,8 @@ void pbcConstraintElementGroup::__init__(){ } } - for (int idom = 0; idom< _allDomain.size(); idom++){ - partDomain* dom = _allDomain[idom]; + for (int idom = 0; idom< allDomain.size(); idom++){ + partDomain* dom = allDomain[idom]; for (groupOfElements::elementContainer::const_iterator it = dom->g_cbegin(); it!= dom->g_cend(); it++){ _g->insert(*it); } @@ -192,26 +197,26 @@ void pbcConstraintElementGroup::__init__(){ if (_fullDG){ Msg::Info("start decomsing boundary element to domains"); _boundaryDGMap.clear(); - const std::vector<int>& bphysical = _mbc->getBoundaryPhysicals(); - const std::vector<groupOfElements*>& bgroup = _mbc->getBoundaryGroupOfElements(); + const std::vector<int>& bphysical = _solver->getMicroBC()->getBoundaryPhysicals(); + const std::vector<groupOfElements*>& bgroup = _solver->getMicroBC()->getBoundaryGroupOfElements(); for (int ig=0; ig< bgroup.size(); ig++){ groupOfElements* gr = bgroup[ig]; - groupOfElementsDomainDecomposition* grDomPart = new groupOfElementsDomainDecomposition(bphysical[ig], gr,_allDomain); + groupOfElementsDomainDecomposition* grDomPart = new groupOfElementsDomainDecomposition(bphysical[ig], gr,allDomain); _boundaryDGMap.push_back(grDomPart); } Msg::Info("done decomsing boundary element to domains"); // create all lag space int maxTag = 0; - for (int i=0; i< _allDomain.size(); i++){ - if ((maxTag< _allDomain[i]->getFunctionSpace()->getId()) and (_allDomain[i]->groupOfElementsSize()>0)){ - maxTag = _allDomain[i]->getFunctionSpace()->getId(); + for (int i=0; i< allDomain.size(); i++){ + if ((maxTag< allDomain[i]->getFunctionSpace()->getId()) and (allDomain[i]->groupOfElementsSize()>0)){ + maxTag = allDomain[i]->getFunctionSpace()->getId(); } } maxTag ++; // to create a diffrent id for multspace _allDGMultSpace.clear(); - for (int i=0; i< _allDomain.size(); i++){ - partDomain* dom = _allDomain[i]; + for (int i=0; i< allDomain.size(); i++){ + partDomain* dom = allDomain[i]; if (dom->groupOfElementsSize()>0){ int newTag = maxTag+i; FunctionSpaceBase* sp = dom->getFunctionSpace()->clone(newTag); @@ -223,9 +228,9 @@ void pbcConstraintElementGroup::__init__(){ } } - nonLinearPeriodicBC* pbc = dynamic_cast<nonLinearPeriodicBC*>(_mbc); - const std::vector<groupOfElements*>& bgroup = _mbc->getBoundaryGroupOfElements(); - int dim = _mbc->getDim(); + nonLinearPeriodicBC* pbc = dynamic_cast<nonLinearPeriodicBC*>(_solver->getMicroBC()); + const std::vector<groupOfElements*>& bgroup = _solver->getMicroBC()->getBoundaryGroupOfElements(); + int dim = _solver->getMicroBC()->getDim(); if (pbc != NULL && bgroup.size()>0){ if (dim ==2){ if (bgroup.size() == 4){ @@ -447,6 +452,9 @@ void pbcConstraintElementGroup::__init__(){ Msg::Info("Corner vertex = %d",v->getNum()); } #endif //_DEBUG + + addControlPoints(); + addOtherCornerPoints(); } }; @@ -454,7 +462,7 @@ void pbcConstraintElementGroup::__init__(){ void pbcConstraintElementGroup::addControlPoints(){ std::set<MVertex*> vv; groupIntersection(l12,l41,vv); - if (_mbc->getDim() == 3){ + if (_solver->getMicroBC()->getDim() == 3){ groupIntersection(l12,l15,vv); groupIntersection(l41,l15,vv); } @@ -473,7 +481,7 @@ void pbcConstraintElementGroup::addControlPoints(){ Msg::Info("Create root vertex v1 %d: %e %e %e",_v1->getNum(),pp.x(),pp.y(),pp.z()); l12.insert(_v1); l41.insert(_v1); - if (_mbc->getDim()==3){ + if (_solver->getMicroBC()->getDim()==3){ l15.insert(_v1); } _virtualVertices.insert(_v1); @@ -487,7 +495,7 @@ void pbcConstraintElementGroup::addControlPoints(){ vv.clear(); groupIntersection(l12,l23,vv); - if (_mbc->getDim()==3){ + if (_solver->getMicroBC()->getDim()==3){ groupIntersection(l12,l26,vv); groupIntersection(l23,l26,vv); } @@ -516,7 +524,7 @@ void pbcConstraintElementGroup::addControlPoints(){ vv.clear(); groupIntersection(l34,l41,vv); - if (_mbc->getDim()==3){ + if (_solver->getMicroBC()->getDim()==3){ groupIntersection(l34,l48,vv); groupIntersection(l41,l48,vv); } @@ -542,7 +550,7 @@ void pbcConstraintElementGroup::addControlPoints(){ else { _v4 = *(vv.begin()); } - if (_mbc->getDim()==3){ + if (_solver->getMicroBC()->getDim()==3){ vv.clear(); groupIntersection(l85,l15,vv); groupIntersection(l85,l56,vv); @@ -686,6 +694,29 @@ void pbcConstraintElementGroup::addControlPoints(){ } } + + _periodic12[0] = _v2->x() - _v1->x(); + _periodic12[1] = _v2->y() - _v1->y(); + _periodic12[2] = _v2->z() - _v1->z(); + + _periodic14[0] = _v4->x() - _v1->x(); + _periodic14[1] = _v4->y() - _v1->y(); + _periodic14[2] = _v4->z() - _v1->z(); + + if (_solver->getMicroBC()->getDim() == 3){ + _periodic15[0] = _v5->x() - _v1->x(); + _periodic15[1] = _v5->y() - _v1->y(); + _periodic15[2] = _v5->z() - _v1->z(); + } + + _periodic12.print("periodic 1 --> 2"); + _periodic14.print("periodic 1 --> 4"); + + + if (_solver->getMicroBC()->getDim() == 3){ + _periodic15.print("periodic 1 --> 5"); + } + }; void pbcConstraintElementGroup::addOtherCornerPoints(){ @@ -693,7 +724,7 @@ void pbcConstraintElementGroup::addOtherCornerPoints(){ // find _v3 vv.clear(); groupIntersection(l23,l34,vv); - if (_mbc->getDim() ==3){ + if (_solver->getMicroBC()->getDim() ==3){ if (vv.size()==0) groupIntersection(l34,l37,vv); if (vv.size() ==0) @@ -708,7 +739,7 @@ void pbcConstraintElementGroup::addOtherCornerPoints(){ Msg::Info("Create root vertex v3 %d: %e %e %e",_v3->getNum(),x,y,z); l23.insert(_v3); l34.insert(_v3); - if (_mbc->getDim() ==3) + if (_solver->getMicroBC()->getDim() ==3) l37.insert(_v3); _virtualVertices.insert(_v3); _cVertices.insert(_v3); @@ -718,7 +749,7 @@ void pbcConstraintElementGroup::addOtherCornerPoints(){ _v3 = *(vv.begin()); } - if (_mbc->getDim() ==3){ + if (_solver->getMicroBC()->getDim() ==3){ // find _v6 vv.clear(); groupIntersection(l26,l56,vv); @@ -800,8 +831,8 @@ void pbcConstraintElementGroup::addOtherCornerPoints(){ }; void pbcConstraintElementGroup::createPolynomialBasePoints(){ - int dim = _mbc->getDim(); - nonLinearPeriodicBC* pbc = static_cast<nonLinearPeriodicBC*>(_mbc); + int dim = _solver->getMicroBC()->getDim(); + nonLinearPeriodicBC* pbc = static_cast<nonLinearPeriodicBC*>(_solver->getMicroBC()); int degreeX = pbc->getPBCPolynomialDegree(0); int degreeY = pbc->getPBCPolynomialDegree(1);; int degreeZ = pbc->getPBCPolynomialDegree(2);; @@ -839,13 +870,6 @@ void pbcConstraintElementGroup::createPolynomialBasePoints(){ pbc->setPBCPolynomialDegree(2,degreeZ); } - - - - - // add root points if necessary - this->addControlPoints(); - Msg::Info("Interpolation degree used in X direction %d, Y direction %d, Z direction %d",degreeX,degreeY,degreeZ); bool ok = false; @@ -882,7 +906,7 @@ void pbcConstraintElementGroup::createBCGroup3D( std::vector<MVertex*>& vlx, std return; } MVertex* vroot = vlx[0]; - nonLinearPeriodicBC* pbc = dynamic_cast<nonLinearPeriodicBC*>(_mbc); + nonLinearPeriodicBC* pbc = dynamic_cast<nonLinearPeriodicBC*>(_solver->getMicroBC()); if (pbc == NULL) return; int NX = vlx.size(); int NY = vly.size(); @@ -931,7 +955,7 @@ void pbcConstraintElementGroup::createBCGroup3D( std::vector<MVertex*>& vlx, std } }; -void pbcConstraintElementGroup::createLineFromTwoFaces(groupOfElements* face1, groupOfElements* face2, groupOfElements* line) const{ +void pbcConstraintElementGroup::intersectionBetweenTwoFaces(const groupOfElements* face1, const groupOfElements* face2, groupOfElements* & line) const{ std::vector<std::vector<MVertex*> > allEdges; for (groupOfElements::elementContainer::iterator itL = face1->begin(); itL!= face1->end(); itL++){ @@ -963,8 +987,9 @@ void pbcConstraintElementGroup::createLineFromTwoFaces(groupOfElements* face1, g } } - - line->clearAll(); + + // add to grEle + if (line == NULL) line = new groupOfElements(); for (int i=0; i< allEdges.size(); i++){ std::vector<MVertex*>& vv = allEdges[i]; MElement* ele = new MLineN(vv); @@ -972,12 +997,34 @@ void pbcConstraintElementGroup::createLineFromTwoFaces(groupOfElements* face1, g } }; +void pbcConstraintElementGroup::intersectionBetweenTwoLines(const groupOfElements* line1, const groupOfElements* line2, groupOfElements* & pt) const{ + std::vector<MVertex*> allVertex; + for (groupOfElements::vertexContainer::iterator itL = line1->vbegin(); itL!= line1->vend(); itL++){ + MVertex* v1 = *itL; + for (groupOfElements::vertexContainer::iterator itR = line2->vbegin(); itR!= line2->vend(); itR++){ + MVertex* v2 = *itR; + if (v1->getNum() == v2->getNum()){ + allVertex.push_back(v1); + break; + } + } + } + + if (pt == NULL) pt = new groupOfElements(); + for (int i=0; i< allVertex.size(); i++){ + MElement* ele = new MPoint(allVertex[i]); + pt->insert(ele); + } +}; + void pbcConstraintElementGroup::createAllBCGroups(){ - int dim = _mbc->getDim(); + int dim = _solver->getMicroBC()->getDim(); + if (_gX != NULL) delete _gX; _gX = new groupOfElements(); + if (_gY != NULL) delete _gY; _gY = new groupOfElements(); - nonLinearPeriodicBC* pbc = dynamic_cast<nonLinearPeriodicBC*>(_mbc); + nonLinearPeriodicBC* pbc = dynamic_cast<nonLinearPeriodicBC*>(_solver->getMicroBC()); if (pbc->getPBCMethod() == nonLinearPeriodicBC::FE_LIN){ for (int i=0; i<_xBase.size()-1; i++){ MElement* line = new MLine(_xBase[i],_xBase[i+1]); @@ -1039,6 +1086,7 @@ void pbcConstraintElementGroup::createAllBCGroups(){ if (dim== 3){ std::vector<MVertex*> ztemp(_zBase); _zBase.clear(); + if (_gZ != NULL) delete _gZ; _gZ = new groupOfElements(); for (int i=0; i<ztemp.size()-1; i++){ _zBase.push_back(ztemp[i]); @@ -1061,12 +1109,13 @@ void pbcConstraintElementGroup::createAllBCGroups(){ }; if (dim == 3){ + if (_gXY != NULL) delete _gXY; + if (_gYZ != NULL) delete _gYZ; + if (_gZX != NULL) delete _gZX; _gXY = new groupOfElements(); _gZX = new groupOfElements(); _gYZ = new groupOfElements(); - this->addOtherCornerPoints(); - this->createBCGroup3D(_xBase,_yBase,_v3,_gXY); this->createBCGroup3D(_yBase,_zBase,_v8,_gYZ); this->createBCGroup3D(_zBase,_xBase,_v6,_gZX); @@ -1114,7 +1163,7 @@ void pbcConstraintElementGroup::periodicConditionForPeriodicMesh(Iterator posivt MVertex* v = *itp; if ( others.find(v) == others.end()){ MVertex* vn = findNearestVertex(negativeitbegin,negativeitend,v); - constraintElement* cel = new periodicMeshConstraint(_mbc,_LagSpace,_MultSpace,-1,v,vn,vrootP,vrootN); + constraintElement* cel = new periodicMeshConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,-1,v,vn,vrootP,vrootN); _allConstraint.insert(cel); }; } @@ -1129,7 +1178,7 @@ void pbcConstraintElementGroup::periodicConditionForPeriodicMesh(const int comp, MVertex* v = *itp; if ( others.find(v) == others.end()){ MVertex* vn = findNearestVertex(negativeitbegin,negativeitend,v); - constraintElement* cel = new periodicMeshConstraint(_mbc,_LagSpace,_MultSpace,comp,v,vn,vrootP,vrootN,fact); + constraintElement* cel = new periodicMeshConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,comp,v,vn,vrootP,vrootN,fact); _allConstraint.insert(cel); }; } @@ -1233,7 +1282,7 @@ void pbcConstraintElementGroup::cubicSplineFormCondition(Iterator itbegin, Itera break; }; }; - constraintElement* cele = new cubicSplineConstraintElement(_mbc,_LagSpace,_MultSpace,-1,v,vleft,vright,fl); + constraintElement* cele = new cubicSplineConstraintElement(_solver->getMicroBC(),_LagSpace,_MultSpace,-1,v,vleft,vright,fl); _allConstraint.insert(cele); }; @@ -1263,7 +1312,7 @@ void pbcConstraintElementGroup::cubicSplinePeriodicCondition(Iterator itbegin, I }; // if found segment if ((vleft != NULL) and (vright!= NULL)){ - constraintElement* cele = new cubicSplineConstraintElement(_mbc,_LagSpace,_MultSpace,-1,v,vleft,vright,fl); + constraintElement* cele = new cubicSplineConstraintElement(_solver->getMicroBC(),_LagSpace,_MultSpace,-1,v,vleft,vright,fl); _allConstraint.insert(cele); } @@ -1311,7 +1360,7 @@ void pbcConstraintElementGroup::cubicSplineFormConditionCoonsPatch(Iterator itbe }; // segment found if ((vleftx!=NULL) and (vlefty!=NULL) and (vrightx!=NULL) and (vrighty!=NULL)){ - constraintElement* cele = new CoonsPatchCubicSplineConstraintElement(_mbc,_LagSpace,_MultSpace, + constraintElement* cele = new CoonsPatchCubicSplineConstraintElement(_solver->getMicroBC(),_LagSpace,_MultSpace, -1,v,vref,vleftx,vrightx,vlefty,vrighty,flagx,flagy); _allConstraint.insert(cele); } @@ -1362,7 +1411,7 @@ void pbcConstraintElementGroup::cubicSplinePeriodicConditionCoonsPatch(Iterator }; }; if ((vleftx!=NULL) and (vlefty!=NULL) and (vrightx!=NULL) and (vrighty!=NULL)){ - constraintElement* cele = new CoonsPatchCubicSplineConstraintElement(_mbc ,_LagSpace,_MultSpace, + constraintElement* cele = new CoonsPatchCubicSplineConstraintElement(_solver->getMicroBC() ,_LagSpace,_MultSpace, -1,v,vref,vleftx,vrightx,vlefty,vrighty,flagx,flagy); _allConstraint.insert(cele); @@ -1388,7 +1437,7 @@ void pbcConstraintElementGroup::lagrangeFormCondition(Iterator itbegin, Iterator } }; if (flag){ - constraintElement* cele = new lagrangeConstraintElement(_mbc,_LagSpace,_MultSpace, + constraintElement* cele = new lagrangeConstraintElement(_solver->getMicroBC(),_LagSpace,_MultSpace, -1,v,vlist,vrootP,vrootN); _allConstraint.insert(cele); }; @@ -1401,13 +1450,113 @@ void pbcConstraintElementGroup::lagrangePeriodicCondition(Iterator itbegin, Iter for (Iterator it = itbegin; it != itend; it++){ MVertex* v= *it; if (others.find(v) == others.end()){ - constraintElement* cele = new lagrangeConstraintElement(_mbc,_LagSpace,_MultSpace, + constraintElement* cele = new lagrangeConstraintElement(_solver->getMicroBC(),_LagSpace,_MultSpace, -1,v,vlist,vrootP,vrootN); _allConstraint.insert(cele); }; }; }; +template<class Iterator> +void pbcConstraintElementGroup::shiftedLagrangePeriodicCondition(Iterator itbegin, Iterator itend, + std::vector<MVertex*>& vlist,std::set<MVertex*>& others, const SVector3& normal){ + + for (Iterator it = itbegin; it != itend; it++){ + MVertex* v= *it; + if (others.find(v) == others.end()){ + constraintElement* cele = new shiftedLagrangeConstraintElement(_solver->getMicroBC(),_LagSpace,_MultSpace, + -1,v,vlist,normal); + _allConstraint.insert(cele); + }; + } +}; + +template<class Iterator> +void pbcConstraintElementGroup::directionalLagrangeFormCondition(Iterator itbegin, Iterator itend, + std::vector<MVertex*>& vlist, const SVector3& pbcDir){ + + int vsize = vlist.size(); + for (Iterator it = itbegin; it!= itend;it++){ + MVertex* v = *it; + bool flag = true; + + for (int i=0; i<vsize; i++){ + if (v->getNum() == vlist[i]->getNum()){ + flag = false; + break; + } + }; + + if (flag){ + constraintElement* cele = new directionalFormLagrangeConstraintElement(_solver->getMicroBC(),_LagSpace,_MultSpace,v,vlist,pbcDir); + _allConstraint.insert(cele); + }; + }; + +}; + +template<class Iterator> +void pbcConstraintElementGroup::directionalLagrangePeriodicCondition(Iterator itbegin, Iterator itend, + std::vector<MVertex*>& xlist, std::vector<MVertex*>& ylist, + const SVector3& pbcNormal, const bool allComp){ + if (xlist[0]->getNum() != ylist[0]->getNum()){ + Msg::Fatal("construction of interplolation basis is not correct pbcConstraintElementGroup::directionalLagrangePeriodicCondition"); + } + int xsize = xlist.size(); + int ysize = ylist.size(); + for (Iterator it = itbegin; it!= itend;it++){ + MVertex* v = *it; + bool flag = true; + + for (int i=0; i<xsize; i++){ + if (v->getNum() == xlist[i]->getNum()){ + flag = false; + break; + } + }; + if (flag){ + for (int i=0; i<ysize; i++){ + if (v->getNum() == ylist[i]->getNum()){ + flag = false; + break; + } + }; + } + + if (flag){ + SPoint3 pt = v->point(); + SPoint3 v1 = xlist[0]->point(); + SPoint3 v2 = xlist[xsize-1]->point(); + + SPoint3 pp = planeDirProject(pt,v1,v2,pbcNormal); + + SVector3 ppv1(pp,v1); + SVector3 ppv2(pp,v2); + if (dot(ppv1,ppv2) <=0.){ + constraintElement* cele; + if (allComp){ + cele = new lagrangeConstraintElement(_solver->getMicroBC(),_LagSpace,_MultSpace,-1,v,xlist,pbcNormal); + } + else{ + cele = new directionalPBCLagrangeConstraintElement(_solver->getMicroBC(),_LagSpace,_MultSpace,v,xlist,pbcNormal); + } + + _allConstraint.insert(cele); + } + else{ + constraintElement* cele; + if (allComp){ + cele = new lagrangeConstraintElement(_solver->getMicroBC(),_LagSpace,_MultSpace,-1,v,ylist,pbcNormal); + } + else{ + cele = new directionalPBCLagrangeConstraintElement(_solver->getMicroBC(),_LagSpace,_MultSpace,v,ylist,pbcNormal); + } + _allConstraint.insert(cele); + } + }; + }; +}; + // for lagrange template<class Iterator> void pbcConstraintElementGroup::lagrangeFormConditionCoonsPatch(Iterator itbegin, Iterator itend, MVertex* vref, @@ -1416,7 +1565,7 @@ void pbcConstraintElementGroup::lagrangeFormConditionCoonsPatch(Iterator itbegin for (Iterator it = itbegin; it!= itend;it++){ MVertex* v = *it; if (others.find(v)==others.end()){ - constraintElement* cele = new CoonsPatchLagrangeConstraintElement(_mbc,_LagSpace,_MultSpace, + constraintElement* cele = new CoonsPatchLagrangeConstraintElement(_solver->getMicroBC(),_LagSpace,_MultSpace, -1,v,vref,xlist,ylist, vrootP,vrootN); _allConstraint.insert(cele); @@ -1430,7 +1579,7 @@ void pbcConstraintElementGroup::lagrangePeriodicConditionCoonsPatch(Iterator itb for (Iterator it = itbegin; it!= itend;it++){ MVertex* v = *it; if (others.find(v)==others.end()){ - constraintElement* cele = new CoonsPatchLagrangeConstraintElement(_mbc,_LagSpace,_MultSpace, + constraintElement* cele = new CoonsPatchLagrangeConstraintElement(_solver->getMicroBC(),_LagSpace,_MultSpace, -1,v,vref,xlist,ylist, vrootP,vrootN); _allConstraint.insert(cele); }; @@ -1480,7 +1629,7 @@ void pbcConstraintElementGroup::pbcFEConstraintElementGroup(Iterator itbegin, It Msg::Error("receive element not found"); } else{ - constraintElement* cele = new FEConstraintElement(_mbc ,_LagSpace,_MultSpace, -1,v,e,vrootP,vrootN); + constraintElement* cele = new FEConstraintElement(_solver->getMicroBC() ,_LagSpace,_MultSpace, -1,v,e,vrootP,vrootN); _allConstraint.insert(cele); } }; @@ -1488,9 +1637,9 @@ void pbcConstraintElementGroup::pbcFEConstraintElementGroup(Iterator itbegin, It }; void pbcConstraintElementGroup::createFEConstraintElementGroup(){ - int dim = _mbc->getDim(); - nonLinearPeriodicBC* pbc = static_cast<nonLinearPeriodicBC*>(_mbc); - const std::vector<groupOfElements*>& bgroup = _mbc->getBoundaryGroupOfElements(); + int dim = _solver->getMicroBC()->getDim(); + nonLinearPeriodicBC* pbc = static_cast<nonLinearPeriodicBC*>(_solver->getMicroBC()); + const std::vector<groupOfElements*>& bgroup = _solver->getMicroBC()->getBoundaryGroupOfElements(); // create base this->createPolynomialBasePoints(); this->createAllBCGroups(); @@ -1535,9 +1684,9 @@ void pbcConstraintElementGroup::createFEConstraintElementGroup(){ }; void pbcConstraintElementGroup::createProjectConstraintElementGroup(){ - int dim = _mbc->getDim(); - nonLinearPeriodicBC* pbc = static_cast<nonLinearPeriodicBC*>(_mbc); - const std::vector<groupOfElements*>& bgroup = _mbc->getBoundaryGroupOfElements(); + int dim = _solver->getMicroBC()->getDim(); + nonLinearPeriodicBC* pbc = static_cast<nonLinearPeriodicBC*>(_solver->getMicroBC()); + const std::vector<groupOfElements*>& bgroup = _solver->getMicroBC()->getBoundaryGroupOfElements(); if (dim == 2){ this->pbcFEConstraintElementGroup(l34.begin(),l34.end(),bgroup[0],_cVertices,_v4,_v1); @@ -1548,11 +1697,11 @@ void pbcConstraintElementGroup::createProjectConstraintElementGroup(){ if (_gY) delete _gY; if (_gZ) delete _gZ; _gX = new groupOfElements(); - createLineFromTwoFaces(f1234,f1562,_gX); + intersectionBetweenTwoFaces(f1234,f1562,_gX); _gY = new groupOfElements(); - createLineFromTwoFaces(f1234,f1584,_gY); + intersectionBetweenTwoFaces(f1234,f1584,_gY); _gZ = new groupOfElements(); - createLineFromTwoFaces(f1562,f1584,_gZ); + intersectionBetweenTwoFaces(f1562,f1584,_gZ); this->pbcFEConstraintElementGroup(l34.begin(),l34.end(),_gX,_cVertices,_v4,_v1); this->pbcFEConstraintElementGroup(l78.begin(),l78.end(),_gX,_cVertices,_v8,_v1); @@ -1574,12 +1723,12 @@ void pbcConstraintElementGroup::createProjectConstraintElementGroup(){ }; void pbcConstraintElementGroup::createPeriodicMeshConstraintElementGroup(){ - nonLinearPeriodicBC* pbc = static_cast<nonLinearPeriodicBC*>(_mbc); - int dim = _mbc->getDim(); - const std::vector<groupOfElements*>& bgroup = _mbc->getBoundaryGroupOfElements(); + nonLinearPeriodicBC* pbc = static_cast<nonLinearPeriodicBC*>(_solver->getMicroBC()); + int dim = _solver->getMicroBC()->getDim(); + const std::vector<groupOfElements*>& bgroup = _solver->getMicroBC()->getBoundaryGroupOfElements(); /**fixed node in case of periodic boundary condition and corner nodes does not exist**/ - if ((_cVertices.size() ==0) and (_mbc->getOrder()==1)){ + if ((_cVertices.size() ==0) and (_solver->getMicroBC()->getOrder()==1)){ if (dim==2){ MVertex* v = *(bgroup[0]->vbegin()); _cVertices.insert(v); @@ -1639,9 +1788,9 @@ void pbcConstraintElementGroup::createPeriodicMeshConstraintElementGroup(){ void pbcConstraintElementGroup::createCubicSplineConstraintElementGroup(){ - const std::vector<groupOfElements*>& bgroup = _mbc->getBoundaryGroupOfElements(); - nonLinearPeriodicBC* pbc = static_cast<nonLinearPeriodicBC*>(_mbc); - int dim = _mbc->getDim(); + const std::vector<groupOfElements*>& bgroup = _solver->getMicroBC()->getBoundaryGroupOfElements(); + nonLinearPeriodicBC* pbc = static_cast<nonLinearPeriodicBC*>(_solver->getMicroBC()); + int dim = _solver->getMicroBC()->getDim(); // create basis this->createPolynomialBasePoints(); @@ -1681,17 +1830,75 @@ void pbcConstraintElementGroup::createCubicSplineConstraintElementGroup(){ }; }; +void pbcConstraintElementGroup::createShiftedLagrangeConstraintElementGroup(){ + nonLinearPeriodicBC* pbc = static_cast<nonLinearPeriodicBC*>(_solver->getMicroBC()); + + const SVector3& normal = pbc->getShiftPBCNormal(); + if (normal.norm() < 1e-10){ + printf("no shifted if normal is zero pbcConstraintElementGroup::createShiftedLagrangeConstraintElementGroup \n"); + this->createLagrangeConstraintElementGroup(); + pbc->setShiftedBC(false); + return; + } + + int dim = _solver->getMicroBC()->getDim(); + const std::vector<groupOfElements*>& bgroup = _solver->getMicroBC()->getBoundaryGroupOfElements(); + // create base + this->createPolynomialBasePoints(); + + if (dim ==2){ + this->lagrangeFormCondition(l12.begin(),l12.end(),_xBase); + this->lagrangeFormCondition(l41.begin(),l41.end(),_yBase); + + SPoint3 p1 = _v1->point(); + SPoint3 p2 = _v2->point(); + SPoint3 p3 = _v3->point(); + SPoint3 p4 = _v4->point(); + SVector3 p1p2(p1,p2); + + SPoint3 p = planeDirProject(p3,p1,p2,normal); + SVector3 p1p3(p1,p3); + SVector3 p2p4(p2,p4); + + double phi0 = acos(dot(p1p2,p1p3)/(p1p2.norm()*p1p3.norm())); + double phi1 = acos(dot(p1p2,p2p4)/(p1p2.norm()*p2p4.norm())); + + SVector3 pp3(p,p3); + double phi = acos(dot(pp3,p1p2)/(pp3.norm()*p1p2.norm())); + + printf("phi = %f phi0 = %f phi1 = %f \n",phi*180./3.14159265359, phi0*180/3.14159265359,phi1*180./3.14159265359); + + if ((phi >=phi0) and (phi<=phi1)){ + Msg::Info("shifted l34"); + std::set<MVertex*> others; + this->lagrangePeriodicCondition(l23.begin(),l23.end(),_yBase,others); + others.insert(_v3); // avoid duplicating constraint at v3 + this->shiftedLagrangePeriodicCondition(l34.begin(),l34.end(),_xBase,others,normal); + } + else{ + Msg::Info("shifted l23"); + std::set<MVertex*> others; + this->lagrangePeriodicCondition(l34.begin(),l34.end(),_xBase,others); + others.insert(_v3); // avoid duplicating constraint at v3 + this->shiftedLagrangePeriodicCondition(l23.begin(),l23.end(),_yBase,others,normal); + } + + } + else{ + Msg::Fatal("createShiftedLagrangeConstraintElementGroup has not been implemented for 3D problems"); + } +} + void pbcConstraintElementGroup::createLagrangeConstraintElementGroup(){ - int dim = _mbc->getDim(); - nonLinearPeriodicBC* pbc = static_cast<nonLinearPeriodicBC*>(_mbc); - const std::vector<groupOfElements*>& bgroup = _mbc->getBoundaryGroupOfElements(); + int dim = _solver->getMicroBC()->getDim(); + nonLinearPeriodicBC* pbc = static_cast<nonLinearPeriodicBC*>(_solver->getMicroBC()); + const std::vector<groupOfElements*>& bgroup = _solver->getMicroBC()->getBoundaryGroupOfElements(); // create base this->createPolynomialBasePoints(); if (dim ==2){ this->lagrangeFormCondition(l12.begin(),l12.end(),_xBase,_v1,_v1); - this->lagrangePeriodicCondition(l34.begin(),l34.end(),_xBase,_cVertices,_v4,_v1); - + this->lagrangePeriodicCondition(l34.begin(),l34.end(),_xBase,_cVertices,_v4,_v1); this->lagrangeFormCondition(l41.begin(),l41.end(),_yBase,_v1,_v1); this->lagrangePeriodicCondition(l23.begin(),l23.end(),_yBase,_cVertices,_v2,_v1); } @@ -1724,7 +1931,7 @@ void pbcConstraintElementGroup::createLagrangeConstraintElementGroup(){ }; void pbcConstraintElementGroup::createLinearDisplacementConstraintElementGroup(){ - const std::vector<groupOfElements*>& bgroup = _mbc->getBoundaryGroupOfElements(); + const std::vector<groupOfElements*>& bgroup = _solver->getMicroBC()->getBoundaryGroupOfElements(); std::set<MVertex*> allVertices; for (int i=0; i<bgroup.size(); i++){ groupOfElements* g = bgroup[i]; @@ -1737,24 +1944,24 @@ void pbcConstraintElementGroup::createLinearDisplacementConstraintElementGroup() for (std::set<MVertex*>::iterator it = allVertices.begin(); it!= allVertices.end(); it++){ MVertex* vp = *it; - constraintElement* cel = new periodicMeshConstraint(_mbc,_LagSpace,_MultSpace,-1,vp); + constraintElement* cel = new periodicMeshConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,-1,vp); _allConstraint.insert(cel); }; }; void pbcConstraintElementGroup::createMinimalKinematicConstraintElementGroup(){ - const std::vector<groupOfElements*>& bgroup = _mbc->getBoundaryGroupOfElements(); + const std::vector<groupOfElements*>& bgroup = _solver->getMicroBC()->getBoundaryGroupOfElements(); int size = bgroup.size(); for (int i=0; i<size; i++){ - constraintElement* ppc = new supplementConstraint(_mbc,_LagSpace,_MultSpace,-1,bgroup[i]); + constraintElement* ppc = new supplementConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,-1,bgroup[i]); _allConstraint.insert(ppc); } }; void pbcConstraintElementGroup::createLinearDisplacementConstraintElementGroup_DG(){ if (_boundaryDGMap.size() <=0) Msg::Fatal("_boundaryDGMap has not been initiated"); - int ndofsPerNode = _mbc->getNumberOfConstrainedDofsPerVertex(); - const std::set<int>& constrainedComp = _mbc->getConstrainedComps(); + int ndofsPerNode = _solver->getMicroBC()->getNumberOfConstrainedDofsPerVertex(); + const std::set<int>& constrainedComp = _solver->getMicroBC()->getConstrainedComps(); std::set<Dof> allConstraintDof; for (int i=0; i<_boundaryDGMap.size(); i++){ @@ -1776,7 +1983,7 @@ void pbcConstraintElementGroup::createLinearDisplacementConstraintElementGroup_D if (allConstraintDof.find(key[0])== allConstraintDof.end()){ allConstraintDof.insert(key[0]); // create constraint - constraintElement* cel = new periodicMeshConstraint(_mbc,lagSpace,multspace,*itcomp,v); + constraintElement* cel = new periodicMeshConstraint(_solver->getMicroBC(),lagSpace,multspace,*itcomp,v); _allConstraint.insert(cel); } @@ -1791,19 +1998,19 @@ void pbcConstraintElementGroup::createLinearDisplacementConstraintElementGroup_D void pbcConstraintElementGroup::createMinimalKinematicConstraintElementGroup_DG(){ if (_boundaryDGMap.size() <=0) Msg::Fatal("_boundaryDGMap has not been initiated"); - const std::set<int>& constrainedComp = _mbc->getConstrainedComps(); + const std::set<int>& constrainedComp = _solver->getMicroBC()->getConstrainedComps(); for (int i=0; i<_boundaryDGMap.size(); i++){ for (std::set<int>::const_iterator itcomp = constrainedComp.begin(); itcomp!= constrainedComp.end(); itcomp++){ int comp = *itcomp; - constraintElement* ppc = new supplementConstraintGeneral(_mbc,_MultSpace,comp,_boundaryDGMap[i]); + constraintElement* ppc = new supplementConstraintGeneral(_solver->getMicroBC(),_MultSpace,comp,_boundaryDGMap[i]); _allConstraint.insert(ppc); } } }; void pbcConstraintElementGroup::createMixBCConstraintElementGroup(){ - nonLinearMixedBC* mixBC = dynamic_cast<nonLinearMixedBC*>(_mbc); + nonLinearMixedBC* mixBC = dynamic_cast<nonLinearMixedBC*>(_solver->getMicroBC()); // apply on vertices const std::vector<std::pair<int,int> >& vlist = mixBC->getFixVertices(); for (int i=0; i< vlist.size(); i++){ @@ -1816,27 +2023,27 @@ void pbcConstraintElementGroup::createMixBCConstraintElementGroup(){ else v = *(gv.vbegin()); if (v != NULL){ - constraintElement* cel = new periodicMeshConstraint(_mbc,_LagSpace,_MultSpace,vercomp,v); + constraintElement* cel = new periodicMeshConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,vercomp,v); _allConstraint.insert(cel); } } - const std::vector<groupOfElements*>& bgroup = _mbc->getBoundaryGroupOfElements(); - const std::vector<int>& bphysical = _mbc->getBoundaryPhysicals(); + const std::vector<groupOfElements*>& bgroup = _solver->getMicroBC()->getBoundaryGroupOfElements(); + const std::vector<int>& bphysical = _solver->getMicroBC()->getBoundaryPhysicals(); const std::vector<std::pair<int,int> >& kphysical = mixBC->getKinematicPhysical(); std::map<MVertex*, std::set<int> > mapKinematicConstraints; for (int i=0; i<kphysical.size(); i++){ Msg::Info("k bc = %d comp = %d",kphysical[i].first,kphysical[i].second); - const groupOfElements* gr = _mbc->getBCGroup(kphysical[i].first); + const groupOfElements* gr = _solver->getMicroBC()->getBCGroup(kphysical[i].first); int compK = kphysical[i].second; for (groupOfElements::vertexContainer::iterator it = gr->vbegin(); it!= gr->vend(); it++){ MVertex* vp = *it; std::map<MVertex*, std::set<int> >::iterator itvert=mapKinematicConstraints.find(vp); if(itvert==mapKinematicConstraints.end()) { - constraintElement* cel = new periodicMeshConstraint(_mbc,_LagSpace,_MultSpace,compK,vp); + constraintElement* cel = new periodicMeshConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,compK,vp); _allConstraint.insert(cel); std::set<int> comp; comp.insert(compK); @@ -1846,7 +2053,7 @@ void pbcConstraintElementGroup::createMixBCConstraintElementGroup(){ std::set<int> &comp = itvert->second; if (comp.find(compK)==comp.end()) { - constraintElement* cel = new periodicMeshConstraint(_mbc,_LagSpace,_MultSpace,compK,vp); + constraintElement* cel = new periodicMeshConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,compK,vp); _allConstraint.insert(cel); comp.insert(kphysical[i].second); } @@ -1860,22 +2067,22 @@ void pbcConstraintElementGroup::createMixBCConstraintElementGroup(){ for (int i=0; i<sphysical.size(); i++){ Msg::Info("s bc = %d comp = %d",sphysical[i].first,sphysical[i].second); - groupOfElements* gr = _mbc->getBCGroup(sphysical[i].first); + groupOfElements* gr = _solver->getMicroBC()->getBCGroup(sphysical[i].first); int compS = sphysical[i].second; - constraintElement* ppc= new supplementConstraint(_mbc,_LagSpace,_MultSpace,compS,gr); + constraintElement* ppc= new supplementConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,compS,gr); _allConstraint.insert(ppc); }; - if (_mbc->getOrder() == 2){ + if (_solver->getMicroBC()->getOrder() == 2){ const std::vector<additionalSecondOrderElement>& hoCons = mixBC->getAdditionalSecondOrderStaticPhysical(); for (int i=0; i< hoCons.size(); i++){ const additionalSecondOrderElement& el = hoCons[i]; Msg::Info("ho static bc = %d comp = %d direction = %d",el.physical,el.comp,el.direction); - groupOfElements* gr = _mbc->getBCGroup(el.physical); + groupOfElements* gr = _solver->getMicroBC()->getBCGroup(el.physical); singlePositionScalarWeightFunction fct(el.direction); - constraintElement* ppc = new supplementConstraint(_mbc, _LagSpace,_MultSpace,el.comp,gr, &fct); + constraintElement* ppc = new supplementConstraint(_solver->getMicroBC(), _LagSpace,_MultSpace,el.comp,gr, &fct); _allConstraint.insert(ppc); } @@ -1892,8 +2099,8 @@ void pbcConstraintElementGroup::createMixBCConstraintElementGroup(){ Msg::Info("periodic BC negative = %d positive = %d comp = %d",phyNegative,phyPositive,comp); - groupOfElements* gPositive = _mbc->getBCGroup(phyPositive); - groupOfElements* gNegative = _mbc->getBCGroup(phyNegative); + groupOfElements* gPositive = _solver->getMicroBC()->getBCGroup(phyPositive); + groupOfElements* gNegative = _solver->getMicroBC()->getBCGroup(phyNegative); std::set<MVertex*> nullSet; periodicConditionForPeriodicMesh(comp,negFact,gPositive->vbegin(), gPositive->vend(), @@ -1903,8 +2110,169 @@ void pbcConstraintElementGroup::createMixBCConstraintElementGroup(){ }; +void pbcConstraintElementGroup::createOrthogonalMixBCConstraintElementGroupDirectionFollowing(){ + nonLinearOrthogonalMixedBCDirectionFollowing* mixBC = dynamic_cast<nonLinearOrthogonalMixedBCDirectionFollowing*>(_solver->getMicroBC()); + const std::vector<SVector3>& kubcDir = mixBC->getKUBCDirection(); + const std::vector<SVector3>& subcDir = mixBC->getSUBCDirection(); + + const std::vector<groupOfElements*>& bgroup = _solver->getMicroBC()->getBoundaryGroupOfElements(); + std::set<MVertex*> allVertex; + + for (int i=0; i< bgroup.size(); i++){ + for (groupOfElements::vertexContainer::iterator it = bgroup[i]->vbegin(); it!= bgroup[i]->vend(); it++){ + allVertex.insert(*it); + } + } + + for (int i=0; i< kubcDir.size(); i++){ + const SVector3& dir = kubcDir[i]; + for (std::set<MVertex*>::iterator it = allVertex.begin(); it!= allVertex.end(); it++){ + MVertex* v = *it; + + if (it == allVertex.begin()){ + MVertex* v = *(allVertex.begin()); + constraintElement* ppc = new periodicMeshConstraint(_solver->getMicroBC(), _LagSpace,_LagSpace,_MultSpace,-1,v); + _allConstraint.insert(ppc); + } + else{ + constraintElement* ppc = new directionalPeriodicMeshConstraint(_solver->getMicroBC(), _LagSpace,_LagSpace,_MultSpace,v,NULL,dir); + _allConstraint.insert(ppc); + } + } + } + + int halfOfgsize = bgroup.size()/2; + for (int i=0; i< subcDir.size(); i++){ + const SVector3& dir = subcDir[i]; + for (int j=0; j< halfOfgsize; j++){ + groupOfElements* gPlus = bgroup[j]; + groupOfElements* gMinus = bgroup[j+halfOfgsize]; + constraintElement* ppc = new directionalPBCSupplementConstraint(_solver->getMicroBC(), _LagSpace,_MultSpace,gPlus,gMinus,dir); + _allConstraint.insert(ppc); + }; + } +}; + +void pbcConstraintElementGroup::createMixBCConstraintElementGroupDirectionFollowing(){ + nonLinearMixedBCDirectionFollowing* mixBC = dynamic_cast<nonLinearMixedBCDirectionFollowing*>(_solver->getMicroBC()); + const std::vector<SVector3>& kubcDir = mixBC->getKUBCDirection(); + const std::vector<SVector3>& subcDir = mixBC->getSUBCDirection(); + const std::vector<SVector3>& pbcDir = mixBC->getPBCDirection(); + const std::vector<SVector3>& pbcNormalDir = mixBC->getPBCNormalDirection(); + const std::vector<bool>& pbcFullConstrainedFlag = mixBC->getFullConstrainedFlag(); + + + const std::vector<groupOfElements*>& bgroup = _solver->getMicroBC()->getBoundaryGroupOfElements(); + std::set<MVertex*> allVertex; + + for (int i=0; i< bgroup.size(); i++){ + for (groupOfElements::vertexContainer::iterator it = bgroup[i]->vbegin(); it!= bgroup[i]->vend(); it++){ + allVertex.insert(*it); + } + } + + for (int i=0; i< kubcDir.size(); i++){ + const SVector3& dir = kubcDir[i]; + for (std::set<MVertex*>::iterator it = allVertex.begin(); it!= allVertex.end(); it++){ + MVertex* v = *it; + + if ((pbcNormalDir.size() == 0) and (it == allVertex.begin())){ + MVertex* v = *(allVertex.begin()); + constraintElement* ppc = new periodicMeshConstraint(_solver->getMicroBC(), _LagSpace,_LagSpace,_MultSpace,-1,v); + _allConstraint.insert(ppc); + } + else{ + constraintElement* ppc = new directionalPeriodicMeshConstraint(_solver->getMicroBC(), _LagSpace,_LagSpace,_MultSpace,v,NULL,dir); + _allConstraint.insert(ppc); + } + } + } + if (pbcNormalDir.size() > 0){ + const std::vector<int>& rootPhysical = mixBC->getRootPhysical(); + const std::vector<int>& interpDeg = mixBC->getInterpolationDegree(); + + if (mixBC->getDim() == 2){ + MVertex* v1(NULL), *v2(NULL), *v4(NULL); + for (std::set<MVertex*>::iterator it = allVertex.begin(); it!= allVertex.end(); it++){ + MVertex* v = *it; + if ((v1 == NULL) and (v->getNum() == rootPhysical[0])){ + v1 = v; + } + if ((v2 == NULL) and (v->getNum() == rootPhysical[1])){ + v2 = v; + } + if ((v4 == NULL) and (v->getNum() == rootPhysical[2])){ + v4 = v; + } + if ((v1 != NULL) and (v2!=NULL) and (v4!=NULL)){ + break; + } + }; + if ((v1==NULL) or (v2 == NULL) or (v4 ==NULL)){ + Msg::Fatal("root physical vertces are not correctly defined"); + } + + constraintElement* ppc = new periodicMeshConstraint(_solver->getMicroBC(), _LagSpace,_LagSpace,_MultSpace,-1,v2); + _allConstraint.insert(ppc); + + // create local basis + this->getInterpolatioPointsFromExistingVertices(interpDeg[0],v1,v4,bgroup[0]->vbegin(),bgroup[0]->vend(),_xBase); + this->getInterpolatioPointsFromExistingVertices(interpDeg[1],v1,v2,bgroup[1]->vbegin(),bgroup[1]->vend(),_yBase); + + for (int i=0; i< _xBase.size(); i++){ + Msg::Info("xbase : %d",_xBase[i]->getNum()); + } + + for (int i=0; i< _yBase.size(); i++){ + Msg::Info("ybase : %d",_yBase[i]->getNum()); + } + + std::set<MVertex*> allPositiveVertex; + for (groupOfElements::vertexContainer::iterator it = bgroup[2]->vbegin(); it!= bgroup[2]->vend(); it++){ + allPositiveVertex.insert(*it); + } + for (groupOfElements::vertexContainer::iterator it = bgroup[3]->vbegin(); it!= bgroup[3]->vend(); it++){ + allPositiveVertex.insert(*it); + } + + + for (int i=0; i< pbcNormalDir.size(); i++){ + const SVector3& normalPBC = pbcNormalDir[i]; + const SVector3& dirPBC = pbcDir[i]; + const bool& fullCon = pbcFullConstrainedFlag[i]; + + if (fullCon){ + this->lagrangeFormCondition(bgroup[0]->vbegin(),bgroup[0]->vend(),_xBase); + this->lagrangeFormCondition(bgroup[1]->vbegin(),bgroup[1]->vend(),_yBase); + this->directionalLagrangePeriodicCondition(allPositiveVertex.begin(), allPositiveVertex.end(),_xBase,_yBase,normalPBC,true); + } + else{ + this->directionalLagrangeFormCondition(bgroup[0]->vbegin(),bgroup[0]->vend(),_xBase,dirPBC); + this->directionalLagrangeFormCondition(bgroup[1]->vbegin(),bgroup[1]->vend(),_yBase,dirPBC); + this->directionalLagrangePeriodicCondition(allPositiveVertex.begin(), allPositiveVertex.end(),_xBase,_yBase,normalPBC,false); + } + } + + } + else{ + Msg::Fatal("this bc is not implemented for 3D problems"); + } + } + + int halfOfgsize = bgroup.size()/2; + for (int i=0; i< subcDir.size(); i++){ + const SVector3& dir = subcDir[i]; + for (int j=0; j< halfOfgsize; j++){ + groupOfElements* gPlus = bgroup[j]; + groupOfElements* gMinus = bgroup[j+halfOfgsize]; + constraintElement* ppc = new directionalPBCSupplementConstraint(_solver->getMicroBC(), _LagSpace,_MultSpace,gPlus,gMinus,dir); + _allConstraint.insert(ppc); + }; + } +}; + void pbcConstraintElementGroup::createMixBCConstraintElementGroup_DG(){ - nonLinearMixedBC* mixBC = dynamic_cast<nonLinearMixedBC*>(_mbc); + nonLinearMixedBC* mixBC = dynamic_cast<nonLinearMixedBC*>(_solver->getMicroBC()); const std::vector<std::pair<int,int> >& kphysical = mixBC->getKinematicPhysical(); const std::vector<std::pair<int,int> >& sphysical = mixBC->getStaticPhysical(); @@ -1912,7 +2280,7 @@ void pbcConstraintElementGroup::createMixBCConstraintElementGroup_DG(){ std::set<Dof> allConstraintDof; for (int i=0; i<kphysical.size(); i++){ Msg::Info("k bc = %d comp = %d",kphysical[i].first,kphysical[i].second); - const groupOfElements* grPhy = _mbc->getBCGroup(kphysical[i].first); + const groupOfElements* grPhy = _solver->getMicroBC()->getBCGroup(kphysical[i].first); groupOfElementsDomainDecomposition* gPartGroup = NULL; for (int ig=0; ig< _boundaryDGMap.size(); ig++){ if (_boundaryDGMap[ig]->physical == kphysical[i].first){ @@ -1940,7 +2308,7 @@ void pbcConstraintElementGroup::createMixBCConstraintElementGroup_DG(){ if (allConstraintDof.find(key[0])== allConstraintDof.end()){ allConstraintDof.insert(key[0]); // create constraint - constraintElement* cel = new periodicMeshConstraint(_mbc,lagSpace,multspace,compK,v); + constraintElement* cel = new periodicMeshConstraint(_solver->getMicroBC(),lagSpace,multspace,compK,v); _allConstraint.insert(cel); } @@ -1950,7 +2318,7 @@ void pbcConstraintElementGroup::createMixBCConstraintElementGroup_DG(){ for (int i=0; i<sphysical.size(); i++){ Msg::Info("s bc = %d comp = %d",sphysical[i].first,sphysical[i].second); - groupOfElements* grPhy = _mbc->getBCGroup(sphysical[i].first); + groupOfElements* grPhy = _solver->getMicroBC()->getBCGroup(sphysical[i].first); groupOfElementsDomainDecomposition* gPartGroup = NULL; for (int ig=0; ig< _boundaryDGMap.size(); ig++){ if (_boundaryDGMap[ig]->physical == sphysical[i].first){ @@ -1963,16 +2331,16 @@ void pbcConstraintElementGroup::createMixBCConstraintElementGroup_DG(){ } int compS = sphysical[i].second; - constraintElement* ppc= new supplementConstraintGeneral(_mbc,_MultSpace,compS,gPartGroup); + constraintElement* ppc= new supplementConstraintGeneral(_solver->getMicroBC(),_MultSpace,compS,gPartGroup); _allConstraint.insert(ppc); }; - if (_mbc->getOrder() == 2){ + if (_solver->getMicroBC()->getOrder() == 2){ const std::vector<additionalSecondOrderElement>& hoCons = mixBC->getAdditionalSecondOrderStaticPhysical(); for (int i=0; i< hoCons.size(); i++){ const additionalSecondOrderElement& el = hoCons[i]; Msg::Info("ho static bc = %d comp = %d direction = %d",el.physical,el.comp,el.direction); - groupOfElements* grPhy = _mbc->getBCGroup(el.physical); + groupOfElements* grPhy = _solver->getMicroBC()->getBCGroup(el.physical); groupOfElementsDomainDecomposition* gPartGroup = NULL; for (int ig=0; ig< _boundaryDGMap.size(); ig++){ if (_boundaryDGMap[ig]->physical == el.physical){ @@ -1985,7 +2353,7 @@ void pbcConstraintElementGroup::createMixBCConstraintElementGroup_DG(){ } singlePositionScalarWeightFunction fct(el.direction); - constraintElement* ppc = new supplementConstraintGeneral(_mbc,_MultSpace,el.comp,gPartGroup,&fct); + constraintElement* ppc = new supplementConstraintGeneral(_solver->getMicroBC(),_MultSpace,el.comp,gPartGroup,&fct); _allConstraint.insert(ppc); } @@ -1996,30 +2364,41 @@ void pbcConstraintElementGroup::createMixBCConstraintElementGroup_DG(){ } }; +void pbcConstraintElementGroup::createCornerConstraintElementGroupShiftedBPC(){ + if (_solver->getMicroBC()->getOrder() == 2){ + Msg::Fatal("shifted BC is implemented for first order BC only"); + } + + if (_cVertices.size() > 0){ + constraintElement* cel = new periodicMeshConstraint(_solver->getMicroBC() ,_LagSpace,_MultSpace,-1,_v1); + _allConstraint.insert(cel); + } +} + void pbcConstraintElementGroup::createCornerConstraintElementGroup(){ - int ndofsPerNode = _mbc->getNumberOfConstrainedDofsPerVertex(); + int ndofsPerNode = _solver->getMicroBC()->getNumberOfConstrainedDofsPerVertex(); - std::vector<int> mechanics(_mbc->getMechanicsConstrainedComps().begin(), _mbc->getMechanicsConstrainedComps().end()); // mechanic Dof only - std::vector<int> compConstitutive(_mbc->getConstitutiveExtraConstrainedComps().begin(), _mbc->getConstitutiveExtraConstrainedComps().end()); // constitutuive extraDofs - std::vector<int> compNotConstitutive(_mbc->getNonConstitutiveExtraConstrainedComps().begin(), _mbc->getNonConstitutiveExtraConstrainedComps().end()); // non-constitutive extraDofs + std::vector<int> mechanics(_solver->getMicroBC()->getMechanicsConstrainedComps().begin(), _solver->getMicroBC()->getMechanicsConstrainedComps().end()); // mechanic Dof only + std::vector<int> compConstitutive(_solver->getMicroBC()->getConstitutiveExtraConstrainedComps().begin(), _solver->getMicroBC()->getConstitutiveExtraConstrainedComps().end()); // constitutuive extraDofs + std::vector<int> compNotConstitutive(_solver->getMicroBC()->getNonConstitutiveExtraConstrainedComps().begin(), _solver->getMicroBC()->getNonConstitutiveExtraConstrainedComps().end()); // non-constitutive extraDofs - if (_mbc->getType() == nonLinearMicroBC::PBC){ - nonLinearPeriodicBC* pbc = static_cast<nonLinearPeriodicBC*>(_mbc); - const std::vector<groupOfElements*>& bgroup = _mbc->getBoundaryGroupOfElements(); + if (_solver->getMicroBC()->getType() == nonLinearMicroBC::PBC){ + nonLinearPeriodicBC* pbc = static_cast<nonLinearPeriodicBC*>(_solver->getMicroBC()); + const std::vector<groupOfElements*>& bgroup = _solver->getMicroBC()->getBoundaryGroupOfElements(); if (bgroup.size()>0){ if (pbc->getPBCMethod() == nonLinearPeriodicBC::CEM or pbc->getPBCMethod() == nonLinearPeriodicBC::PROJECT){ // for mechanical Dofs - if (_mbc->getOrder() == 1){ + if (_solver->getMicroBC()->getOrder() == 1){ // fix all corners mechanical Dofs for (std::set<MVertex*>::iterator it = _cVertices.begin(); it!= _cVertices.end(); it++){ MVertex* vp1 = *it; for (int i=0; i< mechanics.size(); i++){ - constraintElement* cel = new periodicMeshConstraint(_mbc ,_LagSpace,_MultSpace,mechanics[i],vp1); + constraintElement* cel = new periodicMeshConstraint(_solver->getMicroBC() ,_LagSpace,_MultSpace,mechanics[i],vp1); _allConstraint.insert(cel); } } } - else if (_mbc->getOrder() == 2){ + else if (_solver->getMicroBC()->getOrder() == 2){ // periodic between if (_cVertices.size() >0){ MVertex* vn = *(_cVertices.begin()); @@ -2028,7 +2407,7 @@ void pbcConstraintElementGroup::createCornerConstraintElementGroup(){ { MVertex* vp1 = *it; for (int i=0; i< mechanics.size(); i++){ - constraintElement* cel = new periodicMeshConstraint(_mbc,_LagSpace,_MultSpace,mechanics[i], vp1,vn); + constraintElement* cel = new periodicMeshConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,mechanics[i], vp1,vn); _allConstraint.insert(cel); } } @@ -2038,7 +2417,7 @@ void pbcConstraintElementGroup::createCornerConstraintElementGroup(){ for (int i=0; i<bgroup.size()/2; i++){ groupOfElements* g = bgroup[i]; for (int k=0; k< mechanics.size(); k++){ - constraintElement* ppc = new supplementConstraint(_mbc,_LagSpace,_MultSpace,mechanics[k],g); + constraintElement* ppc = new supplementConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,mechanics[k],g); _allConstraint.insert(ppc); } } @@ -2051,14 +2430,14 @@ void pbcConstraintElementGroup::createCornerConstraintElementGroup(){ MVertex* vp1 = *it; if (vp1 != oneV){ for (int i=0; i< compConstitutive.size(); i++){ - constraintElement* cel = new periodicMeshConstraint(_mbc,_LagSpace,_MultSpace,compConstitutive[i],vp1,oneV); + constraintElement* cel = new periodicMeshConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,compConstitutive[i],vp1,oneV); _allConstraint.insert(cel); } } } } for (int i=0; i< compConstitutive.size(); i++){ - constraintElement* celExtra = new supplementConstraintAverageExtraDofValue(_mbc ,_MultSpace,compConstitutive[i],&_allDomain); + constraintElement* celExtra = new supplementConstraintAverageExtraDofValue(_solver->getMicroBC() ,_MultSpace,compConstitutive[i],_solver->getDomainVector()); _allConstraint.insert(celExtra); } @@ -2066,48 +2445,48 @@ void pbcConstraintElementGroup::createCornerConstraintElementGroup(){ for (std::set<MVertex*>::iterator it = _cVertices.begin(); it!= _cVertices.end(); it++){ MVertex* vp1 = *it; for (int i=0; i< compNotConstitutive.size(); i++){ - constraintElement* cel = new periodicMeshConstraint(_mbc ,_LagSpace,_MultSpace,compNotConstitutive[i],vp1); + constraintElement* cel = new periodicMeshConstraint(_solver->getMicroBC() ,_LagSpace,_MultSpace,compNotConstitutive[i],vp1); _allConstraint.insert(cel); } } } else if (pbc->getPBCMethod() == nonLinearPeriodicBC::CSIM){ // for mechanics - if (_mbc->getOrder() == 1){ + if (_solver->getMicroBC()->getOrder() == 1){ for (std::set<MVertex*>::iterator it = _cVertices.begin(); it!= _cVertices.end(); it++){ MVertex* vp1 = *it; for (int i=0; i< mechanics.size(); i++){ - constraintElement* cel = new periodicMeshConstraint(_mbc ,_LagSpace,_MultSpace,mechanics[i],vp1); + constraintElement* cel = new periodicMeshConstraint(_solver->getMicroBC() ,_LagSpace,_MultSpace,mechanics[i],vp1); _allConstraint.insert(cel); } } } - else if (_mbc->getOrder() == 2){ + else if (_solver->getMicroBC()->getOrder() == 2){ for(std::set<MVertex*>::iterator it = _cVertices.begin(); it!= _cVertices.end(); it++){ MVertex* v = *it; if ( v != _v1){ for (int i=0; i< mechanics.size(); i++){ - constraintElement* cel = new periodicMeshConstraint(_mbc ,_LagSpace,_MultSpace,mechanics[i],v,_v1); + constraintElement* cel = new periodicMeshConstraint(_solver->getMicroBC() ,_LagSpace,_MultSpace,mechanics[i],v,_v1); _allConstraint.insert(cel); } } } - if (_mbc->getDim() ==2){ + if (_solver->getMicroBC()->getDim() ==2){ for (int i=0; i< mechanics.size(); i++){ - constraintElement* ppc = new cubicSplineSupplementConstraint(_mbc,_LagSpace,_MultSpace,mechanics[i],_xBase,0); + constraintElement* ppc = new cubicSplineSupplementConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,mechanics[i],_xBase,0); _allConstraint.insert(ppc); - ppc = new cubicSplineSupplementConstraint(_mbc,_LagSpace,_MultSpace,mechanics[i],_yBase,1); + ppc = new cubicSplineSupplementConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,mechanics[i],_yBase,1); _allConstraint.insert(ppc); } } - else if (_mbc->getDim() == 3){ + else if (_solver->getMicroBC()->getDim() == 3){ for (int i=0; i<bgroup.size()/2; i++){ groupOfElements* g = bgroup[i]; for (int k=0; k< mechanics.size(); k++){ - constraintElement* ppc = new supplementConstraint(_mbc,_LagSpace,_MultSpace,mechanics[k],g); + constraintElement* ppc = new supplementConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,mechanics[k],g); _allConstraint.insert(ppc); } } @@ -2120,14 +2499,14 @@ void pbcConstraintElementGroup::createCornerConstraintElementGroup(){ MVertex* vp1 = *it; if (vp1 != _v1){ for (int i=0; i< compConstitutive.size(); i++){ - constraintElement* cel = new periodicMeshConstraint(_mbc,_LagSpace,_MultSpace,compConstitutive[i],vp1,_v1); + constraintElement* cel = new periodicMeshConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,compConstitutive[i],vp1,_v1); _allConstraint.insert(cel); } } } for (int i=0; i< compConstitutive.size(); i++){ - constraintElement* celExtra = new supplementConstraintAverageExtraDofValue(_mbc ,_MultSpace, - compConstitutive[i], &_allDomain); + constraintElement* celExtra = new supplementConstraintAverageExtraDofValue(_solver->getMicroBC() ,_MultSpace, + compConstitutive[i], _solver->getDomainVector()); _allConstraint.insert(celExtra); } @@ -2135,7 +2514,7 @@ void pbcConstraintElementGroup::createCornerConstraintElementGroup(){ for (std::set<MVertex*>::iterator it = _cVertices.begin(); it!= _cVertices.end(); it++){ MVertex* vp1 = *it; for (int i=0; i< compNotConstitutive.size(); i++){ - constraintElement* cel = new periodicMeshConstraint(_mbc ,_LagSpace,_MultSpace,compNotConstitutive[i],vp1); + constraintElement* cel = new periodicMeshConstraint(_solver->getMicroBC() ,_LagSpace,_MultSpace,compNotConstitutive[i],vp1); _allConstraint.insert(cel); } @@ -2143,22 +2522,22 @@ void pbcConstraintElementGroup::createCornerConstraintElementGroup(){ } else if (pbc->getPBCMethod() == nonLinearPeriodicBC::LIM){ // for mechanics - if (_mbc->getOrder() == 1){ + if (_solver->getMicroBC()->getOrder() == 1){ for (std::set<MVertex*>::iterator it = _cVertices.begin(); it!= _cVertices.end(); it++){ MVertex* vp1 = *it; for (int i=0; i< mechanics.size(); i++){ - constraintElement* cel = new periodicMeshConstraint(_mbc ,_LagSpace,_MultSpace,mechanics[i],vp1); + constraintElement* cel = new periodicMeshConstraint(_solver->getMicroBC() ,_LagSpace,_MultSpace,mechanics[i],vp1); _allConstraint.insert(cel); } } } - else if (_mbc->getOrder() == 2){ + else if (_solver->getMicroBC()->getOrder() == 2){ if (pbc->getMaxDegree()>1){ for(std::set<MVertex*>::iterator it = _cVertices.begin(); it!= _cVertices.end(); it++){ MVertex* v = *it; if ( v != _v1){ for (int i=0; i< mechanics.size(); i++){ - constraintElement* cel = new periodicMeshConstraint(_mbc ,_LagSpace,_MultSpace,mechanics[i],v,_v1); + constraintElement* cel = new periodicMeshConstraint(_solver->getMicroBC() ,_LagSpace,_MultSpace,mechanics[i],v,_v1); _allConstraint.insert(cel); } } @@ -2166,26 +2545,26 @@ void pbcConstraintElementGroup::createCornerConstraintElementGroup(){ // for (int k=0; k< mechanics.size(); k++){ - if (_mbc->getDim() ==2){ - constraintElement* ppc = new lagrangeSupplementConstraint(_mbc, _LagSpace,_MultSpace,mechanics[k],_xBase); + if (_solver->getMicroBC()->getDim() ==2){ + constraintElement* ppc = new lagrangeSupplementConstraint(_solver->getMicroBC(), _LagSpace,_MultSpace,mechanics[k],_xBase); _allConstraint.insert(ppc); - ppc = new lagrangeSupplementConstraint(_mbc, _LagSpace,_MultSpace,mechanics[k],_yBase); + ppc = new lagrangeSupplementConstraint(_solver->getMicroBC(), _LagSpace,_MultSpace,mechanics[k],_yBase); _allConstraint.insert(ppc); } - else if (_mbc->getDim() ==3){ + else if (_solver->getMicroBC()->getDim() ==3){ std::vector<lagrangeSupplementConstraint*> lconstraint; - lagrangeSupplementConstraint* con = new lagrangeSupplementConstraint(_mbc, _LagSpace,_MultSpace,mechanics[k],_xBase); + lagrangeSupplementConstraint* con = new lagrangeSupplementConstraint(_solver->getMicroBC(), _LagSpace,_MultSpace,mechanics[k],_xBase); lconstraint.push_back(con); - con = new lagrangeSupplementConstraint(_mbc,_LagSpace,_MultSpace,mechanics[k],_yBase); + con = new lagrangeSupplementConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,mechanics[k],_yBase); lconstraint.push_back(con); - con = new lagrangeSupplementConstraint(_mbc,_LagSpace,_MultSpace,mechanics[k],_zBase); + con = new lagrangeSupplementConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,mechanics[k],_zBase); lconstraint.push_back(con); // - constraintElement* ppc = new CoonsPatchLagrangeSupplementConstraint(_mbc,_LagSpace,_MultSpace,mechanics[k],lconstraint[0],lconstraint[1]); + constraintElement* ppc = new CoonsPatchLagrangeSupplementConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,mechanics[k],lconstraint[0],lconstraint[1]); _allConstraint.insert(ppc); - ppc = new CoonsPatchLagrangeSupplementConstraint(_mbc, _LagSpace,_MultSpace,mechanics[k],lconstraint[1],lconstraint[2]); + ppc = new CoonsPatchLagrangeSupplementConstraint(_solver->getMicroBC(), _LagSpace,_MultSpace,mechanics[k],lconstraint[1],lconstraint[2]); _allConstraint.insert(ppc); - ppc = new CoonsPatchLagrangeSupplementConstraint(_mbc, _LagSpace,_MultSpace,mechanics[k],lconstraint[0],lconstraint[2]); + ppc = new CoonsPatchLagrangeSupplementConstraint(_solver->getMicroBC(), _LagSpace,_MultSpace,mechanics[k],lconstraint[0],lconstraint[2]); _allConstraint.insert(ppc); } @@ -2195,7 +2574,7 @@ void pbcConstraintElementGroup::createCornerConstraintElementGroup(){ for (std::set<MVertex*>::iterator it = _cVertices.begin(); it!= _cVertices.end(); it++){ MVertex* vp1 = *it; for (int i=0; i< mechanics.size(); i++){ - constraintElement* cel = new periodicMeshConstraint(_mbc,_LagSpace,_MultSpace,mechanics[i],vp1); + constraintElement* cel = new periodicMeshConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,mechanics[i],vp1); _allConstraint.insert(cel); } } @@ -2208,14 +2587,14 @@ void pbcConstraintElementGroup::createCornerConstraintElementGroup(){ MVertex* vp1 = *it; if (vp1 != _v1){ for (int i=0; i< compConstitutive.size(); i++){ - constraintElement* cel = new periodicMeshConstraint(_mbc,_LagSpace,_MultSpace,compConstitutive[i],vp1,_v1); + constraintElement* cel = new periodicMeshConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,compConstitutive[i],vp1,_v1); _allConstraint.insert(cel); } } } for (int i=0; i< compConstitutive.size(); i++){ - constraintElement* celExtra = new supplementConstraintAverageExtraDofValue(_mbc ,_MultSpace, - compConstitutive[i], &_allDomain); + constraintElement* celExtra = new supplementConstraintAverageExtraDofValue(_solver->getMicroBC() ,_MultSpace, + compConstitutive[i], _solver->getDomainVector()); _allConstraint.insert(celExtra); } @@ -2223,7 +2602,7 @@ void pbcConstraintElementGroup::createCornerConstraintElementGroup(){ for (std::set<MVertex*>::iterator it = _cVertices.begin(); it!= _cVertices.end(); it++){ MVertex* vp1 = *it; for (int i=0; i< compNotConstitutive.size(); i++){ - constraintElement* cel = new periodicMeshConstraint(_mbc ,_LagSpace,_MultSpace,compNotConstitutive[i],vp1); + constraintElement* cel = new periodicMeshConstraint(_solver->getMicroBC() ,_LagSpace,_MultSpace,compNotConstitutive[i],vp1); _allConstraint.insert(cel); } } @@ -2253,17 +2632,17 @@ void pbcConstraintElementGroup::createCornerConstraintElementGroup(){ } // for mechanics - if (_mbc->getOrder() == 1){ + if (_solver->getMicroBC()->getOrder() == 1){ for (std::set<MVertex*>::iterator it = activeCornerVertices.begin(); it!= activeCornerVertices.end(); it++){ MVertex* vp1 = *it; for (int i=0; i< mechanics.size(); i++){ - constraintElement* cel = new periodicMeshConstraint(_mbc ,_LagSpace,_MultSpace,mechanics[i],vp1); + constraintElement* cel = new periodicMeshConstraint(_solver->getMicroBC() ,_LagSpace,_MultSpace,mechanics[i],vp1); _allConstraint.insert(cel); } } } - else if (_mbc->getOrder() == 2){ + else if (_solver->getMicroBC()->getOrder() == 2){ if (_cVertices.size() >0){ MVertex* vn = *(_cVertices.begin()); for(std::set<MVertex*>::iterator it = _cVertices.begin(); it!= _cVertices.end(); it++){ @@ -2271,7 +2650,7 @@ void pbcConstraintElementGroup::createCornerConstraintElementGroup(){ { MVertex* vp1 = *it; for (int i=0; i< mechanics.size(); i++){ - constraintElement* cel = new periodicMeshConstraint(_mbc,_LagSpace,_MultSpace,mechanics[i],vp1,vn); + constraintElement* cel = new periodicMeshConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,mechanics[i],vp1,vn); _allConstraint.insert(cel); } @@ -2280,18 +2659,18 @@ void pbcConstraintElementGroup::createCornerConstraintElementGroup(){ } for (int i=0; i< mechanics.size(); i++){ - if (_mbc->getDim()== 2){ - constraintElement* ppc = new supplementConstraint(_mbc,_LagSpace,_MultSpace,mechanics[i],_gX); + if (_solver->getMicroBC()->getDim()== 2){ + constraintElement* ppc = new supplementConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,mechanics[i],_gX); _allConstraint.insert(ppc); - ppc = new supplementConstraint(_mbc,_LagSpace,_MultSpace,mechanics[i],_gY); + ppc = new supplementConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,mechanics[i],_gY); _allConstraint.insert(ppc); } - else if (_mbc->getDim() == 3){ - constraintElement* ppc = new supplementConstraint(_mbc,_LagSpace,_MultSpace,mechanics[i],_gXY); + else if (_solver->getMicroBC()->getDim() == 3){ + constraintElement* ppc = new supplementConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,mechanics[i],_gXY); _allConstraint.insert(ppc); - ppc = new supplementConstraint(_mbc,_LagSpace,_MultSpace,mechanics[i],_gYZ); + ppc = new supplementConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,mechanics[i],_gYZ); _allConstraint.insert(ppc); - ppc = new supplementConstraint(_mbc,_LagSpace,_MultSpace,mechanics[i],_gZX); + ppc = new supplementConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,mechanics[i],_gZX); _allConstraint.insert(ppc); } } @@ -2304,15 +2683,15 @@ void pbcConstraintElementGroup::createCornerConstraintElementGroup(){ MVertex* vp1 = *it; if (vp1 != vn1){ for (int i=0; i< compConstitutive.size(); i++){ - constraintElement* cel = new periodicMeshConstraint(_mbc,_LagSpace,_MultSpace,compConstitutive[i],vp1,vn1); + constraintElement* cel = new periodicMeshConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,compConstitutive[i],vp1,vn1); _allConstraint.insert(cel); } } } } for (int i=0; i< compConstitutive.size(); i++){ - constraintElement* celExtra = new supplementConstraintAverageExtraDofValue(_mbc ,_MultSpace, - compConstitutive[i], &_allDomain); + constraintElement* celExtra = new supplementConstraintAverageExtraDofValue(_solver->getMicroBC() ,_MultSpace, + compConstitutive[i], _solver->getDomainVector()); _allConstraint.insert(celExtra); } @@ -2320,7 +2699,7 @@ void pbcConstraintElementGroup::createCornerConstraintElementGroup(){ for (int i=0; i< compNotConstitutive.size(); i++){ for (std::set<MVertex*>::iterator it = activeCornerVertices.begin(); it!= activeCornerVertices.end(); it++){ MVertex* vp1 = *it; - constraintElement* cel = new periodicMeshConstraint(_mbc ,_LagSpace,_MultSpace,compNotConstitutive[i],vp1); + constraintElement* cel = new periodicMeshConstraint(_solver->getMicroBC() ,_LagSpace,_MultSpace,compNotConstitutive[i],vp1); _allConstraint.insert(cel); } @@ -2339,15 +2718,15 @@ void pbcConstraintElementGroup::createCornerConstraintElementGroup(){ void pbcConstraintElementGroup::createConstraintGroup(){ constraintElement::allPositiveDof.clear(); if (_fullDG){ - if (_mbc->getType()==nonLinearMicroBC::LDBC){ + if (_solver->getMicroBC()->getType()==nonLinearMicroBC::LDBC){ Msg::Info("Imposing linear displacement BC"); this->createLinearDisplacementConstraintElementGroup_DG(); } - else if (_mbc->getType()==nonLinearMicroBC::MKBC){ + else if (_solver->getMicroBC()->getType()==nonLinearMicroBC::MKBC){ Msg::Info("Imposing minimal kinematical BC"); this->createMinimalKinematicConstraintElementGroup_DG(); } - else if (_mbc->getType() == nonLinearMicroBC::MIXBC){ + else if (_solver->getMicroBC()->getType() == nonLinearMicroBC::MIXBC){ Msg::Info("imposing mixed BC"); this->createMixBCConstraintElementGroup_DG(); } @@ -2356,9 +2735,12 @@ void pbcConstraintElementGroup::createConstraintGroup(){ }; } else{ - if (_mbc->getType() == nonLinearMicroBC::PBC){ - nonLinearPeriodicBC* pbc = static_cast<nonLinearPeriodicBC*>(_mbc); - const std::vector<groupOfElements*>& bgroup = _mbc->getBoundaryGroupOfElements(); + if (_solver->getMicroBC()->getType() == nonLinearMicroBC::PBC){ + nonLinearPeriodicBC* pbc = static_cast<nonLinearPeriodicBC*>(_solver->getMicroBC()); + if (pbc->isShifted() and pbc->getPBCMethod() != nonLinearPeriodicBC::LIM){ + Msg::Warning("shifted has not implemented for this option"); + } + const std::vector<groupOfElements*>& bgroup = _solver->getMicroBC()->getBoundaryGroupOfElements(); if (bgroup.size()>0){ if (pbc->getPBCMethod() == nonLinearPeriodicBC::CEM){ Msg::Info("Imposing PBC by periodic mesh formulation"); @@ -2370,10 +2752,17 @@ void pbcConstraintElementGroup::createConstraintGroup(){ } else if (pbc->getPBCMethod() == nonLinearPeriodicBC::LIM){ Msg::Info("Imposing PBC by lagrange formulation"); - if (pbc->getMaxDegree() >1) - this->createLagrangeConstraintElementGroup(); - else + if (pbc->getMaxDegree() >1){ + if (pbc->isShifted()){ + this->createShiftedLagrangeConstraintElementGroup(); + } + else{ + this->createLagrangeConstraintElementGroup(); + } + } + else{ createLinearDisplacementConstraintElementGroup(); + } } else if (pbc->getPBCMethod() == nonLinearPeriodicBC::FE_LIN or pbc->getPBCMethod() == nonLinearPeriodicBC::FE_QUA){ Msg::Info("Imposing PBC by lagrange C0"); @@ -2386,22 +2775,32 @@ void pbcConstraintElementGroup::createConstraintGroup(){ else{ Msg::Fatal("this method is not implemented to impose PBC"); } - - this->createCornerConstraintElementGroup(); + + if (pbc->isShifted()){ + this->createCornerConstraintElementGroupShiftedBPC(); + } + else + this->createCornerConstraintElementGroup(); } } - else if (_mbc->getType()==nonLinearMicroBC::LDBC){ + else if (_solver->getMicroBC()->getType()==nonLinearMicroBC::LDBC){ Msg::Info("Imposing linear displacement BC"); this->createLinearDisplacementConstraintElementGroup(); } - else if (_mbc->getType()==nonLinearMicroBC::MKBC){ + else if (_solver->getMicroBC()->getType()==nonLinearMicroBC::MKBC){ Msg::Info("Imposing minimal kinematical BC"); this->createMinimalKinematicConstraintElementGroup(); } - else if (_mbc->getType() == nonLinearMicroBC::MIXBC){ + else if (_solver->getMicroBC()->getType() == nonLinearMicroBC::MIXBC){ Msg::Info("imposing mixed BC"); this->createMixBCConstraintElementGroup(); } + else if (_solver->getMicroBC()->getType() == nonLinearMicroBC::DirectionalMIXBC){ + this->createMixBCConstraintElementGroupDirectionFollowing(); + } + else if (_solver->getMicroBC()->getType() == nonLinearMicroBC::OrthogonalDirectionalMixedBC){ + this->createOrthogonalMixBCConstraintElementGroupDirectionFollowing(); + } else{ Msg::Error("this boundary condition type is not implemented"); }; @@ -2409,6 +2808,17 @@ void pbcConstraintElementGroup::createConstraintGroup(){ constraintElement::allPositiveDof.clear(); }; +void pbcConstraintElementGroup::clearAllConstraints(){ + _allConstraint.clear(); + _virtualVertices.clear(); + _pbcNodes.clear(); +}; + +void pbcConstraintElementGroup::switchMicroBC(){ + this->clearAllConstraints(); // clear all existing constraint elements + this->createConstraintGroup(); // create new groups +}; + void pbcConstraintElementGroup::createPBCFromFile(FILE* fp, GModel* pModel){ if (fp == NULL) return; while (1){ @@ -2424,7 +2834,7 @@ void pbcConstraintElementGroup::createPBCFromFile(FILE* fp, GModel* pModel){ if (fscanf(fp, "%d", &num)){ MVertex* v = pModel->getMeshVertexByTag(num); Msg::Error("periodic node: %d",v->getNum()); - constraintElement* cel = new periodicMeshConstraint(_mbc,_LagSpace,_MultSpace,-1,v); + constraintElement* cel = new periodicMeshConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,-1,v); _allConstraint.insert(cel); } } @@ -2439,7 +2849,7 @@ void pbcConstraintElementGroup::createPBCFromFile(FILE* fp, GModel* pModel){ MVertex* vn = pModel->getMeshVertexByTag(n); Msg::Error("matching node: %d %d", vp->getNum(),vn->getNum()); - constraintElement* cel = new periodicMeshConstraint(_mbc,_LagSpace,_MultSpace,-1,vp,vn); + constraintElement* cel = new periodicMeshConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,-1,vp,vn); _allConstraint.insert(cel); } @@ -2449,14 +2859,14 @@ void pbcConstraintElementGroup::createPBCFromFile(FILE* fp, GModel* pModel){ }; SVector3 pbcConstraintElementGroup::getUniformDisp(MVertex* v){ - const STensor3& FI = _mbc->getFirstOrderKinematicalVariable(); - const STensor33& G = _mbc->getSecondOrderKinematicalVariable(); + const STensor3& FI = _solver->getMicroBC()->getFirstOrderKinematicalVariable(); + const STensor33& G = _solver->getMicroBC()->getSecondOrderKinematicalVariable(); SVector3 u(0.,0.,0.); SPoint3 p = v->point(); for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ u[i]+= FI(i,j)*p[j]; - if (_mbc->getOrder() == 2){ + if (_solver->getMicroBC()->getOrder() == 2){ for (int k=0; k<3; k++){ u[i] += 0.5*G(i,j,k)*p[j]*p[k]; } @@ -2470,7 +2880,7 @@ SVector3 pbcConstraintElementGroup::getPerturbation(dofManager<double>* pmanager SVector3 ubar = this->getUniformDisp(v); std::vector<Dof> keys; std::vector<double> val; - std::vector<int> constrainedComp(_mbc->getConstrainedComps().begin(), _mbc->getConstrainedComps().end()); + std::vector<int> constrainedComp(_solver->getMicroBC()->getConstrainedComps().begin(), _solver->getMicroBC()->getConstrainedComps().end()); getKeysFromVertex(_LagSpace,v,constrainedComp,keys); pmanager->getDofValue(keys,val); ubar *= -1.; @@ -2482,12 +2892,12 @@ SVector3 pbcConstraintElementGroup::getPerturbation(dofManager<double>* pmanager SVector3 pbcConstraintElementGroup::getTangentCubicSpline(dofManager<double>* pmanager, MVertex* v, const int dir){ SVector3 vec(0.,0.,0.); - std::vector<int> constrainedComp(_mbc->getConstrainedComps().begin(), _mbc->getConstrainedComps().end()); - if (_mbc->getType() != nonLinearMicroBC::PBC) { + std::vector<int> constrainedComp(_solver->getMicroBC()->getConstrainedComps().begin(), _solver->getMicroBC()->getConstrainedComps().end()); + if (_solver->getMicroBC()->getType() != nonLinearMicroBC::PBC) { Msg::Warning("this used for periodic BC and cubic spline method"); } else { - nonLinearPeriodicBC* pbc = dynamic_cast<nonLinearPeriodicBC*>(_mbc); + nonLinearPeriodicBC* pbc = dynamic_cast<nonLinearPeriodicBC*>(_solver->getMicroBC()); if (pbc->getPBCMethod() == nonLinearPeriodicBC::CSIM){ std::vector<Dof> dofs; std::vector<double> vals; @@ -2575,8 +2985,8 @@ void pbcConstraintElementGroup::lagrangeToFile(std::vector<MVertex*>& vlist, dof }; void pbcConstraintElementGroup::writePertBoundaryToFile(dofManager<double>* pmanager, const int e, const int g, const int iter ){ - if (_mbc->getType() == nonLinearMicroBC::PBC){ - nonLinearPeriodicBC* pbc = dynamic_cast<nonLinearPeriodicBC*>(_mbc); + if (_solver->getMicroBC()->getType() == nonLinearMicroBC::PBC){ + nonLinearPeriodicBC* pbc = dynamic_cast<nonLinearPeriodicBC*>(_solver->getMicroBC()); std::string filename = "E_"+int2str(e)+"_GP_"+int2str(g)+"_xInterpolation_iter_"+int2str(iter)+ ".csv"; FILE* file = fopen(filename.c_str(),"w"); if (pbc->getPBCMethod() == nonLinearPeriodicBC::CSIM) @@ -2602,7 +3012,7 @@ void pbcConstraintElementGroup::writePertBoundaryToFile(dofManager<double>* pman fclose(file); } - const std::vector<groupOfElements*>& bgr = _mbc->getBoundaryGroupOfElements(); + const std::vector<groupOfElements*>& bgr = _solver->getMicroBC()->getBoundaryGroupOfElements(); for (int i =0; i< bgr.size(); i++){ std::string filename ="E_"+int2str(e)+"_GP_"+int2str(g)+"_pert_" + int2str(i)+ "_iter_"+int2str(iter)+ ".csv"; FILE* file = fopen(filename.c_str(),"w"); @@ -2621,7 +3031,7 @@ int pbcConstraintElementGroup::sizeOfDirectConstraints() const{ for (std::set<constraintElement*>::const_iterator it = _allConstraint.begin(); it!= _allConstraint.end(); it++){ const constraintElement* cel = *it; - if (cel->getType() == constraintElement::PeriodicNode){ + if (cel->isDirect()){ numDir++; } } @@ -2656,41 +3066,33 @@ void pbcConstraintElementGroup::createConstraintForTest(){ _allConstraint.clear(); Msg::Info("apply periodic boundary condition"); - if (_mbc->getNumberOfConstrainedConstitutiveExtraDofs() > 0){ + if (_solver->getMicroBC()->getNumberOfConstrainedConstitutiveExtraDofs() > 0){ Msg::Fatal("This implementation pbcConstraintElementGroup::createConstraintForTest is not considered with existing constitutive extra Dofs"); } - if (_mbc->getType() == nonLinearMicroBC::PBC){ - nonLinearPeriodicBC* pbc = static_cast<nonLinearPeriodicBC*>(_mbc); - const std::vector<groupOfElements*>& bgroup = _mbc->getBoundaryGroupOfElements(); + if (_solver->getMicroBC()->getType() == nonLinearMicroBC::PBC){ + nonLinearPeriodicBC* pbc = static_cast<nonLinearPeriodicBC*>(_solver->getMicroBC()); + const std::vector<groupOfElements*>& bgroup = _solver->getMicroBC()->getBoundaryGroupOfElements(); if (bgroup.size()>0){ if (pbc->getPBCMethod() == nonLinearPeriodicBC::CEM){ Msg::Info("Imposing PBC by periodic mesh formulation"); - this->addControlPoints(); - this->addOtherCornerPoints(); this->createPeriodicMeshConstraintElementGroup(); } else if (pbc->getPBCMethod() == nonLinearPeriodicBC::CSIM){ Msg::Info("Imposing PBC by cubic spline formulation"); - this->addOtherCornerPoints(); this->createCubicSplineConstraintElementGroup(); } else if (pbc->getPBCMethod() == nonLinearPeriodicBC::LIM){ Msg::Info("Imposing PBC by lagrange formulation"); - this->addOtherCornerPoints(); this->createLagrangeConstraintElementGroup(); } else if (pbc->getPBCMethod() == nonLinearPeriodicBC::FE_LIN or pbc->getPBCMethod() == nonLinearPeriodicBC::FE_QUA){ Msg::Info("Imposing PBC by lagrange C0"); - if (_mbc->getDim() == 2) - this->addOtherCornerPoints(); this->createFEConstraintElementGroup(); } else if (pbc->getPBCMethod() == nonLinearPeriodicBC::PROJECT){ Msg::Info("Imposing PBC by projection method"); - this->addControlPoints(); - this->addOtherCornerPoints(); this->createProjectConstraintElementGroup(); } else{ @@ -2707,17 +3109,17 @@ void pbcConstraintElementGroup::createConstraintForTest(){ if (_v5) Msg::Info("root vertex v5 = %d; vec15 = %f %f %f",_v5->getNum(),_v5->x()-_v1->x(),_v5->y()-_v1->y(),_v5->z()-_v1->z()); - constraintElement* cele = new periodicMeshConstraint(_mbc,_LagSpace,_MultSpace,-1,_v3,_v4,_v2,_v1); + constraintElement* cele = new periodicMeshConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,-1,_v3,_v4,_v2,_v1); _allConstraint.insert(cele); - if (_mbc->getDim() ==3){ - cele = new periodicMeshConstraint(_mbc,_LagSpace,_MultSpace,-1,_v7,_v3,_v5,_v1); + if (_solver->getMicroBC()->getDim() ==3){ + cele = new periodicMeshConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,-1,_v7,_v3,_v5,_v1); _allConstraint.insert(cele); - cele = new periodicMeshConstraint(_mbc,_LagSpace,_MultSpace,-1,_v6,_v2,_v5,_v1); + cele = new periodicMeshConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,-1,_v6,_v2,_v5,_v1); _allConstraint.insert(cele); - cele = new periodicMeshConstraint(_mbc,_LagSpace,_MultSpace,-1,_v8,_v4,_v5,_v1); + cele = new periodicMeshConstraint(_solver->getMicroBC(),_LagSpace,_MultSpace,-1,_v8,_v4,_v5,_v1); _allConstraint.insert(cele); } @@ -2729,7 +3131,7 @@ void pbcConstraintElementGroup::createConstraintForTest(){ void pbcConstraintElementGroup::numberDof_virtualVertices(dofManager<double>* pmanager){ Msg::Info("begin numbering all virtual Dofs from interpolation"); - std::vector<int> constrainedComp(_mbc->getConstrainedComps().begin(), _mbc->getConstrainedComps().end()); + std::vector<int> constrainedComp(_solver->getMicroBC()->getConstrainedComps().begin(), _solver->getMicroBC()->getConstrainedComps().end()); for (std::set<MVertex*>::iterator it = _virtualVertices.begin(); it!= _virtualVertices.end(); it++){ MVertex* v = *it; if (this->isActive(v)){ @@ -2763,3 +3165,64 @@ void pbcConstraintElementGroup::applyLinearConstraintsToSystem(dofManager<double linearConstraint.clear(); }; }; + +void pbcConstraintElementGroup::setLocalBasis(const SVector3& n, const SVector3& t, const SVector3& b){ + _e1 = n; _e1.normalize(); + _e2 = t; _e2.normalize(); + _e3 = b; _e3.normalize(); +}; + +void pbcConstraintElementGroup::setRotatedBasis(const SVector3& n, const SVector3& t, const SVector3 b){ + _e1Rotated = n; _e1Rotated.normalize(); + _e2Rotated = t; _e2Rotated.normalize(); + _e3Rotated = b; _e3Rotated.normalize(); +}; + +SPoint3 pbcConstraintElementGroup::getRootPoint(){ + if (_v1 != NULL) return _v1->point(); + else{ + const std::vector<groupOfElements*>& bgroup = _solver->getMicroBC()->getBoundaryGroupOfElements(); + if (_solver->getMicroBC()->getDim() == 2){ + SPoint3 oneVp = (*(bgroup[0]->vbegin()))->point(); + groupOfElements::vertexContainer::iterator it = bgroup[0]->vbegin(); + SPoint3 firstVn = (*it)->point(); + it++; + SPoint3 secondVn = (*it)->point(); + + SPoint3 p = project(oneVp,firstVn,secondVn); + _v1 = new MVertex(p.x(),p.y(),p.z()); + return p; + } + else if (_solver->getMicroBC()->getDim() == 3){ + + MElement* e1 = *(bgroup[0]->begin()); + MElement* e2 = *(bgroup[2]->begin()); + MElement* e3 = *(bgroup[1]->begin()); + fullMatrix<double> m(3,3); m.setAll(0.); + fullVector<double> b(3); b.setAll(0.); + + std::vector<MVertex*> vv1, vv2, vv3; + e1->getVertices(vv1); + e2->getVertices(vv2); + e3->getVertices(vv3); + + computeSurface(vv1[0]->point(),vv1[1]->point(),vv1[2]->point(),m(0,0),m(0,1),m(0,2),b(0)); + computeSurface(vv2[0]->point(),vv2[1]->point(),vv2[2]->point(),m(1,0),m(1,1),m(1,2),b(1)); + computeSurface(vv3[0]->point(),vv3[1]->point(),vv3[2]->point(),m(2,0),m(2,1),m(2,2),b(2)); + + fullMatrix<double> invm(3,3); + m.invert(invm); + fullVector<double> f(3); + invm.mult(b,f); + + SPoint3 p(f(0),f(1),f(2)); + _v1 = new MVertex(p.x(),p.y(),p.z()); + return p; + } + else{ + Msg::Fatal("getRootPoint has not been implemented for %d D problems",_solver->getMicroBC()->getDim()); + } + } + +}; + diff --git a/NonLinearSolver/periodicBC/pbcCreateConstraints.h b/NonLinearSolver/periodicBC/pbcCreateConstraints.h index de06fd6e0dbc220054a4b6bb7cf77f622409ffbd..273f696486d634cec307952db62d5c1705cf86bd 100644 --- a/NonLinearSolver/periodicBC/pbcCreateConstraints.h +++ b/NonLinearSolver/periodicBC/pbcCreateConstraints.h @@ -86,8 +86,8 @@ class groupOfElementsDomainDecomposition{ class pbcConstraintElementGroup{ protected: bool _fullDG; // DG flag - std::vector<partDomain*>& _allDomain; // all microscopic domains - nonLinearMicroBC* _mbc; // micro bc + nonLinearMechSolver* _solver; + FunctionSpaceBase* _LagSpace, *_MultSpace; // lagspace and mult space std::set<constraintElement*> _allConstraint; // all constraint std::set<MVertex*> _cVertices; // corner vertices @@ -106,6 +106,10 @@ class pbcConstraintElementGroup{ MVertex* _v3, *_v6, *_v7, *_v8; groupOfElements* _gX, *_gY, *_gZ; // interpolation edges groupOfElements* _gXY, *_gYZ, *_gZX; // interpolation faces + + SVector3 _periodic12, _periodic14, _periodic15; // + SVector3 _e1, _e2, _e3; // local basis + SVector3 _e1Rotated, _e2Rotated, _e3Rotated; // rotate basis // 6 periodic nodes in case of missing corner nodes std::vector<MVertex*> _pbcNodes; @@ -118,8 +122,8 @@ class pbcConstraintElementGroup{ void groupIntersection(groupOfElements* g1, groupOfElements* g2, groupOfElements* &g) const; void groupIntersection(std::set<MVertex*>& g1, std::set<MVertex*>& g2, std::set<MVertex*>& ver) const; /* create group of line at intersection of two faces*/ - void createLineFromTwoFaces(groupOfElements* face1, groupOfElements* face2, groupOfElements* line) const; - + void intersectionBetweenTwoFaces(const groupOfElements* face1, const groupOfElements* face2, groupOfElements* &line) const; + void intersectionBetweenTwoLines(const groupOfElements* line1, const groupOfElements* line2, groupOfElements* & pt) const; void __init__(); // add control point in case of missing void addControlPoints(); @@ -189,6 +193,19 @@ class pbcConstraintElementGroup{ void lagrangePeriodicCondition(Iterator itbegin, Iterator itend, std::vector<MVertex*>& vlist,std::set<MVertex*>& others, MVertex* vrootP=NULL, MVertex* vrootN = NULL); + template<class Iterator> + void shiftedLagrangePeriodicCondition(Iterator itbegin, Iterator itend, + std::vector<MVertex*>& vlist,std::set<MVertex*>& others, const SVector3& normal); + + // for lagrange + template<class Iterator> + void directionalLagrangeFormCondition(Iterator itbegin, Iterator itend, + std::vector<MVertex*>& vlist,const SVector3& pbcDir); + + template<class Iterator> + void directionalLagrangePeriodicCondition(Iterator itbegin, Iterator itend, + std::vector<MVertex*>& xlist, std::vector<MVertex*>& ylist, + const SVector3& pbcNormal, const bool allComp); // for lagrange template<class Iterator> @@ -209,6 +226,7 @@ class pbcConstraintElementGroup{ void createPeriodicMeshConstraintElementGroup(); void createCubicSplineConstraintElementGroup(); void createLagrangeConstraintElementGroup(); + void createShiftedLagrangeConstraintElementGroup(); void createFEConstraintElementGroup(); void createLinearDisplacementConstraintElementGroup(); void createProjectConstraintElementGroup(); @@ -216,11 +234,15 @@ class pbcConstraintElementGroup{ void createMixBCConstraintElementGroup(); void createCornerConstraintElementGroup(); + void createCornerConstraintElementGroupShiftedBPC(); // for DG case void createLinearDisplacementConstraintElementGroup_DG(); void createMinimalKinematicConstraintElementGroup_DG(); void createMixBCConstraintElementGroup_DG(); + + void createOrthogonalMixBCConstraintElementGroupDirectionFollowing(); + void createMixBCConstraintElementGroupDirectionFollowing(); SVector3 getUniformDisp(MVertex* v); @@ -230,10 +252,12 @@ class pbcConstraintElementGroup{ void lagrangeToFile(std::vector<MVertex*>& vlist, dofManager<double>* pmanager, FILE* file); public: - pbcConstraintElementGroup(nonLinearMicroBC* bc, std::vector<partDomain*>& allDom, + pbcConstraintElementGroup(nonLinearMechSolver* sl, FunctionSpaceBase* lagspace, FunctionSpaceBase* multspace); virtual ~pbcConstraintElementGroup(); void createConstraintGroup(); + void switchMicroBC(); + void clearAllConstraints(); std::set<constraintElement*>::iterator constraintGroupBegin(){return _allConstraint.begin();}; std::set<constraintElement*>::iterator constraintGroupEnd(){return _allConstraint.end();}; int size() const {return _allConstraint.size();}; @@ -255,8 +279,11 @@ class pbcConstraintElementGroup{ void createConstraintForTest(); void numberDof_virtualVertices(dofManager<double>* pmanager); void applyLinearConstraintsToSystem(dofManager<double>* pmanager); - - + + void setLocalBasis(const SVector3& n, const SVector3& t, const SVector3& b); + void setRotatedBasis(const SVector3& n, const SVector3& t, const SVector3 b); + + SPoint3 getRootPoint(); }; #endif // PBCCREATCONSTRAINTS_H_ diff --git a/NonLinearSolver/periodicBC/pbcSupplementConstraint.cpp b/NonLinearSolver/periodicBC/pbcSupplementConstraint.cpp index 42a078a725aa9a98cec85cb49b9ec19372c0b6a4..1cec495b39f0d0916bca3f286adf7949db440710 100644 --- a/NonLinearSolver/periodicBC/pbcSupplementConstraint.cpp +++ b/NonLinearSolver/periodicBC/pbcSupplementConstraint.cpp @@ -11,40 +11,32 @@ #include "pbcSupplementConstraint.h" #include "pbcCreateConstraints.h" -supplementConstraint::supplementConstraint(nonLinearMicroBC* mbc, FunctionSpaceBase* space, FunctionSpaceBase* mspace, - const int c,groupOfElements* g, const scalarWeightFunction* fct): - supplementConstraintBase(mbc, space,mspace,c),_g(g){ - if (fct == NULL){ - _weightFunction = new constantScalarWeightFunction(1.); - } - else{ - _weightFunction = fct->clone(); - } - int sizever = _g->vsize(); - _weight.resize(sizever); - _v.resize(sizever); +void supplementConstraint::computeWeight(const groupOfElements*g, std::vector<MVertex*>& v, fullVector<double>& weight){ + int sizever = g->vsize(); + v.resize(sizever); // number all vertices std::map<MVertex*,int> allVertices; - for (groupOfElements::vertexContainer::iterator it = _g->vbegin(); it!= _g->vend(); it++){ + for (groupOfElements::vertexContainer::iterator it = g->vbegin(); it!= g->vend(); it++){ MVertex* vertex = *it; int size = allVertices.size(); allVertices[vertex] = size; - _v[size] = vertex; + v[size] = vertex; } - _weight.resize(sizever); - _weight.setAll(0.); + + weight.resize(sizever); + weight.setAll(0.); // integration rule - _integrationRule = new GaussQuadrature(GaussQuadrature::Val); + GaussQuadrature integrationRule(GaussQuadrature::Val); IntPt* GP; double jac[3][3]; double surface =0; double val[256]; // Use a Space to compute Jacobian and shape Function values - for (groupOfElements::elementContainer::iterator it = _g->begin(); it!= _g->end(); it++){ + for (groupOfElements::elementContainer::iterator it = g->begin(); it!= g->end(); it++){ MElement* ele = *it; int numVer = ele->getNumVertices(); - int npts = _integrationRule->getIntPoints(ele,&GP); + int npts = integrationRule.getIntPoints(ele,&GP); 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]; double wgt = GP[i].weight; @@ -54,14 +46,28 @@ supplementConstraint::supplementConstraint(nonLinearMicroBC* mbc, FunctionSpaceB ele->getShapeFunctions(u,v,w,val); for (int j=0; j<numVer; j++){ MVertex* vertex= ele->getVertex(j); - _weight(allVertices[vertex]) += val[j]*ratio; + weight(allVertices[vertex]) += val[j]*ratio; } } } - _weight.scale(1./surface); + weight.scale(1./surface); +}; +supplementConstraint::supplementConstraint(nonLinearMicroBC* mbc, FunctionSpaceBase* space, FunctionSpaceBase* mspace, + const int c,groupOfElements* g, const scalarWeightFunction* fct): + supplementConstraintBase(mbc, space,mspace,c),_g(g){ + if (fct == NULL){ + _weightFunction = new constantScalarWeightFunction(1.); + } + else{ + _weightFunction = fct->clone(); + } + supplementConstraint::computeWeight(_g,_v,_weight); + + int sizever = _v.size(); + // update with weightfunction - for (int i=0; i< _v.size(); i++){ + for (int i=0; i< sizever; i++){ _weight(i) *= _weightFunction->getVal(_v[i]); } @@ -98,7 +104,6 @@ supplementConstraint::supplementConstraint(nonLinearMicroBC* mbc, FunctionSpaceB } } - double invs = 1./(_weight(_positive)); _factor = _weight(_positive); _weight.scale(invs); diff --git a/NonLinearSolver/periodicBC/pbcSupplementConstraint.h b/NonLinearSolver/periodicBC/pbcSupplementConstraint.h index bf10b42f6aefb571ca1c336bf30da7856d65e2fe..19838a67597473f87fc619256368e1e57de46e1b 100644 --- a/NonLinearSolver/periodicBC/pbcSupplementConstraint.h +++ b/NonLinearSolver/periodicBC/pbcSupplementConstraint.h @@ -105,6 +105,9 @@ class singlePositionScalarWeightFunction: public scalarWeightFunction{ class supplementConstraint : public supplementConstraintBase{ + public: + static void computeWeight(const groupOfElements*g, std::vector<MVertex*>& v, fullVector<double>& weight); + protected: groupOfElements* _g; QuadratureBase* _integrationRule; // integration rule for approximate integrals diff --git a/dG3D/benchmarks/CMakeLists.txt b/dG3D/benchmarks/CMakeLists.txt index 77cf214f433b3d60b6f30b651b909224e956f761..2dbcbbf1934e8ba76c97a4225873b00cc17c1d19 100644 --- a/dG3D/benchmarks/CMakeLists.txt +++ b/dG3D/benchmarks/CMakeLists.txt @@ -44,6 +44,7 @@ add_subdirectory(MFH_EVP_Mercier) add_subdirectory(MFH_EVP_Czarnota) add_subdirectory(MFH_2EVP_Czarnota) add_subdirectory(nonLocalJ2) +add_subdirectory(nonLocalLemaitreChabocheCube) add_subdirectory(multiscaleAdhesiveTest2D) add_subdirectory(multiscaleCohesiveTest2D) add_subdirectory(multiscaleCohesiveTest2D_tangentByPert) @@ -104,3 +105,13 @@ add_subdirectory(pathFollowingMultiscale) add_subdirectory(multiscaleCohesiveTest2D_mixedMode) add_subdirectory(multiscaleCohesiveTest2D_fullDG) add_subdirectory(compRVE) +add_subdirectory(smpT22) +add_subdirectory(smpT58) +add_subdirectory(multiscaleCohesiveTest2D_fullDG_rotateRVE) +add_subdirectory(multiscaleEnhanceStrain) +add_subdirectory(nonLinearMixedBC_2D_DirectionFollowing) +add_subdirectory(interpolationPBC_2DShifted) +add_subdirectory(DG_PRI6_resetBC) +add_subdirectory(DG_PRI6_DiriToNeum) +add_subdirectory(microBC_reset) +add_subdirectory(multiscaleCohesiveTest2D_fullDG_changeBCAfterFailure) diff --git a/dG3D/benchmarks/DG_PRI6_DiriToNeum/CMakeLists.txt b/dG3D/benchmarks/DG_PRI6_DiriToNeum/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..1114c32de584c987638d3c2e691c2097dd535f98 --- /dev/null +++ b/dG3D/benchmarks/DG_PRI6_DiriToNeum/CMakeLists.txt @@ -0,0 +1,12 @@ +# test file + +set(PYFILE twoHole.py) + +set(FILES2DELETE + *.csv + disp* + stress* + previousScheme* +) + +add_cm3python_mpi_test(4 ${PYFILE} "${FILES2DELETE}") diff --git a/dG3D/benchmarks/DG_PRI6_DiriToNeum/twoHole.geo b/dG3D/benchmarks/DG_PRI6_DiriToNeum/twoHole.geo new file mode 100644 index 0000000000000000000000000000000000000000..9b42aefe356d6eff249f6f74ccae56f8f5f0ae66 --- /dev/null +++ b/dG3D/benchmarks/DG_PRI6_DiriToNeum/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_DiriToNeum/twoHole.msh b/dG3D/benchmarks/DG_PRI6_DiriToNeum/twoHole.msh new file mode 100644 index 0000000000000000000000000000000000000000..a3e26cda8fef10667b50e4f68cb7ba3f7aaa6e4a --- /dev/null +++ b/dG3D/benchmarks/DG_PRI6_DiriToNeum/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_DiriToNeum/twoHole.py b/dG3D/benchmarks/DG_PRI6_DiriToNeum/twoHole.py new file mode 100644 index 0000000000000000000000000000000000000000..c57ac0462720449a7b2b62a5b1d6e7317d8cbf54 --- /dev/null +++ b/dG3D/benchmarks/DG_PRI6_DiriToNeum/twoHole.py @@ -0,0 +1,105 @@ +#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 = 25 # 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 = J2LinearDG3DMaterialLaw(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 -mat_mumps_icntl_7 2") + +# 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.energyBuildView("elastic energy",2) +mysolver.OneUnknownBuildView("disp0",0) + +mysolver.archivingForceOnPhysicalGroup("Face", 84, 1) +mysolver.archivingNodeDisplacement(19,1,1) + +t1 = mysolver.solve() + +check = TestCheck() +check.equal(-2.839032e+03,mysolver.getArchivedForceOnPhysicalGroup("Face", 84, 1),1.e-4) + +nstep = 5 # 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) +mysolver.snlData(nstep,ftime,tol) + +lastF = 2.839032e+03/(20e-3*1e-3) + +fct = LinearFunctionTime(0,lastF,ftime,0.*lastF) +mysolver.resetBoundaryConditions(False); + +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.forceBC("Face",85,1,fct) +mysolver.displacementBC("Face",85,2,0.) + +mysolver.solve() + +check = TestCheck() +check.equal(-1.503462e-06,mysolver.getArchivedForceOnPhysicalGroup("Face", 84, 1),1.e-4) diff --git a/dG3D/benchmarks/DG_PRI6_resetBC/CMakeLists.txt b/dG3D/benchmarks/DG_PRI6_resetBC/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..1114c32de584c987638d3c2e691c2097dd535f98 --- /dev/null +++ b/dG3D/benchmarks/DG_PRI6_resetBC/CMakeLists.txt @@ -0,0 +1,12 @@ +# test file + +set(PYFILE twoHole.py) + +set(FILES2DELETE + *.csv + disp* + stress* + previousScheme* +) + +add_cm3python_mpi_test(4 ${PYFILE} "${FILES2DELETE}") diff --git a/dG3D/benchmarks/DG_PRI6_resetBC/twoHole.geo b/dG3D/benchmarks/DG_PRI6_resetBC/twoHole.geo new file mode 100644 index 0000000000000000000000000000000000000000..9b42aefe356d6eff249f6f74ccae56f8f5f0ae66 --- /dev/null +++ b/dG3D/benchmarks/DG_PRI6_resetBC/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_resetBC/twoHole.msh b/dG3D/benchmarks/DG_PRI6_resetBC/twoHole.msh new file mode 100644 index 0000000000000000000000000000000000000000..a3e26cda8fef10667b50e4f68cb7ba3f7aaa6e4a --- /dev/null +++ b/dG3D/benchmarks/DG_PRI6_resetBC/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_resetBC/twoHole.py b/dG3D/benchmarks/DG_PRI6_resetBC/twoHole.py new file mode 100644 index 0000000000000000000000000000000000000000..bef45c3ef1a62a46b809704c5fd1db4ab39840ce --- /dev/null +++ b/dG3D/benchmarks/DG_PRI6_resetBC/twoHole.py @@ -0,0 +1,100 @@ +#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 = 25 # 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 = J2LinearDG3DMaterialLaw(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) + +t1 = mysolver.solve() + +check = TestCheck() +check.equal(-2.839032e+03,mysolver.getArchivedForceOnPhysicalGroup("Face", 84, 1),1.e-4) + +nstep = 5 # 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) +mysolver.snlData(nstep,ftime,tol) + +fct = LinearFunctionTime(0,5e-4,ftime,0.) +mysolver.resetBoundaryConditions(); + +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,fct) +mysolver.displacementBC("Face",85,2,0.) +mysolver.solve() + +check = TestCheck() +check.equal(2.570988e+03,mysolver.getArchivedForceOnPhysicalGroup("Face", 84, 1),1.e-4) diff --git a/dG3D/benchmarks/TransverseAnisotropicCZM/cubeTransverseAnisotropy.py b/dG3D/benchmarks/TransverseAnisotropicCZM/cubeTransverseAnisotropy.py index 6c95e170a64d69662eef7133f4fd5adcaf0187bb..6df3acac30875e86efc9bd985f78f0357c3a7498 100644 --- a/dG3D/benchmarks/TransverseAnisotropicCZM/cubeTransverseAnisotropy.py +++ b/dG3D/benchmarks/TransverseAnisotropicCZM/cubeTransverseAnisotropy.py @@ -108,6 +108,6 @@ mysolver.archivingForceOnPhysicalGroup("Face", 5678, 2) mysolver.solve() check = TestCheck() -check.equal(2.613053e-01,mysolver.getArchivedForceOnPhysicalGroup("Face", 5678, 2),1.e-4) +check.equal(2.615077e-01,mysolver.getArchivedForceOnPhysicalGroup("Face", 5678, 2),1.e-4) diff --git a/dG3D/benchmarks/compRVE/RVE.py b/dG3D/benchmarks/compRVE/RVE.py index 8820ef176b8507c5b27c6805f629afc32271aa00..83690a53f27f728a4e75d5a266c64c58c11dc7b5 100644 --- a/dG3D/benchmarks/compRVE/RVE.py +++ b/dG3D/benchmarks/compRVE/RVE.py @@ -14,21 +14,21 @@ meshfile="comp.msh" # name of mesh file lawnonlocal = 2 # unique number of law rhoCF = 1750. -youngCF = 40.e9 -youngACF = 230.e9; +youngCF = 40.e3 +youngACF = 230.e3; nuCF = 0.2 # nu_minorCF = 0.256*youngCF/youngACF -GACF = 24.e9 +GACF = 24.e3 Ax = 0.; #direction of anisotropy Ay = 0.; Az = 1.; lawlinear = 3 # unique number of law rhoEP = 1000. -youngEP = 3.2e9 +youngEP = 3.2e3 nuEP = 0.3 -sy0EP = 25.e6 -hEP = 7.1e8 #7.1e9 +sy0EP = 25. +hEP = 7.1e2 #7.1e9 hexp = 60. # solver @@ -42,6 +42,8 @@ fulldg = 0 beta1 = 30. eqRatio = 1.e6 +BC="MIXED" +number=1 # compute solution and BC (given directly to the solver # creation of law # creation of law @@ -83,35 +85,39 @@ mysolver.snlData(nstep,ftime,tol,1.e-4) #mysolver.lineSearch(bool(1)) #mysolver.snlManageTimeStep(16, 3, 2, 10) mysolver.stepBetweenArchiving(nstepArch) -#mysolver.options("-petsc_direct") -mysolver.setSystemType(1) + + +if BC=="KUBC": + mysolver.setSystemType(1) +elif BC=="SUBC": + mysolver.setSystemType(2) +elif BC=="PERIODIC": + mysolver.setSystemType(1) +elif BC=="MIXED": + mysolver.setSystemType(1) + mysolver.stiffnessModification(bool(1)) mysolver.iterativeProcedure(bool(1)) mysolver.setMessageView(bool(1)) - -mysolver.setPeriodicity(1.e-5,0,0,"x") -mysolver.setPeriodicity(0,1.e-5,0,"y") -mysolver.setPeriodicity(0,0,1.e-6,"z") +mysolver.setPeriodicity(1.e-2,0,0,"x") +mysolver.setPeriodicity(0,1.e-2,0,"y") +mysolver.setPeriodicity(0,0,1.e-3,"z") #boundary condition - -microBC = nonLinearPeriodicBC(1000,3) -microBC.setOrder(1) -microBC.setBCPhysical(120,100,110,121,101,111) - - -method = 5 # Periodic mesh = 0, Langrange interpolation = 1, Cubic spline interpolation =2, FE linear= 3, FE Quad = 4 -degree = 3 # Order used for polynomial interpolation -addvertex = 1 # Polynomial interpolation by mesh vertex = 0, Polynomial interpolation by virtual vertex -microBC.setPeriodicBCOptions(method, degree,bool(addvertex)) - -runTest=1 +runTest=1 if(runTest==1): + microBC = nonLinearPeriodicBC(1000,3) + microBC.setOrder(1) + microBC.setBCPhysical(120,100,110,121,101,111) + method = 5 # Periodic mesh = 0, Langrange interpolation = 1, Cubic spline interpolation =2, FE linear= 3, FE Quad = 4 + degree = 3 # Order used for polynomial interpolation + addvertex = 1 # Polynomial interpolation by mesh vertex = 0, Polynomial interpolation by virtual vertex + microBC.setPeriodicBCOptions(method, degree, bool(addvertex)) mysolver.addMicroBC(microBC) mysolver.activateTest(True) - mysolver.setRVEVolume(1.e-5*1.e-5*1.e-6) + mysolver.setRVEVolume(1.e-2*1.e-2*1.e-3) # block rigid mode mysolver.displacementBC("Node",1,0,0.) @@ -126,19 +132,65 @@ if(runTest==1): mysolver.displacementBC("Face",120,2,0.) mysolver.displacementBC("Face",121,2,0.) + if(runTest==0): + if BC=="KUBC": + #linear displacement BC + microBC = nonLinearDisplacementBC(1000,3) + + elif BC=="SUBC": + #minimal kinematical BC + microBC = nonLinearMinimalKinematicBC(1000,3) + + elif BC=="PERIODIC": + #boundary condition + microBC = nonLinearPeriodicBC(1000,3) + method = 5 # Periodic mesh = 0, Langrange interpolation = 1, Cubic spline interpolation =2, FE linear= 3, FE Quad = 4 + degree = 3 # Order used for polynomial interpolation + addvertex = 1 # Polynomial interpolation by mesh vertex = 0, Polynomial interpolation by virtual vertex + microBC.setPeriodicBCOptions(method, degree, bool(addvertex)) + + elif BC=="MIXED": + microBC = nonLinearMixedBC(1000,3) + microBC.setKinematicPhysical(100,0) + microBC.setKinematicPhysical(100,1) + microBC.setKinematicPhysical(100,2) + microBC.setKinematicPhysical(101,0) + microBC.setKinematicPhysical(101,1) + microBC.setKinematicPhysical(101,2) + microBC.setKinematicPhysical(110,0) + microBC.setKinematicPhysical(110,1) + microBC.setKinematicPhysical(110,2) + microBC.setKinematicPhysical(111,0) + microBC.setKinematicPhysical(111,1) + microBC.setKinematicPhysical(111,2) + microBC.setStaticPhysical(120,0) + microBC.setStaticPhysical(120,1) + microBC.setKinematicPhysical(120,2) + microBC.setStaticPhysical(121,0) + microBC.setStaticPhysical(121,1) + microBC.setKinematicPhysical(121,2) + + microBC.setOrder(1) + microBC.setBCPhysical(120,100,110,121,101,111) # Deformation gradient - microBC.setDeformationGradient(1.01,0.0,0.0,0.0,1.,0,0,0,1.0) - mysolver.addMicroBC(microBC) + mysolver.setMicroProblemIndentification(0, number); #stress averaging flag and averaging method 0- VOLUME, 1- SURFACE mysolver.stressAveragingFlag(bool(1)) # set stress averaging ON- 0 , OFF-1 mysolver.setStressAveragingMethod(0) # 0 -volume 1- surface #tangent averaging flag mysolver.tangentAveragingFlag(bool(1)) # set tangent averaging ON -0, OFF -1 - mysolver.setTangentAveragingMethod(2,1e-6) # 0- perturbation 1- condensation + if BC=="KUBC": + mysolver.setTangentAveragingMethod(2,1e-6) # 0- perturbation 1- condensation + elif BC=="SUBC": + mysolver.setTangentAveragingMethod(0,1e-6) # 0- perturbation 1- condensation + elif BC=="PERIODIC": + mysolver.setTangentAveragingMethod(2,1e-6) # 0- perturbation 1- condensation + elif BC=="MIXED": + mysolver.setTangentAveragingMethod(2,1e-6) # 0- perturbation 1- condensation # BC - # fixed face - #mysolver.displacementBC("Face",120,2,0.) + microBC.setDeformationGradient(1.01,0.0,0.0,0.0,0.99,0,0,0,1.01) + mysolver.addMicroBC(microBC) @@ -162,5 +214,5 @@ check = TestCheck() import linecache homoStress = linecache.getline('homo_sigma.csv',3) val = float(homoStress.split(';')[9]) -check.equal(5.436245e+07,val,1.e-4) +check.equal(5.326579e-02,val,1.e-4) diff --git a/dG3D/benchmarks/compRVE/comp.geo b/dG3D/benchmarks/compRVE/comp.geo index d6093ce15308e4d48e8bf802cc387491d95c4438..4ee091aa4828ebd010841ad857ba8161b1f74310 100644 --- a/dG3D/benchmarks/compRVE/comp.geo +++ b/dG3D/benchmarks/compRVE/comp.geo @@ -1,7 +1,7 @@ //Fiber reinforced composite cross-section Geometry.AutoCoherence= 0; //defination of unit -unit = 1e-06; +unit = 1e-03; //characteristic mesh size cl = 1.0*unit; h_x = 10.000000 * unit; diff --git a/dG3D/benchmarks/interpolationPBC_2DShifted/CMakeLists.txt b/dG3D/benchmarks/interpolationPBC_2DShifted/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..6e77bcca3ada1b536da9d15d4d87cc953d7708eb --- /dev/null +++ b/dG3D/benchmarks/interpolationPBC_2DShifted/CMakeLists.txt @@ -0,0 +1,12 @@ +# test file + +set(PYFILE idealHole.py) + +set(FILES2DELETE + E_0_GP_0_out.txt + E_0_GP_0_disp.msh + E_0_GP_0_stress.msh + E_0_GP_0*.csv +) + +add_cm3python_test(${PYFILE} "${FILES2DELETE}") diff --git a/dG3D/benchmarks/interpolationPBC_2DShifted/idealHole.geo b/dG3D/benchmarks/interpolationPBC_2DShifted/idealHole.geo new file mode 100644 index 0000000000000000000000000000000000000000..8e8b34440be4b4807fcec7b6e362d49ffee2c257 --- /dev/null +++ b/dG3D/benchmarks/interpolationPBC_2DShifted/idealHole.geo @@ -0,0 +1,61 @@ + +mm=1.0; +n=1; +L=1; +sl1=0.07*L/n; +Point(1)={0,0,0,sl1}; +Point(2)={L,0,0,sl1}; +Point(3)={L,L,0,sl1}; +Point(4)={0,L,0,sl1}; +Line(1)={1,2}; +Line(2)={2,3}; +Line(3)={3,4}; +Line(4)={4,1}; +x0=0.65*L/n; y0=0.45*L/n; r=0.25*L/n; +num=0; +moyen=0; +surf=0; +For i In {0:n-1} + For j In {0:n-1} + x=x0*(2*i+1); + y=y0*(2*j+1); + sl2=0.7*sl1; + moyen=moyen+r; + surf=surf+Pi*r*r; + + 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}; + +// Transfinite Line {c3, c2, c4, c1} = 4 Using Progression 1; + num+=1; + l[num]=newreg; Line Loop(l[num]) = {c1,c2,c3,c4}; + EndFor +EndFor +l[0]=newreg; +Line Loop(l[0])={1,2,3,4}; +Plane Surface(11)={l[]}; +Physical Line(1)={1}; +Physical Line(2)={2}; +Physical Line(3)={3}; +Physical Line(4)={4}; +Physical Surface(11)={11}; +Physical Point(1)={1}; +Physical Point(2)={2}; +Physical Point(3)={3}; +Physical Point(4)={4}; +//Transfinite Line {3, 2, 4, 1} = 5*n Using Progression 1; +//Transfinite Surface{11}; +//Recombine Surface{11}; + +Translate {-L/2, -L/2, 0} { + Surface{11}; +} + diff --git a/dG3D/benchmarks/interpolationPBC_2DShifted/idealHole.py b/dG3D/benchmarks/interpolationPBC_2DShifted/idealHole.py new file mode 100644 index 0000000000000000000000000000000000000000..2b2075f745f4296ad81981cca5fbce4c0f0e0dfa --- /dev/null +++ b/dG3D/benchmarks/interpolationPBC_2DShifted/idealHole.py @@ -0,0 +1,121 @@ +#coding-Utf-8-*- + +from gmshpy import * +from dG3Dpy import* +from math import* + +#script to launch PBC problem with a python script + +# material law +lawnum = 11 # unique number of law + + +E = 210E3 +nu = 0.3 +K = E/3./(1.-2.*nu) # Bulk mudulus +mu =E/2./(1.+nu) # Shear mudulus +rho = 2.7 # Bulk mass +sy0 = 507.e100 +h = 200 + +# creation of material law + +law1 = dG3DLinearElasticMaterialLaw(lawnum,rho,E,nu) + +# geometry +geofile="idealHole.geo" # name of mesh file +meshfile="idealHole.msh" # name of mesh file + +# creation of part Domain +nfield = 11 # number of the field (physical number of entity) +dim =2 +myfield1 = dG3DDomain(10,nfield,0,lawnum,0,dim) + + +# solver +sol = 2 # Gmm=0 (default) Taucs=1 PETsc=2 +soltype =1 # StaticLinear=0 (default) StaticNonLinear=1 +nstep = 3 # 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) +system = 3 # Displacement elimination =0 Multiplier elimination = 1 Displacement+ multiplier = 2 +control = 0 # load control = 0 arc length control euler = 1 + +# creation of Solver +mysolver = nonLinearMechSolver(1000) +mysolver.createModel(geofile,meshfile,3,1) +#mysolver.loadModel(meshfile) +mysolver.addDomain(myfield1) +mysolver.addMaterialLaw(law1) +mysolver.Scheme(soltype) +mysolver.Solver(sol) +mysolver.snlData(nstep,ftime,tol) +mysolver.setSystemType(system) +mysolver.setControlType(control) +mysolver.stiffnessModification(bool(1)) +mysolver.iterativeProcedure(bool(1)) +mysolver.setMessageView(bool(1)) + + +#rve - periodicity +mysolver.setPeriodicity(1.,0,0,"x") +mysolver.setPeriodicity(0,1.,0,"y") +mysolver.setPeriodicity(0,0,1.,"z") + +#boundary condition +microBC = nonLinearPeriodicBC(100,2) +microBC.setOrder(1) +microBC.setBCPhysical(1,4,3,2) +method =1 # Periodic mesh = 0, Langrange interpolation = 1, Cubic spline interpolation =2, FE linear= 3, FE Quad = 4 +degree = 5 # Order used for polynomial interpolation +addvertex = 0 # Polynomial interpolation by mesh vertex = 0, Polynomial interpolation by virtual vertex + +microBC.setPeriodicBCOptions(method, degree,bool(addvertex)) +theta = pi/10; + +microBC.activeShiftPBC(True) +microBC.setShiftPBCNormal(sin(theta),-cos(theta),0.) + + # Deformation gradient +microBC.setDeformationGradient(1.01,0.0,0.0,0.0,1.0,0,0,0,1.0) + +mysolver.addMicroBC(microBC) + +#stress averaging flag and averaging method 0- VOLUME, 1- SURFACE +mysolver.stressAveragingFlag(bool(1)) # set stress averaging ON- 0 , OFF-1 +mysolver.setStressAveragingMethod(0) # 0 -volume 1- surface +#tangent averaging flag +mysolver.tangentAveragingFlag(bool(1)) # set tangent averaging ON -0, OFF -1 +mysolver.setTangentAveragingMethod(2,1e-6) # 0- perturbation 1- condensation + +#mysolver.setExtractPerturbationToFileFlag(0) + +# build view +mysolver.internalPointBuildView("Green-Lagrange_xx",IPField.STRAIN_XX, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_yy",IPField.STRAIN_YY, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_zz",IPField.STRAIN_ZZ, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_xy",IPField.STRAIN_XY, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_yz",IPField.STRAIN_YZ, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_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("Green-Lagrange equivalent strain",IPField.GL_EQUIVALENT_STRAIN, 1, 1); +mysolver.internalPointBuildView("Equivalent plastic strain",IPField.PLASTICSTRAIN, 1, 1); + +#mysolver.setWriteDeformedMeshToFile(1) + +#mysolver.readPBCDataFromFile("pbcFile.txt") + +# solve +mysolver.solve() + +check = TestCheck() +check.equal(2.082490e+01,mysolver.getHomogenizedStress(0,1),1.e-3) +check.equal(1.598886e+05,mysolver.getHomogenizedTangent(0,0,0,0),5.e-4) + diff --git a/dG3D/benchmarks/microBC_reset/CMakeLists.txt b/dG3D/benchmarks/microBC_reset/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..1b051f5356f5dcf1d8e1d24464f275b5e2bb9b26 --- /dev/null +++ b/dG3D/benchmarks/microBC_reset/CMakeLists.txt @@ -0,0 +1,13 @@ +# test file + +set(PYFILE run.py) + +set(FILES2DELETE + E_0_GP_0_out.txt + E_0_GP_0_disp.msh + E_0_GP_0_stress.msh + E_0_GP_0*.csv + previousScheme* +) + +add_cm3python_test(${PYFILE} "${FILES2DELETE}") diff --git a/dG3D/benchmarks/microBC_reset/run.py b/dG3D/benchmarks/microBC_reset/run.py new file mode 100644 index 0000000000000000000000000000000000000000..e4330699ccbacf9c93e7c052fe08046ae9392bbd --- /dev/null +++ b/dG3D/benchmarks/microBC_reset/run.py @@ -0,0 +1,124 @@ +#coding-Utf-8-*- + +from gmshpy import * +from dG3Dpy import* + +#script to launch PBC problem with a python script + +# material law +E = 3.2E3 +nu = 0.3 +K = E/3./(1.-2.*nu) # Bulk mudulus +mu =E/2./(1.+nu) # Shear mudulus +rho = 2.7e-9 # Bulk mass + +# creation of material law + +law1 = dG3DLinearElasticMaterialLaw(11,rho,E,nu) + +# geometry +meshfile="rve.msh" # name of mesh file + +# creation of part Domain +myfield1 = dG3DDomain(10,11,0,11,0,3) + + +# 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-6 # relative tolerance for NR scheme (used only if soltype=1) +nstepArch=1 # Number of step between 2 archiving (used only if soltype=1) +system = 1 # Displacement elimination =0 Multiplier elimination = 1 Displacement+ multiplier = 2 +control = 0 # load control = 0 arc length control euler = 1 + +# 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.setSystemType(system) +mysolver.setControlType(control) +mysolver.stiffnessModification(bool(1)) +mysolver.iterativeProcedure(bool(1)) +mysolver.setMessageView(bool(1)) + + +#rve - periodicity +mysolver.setPeriodicity(1.,0,0,"x") +mysolver.setPeriodicity(0,1.,0,"y") +mysolver.setPeriodicity(0,0,1.,"z") + +#boundary condition +microBC = nonLinearMinimalKinematicBC(1000,3) +microBC.setOrder(1) +microBC.setBCPhysical(1,3,5,2,4,6) + # Deformation gradient +microBC.setDeformationGradient(1.0,0.02,0.02,0.0,0.97,0,0,0,1.02) + +mysolver.addMicroBC(microBC) + +#stress averaging flag and averaging method 0- VOLUME, 1- SURFACE +mysolver.stressAveragingFlag(bool(1)) # set stress averaging ON- 0 , OFF-1 +mysolver.setStressAveragingMethod(0) # 0 -volume 1- surface +#tangent averaging flag +mysolver.tangentAveragingFlag(bool(1)) # set tangent averaging ON -0, OFF -1 +mysolver.setTangentAveragingMethod(2,1e-6) # 0- perturbation 1- condensation + +#mysolver.setExtractPerturbationToFileFlag(0) + +# build view +mysolver.internalPointBuildView("Green-Lagrange_xx",IPField.STRAIN_XX, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_yy",IPField.STRAIN_YY, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_zz",IPField.STRAIN_ZZ, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_xy",IPField.STRAIN_XY, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_yz",IPField.STRAIN_YZ, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_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("Green-Lagrange equivalent strain",IPField.GL_EQUIVALENT_STRAIN, 1, 1); +mysolver.internalPointBuildView("Equivalent plastic strain",IPField.PLASTICSTRAIN, 1, 1); + + +# solve +mysolver.solve() + + +microBC = nonLinearPeriodicBC(1000,3) +microBC.setOrder(1) +microBC.setBCPhysical(1,3,5,2,4,6) #Periodic boundary condition + +method =0 # Periodic mesh = 0, Langrange interpolation = 1, Cubic spline interpolation =2, FE linear= 3, FE Quad = 4 +degree = 2 # Order used for polynomial interpolation +addvertex = 0 # Polynomial interpolation by mesh vertex = 0, Polynomial interpolation by virtual vertex +microBC.setPeriodicBCOptions(method, degree,bool(addvertex)) + # Deformation gradient +microBC.setDeformationGradient(1.01,-0.01,0.0,0.0,0.97,0,0,0,1.0) + +mysolver.addMicroBC(microBC) +nstep = 5 # 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) +mysolver.snlData(nstep,ftime,tol) +mysolver.solve() + +# test check +check = TestCheck() +check.equal(-3.748114e+00,mysolver.getHomogenizedStress(0,0),1.e-4) +check.equal(-8.54755E+00,mysolver.getHomogenizedStress(1,0),1.e-4) +check.equal(-2.23399E+01,mysolver.getHomogenizedStress(2,2),1.e-4) + +check.equal(2.976177e+03,mysolver.getHomogenizedTangent(0,0,0,0),1.e-4) +check.equal(1.116996e+03,mysolver.getHomogenizedTangent(0,0,1,1),1.e-4) +check.equal(8.54755E+02,mysolver.getHomogenizedTangent(0,1,0,1),1.e-4) + + diff --git a/dG3D/benchmarks/microBC_reset/rve.geo b/dG3D/benchmarks/microBC_reset/rve.geo new file mode 100644 index 0000000000000000000000000000000000000000..cb718ac283e55fa3ecac1ede9b5dedd7eac12ad1 --- /dev/null +++ b/dG3D/benchmarks/microBC_reset/rve.geo @@ -0,0 +1,87 @@ +l = 1; +r1 = 0.5; +r2 = 0.2; +n =6; +n2 = 8; +progr = 1.1; + +// exterior cube +Point(1) = {0,0,0,l}; +Point(2) = {r1,r1,-r1,l}; +Point(3) = {-r1,r1,-r1,l}; +Point(4) = {-r1,-r1,-r1,l}; +Point(5) = {r1,-r1,-r1,l}; +Line(1) = {2,3}; +Line(2) = {3,4}; +Line(3) = {4,5}; +Line(4) = {5,2}; +Line Loop(5) = {4,1,2,3}; +Plane Surface(6) = {5}; +Extrude Surface {6, {0.0,0.0,2*r1}}; +Delete { Volume{1}; } + +// interior sphere +Point(102) = {r2,r2,-r2,l}; +Point(103) = {-r2,r2,-r2,l}; +Point(104) = {-r2,-r2,-r2,l}; +Point(105) = {r2,-r2,-r2,l}; +Circle(29) = {103,1,102}; +Circle(30) = {102,1,105}; +Circle(31) = {105,1,104}; +Circle(32) = {104,1,103}; +Line Loop(33) = {29,30,31,32}; +Ruled Surface(34) = {33}; +Rotate { {1,0,0},{0,0,0}, Pi/2 } { Duplicata{ Surface{34}; } } +Rotate { {1,0,0},{0,0,0}, Pi } { Duplicata{ Surface{34}; } } +Rotate { {1,0,0},{0,0,0}, 3*Pi/2 } { Duplicata{ Surface{34}; } } +Rotate { {0,1,0},{0,0,0}, Pi/2 } { Duplicata { Surface{34}; } } +Rotate { {0,1,0},{0,0,0}, -Pi/2 } { Duplicata { Surface{34}; } } + +// connect sphere and cube +Line(52) = {102,2}; +Line(53) = {108,7}; +Line(54) = {105,5}; +Line(55) = {111,6}; +Line(56) = {109,15}; +Line(57) = {104,4}; +Line(58) = {103,3}; +Line(59) = {106,11}; + +Line Loop(60) = {58,-1,-52,-29};Plane Surface(61) = {60}; +Line Loop(62) = {58,18,-59,-39};Plane Surface(63) = {62}; +Line Loop(64) = {59,-9,-53,-36};Plane Surface(65) = {64}; +Line Loop(66) = {37,52,14,-53};Plane Surface(67) = {66}; +Line Loop(68) = {56,-22,-57,-49};Plane Surface(69) = {68}; +Line Loop(70) = {31,57,3,-54};Plane Surface(71) = {70}; +Line Loop(72) = {54,13,-55,-47};Plane Surface(73) = {72}; +Line Loop(74) = {55,-11,-56,41};Plane Surface(75) = {74}; +Line Loop(76) = {59,10,-56,-44};Plane Surface(77) = {76}; +Line Loop(78) = {58,2,-57,32};Plane Surface(79) = {78}; +Line Loop(80) = {52,-4,-54,-30};Plane Surface(81) = {80}; +Line Loop(82) = {42,53,-8,-55};Plane Surface(83) = {82}; + +// connection volumes +Surface Loop(84) = {19,61,-63,-65,67,-35}; Volume(85) = {84}; +Surface Loop(86) = {34,61,-79,6,81,-71}; Volume(87) = {86}; +Surface Loop(88) = {23,-79,63,77,69,-50}; Volume(89) = {88}; +Surface Loop(90) = {28,83,-40,75,-77,65}; Volume(91) = {90}; +Surface Loop(92) = {15,81,-67,-51,-83,73}; Volume(93) = {92}; +Surface Loop(94) = {27,-71,-45,-73,-75,-69}; Volume(95) = {94}; + +// define transfinite mesh +Transfinite Line {53, 59, 52, 58, 55, 56, 54, 57} = n Using Progression progr; +Transfinite Line {42, 44, 30, 32, 36, 41, 29, 31, 9, 1, 8, 4, 11, 3, 10, 2, + 18, 22, 14, 13, 39, 49, 37, 47} = n2; +Transfinite Surface "*"; +Recombine Surface "*"; +Transfinite Volume "*"; + +Physical Volume(11) = {85:95:2}; // ext volume +//Physical Surface(100) = {34,35,40,45,50,51}; // int surf + +Physical Surface(1) = {23}; +Physical Surface(2) = {15}; +Physical Surface(3) = {19}; +Physical Surface(4) = {27}; +Physical Surface(5) = {6}; +Physical Surface(6) = {28}; diff --git a/dG3D/benchmarks/microBC_reset/rve.msh b/dG3D/benchmarks/microBC_reset/rve.msh new file mode 100644 index 0000000000000000000000000000000000000000..87f91a786a5b457c4e434539903a32207827375d --- /dev/null +++ b/dG3D/benchmarks/microBC_reset/rve.msh @@ -0,0 +1,3549 @@ +$MeshFormat +2.2 0 8 +$EndMeshFormat +$Nodes +1776 +1 0.5 0.5 -0.5 +2 -0.5 0.5 -0.5 +3 -0.5 -0.5 -0.5 +4 0.5 -0.5 -0.5 +5 0.5 -0.5 0.5 +6 0.5 0.5 0.5 +7 -0.5 0.5 0.5 +8 -0.5 -0.5 0.5 +9 0.2 0.2 -0.2 +10 -0.2 0.2 -0.2 +11 -0.2 -0.2 -0.2 +12 0.2 -0.2 -0.2 +13 -0.2 0.2 0.2 +14 0.2 0.2 0.2 +15 -0.2 -0.2 0.2 +16 0.2 -0.2 0.2 +17 0.3571428571432532 0.5 -0.5 +18 0.2142857142865066 0.5 -0.5 +19 0.07142857142975945 0.5 -0.5 +20 -0.07142857142738357 0.5 -0.5 +21 -0.2142857142849224 0.5 -0.5 +22 -0.3571428571424612 0.5 -0.5 +23 -0.5 0.3571428571432532 -0.5 +24 -0.5 0.2142857142865066 -0.5 +25 -0.5 0.07142857142975945 -0.5 +26 -0.5 -0.07142857142738357 -0.5 +27 -0.5 -0.2142857142849224 -0.5 +28 -0.5 -0.3571428571424612 -0.5 +29 -0.3571428571432532 -0.5 -0.5 +30 -0.2142857142865066 -0.5 -0.5 +31 -0.07142857142975945 -0.5 -0.5 +32 0.07142857142738357 -0.5 -0.5 +33 0.2142857142849224 -0.5 -0.5 +34 0.3571428571424612 -0.5 -0.5 +35 0.5 -0.3571428571432532 -0.5 +36 0.5 -0.2142857142865066 -0.5 +37 0.5 -0.07142857142975945 -0.5 +38 0.5 0.07142857142738357 -0.5 +39 0.5 0.2142857142849224 -0.5 +40 0.5 0.3571428571424612 -0.5 +41 0.5 -0.3571428571432532 0.5 +42 0.5 -0.2142857142865066 0.5 +43 0.5 -0.07142857142975945 0.5 +44 0.5 0.07142857142738357 0.5 +45 0.5 0.2142857142849224 0.5 +46 0.5 0.3571428571424612 0.5 +47 0.3571428571432532 0.5 0.5 +48 0.2142857142865066 0.5 0.5 +49 0.07142857142975945 0.5 0.5 +50 -0.07142857142738357 0.5 0.5 +51 -0.2142857142849224 0.5 0.5 +52 -0.3571428571424612 0.5 0.5 +53 -0.5 0.3571428571432532 0.5 +54 -0.5 0.2142857142865066 0.5 +55 -0.5 0.07142857142975945 0.5 +56 -0.5 -0.07142857142738357 0.5 +57 -0.5 -0.2142857142849224 0.5 +58 -0.5 -0.3571428571424612 0.5 +59 -0.3571428571432532 -0.5 0.5 +60 -0.2142857142865066 -0.5 0.5 +61 -0.07142857142975945 -0.5 0.5 +62 0.07142857142738357 -0.5 0.5 +63 0.2142857142849224 -0.5 0.5 +64 0.3571428571424612 -0.5 0.5 +65 0.5 -0.5 -0.3571428571432532 +66 0.5 -0.5 -0.2142857142865066 +67 0.5 -0.5 -0.07142857142975945 +68 0.5 -0.5 0.07142857142738357 +69 0.5 -0.5 0.2142857142849224 +70 0.5 -0.5 0.3571428571424612 +71 0.5 0.5 -0.3571428571432532 +72 0.5 0.5 -0.2142857142865066 +73 0.5 0.5 -0.07142857142975945 +74 0.5 0.5 0.07142857142738357 +75 0.5 0.5 0.2142857142849224 +76 0.5 0.5 0.3571428571424612 +77 -0.5 0.5 -0.3571428571432532 +78 -0.5 0.5 -0.2142857142865066 +79 -0.5 0.5 -0.07142857142975945 +80 -0.5 0.5 0.07142857142738357 +81 -0.5 0.5 0.2142857142849224 +82 -0.5 0.5 0.3571428571424612 +83 -0.5 -0.5 -0.3571428571432532 +84 -0.5 -0.5 -0.2142857142865066 +85 -0.5 -0.5 -0.07142857142975945 +86 -0.5 -0.5 0.07142857142738357 +87 -0.5 -0.5 0.2142857142849224 +88 -0.5 -0.5 0.3571428571424612 +89 -0.1474332721339672 0.2216567507068885 -0.2216567507068885 +90 -0.09031909942240358 0.2364767010505748 -0.2364767010505748 +91 -0.03041911644443993 0.2440027431759114 -0.2440027431759114 +92 0.03041911644345088 0.244002743175973 -0.244002743175973 +93 0.09031909942176847 0.2364767010506962 -0.2364767010506962 +94 0.1474332721337505 0.2216567507069607 -0.2216567507069607 +95 0.2216567507068885 0.1474332721339672 -0.2216567507068885 +96 0.2364767010505748 0.09031909942240358 -0.2364767010505748 +97 0.2440027431759114 0.03041911644443993 -0.2440027431759114 +98 0.244002743175973 -0.03041911644345088 -0.244002743175973 +99 0.2364767010506962 -0.09031909942176847 -0.2364767010506962 +100 0.2216567507069607 -0.1474332721337505 -0.2216567507069607 +101 0.1474332721339672 -0.2216567507068885 -0.2216567507068885 +102 0.09031909942240358 -0.2364767010505748 -0.2364767010505748 +103 0.03041911644443993 -0.2440027431759114 -0.2440027431759114 +104 -0.03041911644345088 -0.244002743175973 -0.244002743175973 +105 -0.09031909942176847 -0.2364767010506962 -0.2364767010506962 +106 -0.1474332721337505 -0.2216567507069607 -0.2216567507069607 +107 -0.2216567507068885 -0.1474332721339672 -0.2216567507068885 +108 -0.2364767010505748 -0.09031909942240358 -0.2364767010505748 +109 -0.2440027431759114 -0.03041911644443993 -0.2440027431759114 +110 -0.244002743175973 0.03041911644345088 -0.244002743175973 +111 -0.2364767010506962 0.09031909942176847 -0.2364767010506962 +112 -0.2216567507069607 0.1474332721337505 -0.2216567507069607 +113 -0.1474332721339672 0.2216567507068885 0.2216567507068885 +114 -0.09031909942240358 0.2364767010505748 0.2364767010505748 +115 -0.03041911644443993 0.2440027431759114 0.2440027431759114 +116 0.03041911644345088 0.244002743175973 0.244002743175973 +117 0.09031909942176847 0.2364767010506962 0.2364767010506962 +118 0.1474332721337505 0.2216567507069607 0.2216567507069607 +119 0.2216567507068885 0.2216567507068885 0.1474332721339672 +120 0.2364767010505748 0.2364767010505748 0.09031909942240361 +121 0.2440027431759114 0.2440027431759114 0.03041911644444001 +122 0.244002743175973 0.244002743175973 -0.03041911644345077 +123 0.2364767010506962 0.2364767010506962 -0.09031909942176844 +124 0.2216567507069607 0.2216567507069607 -0.1474332721337504 +125 -0.2216567507068885 0.2216567507068885 -0.1474332721339672 +126 -0.2364767010505748 0.2364767010505748 -0.09031909942240361 +127 -0.2440027431759114 0.2440027431759114 -0.03041911644444001 +128 -0.244002743175973 0.244002743175973 0.03041911644345077 +129 -0.2364767010506962 0.2364767010506962 0.09031909942176844 +130 -0.2216567507069607 0.2216567507069607 0.1474332721337504 +131 -0.1474332721338868 -0.2216567507069153 0.2216567507069154 +132 -0.09031909942234323 -0.2364767010505864 0.2364767010505864 +133 -0.03041911644429762 -0.2440027431759203 0.2440027431759204 +134 0.03041911644345505 -0.2440027431759728 0.2440027431759729 +135 0.0903190994216333 -0.236476701050722 0.236476701050722 +136 0.1474332721337114 -0.2216567507069737 0.2216567507069738 +137 0.2216567507068848 -0.1474332721339787 0.2216567507068848 +138 0.2364767010505767 -0.09031909942239386 0.2364767010505768 +139 0.2440027431759136 -0.03041911644440559 0.2440027431759136 +140 0.244002743175969 0.03041911644351575 0.244002743175969 +141 0.2364767010506961 0.09031909942176899 0.2364767010506961 +142 0.221656750706967 0.1474332721337317 0.221656750706967 +143 -0.2216567507068881 0.1474332721339684 0.2216567507068882 +144 -0.2364767010505747 0.0903190994224045 0.2364767010505747 +145 -0.2440027431759117 0.0304191164444344 0.2440027431759117 +146 -0.2440027431759724 -0.03041911644346137 0.2440027431759724 +147 -0.2364767010506957 -0.09031909942177099 0.2364767010506957 +148 -0.2216567507069608 -0.1474332721337499 0.2216567507069609 +149 0.2216567507068885 -0.2216567507068885 -0.1474332721339672 +150 0.2364767010505748 -0.2364767010505748 -0.09031909942240361 +151 0.2440027431759114 -0.2440027431759114 -0.03041911644444001 +152 0.244002743175973 -0.244002743175973 0.03041911644345077 +153 0.2364767010506962 -0.2364767010506962 0.09031909942176844 +154 0.2216567507069607 -0.2216567507069607 0.1474332721337504 +155 -0.2216567507069033 -0.2216567507069033 0.1474332721339231 +156 -0.236476701050581 -0.236476701050581 0.09031909942237172 +157 -0.2440027431759109 -0.2440027431759109 0.03041911644444972 +158 -0.2440027431759716 -0.2440027431759716 -0.03041911644347436 +159 -0.2364767010506936 -0.2364767010506936 -0.09031909942178215 +160 -0.2216567507069927 -0.2216567507069927 -0.1474332721336544 +161 0.2491392444305696 0.2491392444305696 -0.2491392444305696 +162 0.3031924130913432 0.3031924130913432 -0.3031924130913432 +163 0.3626508984333672 0.3626508984333672 -0.3626508984333672 +164 0.4280552325108338 0.4280552325108338 -0.4280552325108338 +165 0.2491392444305696 0.2491392444305696 0.2491392444305696 +166 0.3031924130913432 0.3031924130913432 0.3031924130913432 +167 0.3626508984333672 0.3626508984333672 0.3626508984333672 +168 0.4280552325108338 0.4280552325108338 0.4280552325108338 +169 0.2491392444305696 -0.2491392444305696 -0.2491392444305696 +170 0.3031924130913432 -0.3031924130913432 -0.3031924130913432 +171 0.3626508984333672 -0.3626508984333672 -0.3626508984333672 +172 0.4280552325108338 -0.4280552325108338 -0.4280552325108338 +173 0.249139244430541 -0.249139244430541 0.2491392444305411 +174 0.3031924130913838 -0.3031924130913838 0.3031924130913838 +175 0.3626508984333941 -0.3626508984333941 0.3626508984333941 +176 0.4280552325108383 -0.4280552325108383 0.4280552325108383 +177 -0.249139244430541 -0.249139244430541 0.2491392444305411 +178 -0.3031924130913838 -0.3031924130913838 0.3031924130913838 +179 -0.3626508984333941 -0.3626508984333941 0.3626508984333941 +180 -0.4280552325108383 -0.4280552325108383 0.4280552325108383 +181 -0.2491392444305696 -0.2491392444305696 -0.2491392444305696 +182 -0.3031924130913432 -0.3031924130913432 -0.3031924130913432 +183 -0.3626508984333672 -0.3626508984333672 -0.3626508984333672 +184 -0.4280552325108338 -0.4280552325108338 -0.4280552325108338 +185 -0.2491392444305696 0.2491392444305696 -0.2491392444305696 +186 -0.3031924130913432 0.3031924130913432 -0.3031924130913432 +187 -0.3626508984333672 0.3626508984333672 -0.3626508984333672 +188 -0.4280552325108338 0.4280552325108338 -0.4280552325108338 +189 -0.2491392444305696 0.2491392444305696 0.2491392444305696 +190 -0.3031924130913432 0.3031924130913432 0.3031924130913432 +191 -0.3626508984333672 0.3626508984333672 0.3626508984333672 +192 -0.4280552325108338 0.4280552325108338 0.4280552325108338 +193 0.3571428571425744 -0.3571428571431401 -0.5 +194 0.2142857142851487 -0.3571428571430268 -0.5 +195 0.07142857142772296 -0.3571428571429137 -0.5 +196 -0.07142857142942005 -0.3571428571428006 -0.5 +197 -0.2142857142862802 -0.3571428571426875 -0.5 +198 -0.3571428571431401 -0.3571428571425744 -0.5 +199 0.3571428571426875 -0.2142857142862802 -0.5 +200 0.214285714285375 -0.2142857142860539 -0.5 +201 0.07142857142806242 -0.2142857142858276 -0.5 +202 -0.0714285714290806 -0.2142857142856013 -0.5 +203 -0.2142857142860539 -0.214285714285375 -0.5 +204 -0.357142857143027 -0.2142857142851487 -0.5 +205 0.3571428571428007 -0.07142857142942 -0.5 +206 0.2142857142856013 -0.0714285714290806 -0.5 +207 0.07142857142840181 -0.07142857142874121 -0.5 +208 -0.07142857142874121 -0.07142857142840181 -0.5 +209 -0.2142857142858277 -0.07142857142806236 -0.5 +210 -0.3571428571429137 -0.07142857142772299 -0.5 +211 0.3571428571429139 0.07142857142772299 -0.5 +212 0.2142857142858276 0.07142857142806236 -0.5 +213 0.07142857142874121 0.07142857142840181 -0.5 +214 -0.07142857142840181 0.07142857142874121 -0.5 +215 -0.2142857142856013 0.07142857142908066 -0.5 +216 -0.3571428571428006 0.07142857142942 -0.5 +217 0.357142857143027 0.2142857142851487 -0.5 +218 0.214285714286054 0.214285714285375 -0.5 +219 0.0714285714290806 0.2142857142856014 -0.5 +220 -0.0714285714280624 0.2142857142858276 -0.5 +221 -0.214285714285375 0.2142857142860539 -0.5 +222 -0.3571428571426875 0.2142857142862802 -0.5 +223 0.3571428571431402 0.3571428571425743 -0.5 +224 0.2142857142862802 0.3571428571426875 -0.5 +225 0.07142857142942007 0.3571428571428007 -0.5 +226 -0.07142857142772296 0.3571428571429138 -0.5 +227 -0.2142857142851487 0.357142857143027 -0.5 +228 -0.3571428571425744 0.3571428571431401 -0.5 +229 0.5 -0.3571428571432533 -0.3571428571432532 +230 0.5 -0.3571428571432532 -0.2142857142865066 +231 0.5 -0.3571428571432532 -0.07142857142975945 +232 0.5 -0.3571428571432532 0.07142857142738357 +233 0.5 -0.3571428571432532 0.2142857142849224 +234 0.5 -0.3571428571432532 0.3571428571424612 +235 0.5 -0.2142857142865066 -0.3571428571432532 +236 0.5 -0.2142857142865066 -0.2142857142865066 +237 0.5 -0.2142857142865066 -0.07142857142975945 +238 0.5 -0.2142857142865066 0.07142857142738357 +239 0.5 -0.2142857142865066 0.2142857142849224 +240 0.5 -0.2142857142865066 0.3571428571424612 +241 0.5 -0.07142857142975945 -0.3571428571432532 +242 0.5 -0.07142857142975945 -0.2142857142865066 +243 0.5 -0.07142857142975945 -0.07142857142975945 +244 0.5 -0.07142857142975945 0.07142857142738357 +245 0.5 -0.07142857142975945 0.2142857142849224 +246 0.5 -0.07142857142975945 0.3571428571424612 +247 0.5 0.07142857142738357 -0.3571428571432532 +248 0.5 0.07142857142738357 -0.2142857142865066 +249 0.5 0.07142857142738357 -0.07142857142975945 +250 0.5 0.07142857142738357 0.07142857142738357 +251 0.5 0.07142857142738357 0.2142857142849224 +252 0.5 0.07142857142738357 0.3571428571424612 +253 0.5 0.2142857142849224 -0.3571428571432532 +254 0.5 0.2142857142849222 -0.2142857142865066 +255 0.5 0.2142857142849224 -0.07142857142975945 +256 0.5 0.2142857142849224 0.07142857142738357 +257 0.5 0.2142857142849224 0.2142857142849224 +258 0.5 0.2142857142849224 0.3571428571424613 +259 0.5 0.3571428571424614 -0.3571428571432532 +260 0.5 0.3571428571424612 -0.2142857142865066 +261 0.5 0.3571428571424612 -0.07142857142975945 +262 0.5 0.3571428571424612 0.07142857142738357 +263 0.5 0.3571428571424613 0.2142857142849224 +264 0.5 0.3571428571424612 0.3571428571424612 +265 0.3571428571432533 0.5 -0.3571428571432532 +266 0.3571428571432532 0.5 -0.2142857142865066 +267 0.3571428571432532 0.5 -0.07142857142975945 +268 0.3571428571432532 0.5 0.07142857142738357 +269 0.3571428571432532 0.5 0.2142857142849224 +270 0.3571428571432532 0.5 0.3571428571424612 +271 0.2142857142865066 0.5 -0.3571428571432532 +272 0.2142857142865066 0.5 -0.2142857142865066 +273 0.2142857142865066 0.5 -0.07142857142975945 +274 0.2142857142865066 0.5 0.07142857142738357 +275 0.2142857142865066 0.5 0.2142857142849224 +276 0.2142857142865066 0.5 0.3571428571424612 +277 0.07142857142975945 0.5 -0.3571428571432532 +278 0.07142857142975945 0.5 -0.2142857142865066 +279 0.07142857142975945 0.5 -0.07142857142975945 +280 0.07142857142975945 0.5 0.07142857142738357 +281 0.07142857142975945 0.5 0.2142857142849224 +282 0.07142857142975945 0.5 0.3571428571424612 +283 -0.07142857142738357 0.5 -0.3571428571432532 +284 -0.07142857142738357 0.5 -0.2142857142865066 +285 -0.07142857142738357 0.5 -0.07142857142975945 +286 -0.07142857142738357 0.5 0.07142857142738357 +287 -0.07142857142738357 0.5 0.2142857142849224 +288 -0.07142857142738357 0.5 0.3571428571424612 +289 -0.2142857142849224 0.5 -0.3571428571432532 +290 -0.2142857142849222 0.5 -0.2142857142865066 +291 -0.2142857142849224 0.5 -0.07142857142975945 +292 -0.2142857142849224 0.5 0.07142857142738357 +293 -0.2142857142849224 0.5 0.2142857142849224 +294 -0.2142857142849224 0.5 0.3571428571424613 +295 -0.3571428571424614 0.5 -0.3571428571432532 +296 -0.3571428571424612 0.5 -0.2142857142865066 +297 -0.3571428571424612 0.5 -0.07142857142975945 +298 -0.3571428571424612 0.5 0.07142857142738357 +299 -0.3571428571424613 0.5 0.2142857142849224 +300 -0.3571428571424612 0.5 0.3571428571424612 +301 -0.5 0.3571428571432533 -0.3571428571432532 +302 -0.5 0.3571428571432532 -0.2142857142865066 +303 -0.5 0.3571428571432532 -0.07142857142975945 +304 -0.5 0.3571428571432532 0.07142857142738357 +305 -0.5 0.3571428571432532 0.2142857142849224 +306 -0.5 0.3571428571432532 0.3571428571424612 +307 -0.5 0.2142857142865066 -0.3571428571432532 +308 -0.5 0.2142857142865066 -0.2142857142865066 +309 -0.5 0.2142857142865066 -0.07142857142975945 +310 -0.5 0.2142857142865066 0.07142857142738357 +311 -0.5 0.2142857142865066 0.2142857142849224 +312 -0.5 0.2142857142865066 0.3571428571424612 +313 -0.5 0.07142857142975945 -0.3571428571432532 +314 -0.5 0.07142857142975945 -0.2142857142865066 +315 -0.5 0.07142857142975945 -0.07142857142975945 +316 -0.5 0.07142857142975945 0.07142857142738357 +317 -0.5 0.07142857142975945 0.2142857142849224 +318 -0.5 0.07142857142975945 0.3571428571424612 +319 -0.5 -0.07142857142738357 -0.3571428571432532 +320 -0.5 -0.07142857142738357 -0.2142857142865066 +321 -0.5 -0.07142857142738357 -0.07142857142975945 +322 -0.5 -0.07142857142738357 0.07142857142738357 +323 -0.5 -0.07142857142738357 0.2142857142849224 +324 -0.5 -0.07142857142738357 0.3571428571424612 +325 -0.5 -0.2142857142849224 -0.3571428571432532 +326 -0.5 -0.2142857142849222 -0.2142857142865066 +327 -0.5 -0.2142857142849224 -0.07142857142975945 +328 -0.5 -0.2142857142849224 0.07142857142738357 +329 -0.5 -0.2142857142849224 0.2142857142849224 +330 -0.5 -0.2142857142849224 0.3571428571424613 +331 -0.5 -0.3571428571424614 -0.3571428571432532 +332 -0.5 -0.3571428571424612 -0.2142857142865066 +333 -0.5 -0.3571428571424612 -0.07142857142975945 +334 -0.5 -0.3571428571424612 0.07142857142738357 +335 -0.5 -0.3571428571424613 0.2142857142849224 +336 -0.5 -0.3571428571424612 0.3571428571424612 +337 -0.3571428571432533 -0.5 -0.3571428571432532 +338 -0.3571428571432532 -0.5 -0.2142857142865066 +339 -0.3571428571432532 -0.5 -0.07142857142975945 +340 -0.3571428571432532 -0.5 0.07142857142738357 +341 -0.3571428571432532 -0.5 0.2142857142849224 +342 -0.3571428571432532 -0.5 0.3571428571424612 +343 -0.2142857142865066 -0.5 -0.3571428571432532 +344 -0.2142857142865066 -0.5 -0.2142857142865066 +345 -0.2142857142865066 -0.5 -0.07142857142975945 +346 -0.2142857142865066 -0.5 0.07142857142738357 +347 -0.2142857142865066 -0.5 0.2142857142849224 +348 -0.2142857142865066 -0.5 0.3571428571424612 +349 -0.07142857142975945 -0.5 -0.3571428571432532 +350 -0.07142857142975945 -0.5 -0.2142857142865066 +351 -0.07142857142975945 -0.5 -0.07142857142975945 +352 -0.07142857142975945 -0.5 0.07142857142738357 +353 -0.07142857142975945 -0.5 0.2142857142849224 +354 -0.07142857142975945 -0.5 0.3571428571424612 +355 0.07142857142738357 -0.5 -0.3571428571432532 +356 0.07142857142738357 -0.5 -0.2142857142865066 +357 0.07142857142738357 -0.5 -0.07142857142975945 +358 0.07142857142738357 -0.5 0.07142857142738357 +359 0.07142857142738357 -0.5 0.2142857142849224 +360 0.07142857142738357 -0.5 0.3571428571424612 +361 0.2142857142849224 -0.5 -0.3571428571432532 +362 0.2142857142849222 -0.5 -0.2142857142865066 +363 0.2142857142849224 -0.5 -0.07142857142975945 +364 0.2142857142849224 -0.5 0.07142857142738357 +365 0.2142857142849224 -0.5 0.2142857142849224 +366 0.2142857142849224 -0.5 0.3571428571424613 +367 0.3571428571424614 -0.5 -0.3571428571432532 +368 0.3571428571424612 -0.5 -0.2142857142865066 +369 0.3571428571424612 -0.5 -0.07142857142975945 +370 0.3571428571424612 -0.5 0.07142857142738357 +371 0.3571428571424613 -0.5 0.2142857142849224 +372 0.3571428571424612 -0.5 0.3571428571424612 +373 0.3571428571425744 -0.3571428571431401 0.5 +374 0.2142857142851487 -0.3571428571430268 0.5 +375 0.07142857142772296 -0.3571428571429137 0.5 +376 -0.07142857142942005 -0.3571428571428006 0.5 +377 -0.2142857142862802 -0.3571428571426875 0.5 +378 -0.3571428571431401 -0.3571428571425744 0.5 +379 0.3571428571426875 -0.2142857142862802 0.5 +380 0.214285714285375 -0.2142857142860539 0.5 +381 0.07142857142806242 -0.2142857142858276 0.5 +382 -0.0714285714290806 -0.2142857142856013 0.5 +383 -0.2142857142860539 -0.214285714285375 0.5 +384 -0.357142857143027 -0.2142857142851487 0.5 +385 0.3571428571428007 -0.07142857142942 0.5 +386 0.2142857142856013 -0.0714285714290806 0.5 +387 0.07142857142840181 -0.07142857142874121 0.5 +388 -0.07142857142874121 -0.07142857142840181 0.5 +389 -0.2142857142858277 -0.07142857142806236 0.5 +390 -0.3571428571429137 -0.07142857142772299 0.5 +391 0.3571428571429139 0.07142857142772299 0.5 +392 0.2142857142858276 0.07142857142806236 0.5 +393 0.07142857142874121 0.07142857142840181 0.5 +394 -0.07142857142840181 0.07142857142874121 0.5 +395 -0.2142857142856013 0.07142857142908066 0.5 +396 -0.3571428571428006 0.07142857142942 0.5 +397 0.357142857143027 0.2142857142851487 0.5 +398 0.214285714286054 0.214285714285375 0.5 +399 0.0714285714290806 0.2142857142856014 0.5 +400 -0.0714285714280624 0.2142857142858276 0.5 +401 -0.214285714285375 0.2142857142860539 0.5 +402 -0.3571428571426875 0.2142857142862802 0.5 +403 0.3571428571431402 0.3571428571425743 0.5 +404 0.2142857142862802 0.3571428571426875 0.5 +405 0.07142857142942007 0.3571428571428007 0.5 +406 -0.07142857142772296 0.3571428571429138 0.5 +407 -0.2142857142851487 0.357142857143027 0.5 +408 -0.3571428571425744 0.3571428571431401 0.5 +409 -0.168412729045123 0.1684127290449069 -0.2515438438746232 +410 -0.1840251665288072 0.1056499826353773 -0.2738116492284235 +411 -0.1924172158451904 0.03605238238461032 -0.2857898542124602 +412 -0.1924172158451068 -0.03605238238544776 -0.2857898542124109 +413 -0.1840251665286123 -0.1056499826359164 -0.2738116492283466 +414 -0.1684127290449069 -0.1684127290451231 -0.2515438438746231 +415 -0.1056499826359164 0.1840251665286123 -0.2738116492283466 +416 -0.1178729386221623 0.117872938621781 -0.3036641906469083 +417 -0.1247857852245938 0.04072386774933271 -0.3205777197520384 +418 -0.1247857852244522 -0.04072386774990223 -0.3205777197520211 +419 -0.117872938621781 -0.1178729386221623 -0.3036641906469082 +420 -0.1056499826353774 -0.1840251665288071 -0.2738116492284237 +421 -0.03605238238544779 0.1924172158451068 -0.2857898542124109 +422 -0.04072386774990237 0.1247857852244522 -0.3205777197520211 +423 -0.04344860409511681 0.04344860409491334 -0.3409170538479842 +424 -0.04344860409491342 -0.04344860409511676 -0.3409170538479842 +425 -0.04072386774933271 -0.1247857852245938 -0.3205777197520384 +426 -0.03605238238461032 -0.1924172158451903 -0.2857898542124603 +427 0.0360523823846103 0.1924172158451904 -0.2857898542124602 +428 0.04072386774933271 0.1247857852245938 -0.3205777197520384 +429 0.04344860409491334 0.04344860409511679 -0.3409170538479842 +430 0.04344860409511674 -0.04344860409491339 -0.3409170538479842 +431 0.04072386774990223 -0.1247857852244523 -0.3205777197520211 +432 0.03605238238544774 -0.1924172158451069 -0.2857898542124108 +433 0.1056499826353774 0.1840251665288071 -0.2738116492284237 +434 0.1178729386217809 0.1178729386221624 -0.3036641906469083 +435 0.1247857852244523 0.04072386774990237 -0.320577719752021 +436 0.1247857852245938 -0.04072386774933271 -0.3205777197520384 +437 0.1178729386221622 -0.1178729386217809 -0.3036641906469083 +438 0.1056499826359164 -0.1840251665286123 -0.2738116492283466 +439 0.1684127290449068 0.1684127290451229 -0.2515438438746232 +440 0.1840251665286123 0.1056499826359164 -0.2738116492283466 +441 0.1924172158451068 0.03605238238544775 -0.2857898542124109 +442 0.1924172158451903 -0.03605238238461032 -0.2857898542124603 +443 0.1840251665288071 -0.1056499826353774 -0.2738116492284237 +444 0.168412729045123 -0.1684127290449069 -0.2515438438746231 +445 -0.1684127290451558 0.2515438438746083 0.1684127290448964 +446 -0.1840251665288739 0.2738116492283849 0.1056499826353614 +447 -0.1924172158452907 0.2857898542123938 0.03605238238460135 +448 -0.1924172158452407 0.2857898542123223 -0.03605238238543585 +449 -0.1840251665287792 0.2738116492282497 -0.1056499826358767 +450 -0.1684127290451034 0.2515438438745335 -0.1684127290450603 +451 -0.1056499826360194 0.2738116492283196 0.1840251665285933 +452 -0.1178729386223859 0.3036641906468334 0.1178729386217503 +453 -0.1247857852249425 0.3205777197519049 0.04072386774931482 +454 -0.1247857852249173 0.3205777197518431 -0.04072386774987849 +455 -0.1178729386223399 0.3036641906467211 -0.1178729386220856 +456 -0.1056499826359956 0.2738116492282615 -0.1840251665286935 +457 -0.03605238238561466 0.2857898542123966 0.1924172158450968 +458 -0.04072386775027815 0.3205777197519799 0.1247857852244354 +459 -0.04344860409571683 0.340917053847909 0.04344860409490332 +460 -0.04344860409571349 0.3409170538478838 -0.04344860409510339 +461 -0.04072386775027215 0.3205777197519354 -0.1247857852245517 +462 -0.03605238238561159 0.2857898542123745 -0.1924172158451302 +463 0.03605238238444329 0.2857898542124746 0.1924172158452004 +464 0.04072386774895695 0.3205777197520795 0.1247857852246106 +465 0.04344860409431331 0.3409170538480593 0.04344860409512685 +466 0.04344860409431667 0.3409170538480844 -0.04344860409492691 +467 0.04072386774896288 0.3205777197521241 -0.1247857852244943 +468 0.03605238238444647 0.2857898542124968 -0.1924172158451669 +469 0.1056499826352743 0.2738116492284506 0.1840251665288261 +470 0.1178729386215574 0.3036641906469831 0.117872938622193 +471 0.1247857852241035 0.3205777197521547 0.04072386774992026 +472 0.1247857852241286 0.3205777197522164 -0.04072386774935659 +473 0.1178729386216034 0.3036641906470955 -0.1178729386218575 +474 0.1056499826352982 0.2738116492285088 -0.1840251665287259 +475 0.1684127290448741 0.2515438438746381 0.1684127290451335 +476 0.1840251665285456 0.2738116492283852 0.1056499826359323 +477 0.1924172158450065 0.2857898542124773 0.03605238238545672 +478 0.1924172158450564 0.2857898542125489 -0.03605238238462209 +479 0.1840251665286402 0.2738116492285205 -0.105649982635417 +480 0.1684127290449265 0.2515438438747128 -0.1684127290449696 +481 -0.1684127290450823 -0.1684127290449209 0.251543843874641 +482 -0.1840251665288119 -0.105649982635377 0.2738116492284206 +483 -0.1924172158452408 -0.03605238238461066 0.2857898542124263 +484 -0.192417215845203 0.03605238238544446 0.2857898542123465 +485 -0.1840251665287543 0.1056499826358835 0.2738116492282639 +486 -0.1684127290450919 0.1684127290450623 0.25154384387454 +487 -0.1056499826359598 -0.1840251665286073 0.2738116492283332 +488 -0.1178729386223328 -0.1178729386217564 0.3036641906468516 +489 -0.1247857852248984 -0.04072386774931409 0.3205777197519222 +490 -0.1247857852248832 0.04072386774989958 0.3205777197518537 +491 -0.1178729386223184 0.1178729386220897 0.3036641906467279 +492 -0.1056499826359868 0.1840251665286905 0.2738116492282669 +493 -0.03605238238546996 -0.1924172158451105 0.2857898542124057 +494 -0.04072386775014319 -0.1247857852244379 0.3205777197519961 +495 -0.04344860409560183 -0.04344860409489292 0.3409170538479249 +496 -0.04344860409562647 0.04344860409513956 0.3409170538478903 +497 -0.04072386775021801 0.1247857852245551 0.3205777197519409 +498 -0.03605238238558819 0.1924172158451238 0.2857898542123817 +499 0.03605238238444708 -0.1924172158452069 0.2857898542124697 +500 0.04072386774896121 -0.1247857852246046 0.3205777197520813 +501 0.0434486040943171 -0.0434486040951054 0.3409170538480616 +502 0.04344860409431838 0.04344860409497592 0.3409170538480779 +503 0.0407238677489646 0.1247857852244951 0.3205777197521236 +504 0.03605238238444816 0.1924172158451559 0.285789854212504 +505 0.1056499826351403 -0.184025166528859 0.2738116492284802 +506 0.1178729386214396 -0.1178729386222016 0.3036641906470256 +507 0.1247857852240058 -0.04072386774989675 0.3205777197521956 +508 0.1247857852240518 0.04072386774941997 0.3205777197522383 +509 0.1178729386215558 0.1178729386218648 0.3036641906471112 +510 0.1056499826352796 0.184025166528716 0.2738116492285226 +511 0.1684127290448354 -0.1684127290451551 0.2515438438746495 +512 0.184025166528517 -0.1056499826359303 0.2738116492284053 +513 0.1924172158449843 -0.03605238238542589 0.2857898542124962 +514 0.1924172158450344 0.03605238238468858 0.2857898542125554 +515 0.1840251665286281 0.1056499826354206 0.2738116492285274 +516 0.168412729044926 0.1684127290449547 0.251543843874723 +517 0.1684127290450693 -0.2515438438745579 -0.1684127290450581 +518 0.1840251665287 -0.2738116492282949 -0.1056499826358977 +519 0.1924172158451219 -0.2857898542124004 -0.03605238238545033 +520 0.1924172158451326 -0.2857898542124983 0.03605238238461702 +521 0.1840251665286777 -0.2738116492285006 0.1056499826354033 +522 0.1684127290449259 -0.251543843874717 0.1684127290449639 +523 0.1056499826358776 -0.2738116492283114 -0.184025166528687 +524 0.1178729386220682 -0.3036641906468102 -0.1178729386221277 +525 0.1247857852244938 -0.3205777197520041 -0.04072386774990916 +526 0.1247857852243782 -0.3205777197521204 0.04072386774934742 +527 0.1178729386217095 -0.3036641906470642 0.117872938621832 +528 0.1056499826352727 -0.2738116492285242 0.1840251665287176 +529 0.03605238238544932 -0.2857898542124181 -0.1924172158450957 +530 0.04072386774989759 -0.3205777197519735 -0.1247857852245759 +531 0.04344860409511592 -0.340917053847957 -0.04344860409512769 +532 0.04344860409491991 -0.340917053848008 0.04344860409492274 +533 0.04072386774934349 -0.3205777197520892 0.1247857852244598 +534 0.03605238238461934 -0.2857898542124956 0.1924172158451362 +535 -0.03605238238459459 -0.2857898542125238 -0.192417215845099 +536 -0.04072386774928415 -0.3205777197520849 -0.1247857852244899 +537 -0.04344860409483012 -0.3409170538480177 -0.04344860409493718 +538 -0.04344860409499823 -0.3409170538479725 0.04344860409512315 +539 -0.04072386774976254 -0.3205777197520004 0.1247857852245511 +540 -0.03605238238530302 -0.2857898542124191 0.1924172158451216 +541 -0.105649982635409 -0.2738116492285272 -0.1840251665286348 +542 -0.1178729386218042 -0.3036641906470237 -0.1178729386218418 +543 -0.1247857852244433 -0.3205777197520931 -0.04072386774936267 +544 -0.124785785224524 -0.3205777197519924 0.04072386774990793 +545 -0.117872938622067 -0.3036641906468232 0.1178729386220955 +546 -0.1056499826358417 -0.2738116492283236 0.1840251665286893 +547 -0.1684127290449749 -0.251543843874743 -0.168412729044876 +548 -0.1840251665286797 -0.2738116492284927 -0.1056499826354204 +549 -0.1924172158451182 -0.2857898542125051 -0.03605238238464049 +550 -0.19241721584509 -0.2857898542124208 0.0360523823854591 +551 -0.1840251665286563 -0.2738116492283326 0.1056499826358761 +552 -0.1684127290450105 -0.2515438438746 0.168412729045054 +553 -0.2515438438746297 0.1684127290449116 -0.1684127290451085 +554 -0.2738116492284407 0.1056499826353845 -0.1840251665287776 +555 -0.2857898542124898 0.03605238238461334 -0.192417215845146 +556 -0.2857898542124501 -0.03605238238545479 -0.1924172158450473 +557 -0.2738116492283894 -0.1056499826359344 -0.1840251665285383 +558 -0.2515438438746629 -0.1684127290451507 -0.1684127290448199 +559 -0.2738116492283457 0.1840251665286123 -0.1056499826359187 +560 -0.3036641906469066 0.1178729386217806 -0.117872938622167 +561 -0.3205777197520358 0.04072386774933021 -0.1247857852246015 +562 -0.3205777197520168 -0.04072386774990589 -0.1247857852244621 +563 -0.3036641906469039 -0.1178729386221615 -0.1178729386217929 +564 -0.2738116492284202 -0.1840251665288046 -0.1056499826353907 +565 -0.2857898542124102 0.1924172158451072 -0.03605238238545175 +566 -0.32057771975202 0.1247857852244523 -0.04072386774991131 +567 -0.3409170538479828 0.04344860409490978 -0.04344860409513108 +568 -0.340917053847981 -0.04344860409512288 -0.0434486040949324 +569 -0.3205777197520354 -0.1247857852245942 -0.04072386774935502 +570 -0.2857898542124583 -0.1924172158451888 -0.0360523823846341 +571 -0.2857898542124597 0.192417215845191 0.0360523823846118 +572 -0.3205777197520377 0.1247857852245942 0.04072386774933627 +573 -0.340917053847984 0.04344860409511215 0.04344860409491928 +574 -0.3409170538479821 -0.04344860409492184 0.04344860409512451 +575 -0.3205777197520194 -0.1247857852244537 0.04072386774991162 +576 -0.2857898542124103 -0.1924172158451059 0.03605238238545767 +577 -0.2738116492284244 0.184025166528809 0.1056499826353719 +578 -0.3036641906469118 0.1178729386221646 0.1178729386217696 +579 -0.3205777197520284 0.04072386774989795 0.1247857852244349 +580 -0.3205777197520462 -0.04072386774934392 0.1247857852245699 +581 -0.3036641906469169 -0.1178729386217871 0.1178729386221338 +582 -0.2738116492283549 -0.1840251665286177 0.1056499826358854 +583 -0.2515438438746257 0.1684127290451262 0.1684127290448999 +584 -0.2738116492283543 0.1056499826359205 0.1840251665285985 +585 -0.2857898542124249 0.03605238238544395 0.1924172158450867 +586 -0.2857898542124774 -0.0360523823846234 0.1924172158451624 +587 -0.2738116492284427 -0.105649982635388 0.1840251665287727 +588 -0.2515438438746416 -0.1684127290449192 0.1684127290450832 +589 0.251543843874631 0.1684127290448899 0.1684127290451284 +590 0.2738116492284235 0.1056499826353778 0.184025166528807 +591 0.2857898542124546 0.03605238238467598 0.1924172158451865 +592 0.2857898542124139 -0.03605238238541304 0.1924172158451089 +593 0.2738116492283491 -0.1056499826359068 0.1840251665286141 +594 0.2515438438746185 -0.1684127290451334 0.1684127290449035 +595 0.2738116492283549 0.1840251665285979 0.1056499826359199 +596 0.3036641906469081 0.1178729386217814 0.1178729386221623 +597 0.3205777197520316 0.0407238677493943 0.124785785224591 +598 0.3205777197520247 -0.04072386774986973 0.1247857852244537 +599 0.3036641906469112 -0.1178729386221538 0.1178729386217821 +600 0.2738116492284185 -0.184025166528816 0.1056499826353752 +601 0.2857898542124185 0.1924172158450953 0.0360523823854488 +602 0.320577719752021 0.1247857852244526 0.04072386774990245 +603 0.3409170538479776 0.04344860409496585 0.04344860409511594 +604 0.3409170538479876 -0.04344860409508894 0.04344860409491394 +605 0.3205777197520411 -0.1247857852245866 0.04072386774933306 +606 0.2857898542124556 -0.1924172158451976 0.03605238238460966 +607 0.2857898542124661 0.1924172158451816 -0.03605238238461109 +608 0.3205777197520382 0.124785785224594 -0.04072386774933263 +609 0.3409170538479792 0.04344860409515611 -0.04344860409491271 +610 0.3409170538479868 -0.04344860409489251 -0.04344860409511717 +611 0.3205777197520231 -0.1247857852244469 -0.04072386774990261 +612 0.2857898542124074 -0.1924172158451121 -0.03605238238544722 +613 0.273811649228427 0.1840251665288014 -0.1056499826353786 +614 0.3036641906469082 0.1178729386221625 -0.117872938621781 +615 0.3205777197520184 0.04072386774992697 -0.1247857852244511 +616 0.3205777197520398 -0.04072386774931966 -0.1247857852245944 +617 0.3036641906469094 -0.1178729386217776 -0.1178729386221627 +618 0.2738116492283446 -0.1840251665286158 -0.1056499826359156 +619 0.2515438438746245 0.1684127290451202 -0.1684127290449078 +620 0.2738116492283467 0.1056499826359165 -0.1840251665286122 +621 0.28578985421241 0.03605238238545867 -0.1924172158451061 +622 0.2857898542124608 -0.03605238238460449 -0.1924172158451908 +623 0.273811649228424 -0.1056499826353757 -0.1840251665288074 +624 0.2515438438746223 -0.1684127290449087 -0.1684127290451225 +625 -0.1817831739911862 0.2672486739155991 -0.2672486739155991 +626 -0.1106245187189356 0.2796411537179944 -0.2796411537179944 +627 -0.03713636188567761 0.2859344490980252 -0.2859344490980252 +628 0.03713636188523975 0.2859344490980768 -0.2859344490980768 +629 0.110624518718664 0.2796411537180958 -0.2796411537180958 +630 0.1817831739911347 0.2672486739156595 -0.2672486739156595 +631 -0.219568065885336 0.3173997892476934 -0.3173997892476934 +632 -0.1329604798571652 0.3271220514651835 -0.3271220514651835 +633 -0.04452533184194246 0.3320593254307181 -0.3320593254307181 +634 0.0445253318421109 0.3320593254307586 -0.3320593254307586 +635 0.1329604798572934 0.327122051465263 -0.327122051465263 +636 0.2195680658854663 0.3173997892477408 -0.3173997892477408 +637 -0.261131446839701 0.3725660159415127 -0.3725660159415127 +638 -0.1575300370328433 0.3793510388247375 -0.3793510388247375 +639 -0.05265319876856827 0.3827966892389629 -0.3827966892389629 +640 0.05265319876940359 0.3827966892389911 -0.3827966892389911 +641 0.1575300370334113 0.3793510388247929 -0.3793510388247929 +642 0.2611314468400313 0.3725660159415458 -0.3725660159415458 +643 -0.3068511660301758 0.4332488654914267 -0.4332488654914267 +644 -0.1845565500092459 0.4368029250970186 -0.4368029250970186 +645 -0.06159385241536584 0.4386077895997552 -0.4386077895997552 +646 0.0615938524169348 0.4386077895997699 -0.4386077895997699 +647 0.1845565500102979 0.4368029250970477 -0.4368029250970477 +648 0.3068511660307259 0.4332488654914441 -0.4332488654914441 +649 -0.2672486739155991 0.2672486739155991 -0.1817831739913159 +650 -0.2796411537179944 0.2796411537179944 -0.1106245187191951 +651 -0.2859344490980252 0.2859344490980252 -0.03713636188606684 +652 -0.2859344490980768 0.2859344490980768 0.03713636188485048 +653 -0.2796411537180959 0.2796411537180959 0.1106245187184045 +654 -0.2672486739156595 0.2672486739156595 0.181783173991005 +655 -0.3173997892476934 0.3173997892476934 -0.2195680658856084 +656 -0.3271220514651835 0.3271220514651835 -0.1329604798577101 +657 -0.3320593254307181 0.3320593254307181 -0.04452533184275977 +658 -0.3320593254307586 0.3320593254307586 0.04452533184129356 +659 -0.327122051465263 0.327122051465263 0.1329604798567485 +660 -0.3173997892477407 0.3173997892477407 0.2195680658851938 +661 -0.3725660159415127 0.3725660159415127 -0.2611314468401303 +662 -0.3793510388247375 0.3793510388247375 -0.1575300370337022 +663 -0.3827966892389629 0.3827966892389629 -0.05265319876985641 +664 -0.3827966892389911 0.3827966892389911 0.0526531987681154 +665 -0.3793510388247931 0.3793510388247931 0.1575300370325524 +666 -0.3725660159415458 0.3725660159415458 0.2611314468396017 +667 -0.4332488654914269 0.4332488654914269 -0.3068511660307779 +668 -0.4368029250970185 0.4368029250970185 -0.1845565500104503 +669 -0.4386077895997552 0.4386077895997552 -0.06159385241717196 +670 -0.4386077895997699 0.4386077895997699 0.06159385241512863 +671 -0.4368029250970477 0.4368029250970477 0.1845565500090936 +672 -0.4332488654914442 0.4332488654914442 0.3068511660301237 +673 -0.1817831739911862 0.2672486739155991 0.2672486739155991 +674 -0.1106245187189356 0.2796411537179944 0.2796411537179944 +675 -0.03713636188567761 0.2859344490980252 0.2859344490980252 +676 0.03713636188523975 0.2859344490980768 0.2859344490980768 +677 0.110624518718664 0.2796411537180958 0.2796411537180958 +678 0.1817831739911347 0.2672486739156595 0.2672486739156595 +679 -0.219568065885336 0.3173997892476934 0.3173997892476934 +680 -0.1329604798571652 0.3271220514651835 0.3271220514651835 +681 -0.04452533184194246 0.3320593254307181 0.3320593254307181 +682 0.0445253318421109 0.3320593254307586 0.3320593254307586 +683 0.1329604798572934 0.327122051465263 0.327122051465263 +684 0.2195680658854663 0.3173997892477408 0.3173997892477408 +685 -0.261131446839701 0.3725660159415127 0.3725660159415127 +686 -0.1575300370328433 0.3793510388247375 0.3793510388247375 +687 -0.05265319876856827 0.3827966892389629 0.3827966892389629 +688 0.05265319876940359 0.3827966892389911 0.3827966892389911 +689 0.1575300370334113 0.3793510388247929 0.3793510388247929 +690 0.2611314468400313 0.3725660159415458 0.3725660159415458 +691 -0.3068511660301758 0.4332488654914267 0.4332488654914267 +692 -0.1845565500092459 0.4368029250970186 0.4368029250970186 +693 -0.06159385241536584 0.4386077895997552 0.4386077895997552 +694 0.0615938524169348 0.4386077895997699 0.4386077895997699 +695 0.1845565500102979 0.4368029250970477 0.4368029250970477 +696 0.3068511660307259 0.4332488654914441 0.4332488654914441 +697 0.2672486739155991 0.2672486739155991 0.1817831739911862 +698 0.3173997892476935 0.3173997892476935 0.219568065885336 +699 0.3725660159415127 0.3725660159415127 0.261131446839701 +700 0.4332488654914269 0.4332488654914269 0.3068511660301758 +701 0.2796411537179945 0.2796411537179945 0.1106245187189356 +702 0.3271220514651834 0.3271220514651834 0.1329604798571651 +703 0.3793510388247374 0.3793510388247374 0.1575300370328432 +704 0.4368029250970186 0.4368029250970186 0.1845565500092459 +705 0.2859344490980253 0.2859344490980253 0.03713636188567768 +706 0.3320593254307181 0.3320593254307181 0.0445253318419425 +707 0.3827966892389629 0.3827966892389629 0.05265319876856835 +708 0.4386077895997552 0.4386077895997552 0.06159385241536588 +709 0.2859344490980769 0.2859344490980769 -0.03713636188523964 +710 0.3320593254307586 0.3320593254307586 -0.04452533184211078 +711 0.3827966892389911 0.3827966892389911 -0.05265319876940355 +712 0.4386077895997699 0.4386077895997699 -0.06159385241693471 +713 0.2796411537180958 0.2796411537180958 -0.110624518718664 +714 0.3271220514652631 0.3271220514652631 -0.1329604798572934 +715 0.3793510388247929 0.3793510388247929 -0.1575300370334113 +716 0.4368029250970476 0.4368029250970476 -0.1845565500102979 +717 0.2672486739156595 0.2672486739156595 -0.1817831739911346 +718 0.3173997892477408 0.3173997892477408 -0.2195680658854662 +719 0.3725660159415458 0.3725660159415458 -0.261131446840031 +720 0.4332488654914441 0.4332488654914441 -0.3068511660307258 +721 -0.267248673915589 -0.267248673915589 0.1817831739911253 +722 -0.2796411537179827 -0.2796411537179827 0.110624518718889 +723 -0.2859344490980129 -0.2859344490980129 0.03713636188566966 +724 -0.2859344490980679 -0.2859344490980679 -0.03713636188527181 +725 -0.2796411537180891 -0.2796411537180891 -0.110624518718684 +726 -0.2672486739156842 -0.2672486739156842 -0.1817831739910589 +727 -0.317399789247735 -0.317399789247735 0.2195680658853413 +728 -0.3271220514652117 -0.3271220514652117 0.1329604798571727 +729 -0.3320593254307351 -0.3320593254307351 0.04452533184197186 +730 -0.3320593254307692 -0.3320593254307692 -0.04452533184210862 +731 -0.3271220514652682 -0.3271220514652682 -0.1329604798572901 +732 -0.3173997892477646 -0.3173997892477646 -0.2195680658853968 +733 -0.3725660159415408 -0.3725660159415408 0.2611314468397034 +734 -0.3793510388247562 -0.3793510388247562 0.1575300370328475 +735 -0.3827966892389741 -0.3827966892389741 0.05265319876858802 +736 -0.3827966892389981 -0.3827966892389981 -0.05265319876940266 +737 -0.3793510388247965 -0.3793510388247965 -0.1575300370334095 +738 -0.3725660159415623 -0.3725660159415623 -0.2611314468399829 +739 -0.4332488654914341 -0.4332488654914341 0.3068511660301688 +740 -0.4368029250970228 -0.4368029250970228 0.1845565500092415 +741 -0.4386077895997571 -0.4386077895997571 0.06159385241537084 +742 -0.438607789599771 -0.438607789599771 -0.06159385241693846 +743 -0.4368029250970479 -0.4368029250970479 -0.1845565500102998 +744 -0.4332488654914523 -0.4332488654914523 -0.3068511660307021 +745 0.1817831739911862 -0.2672486739155991 -0.2672486739155991 +746 0.219568065885336 -0.3173997892476935 -0.3173997892476935 +747 0.261131446839701 -0.3725660159415127 -0.3725660159415127 +748 0.3068511660301758 -0.4332488654914269 -0.4332488654914269 +749 0.1106245187189355 -0.2796411537179945 -0.2796411537179945 +750 0.1329604798571651 -0.3271220514651834 -0.3271220514651834 +751 0.1575300370328432 -0.3793510388247374 -0.3793510388247374 +752 0.1845565500092459 -0.4368029250970186 -0.4368029250970186 +753 0.0371363618856776 -0.2859344490980253 -0.2859344490980253 +754 0.0445253318419425 -0.3320593254307181 -0.3320593254307181 +755 0.05265319876856826 -0.3827966892389629 -0.3827966892389629 +756 0.06159385241536582 -0.4386077895997552 -0.4386077895997552 +757 -0.0371363618852397 -0.2859344490980769 -0.2859344490980769 +758 -0.04452533184211083 -0.3320593254307586 -0.3320593254307586 +759 -0.05265319876940363 -0.3827966892389911 -0.3827966892389911 +760 -0.06159385241693476 -0.4386077895997699 -0.4386077895997699 +761 -0.110624518718664 -0.2796411537180958 -0.2796411537180958 +762 -0.1329604798572934 -0.3271220514652631 -0.3271220514652631 +763 -0.1575300370334113 -0.3793510388247929 -0.3793510388247929 +764 -0.1845565500102979 -0.4368029250970476 -0.4368029250970476 +765 -0.1817831739911347 -0.2672486739156594 -0.2672486739156594 +766 -0.2195680658854662 -0.3173997892477407 -0.3173997892477407 +767 -0.2611314468400311 -0.3725660159415458 -0.3725660159415458 +768 -0.3068511660307258 -0.4332488654914441 -0.4332488654914441 +769 0.267248673915595 -0.267248673915595 -0.18178317399132 +770 0.2796411537179862 -0.2796411537179862 -0.1106245187192033 +771 0.285934449098013 -0.285934449098013 -0.03713636188607911 +772 0.2859344490980605 -0.2859344490980605 0.03713636188483414 +773 0.2796411537180754 -0.2796411537180754 0.1106245187183841 +774 0.267248673915635 -0.267248673915635 0.1817831739909805 +775 0.3173997892476992 -0.3173997892476992 -0.2195680658856027 +776 0.3271220514651951 -0.3271220514651951 -0.1329604798576985 +777 0.3320593254307355 -0.3320593254307355 -0.04452533184274234 +778 0.3320593254307817 -0.3320593254307817 0.04452533184131678 +779 0.327122051465292 -0.327122051465292 0.1329604798567775 +780 0.3173997892477755 -0.3173997892477755 0.2195680658852287 +781 0.3725660159415166 -0.3725660159415166 -0.2611314468401266 +782 0.3793510388247452 -0.3793510388247452 -0.1575300370336945 +783 0.3827966892389745 -0.3827966892389745 -0.05265319876984489 +784 0.3827966892390065 -0.3827966892390065 0.0526531987681308 +785 0.3793510388248122 -0.3793510388248122 0.1575300370325716 +786 0.3725660159415689 -0.3725660159415689 0.2611314468396248 +787 0.4332488654914275 -0.4332488654914275 -0.3068511660307772 +788 0.4368029250970197 -0.4368029250970197 -0.184556550010449 +789 0.438607789599757 -0.438607789599757 -0.06159385241717 +790 0.4386077895997726 -0.4386077895997726 0.06159385241513124 +791 0.436802925097051 -0.436802925097051 0.1845565500090969 +792 0.4332488654914481 -0.4332488654914481 0.3068511660301275 +793 0.1817831739909523 -0.2672486739156438 0.2672486739156439 +794 0.1106245187182796 -0.2796411537180924 0.2796411537180925 +795 0.03713636188485016 -0.2859344490980523 0.2859344490980524 +796 -0.03713636188594389 -0.2859344490980084 0.2859344490980085 +797 -0.1106245187191328 -0.279641153717979 0.279641153717979 +798 -0.1817831739912288 -0.267248673915595 0.267248673915595 +799 0.2195680658851966 -0.3173997892477869 0.317399789247787 +800 0.1329604798566767 -0.3271220514653157 0.3271220514653157 +801 0.04452533184130191 -0.332059325430793 0.332059325430793 +802 -0.04452533184267189 -0.3320593254307586 0.3320593254307586 +803 -0.1329604798576873 -0.3271220514652268 0.3271220514652268 +804 -0.2195680658855842 -0.3173997892477486 0.3173997892477486 +805 0.2611314468396027 -0.3725660159415767 0.3725660159415767 +806 0.1575300370325017 -0.3793510388248286 0.3793510388248286 +807 0.05265319876812112 -0.3827966892390138 0.3827966892390138 +808 -0.05265319876979498 -0.3827966892389899 0.3827966892389899 +809 -0.1575300370336856 -0.3793510388247665 0.3793510388247665 +810 -0.2611314468401124 -0.37256601594155 0.37256601594155 +811 0.3068511660301174 -0.4332488654914515 0.4332488654914515 +812 0.1845565500090631 -0.4368029250970579 0.4368029250970578 +813 0.06159385241513034 -0.4386077895997738 0.4386077895997738 +814 -0.06159385241713846 -0.4386077895997613 0.4386077895997612 +815 -0.1845565500104376 -0.4368029250970253 0.4368029250970252 +816 -0.3068511660307617 -0.4332488654914374 0.4332488654914374 +817 -0.2672486739155947 0.181783173991321 0.2672486739155947 +818 -0.2796411537179861 0.110624518719204 0.2796411537179861 +819 -0.2859344490980133 0.03713636188607444 0.2859344490980133 +820 -0.28593444909806 -0.03713636188484301 0.28593444909806 +821 -0.279641153718075 -0.1106245187183862 0.279641153718075 +822 -0.2672486739156351 -0.18178317399098 0.2672486739156351 +823 -0.3173997892476989 0.2195680658856034 0.3173997892476989 +824 -0.327122051465195 0.1329604798576992 0.327122051465195 +825 -0.3320593254307359 0.04452533184273869 0.3320593254307359 +826 -0.3320593254307813 -0.04452533184132373 0.3320593254307813 +827 -0.3271220514652918 -0.1329604798567792 0.3271220514652918 +828 -0.3173997892477757 -0.2195680658852283 0.3173997892477757 +829 -0.3725660159415164 0.2611314468401271 0.3725660159415164 +830 -0.3793510388247451 0.1575300370336948 0.3793510388247451 +831 -0.3827966892389745 0.05265319876984233 0.3827966892389745 +832 -0.3827966892390062 -0.05265319876813567 0.3827966892390062 +833 -0.3793510388248121 -0.1575300370325728 0.3793510388248121 +834 -0.3725660159415689 -0.2611314468396246 0.3725660159415689 +835 -0.4332488654914275 0.3068511660307776 0.4332488654914275 +836 -0.4368029250970197 0.1845565500104492 0.4368029250970197 +837 -0.4386077895997572 0.06159385241716865 0.4386077895997572 +838 -0.4386077895997724 -0.06159385241513379 0.4386077895997724 +839 -0.4368029250970508 -0.1845565500090975 0.4368029250970508 +840 -0.4332488654914481 -0.3068511660301275 0.4332488654914481 +841 -0.2672486739156595 0.1817831739911347 -0.2672486739156595 +842 -0.2796411537180958 0.110624518718664 -0.2796411537180958 +843 -0.2859344490980769 0.03713636188523975 -0.2859344490980769 +844 -0.2859344490980253 -0.03713636188567761 -0.2859344490980253 +845 -0.2796411537179945 -0.1106245187189356 -0.2796411537179945 +846 -0.2672486739155991 -0.1817831739911862 -0.2672486739155991 +847 -0.3173997892477407 0.2195680658854663 -0.3173997892477407 +848 -0.3271220514652631 0.1329604798572935 -0.3271220514652631 +849 -0.3320593254307586 0.0445253318421109 -0.3320593254307586 +850 -0.3320593254307181 -0.04452533184194246 -0.3320593254307181 +851 -0.3271220514651834 -0.1329604798571652 -0.3271220514651834 +852 -0.3173997892476933 -0.2195680658853361 -0.3173997892476933 +853 -0.3725660159415458 0.2611314468400311 -0.3725660159415458 +854 -0.3793510388247931 0.1575300370334113 -0.3793510388247931 +855 -0.3827966892389911 0.0526531987694036 -0.3827966892389911 +856 -0.3827966892389629 -0.05265319876856828 -0.3827966892389629 +857 -0.3793510388247375 -0.1575300370328432 -0.3793510388247375 +858 -0.3725660159415127 -0.261131446839701 -0.3725660159415127 +859 -0.4332488654914441 0.3068511660307258 -0.4332488654914441 +860 -0.4368029250970477 0.1845565500102979 -0.4368029250970477 +861 -0.4386077895997699 0.06159385241693476 -0.4386077895997699 +862 -0.4386077895997552 -0.06159385241536584 -0.4386077895997552 +863 -0.4368029250970186 -0.184556550009246 -0.4368029250970186 +864 -0.4332488654914269 -0.3068511660301757 -0.4332488654914269 +865 0.2672486739155991 0.1817831739911862 -0.2672486739155991 +866 0.2796411537179944 0.1106245187189356 -0.2796411537179944 +867 0.2859344490980252 0.03713636188567761 -0.2859344490980252 +868 0.2859344490980768 -0.03713636188523975 -0.2859344490980768 +869 0.2796411537180958 -0.110624518718664 -0.2796411537180958 +870 0.2672486739156595 -0.1817831739911347 -0.2672486739156595 +871 0.3173997892476934 0.219568065885336 -0.3173997892476934 +872 0.3271220514651835 0.1329604798571652 -0.3271220514651835 +873 0.3320593254307181 0.04452533184194246 -0.3320593254307181 +874 0.3320593254307586 -0.0445253318421109 -0.3320593254307586 +875 0.327122051465263 -0.1329604798572934 -0.327122051465263 +876 0.3173997892477408 -0.2195680658854663 -0.3173997892477408 +877 0.3725660159415127 0.261131446839701 -0.3725660159415127 +878 0.3793510388247375 0.1575300370328433 -0.3793510388247375 +879 0.3827966892389629 0.05265319876856827 -0.3827966892389629 +880 0.3827966892389911 -0.05265319876940359 -0.3827966892389911 +881 0.3793510388247929 -0.1575300370334113 -0.3793510388247929 +882 0.3725660159415458 -0.2611314468400313 -0.3725660159415458 +883 0.4332488654914267 0.3068511660301758 -0.4332488654914267 +884 0.4368029250970186 0.1845565500092459 -0.4368029250970186 +885 0.4386077895997552 0.06159385241536584 -0.4386077895997552 +886 0.4386077895997699 -0.0615938524169348 -0.4386077895997699 +887 0.4368029250970477 -0.1845565500102979 -0.4368029250970477 +888 0.4332488654914441 -0.3068511660307259 -0.4332488654914441 +889 0.2672486739155715 -0.181783173991301 0.2672486739155716 +890 0.3173997892477258 -0.2195680658856509 0.3173997892477259 +891 0.3725660159415342 -0.2611314468401587 0.3725660159415343 +892 0.4332488654914298 -0.3068511660307844 0.43324886549143 +893 0.2796411537179757 -0.1106245187191665 0.2796411537179758 +894 0.3271220514652138 -0.1329604798577327 0.3271220514652139 +895 0.3793510388247578 -0.157530037033717 0.379351038824758 +896 0.4368029250970223 -0.1845565500104511 0.4368029250970225 +897 0.2859344490980109 -0.03713636188602171 0.285934449098011 +898 0.3320593254307427 -0.0445253318427604 0.3320593254307428 +899 0.3827966892389792 -0.05265319876985613 0.3827966892389794 +900 0.4386077895997585 -0.06159385241716628 0.4386077895997587 +901 0.2859344490980613 0.03713636188491708 0.2859344490980614 +902 0.3320593254307734 0.04452533184131877 0.3320593254307735 +903 0.3827966892390009 0.05265319876813366 0.382796689239001 +904 0.438607789599771 0.06159385241514233 0.4386077895997712 +905 0.2796411537180876 0.1106245187184131 0.2796411537180877 +906 0.3271220514652747 0.1329604798567373 0.3271220514652748 +907 0.3793510388248009 0.157530037032545 0.379351038824801 +908 0.4368029250970489 0.1845565500090925 0.436802925097049 +909 0.2672486739156607 0.1817831739909934 0.2672486739156608 +910 0.3173997892477508 0.2195680658851759 0.3173997892477509 +911 0.3725660159415526 0.2611314468395892 0.3725660159415527 +912 0.4332488654914464 0.3068511660301186 0.4332488654914465 +913 0.3118823731958045 0.4404162653877141 -0.3118823731958147 +914 0.2707364787003844 0.3862492339249757 -0.2707364787004039 +915 0.2333311201832754 0.3370064782012724 -0.2333311201833036 +916 0.1993262486983812 0.2922403364951137 -0.1993262486984171 +917 0.3156264838114877 0.4457564389832931 -0.1882331394376631 +918 0.2778843262392285 0.3964441107889961 -0.1645489804854699 +919 0.2435732740063817 0.3516147216593874 -0.1430179269588154 +920 0.2123814082431975 0.3108607314148777 -0.1234442418737392 +921 0.3176390306009115 0.4486290028916712 -0.06294479911140871 +922 0.2817264610189374 0.4019280964321206 -0.05523227882242283 +923 0.2490786705903228 0.3594727270540673 -0.0482208967630996 +924 0.2193988610175045 0.3208769365904072 -0.04184691305299226 +925 0.3176390306008995 0.4486290028916544 0.06294479910980287 +926 0.2817264610189145 0.4019280964320878 0.05523227882151691 +927 0.2490786705902903 0.3594727270540203 0.04822089676282994 +928 0.2193988610174627 0.3208769365903474 0.04184691305330096 +929 0.315626483811465 0.4457564389832606 0.1882331394365821 +930 0.2778843262391852 0.3964441107889342 0.164548980484847 +931 0.2435732740063197 0.3516147216592986 0.1430179269586085 +932 0.2123814082431185 0.3108607314147646 0.1234442418739105 +933 0.3118823731957919 0.4404162653876961 0.3118823731952517 +934 0.2707364787003601 0.3862492339249416 0.2707364787000495 +935 0.2333311201832409 0.3370064782012235 0.2333311201831386 +936 0.1993262486983372 0.2922403364950511 0.1993262486984245 +937 0.1882331394376345 0.4457564389832904 -0.3156264838115079 +938 0.1645489804854156 0.3964441107889906 -0.2778843262392676 +939 0.1430179269587375 0.3516147216593797 -0.2435732740064379 +940 0.1234442418736399 0.3108607314148678 -0.212381408243269 +941 0.1911643985258512 0.4529155528210268 -0.1911643985259121 +942 0.1701450205627737 0.4101115099334025 -0.1701450205628903 +943 0.1510364952005889 0.3711987437916556 -0.1510364952007556 +944 0.1336651084536945 0.3358235017346489 -0.133665108453907 +945 0.1928222089975411 0.4569716858839906 -0.06406509553939166 +946 0.1733099314631899 0.4178550366897678 -0.05737102654851602 +947 0.1555714973956314 0.3822944466226164 -0.0512855093028079 +948 0.139445648193178 0.3499666373701695 -0.04575322088042165 +949 0.192822208997535 0.4569716858839757 0.06406509553772072 +950 0.1733099314631784 0.4178550366897393 0.05737102654748599 +951 0.1555714973956149 0.3822944466225757 0.05128550930236052 +952 0.1394456481931571 0.349966637370118 0.04575322088050379 +953 0.1911643985258401 0.4529155528209999 0.1911643985247884 +954 0.1701450205627528 0.4101115099333511 0.1701450205621849 +955 0.1510364952005587 0.3711987437915818 0.1510364952004307 +956 0.1336651084536561 0.3358235017345552 0.1336651084539279 +957 0.1882331394376287 0.4457564389832764 0.31562648381093 +958 0.1645489804854046 0.3964441107889639 0.2778843262388842 +959 0.143017926958722 0.3516147216593417 0.2435732740062312 +960 0.1234442418736199 0.3108607314148191 0.2123814082432232 +961 0.06294479911136666 0.4486290028916589 -0.3176390306009378 +962 0.05523227882234241 0.4019280964320966 -0.2817264610189876 +963 0.04822089676298449 0.359472727054033 -0.2490786705903952 +964 0.04184691305284542 0.3208769365903635 -0.2193988610175968 +965 0.06406509553929729 0.4569716858839682 -0.1928222089976288 +966 0.05737102654833573 0.4178550366897256 -0.1733099314633573 +967 0.05128550930254969 0.3822944466225558 -0.1555714973958714 +968 0.04575322088009244 0.3499666373700924 -0.1394456481934838 +969 0.06471853061541648 0.4618493814253628 -0.06471853061556283 +970 0.0586184935118034 0.4271670009048712 -0.05861849351208279 +971 0.05307300525285437 0.3956375641650723 -0.05307300525325466 +972 0.04803165227450233 0.3669744397670647 -0.04803165227501248 +973 0.06471853061541563 0.4618493814253567 0.06471853061380456 +974 0.05861849351180189 0.4271670009048598 0.05861849351088629 +975 0.05307300525285219 0.3956375641650559 0.0530730052525686 +976 0.04803165227449949 0.3669744397670435 0.04803165227479055 +977 0.06406509553929583 0.4569716858839577 0.1928222089964523 +978 0.05737102654833298 0.417855036689705 0.1733099314625517 +979 0.05128550930254579 0.3822944466225266 0.1555714973954025 +980 0.04575322088008755 0.3499666373700554 0.1394456481933216 +981 0.06294479911136584 0.4486290028916535 0.3176390306003436 +982 0.05523227882234093 0.4019280964320864 0.2817264610185741 +983 0.04822089676298241 0.3594727270540183 0.2490786705901448 +984 0.04184691305284272 0.3208769365903449 0.2193988610174951 +985 -0.06294479910984002 0.4486290028916295 -0.3176390306009292 +986 -0.05523227882158774 0.4019280964320407 -0.2817264610189713 +987 -0.04822089676293149 0.3594727270539528 -0.2490786705903712 +988 -0.04184691305343046 0.3208769365902612 -0.2193988610175661 +989 -0.06406509553780509 0.4569716858839231 -0.1928222089976426 +990 -0.05737102654764713 0.417855036689639 -0.1733099314633836 +991 -0.05128550930259136 0.3822944466224321 -0.1555714973959088 +992 -0.04575322088079811 0.3499666373699346 -0.1394456481935318 +993 -0.06471853061394534 0.4618493814253147 -0.06471853061560506 +994 -0.05861849351115482 0.4271670009047794 -0.05861849351216351 +995 -0.05307300525295343 0.3956375641649407 -0.05307300525337041 +996 -0.04803165227528106 0.3669744397668968 -0.04803165227516007 +997 -0.06471853061394608 0.4618493814253208 0.06471853061375099 +998 -0.05861849351115638 0.4271670009047908 0.05861849351078393 +999 -0.05307300525295564 0.3956375641649572 0.05307300525242195 +1000 -0.04803165227528386 0.366974439766918 0.04803165227460365 +1001 -0.06406509553780655 0.4569716858839339 0.1928222089964102 +1002 -0.05737102654764992 0.4178550366896593 0.1733099314624715 +1003 -0.0512855093025953 0.3822944466224613 0.1555714973952877 +1004 -0.04575322088080307 0.3499666373699721 0.139445648193175 +1005 -0.06294479910984072 0.4486290028916348 0.3176390306003187 +1006 -0.05523227882158916 0.4019280964320509 0.2817264610185266 +1007 -0.04822089676293347 0.3594727270539674 0.2490786705900769 +1008 -0.04184691305343307 0.3208769365902798 0.2193988610174085 +1009 -0.1882331394365974 0.4457564389832311 -0.3156264838115005 +1010 -0.164548980484876 0.3964441107888775 -0.2778843262392529 +1011 -0.14301792695865 0.3516147216592175 -0.2435732740064167 +1012 -0.1234442418739635 0.310860731414661 -0.2123814082432421 +1013 -0.1911643985248234 0.4529155528209369 -0.1911643985259669 +1014 -0.1701450205622522 0.4101115099332314 -0.1701450205629949 +1015 -0.1510364952005272 0.3711987437914102 -0.1510364952009054 +1016 -0.133665108454051 0.3358235017343361 -0.1336651084540977 +1017 -0.192822208996526 0.4569716858839011 -0.06406509553951682 +1018 -0.1733099314626922 0.4178550366895969 -0.05737102654875495 +1019 -0.1555714973956038 0.3822944466223716 -0.05128550930315041 +1020 -0.1394456481935781 0.3499666373698574 -0.04575322088085806 +1021 -0.1928222089965319 0.4569716858839157 0.06406509553757553 +1022 -0.1733099314627037 0.417855036689625 0.05737102654720878 +1023 -0.1555714973956204 0.3822944466224119 0.05128550930196332 +1024 -0.1394456481935991 0.3499666373699094 0.04575322087999755 +1025 -0.1911643985248346 0.4529155528209639 0.1911643985246823 +1026 -0.1701450205622735 0.4101115099332829 0.1701450205619824 +1027 -0.1510364952005574 0.3711987437914839 0.1510364952001404 +1028 -0.1336651084540894 0.3358235017344299 0.1336651084535579 +1029 -0.1882331394366031 0.4457564389832448 0.3156264838108741 +1030 -0.1645489804848869 0.3964441107889042 0.2778843262387776 +1031 -0.1430179269586657 0.3516147216592558 0.2435732740060786 +1032 -0.1234442418739835 0.3108607314147096 0.2123814082430286 +1033 -0.3118823731952449 0.440416265387671 -0.3118823731958364 +1034 -0.2707364787000357 0.3862492339248936 -0.2707364787004452 +1035 -0.2333311201831188 0.3370064782011548 -0.2333311201833631 +1036 -0.1993262486983993 0.2922403364949636 -0.199326248698493 +1037 -0.3156264838109186 0.445756438983228 -0.1882331394377731 +1038 -0.2778843262388628 0.3964441107888722 -0.1645489804856805 +1039 -0.2435732740062005 0.3516147216592099 -0.143017926959117 +1040 -0.212381408243184 0.3108607314146511 -0.1234442418741236 +1041 -0.3176390306003534 0.4486290028916168 -0.06294479911160387 +1042 -0.2817264610185923 0.4019280964320169 -0.05523227882279534 +1043 -0.2490786705901713 0.3594727270539185 -0.04822089676363347 +1044 -0.2193988610175288 0.3208769365902178 -0.04184691305367265 +1045 -0.3176390306003653 0.448629002891634 0.06294479910959772 +1046 -0.2817264610186153 0.4019280964320493 0.05523227882112521 +1047 -0.249078670590204 0.3594727270539655 0.04822089676226875 +1048 -0.2193988610175705 0.3208769365902777 0.04184691305258571 +1049 -0.3156264838109415 0.4457564389832604 0.1882331394364453 +1050 -0.2778843262389063 0.3964441107889342 0.1645489804845856 +1051 -0.2435732740062626 0.3516147216592985 0.143017926958234 +1052 -0.2123814082432632 0.3108607314147643 0.1234442418734332 +1053 -0.3118823731952571 0.4404162653876888 0.3118823731951948 +1054 -0.2707364787000596 0.3862492339249278 0.2707364786999409 +1055 -0.2333311201831531 0.3370064782012037 0.2333311201829831 +1056 -0.1993262486984432 0.2922403364950263 0.1993262486982262 +1057 -0.1993262486984343 0.1993262486983462 -0.2922403364950387 +1058 -0.2333311201831705 0.2333311201832234 -0.3370064782012137 +1059 -0.2707364787001061 0.2707364787003137 -0.3862492339249345 +1060 -0.3118823731953357 0.3118823731957134 -0.4404162653876925 +1061 -0.2123814082432443 0.123444241873669 -0.3108607314147968 +1062 -0.2435732740062965 0.1430179269587117 -0.3516147216593241 +1063 -0.2778843262389981 0.1645489804853291 -0.3964441107889518 +1064 -0.3156264838110972 0.1882331394374813 -0.4457564389832699 +1065 -0.2193988610175426 0.04184691305292677 -0.3208769365903331 +1066 -0.249078670590255 0.04822089676297521 -0.359472727054009 +1067 -0.2817264610187534 0.0552322788222334 -0.4019280964320797 +1068 -0.3176390306005994 0.06294479911114786 -0.44862900289165 +1069 -0.2193988610174909 -0.04184691305334907 -0.3208769365902918 +1070 -0.2490786705902391 -0.04822089676294077 -0.3594727270539767 +1071 -0.2817264610187765 -0.05523227882169678 -0.4019280964320572 +1072 -0.3176390306006652 -0.06294479911005871 -0.4486290028916383 +1073 -0.2123814082431372 -0.1234442418739344 -0.3108607314147322 +1074 -0.2435732740062856 -0.1430179269586761 -0.3516147216592735 +1075 -0.2778843262390933 -0.1645489804849625 -0.3964441107889166 +1076 -0.3156264838113086 -0.1882331394367506 -0.4457564389832513 +1077 -0.199326248698346 -0.1993262486984341 -0.2922403364950384 +1078 -0.2333311201832234 -0.2333311201831706 -0.3370064782012135 +1079 -0.2707364787003137 -0.2707364787001063 -0.3862492339249345 +1080 -0.3118823731957136 -0.3118823731953355 -0.4404162653876925 +1081 -0.1234442418739344 0.2123814082431371 -0.3108607314147322 +1082 -0.143017926958676 0.2435732740062856 -0.3516147216592734 +1083 -0.1645489804849624 0.2778843262390933 -0.3964441107889165 +1084 -0.1882331394367504 0.3156264838113086 -0.4457564389832514 +1085 -0.1336651084539767 0.1336651084537691 -0.3358235017344924 +1086 -0.1510364952005664 0.1510364952005498 -0.3711987437915328 +1087 -0.1701450205624164 0.1701450205626099 -0.4101115099333172 +1088 -0.191164398525125 0.1911643985255498 -0.4529155528209819 +1089 -0.1394456481934188 0.0457532208802905 -0.3499666373700207 +1090 -0.1555714973956251 0.05128550930255885 -0.3822944466224995 +1091 -0.1733099314629122 0.05737102654813718 -0.417855036689686 +1092 -0.1928222089969643 0.06406509553886998 -0.4569716858839478 +1093 -0.1394456481933374 -0.04575322088059991 -0.3499666373700062 +1094 -0.15557149739561 -0.05128550930258216 -0.3822944466224884 +1095 -0.17330993146297 -0.05737102654784566 -0.4178550366896782 +1096 -0.1928222089971024 -0.06406509553823241 -0.4569716858839437 +1097 -0.133665108453769 -0.1336651084539766 -0.3358235017344926 +1098 -0.1510364952005497 -0.1510364952005664 -0.3711987437915328 +1099 -0.1701450205626099 -0.1701450205624163 -0.410111509933317 +1100 -0.1911643985255498 -0.191164398525125 -0.4529155528209818 +1101 -0.1234442418736689 -0.2123814082432445 -0.3108607314147967 +1102 -0.1430179269587115 -0.2435732740062966 -0.3516147216593238 +1103 -0.1645489804853291 -0.277884326238998 -0.3964441107889519 +1104 -0.1882331394374814 -0.3156264838110973 -0.44575643898327 +1105 -0.04184691305334906 0.219398861017491 -0.3208769365902917 +1106 -0.04822089676294081 0.2490786705902391 -0.3594727270539768 +1107 -0.05523227882169678 0.2817264610187764 -0.4019280964320572 +1108 -0.06294479911005871 0.3176390306006653 -0.4486290028916383 +1109 -0.04575322088060002 0.1394456481933375 -0.3499666373700062 +1110 -0.0512855093025823 0.1555714973956101 -0.3822944466224884 +1111 -0.05737102654784587 0.1733099314629701 -0.4178550366896783 +1112 -0.06406509553823247 0.1928222089971024 -0.4569716858839437 +1113 -0.04803165227494897 0.04803165227483429 -0.3669744397669807 +1114 -0.05307300525291227 0.05307300525289558 -0.3956375641650066 +1115 -0.05861849351143371 0.05861849351152451 -0.4271670009048252 +1116 -0.06471853061457628 0.0647185306147855 -0.4618493814253389 +1117 -0.04803165227483443 -0.0480316522749489 -0.3669744397669807 +1118 -0.05307300525289553 -0.05307300525291221 -0.3956375641650066 +1119 -0.05861849351152459 -0.05861849351143365 -0.4271670009048252 +1120 -0.06471853061478548 -0.06471853061457619 -0.4618493814253389 +1121 -0.04575322088029053 -0.1394456481934187 -0.3499666373700207 +1122 -0.05128550930255878 -0.155571497395625 -0.3822944466224995 +1123 -0.05737102654813717 -0.1733099314629121 -0.4178550366896863 +1124 -0.06406509553886994 -0.1928222089969644 -0.4569716858839478 +1125 -0.04184691305292669 -0.2193988610175425 -0.3208769365903333 +1126 -0.04822089676297509 -0.249078670590255 -0.3594727270540089 +1127 -0.05523227882223346 -0.2817264610187532 -0.4019280964320797 +1128 -0.06294479911114798 -0.3176390306005993 -0.4486290028916502 +1129 0.04184691305292679 0.2193988610175424 -0.3208769365903331 +1130 0.04822089676297522 0.2490786705902551 -0.359472727054009 +1131 0.05523227882223344 0.2817264610187532 -0.4019280964320798 +1132 0.06294479911114788 0.3176390306005995 -0.44862900289165 +1133 0.04575322088029053 0.1394456481934188 -0.3499666373700208 +1134 0.05128550930255885 0.1555714973956252 -0.3822944466224998 +1135 0.05737102654813705 0.1733099314629121 -0.4178550366896862 +1136 0.06406509553886994 0.1928222089969643 -0.4569716858839477 +1137 0.04803165227483432 0.04803165227494887 -0.3669744397669806 +1138 0.05307300525289553 0.05307300525291229 -0.3956375641650066 +1139 0.05861849351152452 0.05861849351143371 -0.4271670009048253 +1140 0.06471853061478543 0.06471853061457621 -0.4618493814253389 +1141 0.04803165227494882 -0.04803165227483449 -0.366974439766981 +1142 0.05307300525291225 -0.05307300525289559 -0.3956375641650067 +1143 0.05861849351143368 -0.05861849351152459 -0.4271670009048253 +1144 0.06471853061457621 -0.06471853061478547 -0.4618493814253389 +1145 0.0457532208805999 -0.1394456481933375 -0.3499666373700063 +1146 0.0512855093025822 -0.1555714973956101 -0.3822944466224882 +1147 0.05737102654784568 -0.17330993146297 -0.4178550366896782 +1148 0.06406509553823245 -0.1928222089971025 -0.4569716858839438 +1149 0.04184691305334909 -0.219398861017491 -0.3208769365902918 +1150 0.04822089676294088 -0.2490786705902392 -0.3594727270539764 +1151 0.05523227882169679 -0.2817264610187763 -0.4019280964320573 +1152 0.06294479911005857 -0.3176390306006655 -0.4486290028916383 +1153 0.123444241873669 0.2123814082432444 -0.3108607314147968 +1154 0.1430179269587115 0.2435732740062966 -0.3516147216593238 +1155 0.1645489804853292 0.2778843262389979 -0.3964441107889517 +1156 0.1882331394374813 0.3156264838110971 -0.4457564389832699 +1157 0.1336651084537689 0.1336651084539767 -0.3358235017344924 +1158 0.1510364952005498 0.1510364952005664 -0.3711987437915328 +1159 0.1701450205626099 0.1701450205624165 -0.4101115099333171 +1160 0.1911643985255498 0.1911643985251252 -0.4529155528209818 +1161 0.1394456481933375 0.04575322088059998 -0.3499666373700062 +1162 0.1555714973956102 0.05128550930258228 -0.3822944466224884 +1163 0.1733099314629701 0.0573710265478458 -0.4178550366896782 +1164 0.1928222089971026 0.0640650955382325 -0.4569716858839438 +1165 0.1394456481934187 -0.04575322088029055 -0.3499666373700208 +1166 0.1555714973956251 -0.0512855093025588 -0.3822944466224996 +1167 0.1733099314629121 -0.05737102654813704 -0.417855036689686 +1168 0.1928222089969644 -0.06406509553886995 -0.4569716858839477 +1169 0.1336651084539765 -0.133665108453769 -0.3358235017344925 +1170 0.1510364952005663 -0.1510364952005497 -0.3711987437915328 +1171 0.1701450205624162 -0.1701450205626098 -0.4101115099333168 +1172 0.191164398525125 -0.1911643985255498 -0.4529155528209818 +1173 0.1234442418739344 -0.212381408243137 -0.3108607314147323 +1174 0.143017926958676 -0.2435732740062856 -0.3516147216592734 +1175 0.1645489804849624 -0.2778843262390931 -0.3964441107889166 +1176 0.1882331394367504 -0.3156264838113086 -0.4457564389832513 +1177 0.1993262486983462 0.1993262486984343 -0.2922403364950387 +1178 0.2333311201832235 0.2333311201831706 -0.3370064782012135 +1179 0.2707364787003138 0.2707364787001061 -0.3862492339249346 +1180 0.3118823731957137 0.3118823731953353 -0.4404162653876926 +1181 0.2123814082431373 0.1234442418739344 -0.3108607314147323 +1182 0.2435732740062857 0.143017926958676 -0.3516147216592733 +1183 0.2778843262390933 0.1645489804849625 -0.3964441107889166 +1184 0.3156264838113088 0.1882331394367503 -0.4457564389832513 +1185 0.219398861017491 0.0418469130533491 -0.3208769365902918 +1186 0.2490786705902392 0.04822089676294083 -0.3594727270539767 +1187 0.2817264610187765 0.05523227882169672 -0.4019280964320572 +1188 0.3176390306006656 0.06294479911005865 -0.4486290028916383 +1189 0.2193988610175423 -0.04184691305292675 -0.3208769365903331 +1190 0.2490786705902551 -0.04822089676297519 -0.3594727270540092 +1191 0.2817264610187533 -0.05523227882223343 -0.40192809643208 +1192 0.3176390306005993 -0.06294479911114793 -0.4486290028916501 +1193 0.2123814082432444 -0.123444241873669 -0.3108607314147968 +1194 0.2435732740062966 -0.1430179269587115 -0.3516147216593239 +1195 0.2778843262389981 -0.164548980485329 -0.3964441107889519 +1196 0.3156264838110973 -0.1882331394374814 -0.44575643898327 +1197 0.1993262486984343 -0.1993262486983461 -0.2922403364950387 +1198 0.2333311201831706 -0.2333311201832235 -0.3370064782012137 +1199 0.2707364787001063 -0.2707364787003138 -0.3862492339249345 +1200 0.3118823731953355 -0.3118823731957137 -0.4404162653876926 +1201 -0.4404162653876943 0.3118823731958008 -0.3118823731958479 +1202 -0.386249233924938 0.2707364787003772 -0.2707364787004669 +1203 -0.3370064782012182 0.2333311201832651 -0.2333311201833937 +1204 -0.2922403364950438 0.199326248698369 -0.199326248698534 +1205 -0.4457564389832513 0.3156264838114805 -0.188233139437783 +1206 -0.3964441107889169 0.2778843262392151 -0.1645489804856985 +1207 -0.3516147216592738 0.2435732740063625 -0.1430179269591427 +1208 -0.3108607314147309 0.2123814082431748 -0.1234442418741599 +1209 -0.4486290028916384 0.3176390306009234 -0.06294479911160744 +1210 -0.4019280964320581 0.2817264610189594 -0.05523227882280098 +1211 -0.3594727270539778 0.2490786705903545 -0.04822089676364138 +1212 -0.3208769365902901 0.219398861017548 -0.04184691305368777 +1213 -0.4486290028916505 0.3176390306009434 0.06294479910960067 +1214 -0.4019280964320813 0.2817264610189971 0.0552322788211322 +1215 -0.3594727270540112 0.2490786705904087 0.04822089676227895 +1216 -0.3208769365903308 0.2193988610176187 0.04184691305259215 +1217 -0.4457564389832707 0.3156264838115277 0.1882331394364484 +1218 -0.3964441107889544 0.2778843262393036 0.1645489804845932 +1219 -0.3516147216593277 0.243573274006489 0.1430179269582449 +1220 -0.3108607314147949 0.2123814082433411 0.1234442418734391 +1221 -0.4404162653876937 0.3118823731958517 0.3118823731951962 +1222 -0.3862492339249388 0.2707364787004725 0.2707364786999458 +1223 -0.3370064782012198 0.2333311201834017 0.2333311201829901 +1224 -0.2922403364950377 0.1993262486985512 0.1993262486982257 +1225 -0.4457564389832741 0.1882331394376551 -0.31562648381152 +1226 -0.3964441107889602 0.1645489804854545 -0.2778843262392902 +1227 -0.351614721659336 0.1430179269587933 -0.24357327400647 +1228 -0.3108607314148104 0.1234442418737126 -0.2123814082433136 +1229 -0.4529155528209813 0.1911643985258933 -0.191164398525986 +1230 -0.4101115099333177 0.1701450205628538 -0.1701450205630298 +1231 -0.3711987437915338 0.1510364952007033 -0.1510364952009553 +1232 -0.3358235017344898 0.133665108453844 -0.1336651084541683 +1233 -0.4569716858839439 0.1928222089976183 -0.06406509553952419 +1234 -0.41785503668968 0.173309931463336 -0.05737102654876666 +1235 -0.3822944466224909 0.1555714973958404 -0.05128550930316686 +1236 -0.349966637370003 0.1394456481934509 -0.04575322088088905 +1237 -0.4569716858839482 0.1928222089976521 0.06406509553758136 +1238 -0.4178550366896893 0.1733099314633998 0.05737102654722289 +1239 -0.3822944466225042 0.1555714973959319 0.05128550930198397 +1240 -0.3499666373700168 0.1394456481935707 0.04575322088001088 +1241 -0.4529155528209834 0.191164398525985 0.1911643985246876 +1242 -0.4101115099333235 0.1701450205630264 0.1701450205619965 +1243 -0.3711987437915422 0.1510364952009502 0.1510364952001612 +1244 -0.3358235017344905 0.1336651084541686 0.1336651084535683 +1245 -0.4457564389832543 0.1882331394377827 0.3156264838108764 +1246 -0.3964441107889263 0.1645489804856944 0.2778843262387864 +1247 -0.3516147216592877 0.1430179269591366 0.2435732740060917 +1248 -0.3108607314147322 0.1234442418741666 0.2123814082430261 +1249 -0.4486290028916575 0.06294479911140644 -0.3176390306009325 +1250 -0.4019280964320943 0.05523227882241799 -0.2817264610189764 +1251 -0.3594727270540296 0.04822089676309264 -0.2490786705903788 +1252 -0.3208769365903569 0.04184691305298573 -0.2193988610175813 +1253 -0.4569716858839474 0.06406509553938494 -0.1928222089976538 +1254 -0.417855036689687 0.05737102654850199 -0.173309931463403 +1255 -0.3822944466225009 0.05128550930278779 -0.1555714973959363 +1256 -0.3499666373700167 0.04575322088040164 -0.1394456481935771 +1257 -0.4618493814253391 0.06471853061555809 -0.06471853061561091 +1258 -0.4271670009048277 0.05861849351207168 -0.0586184935121713 +1259 -0.3956375641650107 0.05307300525323851 -0.05307300525338103 +1260 -0.3669744397669763 0.04803165227500157 -0.0480316522751886 +1261 -0.4618493814253395 0.06471853061560628 0.06471853061375593 +1262 -0.42716700090483 0.05861849351216271 0.0586184935107977 +1263 -0.3956375641650138 0.05307300525336875 0.05307300525244232 +1264 -0.3669744397669756 0.04803165227517256 0.04803165227461003 +1265 -0.4569716858839468 0.06406509553952026 0.1928222089964117 +1266 -0.4178550366896885 0.05737102654875709 0.1733099314624793 +1267 -0.3822944466225034 0.05128550930315273 0.1555714973952996 +1268 -0.3499666373700051 0.04575322088088164 0.1394456481931661 +1269 -0.4486290028916432 0.06294479911160422 0.3176390306003178 +1270 -0.4019280964320728 0.05523227882278992 0.2817264610185315 +1271 -0.3594727270539996 0.04822089676362507 0.249078670590085 +1272 -0.320876936590294 0.04184691305368912 0.2193988610173898 +1273 -0.4486290028916479 -0.06294479910980266 -0.3176390306009088 +1274 -0.4019280964320764 -0.05523227882151707 -0.2817264610189306 +1275 -0.3594727270540039 -0.04822089676283035 -0.2490786705903133 +1276 -0.3208769365903234 -0.04184691305329825 -0.2193988610174995 +1277 -0.4569716858839432 -0.0640650955377178 -0.1928222089976203 +1278 -0.4178550366896789 -0.05737102654748204 -0.173309931463338 +1279 -0.3822944466224896 -0.05128550930235497 -0.1555714973958432 +1280 -0.3499666373700002 -0.04575322088048912 -0.1394456481934618 +1281 -0.4618493814253387 -0.06471853061380439 -0.06471853061556292 +1282 -0.4271670009048282 -0.05861849351088877 -0.05861849351207861 +1283 -0.3956375641650109 -0.05307300525257257 -0.05307300525324821 +1284 -0.3669744397669739 -0.04803165227478279 -0.04803165227502421 +1285 -0.4618493814253395 -0.06471853061375668 0.06471853061380557 +1286 -0.4271670009048307 -0.05861849351079896 0.05861849351089385 +1287 -0.3956375641650149 -0.05307300525244402 0.05307300525258019 +1288 -0.3669744397669724 -0.04803165227461233 0.04803165227477937 +1289 -0.4569716858839514 -0.06406509553758415 0.1928222089964444 +1290 -0.4178550366896989 -0.0573710265472312 0.1733099314625438 +1291 -0.3822944466225186 -0.0512855093019963 0.155571497395392 +1292 -0.3499666373700178 -0.04575322088001228 0.1394456481932762 +1293 -0.4486290028916564 -0.0629447991096051 0.3176390306003368 +1294 -0.4019280964320998 -0.05523227882114749 0.2817264610185695 +1295 -0.3594727270540387 -0.04822089676230155 0.2490786705901394 +1296 -0.320876936590335 -0.04184691305259134 0.2193988610174496 +1297 -0.4457564389832621 -0.1882331394365831 -0.3156264838114625 +1298 -0.3964441107889374 -0.1645489804848493 -0.2778843262391787 +1299 -0.3516147216593036 -0.1430179269586121 -0.2435732740063103 +1300 -0.3108607314147665 -0.1234442418739109 -0.2123814082431155 +1301 -0.4529155528209814 -0.1911643985247813 -0.1911643985258958 +1302 -0.4101115099333184 -0.1701450205621738 -0.170145020562855 +1303 -0.3711987437915349 -0.151036495200415 -0.1510364952007045 +1304 -0.3358235017344858 -0.1336651084538984 -0.1336651084538592 +1305 -0.4569716858839483 -0.1928222089964494 -0.06406509553938992 +1306 -0.41785503668969 -0.1733099314625496 -0.0573710265485069 +1307 -0.3822944466225059 -0.1555714973954 -0.0512855093027943 +1308 -0.3499666373700125 -0.1394456481933023 -0.04575322088042928 +1309 -0.4569716858839449 -0.1928222089964162 0.06406509553772052 +1310 -0.4178550366896856 -0.173309931462488 0.05737102654749289 +1311 -0.3822944466224997 -0.1555714973953121 0.0512855093023713 +1312 -0.3499666373699963 -0.1394456481931819 0.04575322088048508 +1313 -0.4529155528209863 -0.1911643985246931 0.1911643985247764 +1314 -0.4101115099333322 -0.1701450205620105 0.1701450205621714 +1315 -0.3711987437915559 -0.1510364952001819 0.1510364952004123 +1316 -0.3358235017344878 -0.1336651084535767 0.1336651084538643 +1317 -0.4457564389832771 -0.1882331394364543 0.3156264838109199 +1318 -0.3964441107889758 -0.164548980484613 0.2778843262388759 +1319 -0.3516147216593591 -0.1430179269582744 0.2435732740062207 +1320 -0.3108607314147966 -0.1234442418734395 0.2123814082431614 +1321 -0.4404162653877025 -0.3118823731952566 -0.3118823731957782 +1322 -0.3862492339249544 -0.2707364787000591 -0.2707364787003317 +1323 -0.337006478201242 -0.2333311201831525 -0.2333311201831998 +1324 -0.2922403364950701 -0.1993262486984372 -0.1993262486982958 +1325 -0.4457564389832698 -0.3156264838109255 -0.1882331394376554 +1326 -0.396444110788954 -0.2778843262388783 -0.164548980485451 +1327 -0.3516147216593275 -0.2435732740062231 -0.1430179269587876 +1328 -0.3108607314147898 -0.2123814082432013 -0.1234442418737245 +1329 -0.4486290028916509 -0.317639030600342 -0.06294479911140999 +1330 -0.4019280964320855 -0.2817264610185751 -0.05523227882241833 +1331 -0.3594727270540177 -0.249078670590147 -0.04822089676309228 +1332 -0.3208769365903247 -0.2193988610174787 -0.04184691305301291 +1333 -0.4486290028916398 -0.3176390306003228 0.06294479910980533 +1334 -0.4019280964320668 -0.2817264610185405 0.05523227882153033 +1335 -0.3594727270539911 -0.2490786705900978 0.04822089676285025 +1336 -0.320876936590281 -0.2193988610174059 0.04184691305328792 +1337 -0.4457564389832557 -0.3156264838108823 0.1882331394365737 +1338 -0.3964441107889341 -0.2778843262388025 0.1645489804848416 +1339 -0.3516147216592996 -0.2435732740061151 0.1430179269586023 +1340 -0.3108607314147249 -0.2123814082430346 0.1234442418738542 +1341 -0.4404162653877002 -0.3118823731952037 0.3118823731952428 +1342 -0.3862492339249615 -0.2707364786999697 0.2707364787000459 +1343 -0.3370064782012529 -0.2333311201830254 0.233331120183135 +1344 -0.2922403364950351 -0.1993262486982262 0.1993262486983617 +1345 0.311882373195269 -0.3118823731957768 0.4404162653877027 +1346 0.270736478699991 -0.270736478700449 0.386249233924968 +1347 0.2333311201830064 -0.2333311201834187 0.3370064782012634 +1348 0.1993262486981766 -0.199326248698531 0.2922403364950379 +1349 0.1882331394365659 -0.3156264838113711 0.4457564389832869 +1350 0.1645489804846169 -0.2778843262392263 0.3964441107889981 +1351 0.1430179269581813 -0.243573274006478 0.3516147216593917 +1352 0.1234442418732754 -0.2123814082433217 0.3108607314148227 +1353 0.06294479910981921 -0.3176390306006926 0.4486290028916557 +1354 0.05523227882124186 -0.2817264610188418 0.4019280964321037 +1355 0.04822089676228909 -0.2490786705903345 0.3594727270540449 +1356 0.041846913052509 -0.2193988610175539 0.3208769365903202 +1357 -0.06294479911135477 -0.3176390306005838 0.4486290028916405 +1358 -0.05523227882263014 -0.2817264610187365 0.4019280964320745 +1359 -0.04822089676354388 -0.2490786705902322 0.3594727270540028 +1360 -0.04184691305364228 -0.2193988610174546 0.3208769365902666 +1361 -0.1882331394376228 -0.315626483811053 0.4457564389832514 +1362 -0.1645489804856053 -0.2778843262389271 0.3964441107889309 +1363 -0.1430179269591082 -0.2435732740061963 0.3516147216592954 +1364 -0.1234442418741459 -0.2123814082430559 0.3108607314146997 +1365 -0.3118823731957586 -0.3118823731952905 0.4404162653877003 +1366 -0.2707364787004103 -0.270736478700035 0.386249233924964 +1367 -0.233331120183363 -0.2333311201830705 0.3370064782012576 +1368 -0.1993262486984757 -0.1993262486982426 0.2922403364950309 +1369 0.3156264838110299 -0.1882331394376169 0.4457564389832687 +1370 0.277884326238879 -0.1645489804856002 0.3964441107889616 +1371 0.2435732740061267 -0.1430179269591013 0.351614721659339 +1372 0.2123814082429876 -0.1234442418741123 0.3108607314147626 +1373 0.1911643985249531 -0.1911643985256534 0.4529155528210131 +1374 0.1701450205620936 -0.1701450205628196 0.4101115099333879 +1375 0.1510364952001043 -0.1510364952008513 0.3711987437916355 +1376 0.1336651084533639 -0.1336651084541027 0.335823501734573 +1377 0.06406509553800732 -0.1928222089971419 0.4569716858839612 +1378 0.05737102654741768 -0.1733099314630562 0.4178550366897223 +1379 0.05128550930196885 -0.1555714973957348 0.3822944466225526 +1380 0.04575322087981035 -0.1394456481934474 0.3499666373700392 +1381 -0.0640650955390647 -0.1928222089969299 0.4569716858839406 +1382 -0.05737102654851069 -0.1733099314628572 0.4178550366896835 +1383 -0.05128550930309446 -0.1555714973955476 0.3822944466224968 +1384 -0.04575322088096542 -0.139445648193271 0.3499666373699682 +1385 -0.1911643985256834 -0.1911643985250306 0.4529155528209712 +1386 -0.1701450205628705 -0.1701450205622475 0.4101115099333082 +1387 -0.1510364952009238 -0.1510364952003257 0.3711987437915213 +1388 -0.1336651084542219 -0.1336651084536192 0.3358235017344274 +1389 -0.3156264838113588 -0.1882331394366241 0.445756438983272 +1390 -0.277884326239198 -0.1645489804847334 0.3964441107889682 +1391 -0.2435732740064369 -0.1430179269583491 0.3516147216593489 +1392 -0.2123814082432897 -0.1234442418734645 0.3108607314147753 +1393 0.3176390306005519 -0.06294479911134587 0.4486290028916614 +1394 0.2817264610186699 -0.05523227882262107 0.4019280964321109 +1395 0.2490786705901361 -0.04822089676353173 0.3594727270540544 +1396 0.2193988610173587 -0.04184691305359357 0.3208769365903482 +1397 0.1928222089968248 -0.06406509553900741 0.456971685883988 +1398 0.1733099314626492 -0.05737102654840893 0.417855036689772 +1399 0.1555714973952489 -0.05128550930294926 0.3822944466226233 +1400 0.1394456481929204 -0.04575322088074781 0.349966637370138 +1401 0.06471853061438494 -0.06471853061483375 0.4618493814253596 +1402 0.05861849351106965 -0.05861849351162554 0.4271670009048738 +1403 0.05307300525239077 -0.05307300525304128 0.3956375641650773 +1404 0.04803165227427804 -0.04803165227498113 0.3669744397670318 +1405 -0.06471853061495086 -0.06471853061452477 0.4618493814253269 +1406 -0.05861849351184188 -0.05861849351134429 0.4271670009048112 +1407 -0.05307300525335035 -0.05307300525278515 0.3956375641649876 +1408 -0.04803165227540784 -0.04803165227474787 0.3669744397669176 +1409 -0.1928222089972106 -0.0640650955380936 0.4569716858839224 +1410 -0.1733099314631807 -0.05737102654759 0.4178550366896466 +1411 -0.1555714973959124 -0.05128550930221684 0.3822944466224439 +1412 -0.1394456481937038 -0.04575322088009381 0.3499666373699094 +1413 -0.3176390306006992 -0.06294479910986032 0.4486290028916441 +1414 -0.2817264610188484 -0.05523227882132782 0.4019280964320789 +1415 -0.2490786705903433 -0.04822089676241313 0.3594727270540084 +1416 -0.2193988610175918 -0.04184691305263398 0.3208769365902894 +1417 0.3176390306006495 0.06294479910987491 0.448629002891675 +1418 0.2817264610187515 0.05523227882133851 0.4019280964321343 +1419 0.2490786705902039 0.04822089676242663 0.3594727270540877 +1420 0.2193988610174219 0.04184691305272568 0.3208769365904015 +1421 0.1928222089970074 0.06406509553811507 0.4569716858839975 +1422 0.1733099314627916 0.05737102654761474 0.4178550366897881 +1423 0.1555714973953546 0.05128550930225045 0.3822944466226463 +1424 0.1394456481929975 0.04575322088020743 0.3499666373701775 +1425 0.06471853061464311 0.0647185306145408 0.4618493814253631 +1426 0.05861849351125385 0.05861849351135945 0.4271670009048784 +1427 0.0530730052525076 0.05307300525280498 0.3956375641650832 +1428 0.04803165227433528 0.04803165227484155 0.3669744397670488 +1429 -0.06471853061469873 0.06471853061483807 0.4618493814253181 +1430 -0.05861849351166856 0.0586184935116183 0.4271670009047922 +1431 -0.05307300525324901 0.05307300525302914 0.39563756416496 +1432 -0.04803165227537341 0.04803165227503399 0.3669744397668919 +1433 -0.1928222089970345 0.06406509553900423 0.4569716858839054 +1434 -0.1733099314630492 0.05737102654838649 0.4178550366896117 +1435 -0.1555714973958222 0.05128550930291535 0.382294446622394 +1436 -0.1394456481936555 0.04575322088077532 0.3499666373698556 +1437 -0.3176390306006038 0.06294479911134608 0.4486290028916243 +1438 -0.2817264610187672 0.05523227882260458 0.4019280964320385 +1439 -0.2490786705902755 0.04822089676350624 0.3594727270539506 +1440 -0.2193988610175443 0.04184691305363566 0.3208769365902268 +1441 0.3156264838113134 0.1882331394366305 0.445756438983296 +1442 0.277884326239106 0.1645489804847283 0.3964441107890065 +1443 0.243573274006304 0.1430179269583401 0.3516147216594029 +1444 0.2123814082431447 0.1234442418735274 0.3108607314148759 +1445 0.1911643985254963 0.1911643985250526 0.4529155528210315 +1446 0.1701450205625101 0.1701450205622733 0.4101115099334168 +1447 0.1510364952004069 0.151036495200361 0.3711987437916764 +1448 0.1336651084535772 0.1336651084537349 0.3358235017346551 +1449 0.06406509553878185 0.1928222089969397 0.4569716858839691 +1450 0.05737102654796969 0.1733099314628605 0.4178550366897318 +1451 0.05128550930231894 0.1555714973955505 0.3822944466225655 +1452 0.04575322087998152 0.1394456481933431 0.349966637370085 +1453 -0.06406509553830833 0.192822208997126 0.4569716858839254 +1454 -0.05737102654799132 0.1733099314630105 0.4178550366896483 +1455 -0.05128550930279093 0.1555714973956677 0.3822944466224457 +1456 -0.04575322088086291 0.1394456481934303 0.3499666373699325 +1457 -0.191164398525163 0.1911643985256226 0.4529155528209396 +1458 -0.170145020562491 0.1701450205627445 0.4101115099332413 +1459 -0.1510364952006736 0.1510364952007422 0.3711987437914249 +1460 -0.1336651084541037 0.1336651084540342 0.3358235017343346 +1461 -0.3156264838110856 0.1882331394376015 0.4457564389832324 +1462 -0.2778843262389794 0.1645489804855537 0.3964441107888856 +1463 -0.24357327400627 0.1430179269590329 0.35161472165923 +1464 -0.2123814082431946 0.1234442418740997 0.3108607314146554 +1465 0.3118823731957189 0.3118823731952944 0.4404162653877173 +1466 0.2707364787003254 0.2707364787000254 0.3862492339249843 +1467 0.2333311201832402 0.233331120183055 0.3370064782012844 +1468 0.1993262486983595 0.1993262486982975 0.2922403364951186 +1469 0.1882331394374582 0.3156264838110749 0.4457564389832944 +1470 0.1645489804852861 0.2778843262389529 0.3964441107890009 +1471 0.1430179269586498 0.2435732740062318 0.351614721659394 +1472 0.1234442418735856 0.2123814082431719 0.3108607314148758 +1473 0.06294479911110916 0.3176390306005906 0.4486290028916611 +1474 0.05523227882215988 0.2817264610187343 0.4019280964321034 +1475 0.04822089676286975 0.2490786705902276 0.3594727270540428 +1476 0.04184691305279067 0.2193988610175169 0.320876936590366 +1477 -0.06294479911009246 0.3176390306006689 0.4486290028916319 +1478 -0.05523227882176151 0.2817264610187809 0.4019280964320475 +1479 -0.04822089676303357 0.2490786705902455 0.3594727270539625 +1480 -0.04184691305346593 0.2193988610175086 0.3208769365902641 +1481 -0.1882331394367676 0.315626483811327 0.4457564389832331 +1482 -0.1645489804849962 0.2778843262391253 0.3964441107888836 +1483 -0.1430179269587246 0.2435732740063319 0.3516147216592262 +1484 -0.1234442418739915 0.2123814082432061 0.3108607314146621 +1485 -0.3118823731953284 0.3118823731957502 0.440416265387673 +1486 -0.2707364787000946 0.2707364787003816 0.3862492339249003 +1487 -0.2333311201831542 0.23333112018332 0.3370064782011644 +1488 -0.1993262486984054 0.19932624869848 0.2922403364949655 +1489 0.4404162653876931 -0.3118823731958006 -0.3118823731958507 +1490 0.3862492339249377 -0.2707364787003794 -0.2707364787004706 +1491 0.337006478201218 -0.2333311201832687 -0.2333311201833988 +1492 0.2922403364950345 -0.1993262486983627 -0.1993262486985485 +1493 0.445756438983252 -0.3156264838114828 -0.1882331394377815 +1494 0.396444110788922 -0.277884326239224 -0.1645489804856917 +1495 0.351614721659282 -0.2435732740063756 -0.1430179269591325 +1496 0.3108607314147236 -0.21238140824317 -0.1234442418741631 +1497 0.4486290028916389 -0.3176390306009263 -0.06294479911160487 +1498 0.4019280964320658 -0.2817264610189729 -0.05523227882279055 +1499 0.3594727270539892 -0.2490786705903744 -0.0482208967636259 +1500 0.3208769365902784 -0.2193988610175404 -0.04184691305369269 +1501 0.4486290028916513 -0.3176390306009474 0.06294479910960203 +1502 0.401928096432091 -0.2817264610190153 0.05523227882114238 +1503 0.3594727270540258 -0.2490786705904353 0.04822089676229428 +1504 0.3208769365903151 -0.2193988610176084 0.04184691305257872 +1505 0.4457564389832713 -0.3156264838115326 0.1882331394364515 +1506 0.3964441107889659 -0.2778843262393254 0.1645489804846086 +1507 0.3516147216593454 -0.243573274006522 0.1430179269582681 +1508 0.3108607314147748 -0.2123814082433269 0.1234442418734273 +1509 0.4404162653876949 -0.3118823731958574 0.3118823731952001 +1510 0.3862492339249524 -0.2707364787004986 0.2707364786999643 +1511 0.3370064782012404 -0.2333311201834409 0.2333311201830177 +1512 0.2922403364950137 -0.1993262486985331 0.1993262486982113 +1513 0.4457564389832706 -0.1882331394376534 -0.3156264838115274 +1514 0.3964441107889548 -0.1645489804854539 -0.2778843262393021 +1515 0.3516147216593281 -0.1430179269587925 -0.2435732740064872 +1516 0.3108607314147943 -0.1234442418737018 -0.2123814082433401 +1517 0.4529155528209828 -0.1911643985258939 -0.1911643985259845 +1518 0.410111509933323 -0.1701450205628592 -0.1701450205630243 +1519 0.371198743791542 -0.1510364952007115 -0.1510364952009475 +1520 0.3358235017344877 -0.1336651084538343 -0.133665108454168 +1521 0.4569716858839457 -0.1928222089976188 -0.06406509553952118 +1522 0.4178550366896874 -0.173309931463344 -0.05737102654875754 +1523 0.3822944466225021 -0.1555714973958526 -0.05128550930315359 +1524 0.3499666373699996 -0.1394456481934355 -0.04575322088088694 +1525 0.4569716858839505 -0.1928222089976527 0.06406509553758191 +1526 0.4178550366896986 -0.1733099314634107 0.05737102654722838 +1527 0.3822944466225181 -0.1555714973959482 0.05128550930199199 +1528 0.3499666373700115 -0.1394456481935492 0.04575322088000125 +1529 0.4529155528209848 -0.1911643985259856 0.1911643985246923 +1530 0.4101115099333322 -0.1701450205630398 0.170145020562011 +1531 0.3711987437915555 -0.1510364952009707 0.1510364952001821 +1532 0.3358235017344804 -0.1336651084541401 0.13366510845357 +1533 0.4457564389832548 -0.1882331394377832 0.3156264838108819 +1534 0.3964441107889345 -0.1645489804857108 0.2778843262388039 +1535 0.3516147216593 -0.1430179269591616 0.2435732740061171 +1536 0.3108607314147169 -0.1234442418741313 0.2123814082430286 +1537 0.4486290028916505 -0.06294479911140494 -0.317639030600943 +1538 0.4019280964320824 -0.05523227882241693 -0.2817264610189966 +1539 0.3594727270540127 -0.04822089676309139 -0.2490786705904077 +1540 0.3208769365903312 -0.04184691305297517 -0.219398861017619 +1541 0.4569716858839488 -0.06406509553938358 -0.192822208997652 +1542 0.4178550366896914 -0.0573710265485036 -0.1733099314633988 +1543 0.3822944466225072 -0.05128550930279041 -0.1555714973959302 +1544 0.3499666373700174 -0.04575322088038612 -0.139445648193572 +1545 0.4618493814253404 -0.06471853061555556 -0.06471853061560713 +1546 0.427167000904833 -0.05861849351207368 -0.05861849351216325 +1547 0.3956375641650183 -0.05307300525324205 -0.05307300525336951 +1548 0.3669744397669759 -0.04803165227497673 -0.04803165227517851 +1549 0.461849381425341 -0.06471853061560313 0.06471853061375527 +1550 0.4271670009048357 -0.05861849351216585 0.05861849351079761 +1551 0.3956375641650219 -0.05307300525337417 0.05307300525244218 +1552 0.3669744397669745 -0.04803165227513866 0.04803165227460329 +1553 0.4569716858839468 -0.06406509553951655 0.1928222089964168 +1554 0.4178550366896908 -0.05737102654876199 0.1733099314624909 +1555 0.3822944466225073 -0.05128550930316118 0.1555714973953163 +1556 0.3499666373699978 -0.04575322088083902 0.1394456481931788 +1557 0.4486290028916415 -0.06294479911160063 0.3176390306003242 +1558 0.4019280964320718 -0.0552322788227982 0.2817264610185453 +1559 0.3594727270539987 -0.04822089676363835 0.2490786705901047 +1560 0.3208769365902804 -0.04184691305363963 0.2193988610174047 +1561 0.4486290028916384 0.06294479910980305 -0.3176390306009231 +1562 0.4019280964320585 0.05523227882151607 -0.2817264610189584 +1563 0.3594727270539786 0.04822089676282879 -0.2490786705903529 +1564 0.3208769365902891 0.04184691305330437 -0.2193988610175476 +1565 0.4569716858839436 0.0640650955377218 -0.1928222089976179 +1566 0.4178550366896803 0.05737102654748571 -0.1733099314633342 +1567 0.3822944466224915 0.05128550930235992 -0.1555714973958379 +1568 0.3499666373700006 0.04575322088051293 -0.1394456481934511 +1569 0.4618493814253384 0.06471853061381089 -0.06471853061555838 +1570 0.427167000904828 0.05861849351089468 -0.05861849351207125 +1571 0.3956375641650108 0.05307300525258034 -0.0530730052532378 +1572 0.3669744397669715 0.04803165227482029 -0.0480316522750058 +1573 0.4618493814253383 0.06471853061376495 0.06471853061380324 +1574 0.4271670009048292 0.05861849351080593 0.05861849351088799 +1575 0.3956375641650122 0.05307300525245307 0.05307300525257147 +1576 0.3669744397669684 0.04803165227466299 0.04803165227477453 +1577 0.4569716858839478 0.06406509553759325 0.1928222089964491 +1578 0.4178550366896915 0.05737102654723689 0.1733099314625511 +1579 0.3822944466225076 0.051285509302003 0.1555714973954023 +1580 0.3499666373700063 0.04575322088007283 0.1394456481932965 +1581 0.4486290028916506 0.06294479910961399 0.3176390306003422 +1582 0.401928096432087 0.05523227882114952 0.2817264610185776 +1583 0.3594727270540203 0.04822089676230283 0.2490786705901509 +1584 0.3208769365903179 0.04184691305265859 0.2193988610174731 +1585 0.4457564389832518 0.1882331394365782 -0.3156264838114806 +1586 0.3964441107889176 0.1645489804848388 -0.2778843262392146 +1587 0.3516147216592754 0.1430179269585966 -0.2435732740063617 +1588 0.310860731414731 0.1234442418738986 -0.2123814082431752 +1589 0.4529155528209822 0.1911643985247805 -0.1911643985258934 +1590 0.4101115099333191 0.1701450205621687 -0.170145020562853 +1591 0.3711987437915362 0.1510364952004076 -0.1510364952007021 +1592 0.3358235017344901 0.1336651084539049 -0.1336651084538454 +1593 0.4569716858839483 0.1928222089964477 -0.06406509553938529 +1594 0.4178550366896896 0.1733099314625409 -0.05737102654850174 +1595 0.3822944466225047 0.1555714973953868 -0.05128550930278723 +1596 0.3499666373700173 0.1394456481933112 -0.04575322088040509 +1597 0.4569716858839445 0.1928222089964137 0.06406509553771726 +1598 0.4178550366896826 0.173309931462475 0.05737102654748234 +1599 0.382294446622495 0.1555714973952924 0.05128550930235551 +1600 0.3499666373700016 0.1394456481931942 0.04575322088048431 +1601 0.4529155528209829 0.1911643985246887 0.191164398524782 +1602 0.4101115099333223 0.170145020561991 0.1701450205621766 +1603 0.3711987437915412 0.1510364952001525 0.1510364952004191 +1604 0.3358235017344868 0.1336651084535898 0.1336651084538966 +1605 0.4457564389832711 0.1882331394364481 0.3156264838109266 +1606 0.3964441107889583 0.1645489804845866 0.2778843262388822 +1607 0.3516147216593338 0.143017926958235 0.2435732740062287 +1608 0.3108607314147893 0.1234442418734539 0.2123814082432003 +1609 0.440416265387693 0.3118823731952487 -0.3118823731957995 +1610 0.386249233924936 0.270736478700043 -0.2707364787003749 +1611 0.3370064782012153 0.2333311201831291 -0.2333311201832622 +1612 0.2922403364950393 0.1993262486984139 -0.1993262486983659 +1613 0.4457564389832706 0.3156264838109238 -0.1882331394376533 +1614 0.3964441107889544 0.2778843262388716 -0.1645489804854512 +1615 0.351614721659328 0.2435732740062135 -0.1430179269587885 +1616 0.3108607314147983 0.2123814082432038 -0.1234442418737081 +1617 0.4486290028916517 0.317639030600339 -0.06294479911140563 +1618 0.4019280964320844 0.2817264610185637 -0.05523227882241606 +1619 0.3594727270540156 0.2490786705901301 -0.04822089676308984 +1620 0.3208769365903362 0.2193988610174812 -0.0418469130529847 +1621 0.4486290028916404 0.3176390306003181 0.0629447991098015 +1622 0.401928096432063 0.2817264610185236 0.05523227882151555 +1623 0.3594727270539851 0.2490786705900728 0.04822089676282813 +1624 0.3208769365902959 0.2193988610174097 0.04184691305329214 +1625 0.445756438983254 0.3156264838108748 0.1882331394365798 +1626 0.396444110788923 0.2778843262387768 0.1645489804848442 +1627 0.3516147216592832 0.2435732740060775 0.1430179269586046 +1628 0.3108607314147365 0.2123814082430355 0.1234442418738974 +1629 0.4404162653876951 0.3118823731951929 0.3118823731952511 +1630 0.3862492339249417 0.2707364786999345 0.2707364787000507 +1631 0.3370064782012239 0.233331120182974 0.2333311201831403 +1632 0.2922403364950419 0.1993262486982243 0.1993262486984169 +1633 -0.3118823731958161 -0.4404162653877217 -0.3118823731957915 +1634 -0.2707364787004075 -0.3862492339249914 -0.2707364787003571 +1635 -0.2333311201833086 -0.3370064782012952 -0.2333311201832362 +1636 -0.1993262486984205 -0.2922403364951369 -0.199326248698343 +1637 -0.3156264838114974 -0.4457564389832873 -0.1882331394376626 +1638 -0.2778843262392494 -0.3964441107889882 -0.1645489804854642 +1639 -0.2435732740064117 -0.3516147216593759 -0.1430179269588063 +1640 -0.2123814082432277 -0.3108607314148497 -0.1234442418737499 +1641 -0.3176390306009271 -0.448629002891662 -0.06294479911141136 +1642 -0.2817264610189705 -0.4019280964321076 -0.05523227882242031 +1643 -0.2490786705903705 -0.3594727270540493 -0.04822089676309528 +1644 -0.2193988610175513 -0.3208769365903631 -0.0418469130530191 +1645 -0.3176390306009209 -0.4486290028916426 0.06294479910980579 +1646 -0.28172646101896 -0.4019280964320731 0.05523227882153215 +1647 -0.2490786705903561 -0.3594727270539996 0.04822089676285282 +1648 -0.2193988610175248 -0.3208769365902886 0.04184691305328801 +1649 -0.3156264838114932 -0.4457564389832505 0.1882331394365717 +1650 -0.2778843262392464 -0.3964441107889251 0.1645489804848388 +1651 -0.2435732740064087 -0.3516147216592869 0.1430179269585981 +1652 -0.2123814082431997 -0.3108607314147045 0.1234442418738451 +1653 -0.3118823731958269 -0.4404162653876904 0.311882373195236 +1654 -0.2707364787004372 -0.386249233924944 0.2707364787000343 +1655 -0.2333311201833522 -0.3370064782012282 0.2333311201831183 +1656 -0.199326248698436 -0.2922403364949985 0.1993262486983356 +1657 -0.1882331394376612 -0.4457564389832954 -0.3156264838114857 +1658 -0.1645489804854665 -0.396444110789001 -0.2778843262392222 +1659 -0.1430179269588104 -0.3516147216593949 -0.2435732740063725 +1660 -0.1234442418737323 -0.3108607314148814 -0.2123814082431968 +1661 -0.1911643985258996 -0.4529155528210101 -0.1911643985259072 +1662 -0.1701450205628667 -0.4101115099333743 -0.1701450205628761 +1663 -0.1510364952007219 -0.3711987437916155 -0.1510364952007348 +1664 -0.1336651084538616 -0.3358235017345842 -0.1336651084539014 +1665 -0.1928222089976168 -0.4569716858839624 -0.06406509553939146 +1666 -0.173309931463336 -0.4178550366897188 -0.05737102654850847 +1667 -0.1555714973958407 -0.3822944466225468 -0.05128550930279643 +1668 -0.1394456481934392 -0.349966637370059 -0.04575322088043763 +1669 -0.1928222089976364 -0.4569716858839388 0.06406509553772005 +1670 -0.1733099314633745 -0.4178550366896758 0.05737102654749379 +1671 -0.1555714973958961 -0.3822944466224857 0.05128550930237272 +1672 -0.1394456481935051 -0.3499666373699711 0.04575322088047935 +1673 -0.1911643985259634 -0.4529155528209639 0.1911643985247678 +1674 -0.1701450205629919 -0.4101115099332927 0.1701450205621571 +1675 -0.1510364952009017 -0.3711987437914994 0.151036495200392 +1676 -0.1336651084540764 -0.3358235017344062 0.133665108453829 +1677 -0.1882331394377661 -0.4457564389832492 0.3156264838109002 +1678 -0.1645489804856727 -0.3964441107889249 0.2778843262388417 +1679 -0.1430179269591063 -0.3516147216592871 0.2435732740061718 +1680 -0.1234442418740857 -0.3108607314146931 0.2123814082430877 +1681 -0.06294479911140216 -0.4486290028916658 -0.3176390306009209 +1682 -0.05523227882240969 -0.4019280964321112 -0.2817264610189533 +1683 -0.0482208967630807 -0.359472727054054 -0.2490786705903455 +1684 -0.04184691305296983 -0.3208769365903837 -0.2193988610175439 +1685 -0.06406509553937428 -0.4569716858839597 -0.1928222089976264 +1686 -0.0573710265484822 -0.4178550366897125 -0.1733099314633486 +1687 -0.05128550930275926 -0.3822944466225374 -0.1555714973958582 +1688 -0.04575322088036197 -0.3499666373700548 -0.1394456481934873 +1689 -0.06471853061553955 -0.4618493814253481 -0.06471853061556361 +1690 -0.05861849351203781 -0.4271670009048482 -0.05861849351207762 +1691 -0.05307300525319016 -0.39563756416504 -0.05307300525324644 +1692 -0.04803165227493246 -0.3669744397670009 -0.04803165227503164 +1693 -0.06471853061557994 -0.4618493814253378 0.06471853061380595 +1694 -0.05861849351211533 -0.4271670009048308 0.0586184935108976 +1695 -0.05307300525330125 -0.3956375641650154 0.05307300525258582 +1696 -0.04803165227507247 -0.3669744397669596 0.04803165227477366 +1697 -0.06406509553948909 -0.4569716858839413 0.1928222089964409 +1698 -0.05737102654870267 -0.4178550366896833 0.1733099314625407 +1699 -0.05128550930307551 -0.3822944466224967 0.1555714973953879 +1700 -0.0457532208807604 -0.3499666373699737 0.1394456481932547 +1701 -0.06294479911157246 -0.4486290028916435 0.3176390306003279 +1702 -0.05523227882273676 -0.4019280964320798 0.2817264610185573 +1703 -0.04822089676354945 -0.3594727270540101 0.2490786705901226 +1704 -0.04184691305355945 -0.320876936590279 0.2193988610174087 +1705 0.06294479910980125 -0.4486290028916406 -0.3176390306009203 +1706 0.0552322788215148 -0.401928096432063 -0.2817264610189517 +1707 0.04822089676282713 -0.3594727270539854 -0.2490786705903434 +1708 0.04184691305329332 -0.3208769365902951 -0.219398861017541 +1709 0.06406509553771561 -0.4569716858839331 -0.1928222089976473 +1710 0.05737102654747796 -0.4178550366896617 -0.1733099314633881 +1711 0.05128550930234932 -0.382294446622465 -0.1555714973959147 +1712 0.0457532208804822 -0.3499666373699612 -0.1394456481935593 +1713 0.06471853061380251 -0.4618493814253336 -0.06471853061560927 +1714 0.05861849351088458 -0.4271670009048212 -0.05861849351216489 +1715 0.05307300525256635 -0.3956375641650008 -0.05307300525337147 +1716 0.04803165227477785 -0.3669744397669495 -0.04803165227519098 +1717 0.06471853061375563 -0.4618493814253464 0.06471853061375789 +1718 0.05861849351079531 -0.4271670009048476 0.05861849351080578 +1719 0.0530730052524385 -0.3956375641650395 0.05307300525245436 +1720 0.0480316522746134 -0.3669744397669887 0.04803165227460603 +1721 0.0640650955375832 -0.4569716858839626 0.1928222089964188 +1722 0.05737102654722595 -0.4178550366897243 0.1733099314624988 +1723 0.05128550930198817 -0.3822944466225556 0.1555714973953281 +1724 0.04575322088001722 -0.3499666373700475 0.1394456481931783 +1725 0.06294479910960271 -0.4486290028916619 0.3176390306003313 +1726 0.05523227882113744 -0.401928096432115 0.2817264610185638 +1727 0.04822089676228656 -0.3594727270540607 0.2490786705901322 +1728 0.04184691305259652 -0.3208769365903426 0.2193988610174207 +1729 0.1882331394365694 -0.4457564389832435 -0.3156264838114982 +1730 0.1645489804848241 -0.3964441107889033 -0.2778843262392462 +1731 0.1430179269585758 -0.3516147216592546 -0.2435732740064072 +1732 0.1234442418738625 -0.3108607314146999 -0.2123814082432403 +1733 0.191164398524759 -0.4529155528209592 -0.1911643985259759 +1734 0.1701450205621318 -0.4101115099332778 -0.170145020563007 +1735 0.1510364952003551 -0.3711987437914774 -0.1510364952009225 +1736 0.1336651084538192 -0.3358235017344044 -0.1336651084541404 +1737 0.1928222089964252 -0.4569716858839409 -0.06406509553952248 +1738 0.1733099314625042 -0.4178550366896797 -0.0573710265487587 +1739 0.1555714973953348 -0.3822944466224907 -0.05128550930315508 +1740 0.1394456481932175 -0.3499666373699826 -0.04575322088089458 +1741 0.192822208996398 -0.4569716858839696 0.06406509553758562 +1742 0.1733099314624527 -0.4178550366897362 0.05737102654723732 +1743 0.1555714973952614 -0.3822944466225722 0.05128550930200501 +1744 0.1394456481931192 -0.3499666373700763 0.04575322088001055 +1745 0.1911643985246741 -0.4529155528210222 0.1911643985247047 +1746 0.1701450205619725 -0.4101115099334042 0.1701450205620366 +1747 0.151036495200127 -0.3711987437916597 0.1510364952002193 +1748 0.1336651084535142 -0.335823501734606 0.1336651084536085 +1749 0.1882331394364256 -0.4457564389832973 0.3156264838109072 +1750 0.1645489804845551 -0.3964441107890178 0.2778843262388548 +1751 0.143017926958191 -0.3516147216594198 0.2435732740061906 +1752 0.1234442418733483 -0.3108607314148598 0.2123814082431113 +1753 0.311882373195237 -0.4404162653876776 -0.3118823731958351 +1754 0.2707364787000234 -0.3862492339249078 -0.2707364787004408 +1755 0.2333311201831011 -0.3370064782011757 -0.2333311201833561 +1756 0.1993262486983677 -0.2922403364949805 -0.199326248698495 +1757 0.3156264838109005 -0.44575643898324 -0.1882331394377771 +1758 0.2778843262388323 -0.3964441107888995 -0.164548980485683 +1759 0.2435732740061574 -0.3516147216592496 -0.14301792695912 +1760 0.2123814082431115 -0.3108607314146818 -0.1234442418741488 +1761 0.3176390306003262 -0.4486290028916374 -0.06294479911160561 +1762 0.2817264610185468 -0.4019280964320629 -0.05523227882279128 +1763 0.2490786705901064 -0.3594727270539853 -0.04822089676362686 +1764 0.2193988610174203 -0.3208769365902723 -0.04184691305369618 +1765 0.3176390306003293 -0.4486290028916614 0.06294479910960381 +1766 0.2817264610185542 -0.401928096432111 0.05523227882114663 +1767 0.2490786705901173 -0.3594727270540546 0.04822089676230052 +1768 0.2193988610174263 -0.3208769365903504 0.04184691305258371 +1769 0.3156264838108969 -0.4457564389832914 0.1882331394364583 +1770 0.2778843262388304 -0.3964441107890043 0.1645489804846225 +1771 0.2435732740061548 -0.3516147216594007 0.1430179269582883 +1772 0.2123814082430843 -0.3108607314148424 0.1234442418734494 +1773 0.3118823731952049 -0.4404162653877187 0.3118823731952147 +1774 0.2707364786999709 -0.3862492339249989 0.2707364786999932 +1775 0.233331120183027 -0.3370064782013069 0.2333311201830595 +1776 0.1993262486982335 -0.2922403364950946 0.19932624869826 +$EndNodes +$Elements +1764 +1 3 2 5 6 4 35 193 34 +2 3 2 5 6 34 193 194 33 +3 3 2 5 6 33 194 195 32 +4 3 2 5 6 32 195 196 31 +5 3 2 5 6 31 196 197 30 +6 3 2 5 6 30 197 198 29 +7 3 2 5 6 29 198 28 3 +8 3 2 5 6 35 36 199 193 +9 3 2 5 6 193 199 200 194 +10 3 2 5 6 194 200 201 195 +11 3 2 5 6 195 201 202 196 +12 3 2 5 6 196 202 203 197 +13 3 2 5 6 197 203 204 198 +14 3 2 5 6 198 204 27 28 +15 3 2 5 6 36 37 205 199 +16 3 2 5 6 199 205 206 200 +17 3 2 5 6 200 206 207 201 +18 3 2 5 6 201 207 208 202 +19 3 2 5 6 202 208 209 203 +20 3 2 5 6 203 209 210 204 +21 3 2 5 6 204 210 26 27 +22 3 2 5 6 37 38 211 205 +23 3 2 5 6 205 211 212 206 +24 3 2 5 6 206 212 213 207 +25 3 2 5 6 207 213 214 208 +26 3 2 5 6 208 214 215 209 +27 3 2 5 6 209 215 216 210 +28 3 2 5 6 210 216 25 26 +29 3 2 5 6 38 39 217 211 +30 3 2 5 6 211 217 218 212 +31 3 2 5 6 212 218 219 213 +32 3 2 5 6 213 219 220 214 +33 3 2 5 6 214 220 221 215 +34 3 2 5 6 215 221 222 216 +35 3 2 5 6 216 222 24 25 +36 3 2 5 6 39 40 223 217 +37 3 2 5 6 217 223 224 218 +38 3 2 5 6 218 224 225 219 +39 3 2 5 6 219 225 226 220 +40 3 2 5 6 220 226 227 221 +41 3 2 5 6 221 227 228 222 +42 3 2 5 6 222 228 23 24 +43 3 2 5 6 40 1 17 223 +44 3 2 5 6 223 17 18 224 +45 3 2 5 6 224 18 19 225 +46 3 2 5 6 225 19 20 226 +47 3 2 5 6 226 20 21 227 +48 3 2 5 6 227 21 22 228 +49 3 2 5 6 228 22 2 23 +50 3 2 2 15 4 35 229 65 +51 3 2 2 15 65 229 230 66 +52 3 2 2 15 66 230 231 67 +53 3 2 2 15 67 231 232 68 +54 3 2 2 15 68 232 233 69 +55 3 2 2 15 69 233 234 70 +56 3 2 2 15 70 234 41 5 +57 3 2 2 15 35 36 235 229 +58 3 2 2 15 229 235 236 230 +59 3 2 2 15 230 236 237 231 +60 3 2 2 15 231 237 238 232 +61 3 2 2 15 232 238 239 233 +62 3 2 2 15 233 239 240 234 +63 3 2 2 15 234 240 42 41 +64 3 2 2 15 36 37 241 235 +65 3 2 2 15 235 241 242 236 +66 3 2 2 15 236 242 243 237 +67 3 2 2 15 237 243 244 238 +68 3 2 2 15 238 244 245 239 +69 3 2 2 15 239 245 246 240 +70 3 2 2 15 240 246 43 42 +71 3 2 2 15 37 38 247 241 +72 3 2 2 15 241 247 248 242 +73 3 2 2 15 242 248 249 243 +74 3 2 2 15 243 249 250 244 +75 3 2 2 15 244 250 251 245 +76 3 2 2 15 245 251 252 246 +77 3 2 2 15 246 252 44 43 +78 3 2 2 15 38 39 253 247 +79 3 2 2 15 247 253 254 248 +80 3 2 2 15 248 254 255 249 +81 3 2 2 15 249 255 256 250 +82 3 2 2 15 250 256 257 251 +83 3 2 2 15 251 257 258 252 +84 3 2 2 15 252 258 45 44 +85 3 2 2 15 39 40 259 253 +86 3 2 2 15 253 259 260 254 +87 3 2 2 15 254 260 261 255 +88 3 2 2 15 255 261 262 256 +89 3 2 2 15 256 262 263 257 +90 3 2 2 15 257 263 264 258 +91 3 2 2 15 258 264 46 45 +92 3 2 2 15 40 1 71 259 +93 3 2 2 15 259 71 72 260 +94 3 2 2 15 260 72 73 261 +95 3 2 2 15 261 73 74 262 +96 3 2 2 15 262 74 75 263 +97 3 2 2 15 263 75 76 264 +98 3 2 2 15 264 76 6 46 +99 3 2 3 19 1 17 265 71 +100 3 2 3 19 71 265 266 72 +101 3 2 3 19 72 266 267 73 +102 3 2 3 19 73 267 268 74 +103 3 2 3 19 74 268 269 75 +104 3 2 3 19 75 269 270 76 +105 3 2 3 19 76 270 47 6 +106 3 2 3 19 17 18 271 265 +107 3 2 3 19 265 271 272 266 +108 3 2 3 19 266 272 273 267 +109 3 2 3 19 267 273 274 268 +110 3 2 3 19 268 274 275 269 +111 3 2 3 19 269 275 276 270 +112 3 2 3 19 270 276 48 47 +113 3 2 3 19 18 19 277 271 +114 3 2 3 19 271 277 278 272 +115 3 2 3 19 272 278 279 273 +116 3 2 3 19 273 279 280 274 +117 3 2 3 19 274 280 281 275 +118 3 2 3 19 275 281 282 276 +119 3 2 3 19 276 282 49 48 +120 3 2 3 19 19 20 283 277 +121 3 2 3 19 277 283 284 278 +122 3 2 3 19 278 284 285 279 +123 3 2 3 19 279 285 286 280 +124 3 2 3 19 280 286 287 281 +125 3 2 3 19 281 287 288 282 +126 3 2 3 19 282 288 50 49 +127 3 2 3 19 20 21 289 283 +128 3 2 3 19 283 289 290 284 +129 3 2 3 19 284 290 291 285 +130 3 2 3 19 285 291 292 286 +131 3 2 3 19 286 292 293 287 +132 3 2 3 19 287 293 294 288 +133 3 2 3 19 288 294 51 50 +134 3 2 3 19 21 22 295 289 +135 3 2 3 19 289 295 296 290 +136 3 2 3 19 290 296 297 291 +137 3 2 3 19 291 297 298 292 +138 3 2 3 19 292 298 299 293 +139 3 2 3 19 293 299 300 294 +140 3 2 3 19 294 300 52 51 +141 3 2 3 19 22 2 77 295 +142 3 2 3 19 295 77 78 296 +143 3 2 3 19 296 78 79 297 +144 3 2 3 19 297 79 80 298 +145 3 2 3 19 298 80 81 299 +146 3 2 3 19 299 81 82 300 +147 3 2 3 19 300 82 7 52 +148 3 2 1 23 2 23 301 77 +149 3 2 1 23 77 301 302 78 +150 3 2 1 23 78 302 303 79 +151 3 2 1 23 79 303 304 80 +152 3 2 1 23 80 304 305 81 +153 3 2 1 23 81 305 306 82 +154 3 2 1 23 82 306 53 7 +155 3 2 1 23 23 24 307 301 +156 3 2 1 23 301 307 308 302 +157 3 2 1 23 302 308 309 303 +158 3 2 1 23 303 309 310 304 +159 3 2 1 23 304 310 311 305 +160 3 2 1 23 305 311 312 306 +161 3 2 1 23 306 312 54 53 +162 3 2 1 23 24 25 313 307 +163 3 2 1 23 307 313 314 308 +164 3 2 1 23 308 314 315 309 +165 3 2 1 23 309 315 316 310 +166 3 2 1 23 310 316 317 311 +167 3 2 1 23 311 317 318 312 +168 3 2 1 23 312 318 55 54 +169 3 2 1 23 25 26 319 313 +170 3 2 1 23 313 319 320 314 +171 3 2 1 23 314 320 321 315 +172 3 2 1 23 315 321 322 316 +173 3 2 1 23 316 322 323 317 +174 3 2 1 23 317 323 324 318 +175 3 2 1 23 318 324 56 55 +176 3 2 1 23 26 27 325 319 +177 3 2 1 23 319 325 326 320 +178 3 2 1 23 320 326 327 321 +179 3 2 1 23 321 327 328 322 +180 3 2 1 23 322 328 329 323 +181 3 2 1 23 323 329 330 324 +182 3 2 1 23 324 330 57 56 +183 3 2 1 23 27 28 331 325 +184 3 2 1 23 325 331 332 326 +185 3 2 1 23 326 332 333 327 +186 3 2 1 23 327 333 334 328 +187 3 2 1 23 328 334 335 329 +188 3 2 1 23 329 335 336 330 +189 3 2 1 23 330 336 58 57 +190 3 2 1 23 28 3 83 331 +191 3 2 1 23 331 83 84 332 +192 3 2 1 23 332 84 85 333 +193 3 2 1 23 333 85 86 334 +194 3 2 1 23 334 86 87 335 +195 3 2 1 23 335 87 88 336 +196 3 2 1 23 336 88 8 58 +197 3 2 4 27 3 29 337 83 +198 3 2 4 27 83 337 338 84 +199 3 2 4 27 84 338 339 85 +200 3 2 4 27 85 339 340 86 +201 3 2 4 27 86 340 341 87 +202 3 2 4 27 87 341 342 88 +203 3 2 4 27 88 342 59 8 +204 3 2 4 27 29 30 343 337 +205 3 2 4 27 337 343 344 338 +206 3 2 4 27 338 344 345 339 +207 3 2 4 27 339 345 346 340 +208 3 2 4 27 340 346 347 341 +209 3 2 4 27 341 347 348 342 +210 3 2 4 27 342 348 60 59 +211 3 2 4 27 30 31 349 343 +212 3 2 4 27 343 349 350 344 +213 3 2 4 27 344 350 351 345 +214 3 2 4 27 345 351 352 346 +215 3 2 4 27 346 352 353 347 +216 3 2 4 27 347 353 354 348 +217 3 2 4 27 348 354 61 60 +218 3 2 4 27 31 32 355 349 +219 3 2 4 27 349 355 356 350 +220 3 2 4 27 350 356 357 351 +221 3 2 4 27 351 357 358 352 +222 3 2 4 27 352 358 359 353 +223 3 2 4 27 353 359 360 354 +224 3 2 4 27 354 360 62 61 +225 3 2 4 27 32 33 361 355 +226 3 2 4 27 355 361 362 356 +227 3 2 4 27 356 362 363 357 +228 3 2 4 27 357 363 364 358 +229 3 2 4 27 358 364 365 359 +230 3 2 4 27 359 365 366 360 +231 3 2 4 27 360 366 63 62 +232 3 2 4 27 33 34 367 361 +233 3 2 4 27 361 367 368 362 +234 3 2 4 27 362 368 369 363 +235 3 2 4 27 363 369 370 364 +236 3 2 4 27 364 370 371 365 +237 3 2 4 27 365 371 372 366 +238 3 2 4 27 366 372 64 63 +239 3 2 4 27 34 4 65 367 +240 3 2 4 27 367 65 66 368 +241 3 2 4 27 368 66 67 369 +242 3 2 4 27 369 67 68 370 +243 3 2 4 27 370 68 69 371 +244 3 2 4 27 371 69 70 372 +245 3 2 4 27 372 70 5 64 +246 3 2 6 28 5 41 373 64 +247 3 2 6 28 64 373 374 63 +248 3 2 6 28 63 374 375 62 +249 3 2 6 28 62 375 376 61 +250 3 2 6 28 61 376 377 60 +251 3 2 6 28 60 377 378 59 +252 3 2 6 28 59 378 58 8 +253 3 2 6 28 41 42 379 373 +254 3 2 6 28 373 379 380 374 +255 3 2 6 28 374 380 381 375 +256 3 2 6 28 375 381 382 376 +257 3 2 6 28 376 382 383 377 +258 3 2 6 28 377 383 384 378 +259 3 2 6 28 378 384 57 58 +260 3 2 6 28 42 43 385 379 +261 3 2 6 28 379 385 386 380 +262 3 2 6 28 380 386 387 381 +263 3 2 6 28 381 387 388 382 +264 3 2 6 28 382 388 389 383 +265 3 2 6 28 383 389 390 384 +266 3 2 6 28 384 390 56 57 +267 3 2 6 28 43 44 391 385 +268 3 2 6 28 385 391 392 386 +269 3 2 6 28 386 392 393 387 +270 3 2 6 28 387 393 394 388 +271 3 2 6 28 388 394 395 389 +272 3 2 6 28 389 395 396 390 +273 3 2 6 28 390 396 55 56 +274 3 2 6 28 44 45 397 391 +275 3 2 6 28 391 397 398 392 +276 3 2 6 28 392 398 399 393 +277 3 2 6 28 393 399 400 394 +278 3 2 6 28 394 400 401 395 +279 3 2 6 28 395 401 402 396 +280 3 2 6 28 396 402 54 55 +281 3 2 6 28 45 46 403 397 +282 3 2 6 28 397 403 404 398 +283 3 2 6 28 398 404 405 399 +284 3 2 6 28 399 405 406 400 +285 3 2 6 28 400 406 407 401 +286 3 2 6 28 401 407 408 402 +287 3 2 6 28 402 408 53 54 +288 3 2 6 28 46 6 47 403 +289 3 2 6 28 403 47 48 404 +290 3 2 6 28 404 48 49 405 +291 3 2 6 28 405 49 50 406 +292 3 2 6 28 406 50 51 407 +293 3 2 6 28 407 51 52 408 +294 3 2 6 28 408 52 7 53 +295 5 2 11 85 265 17 1 71 913 648 164 720 +296 5 2 11 85 913 648 164 720 914 642 163 719 +297 5 2 11 85 914 642 163 719 915 636 162 718 +298 5 2 11 85 915 636 162 718 916 630 161 717 +299 5 2 11 85 916 630 161 717 480 94 9 124 +300 5 2 11 85 266 265 71 72 917 913 720 716 +301 5 2 11 85 917 913 720 716 918 914 719 715 +302 5 2 11 85 918 914 719 715 919 915 718 714 +303 5 2 11 85 919 915 718 714 920 916 717 713 +304 5 2 11 85 920 916 717 713 479 480 124 123 +305 5 2 11 85 267 266 72 73 921 917 716 712 +306 5 2 11 85 921 917 716 712 922 918 715 711 +307 5 2 11 85 922 918 715 711 923 919 714 710 +308 5 2 11 85 923 919 714 710 924 920 713 709 +309 5 2 11 85 924 920 713 709 478 479 123 122 +310 5 2 11 85 268 267 73 74 925 921 712 708 +311 5 2 11 85 925 921 712 708 926 922 711 707 +312 5 2 11 85 926 922 711 707 927 923 710 706 +313 5 2 11 85 927 923 710 706 928 924 709 705 +314 5 2 11 85 928 924 709 705 477 478 122 121 +315 5 2 11 85 269 268 74 75 929 925 708 704 +316 5 2 11 85 929 925 708 704 930 926 707 703 +317 5 2 11 85 930 926 707 703 931 927 706 702 +318 5 2 11 85 931 927 706 702 932 928 705 701 +319 5 2 11 85 932 928 705 701 476 477 121 120 +320 5 2 11 85 270 269 75 76 933 929 704 700 +321 5 2 11 85 933 929 704 700 934 930 703 699 +322 5 2 11 85 934 930 703 699 935 931 702 698 +323 5 2 11 85 935 931 702 698 936 932 701 697 +324 5 2 11 85 936 932 701 697 475 476 120 119 +325 5 2 11 85 47 270 76 6 696 933 700 168 +326 5 2 11 85 696 933 700 168 690 934 699 167 +327 5 2 11 85 690 934 699 167 684 935 698 166 +328 5 2 11 85 684 935 698 166 678 936 697 165 +329 5 2 11 85 678 936 697 165 118 475 119 14 +330 5 2 11 85 271 18 17 265 937 647 648 913 +331 5 2 11 85 937 647 648 913 938 641 642 914 +332 5 2 11 85 938 641 642 914 939 635 636 915 +333 5 2 11 85 939 635 636 915 940 629 630 916 +334 5 2 11 85 940 629 630 916 474 93 94 480 +335 5 2 11 85 272 271 265 266 941 937 913 917 +336 5 2 11 85 941 937 913 917 942 938 914 918 +337 5 2 11 85 942 938 914 918 943 939 915 919 +338 5 2 11 85 943 939 915 919 944 940 916 920 +339 5 2 11 85 944 940 916 920 473 474 480 479 +340 5 2 11 85 273 272 266 267 945 941 917 921 +341 5 2 11 85 945 941 917 921 946 942 918 922 +342 5 2 11 85 946 942 918 922 947 943 919 923 +343 5 2 11 85 947 943 919 923 948 944 920 924 +344 5 2 11 85 948 944 920 924 472 473 479 478 +345 5 2 11 85 274 273 267 268 949 945 921 925 +346 5 2 11 85 949 945 921 925 950 946 922 926 +347 5 2 11 85 950 946 922 926 951 947 923 927 +348 5 2 11 85 951 947 923 927 952 948 924 928 +349 5 2 11 85 952 948 924 928 471 472 478 477 +350 5 2 11 85 275 274 268 269 953 949 925 929 +351 5 2 11 85 953 949 925 929 954 950 926 930 +352 5 2 11 85 954 950 926 930 955 951 927 931 +353 5 2 11 85 955 951 927 931 956 952 928 932 +354 5 2 11 85 956 952 928 932 470 471 477 476 +355 5 2 11 85 276 275 269 270 957 953 929 933 +356 5 2 11 85 957 953 929 933 958 954 930 934 +357 5 2 11 85 958 954 930 934 959 955 931 935 +358 5 2 11 85 959 955 931 935 960 956 932 936 +359 5 2 11 85 960 956 932 936 469 470 476 475 +360 5 2 11 85 48 276 270 47 695 957 933 696 +361 5 2 11 85 695 957 933 696 689 958 934 690 +362 5 2 11 85 689 958 934 690 683 959 935 684 +363 5 2 11 85 683 959 935 684 677 960 936 678 +364 5 2 11 85 677 960 936 678 117 469 475 118 +365 5 2 11 85 277 19 18 271 961 646 647 937 +366 5 2 11 85 961 646 647 937 962 640 641 938 +367 5 2 11 85 962 640 641 938 963 634 635 939 +368 5 2 11 85 963 634 635 939 964 628 629 940 +369 5 2 11 85 964 628 629 940 468 92 93 474 +370 5 2 11 85 278 277 271 272 965 961 937 941 +371 5 2 11 85 965 961 937 941 966 962 938 942 +372 5 2 11 85 966 962 938 942 967 963 939 943 +373 5 2 11 85 967 963 939 943 968 964 940 944 +374 5 2 11 85 968 964 940 944 467 468 474 473 +375 5 2 11 85 279 278 272 273 969 965 941 945 +376 5 2 11 85 969 965 941 945 970 966 942 946 +377 5 2 11 85 970 966 942 946 971 967 943 947 +378 5 2 11 85 971 967 943 947 972 968 944 948 +379 5 2 11 85 972 968 944 948 466 467 473 472 +380 5 2 11 85 280 279 273 274 973 969 945 949 +381 5 2 11 85 973 969 945 949 974 970 946 950 +382 5 2 11 85 974 970 946 950 975 971 947 951 +383 5 2 11 85 975 971 947 951 976 972 948 952 +384 5 2 11 85 976 972 948 952 465 466 472 471 +385 5 2 11 85 281 280 274 275 977 973 949 953 +386 5 2 11 85 977 973 949 953 978 974 950 954 +387 5 2 11 85 978 974 950 954 979 975 951 955 +388 5 2 11 85 979 975 951 955 980 976 952 956 +389 5 2 11 85 980 976 952 956 464 465 471 470 +390 5 2 11 85 282 281 275 276 981 977 953 957 +391 5 2 11 85 981 977 953 957 982 978 954 958 +392 5 2 11 85 982 978 954 958 983 979 955 959 +393 5 2 11 85 983 979 955 959 984 980 956 960 +394 5 2 11 85 984 980 956 960 463 464 470 469 +395 5 2 11 85 49 282 276 48 694 981 957 695 +396 5 2 11 85 694 981 957 695 688 982 958 689 +397 5 2 11 85 688 982 958 689 682 983 959 683 +398 5 2 11 85 682 983 959 683 676 984 960 677 +399 5 2 11 85 676 984 960 677 116 463 469 117 +400 5 2 11 85 283 20 19 277 985 645 646 961 +401 5 2 11 85 985 645 646 961 986 639 640 962 +402 5 2 11 85 986 639 640 962 987 633 634 963 +403 5 2 11 85 987 633 634 963 988 627 628 964 +404 5 2 11 85 988 627 628 964 462 91 92 468 +405 5 2 11 85 284 283 277 278 989 985 961 965 +406 5 2 11 85 989 985 961 965 990 986 962 966 +407 5 2 11 85 990 986 962 966 991 987 963 967 +408 5 2 11 85 991 987 963 967 992 988 964 968 +409 5 2 11 85 992 988 964 968 461 462 468 467 +410 5 2 11 85 285 284 278 279 993 989 965 969 +411 5 2 11 85 993 989 965 969 994 990 966 970 +412 5 2 11 85 994 990 966 970 995 991 967 971 +413 5 2 11 85 995 991 967 971 996 992 968 972 +414 5 2 11 85 996 992 968 972 460 461 467 466 +415 5 2 11 85 286 285 279 280 997 993 969 973 +416 5 2 11 85 997 993 969 973 998 994 970 974 +417 5 2 11 85 998 994 970 974 999 995 971 975 +418 5 2 11 85 999 995 971 975 1000 996 972 976 +419 5 2 11 85 1000 996 972 976 459 460 466 465 +420 5 2 11 85 287 286 280 281 1001 997 973 977 +421 5 2 11 85 1001 997 973 977 1002 998 974 978 +422 5 2 11 85 1002 998 974 978 1003 999 975 979 +423 5 2 11 85 1003 999 975 979 1004 1000 976 980 +424 5 2 11 85 1004 1000 976 980 458 459 465 464 +425 5 2 11 85 288 287 281 282 1005 1001 977 981 +426 5 2 11 85 1005 1001 977 981 1006 1002 978 982 +427 5 2 11 85 1006 1002 978 982 1007 1003 979 983 +428 5 2 11 85 1007 1003 979 983 1008 1004 980 984 +429 5 2 11 85 1008 1004 980 984 457 458 464 463 +430 5 2 11 85 50 288 282 49 693 1005 981 694 +431 5 2 11 85 693 1005 981 694 687 1006 982 688 +432 5 2 11 85 687 1006 982 688 681 1007 983 682 +433 5 2 11 85 681 1007 983 682 675 1008 984 676 +434 5 2 11 85 675 1008 984 676 115 457 463 116 +435 5 2 11 85 289 21 20 283 1009 644 645 985 +436 5 2 11 85 1009 644 645 985 1010 638 639 986 +437 5 2 11 85 1010 638 639 986 1011 632 633 987 +438 5 2 11 85 1011 632 633 987 1012 626 627 988 +439 5 2 11 85 1012 626 627 988 456 90 91 462 +440 5 2 11 85 290 289 283 284 1013 1009 985 989 +441 5 2 11 85 1013 1009 985 989 1014 1010 986 990 +442 5 2 11 85 1014 1010 986 990 1015 1011 987 991 +443 5 2 11 85 1015 1011 987 991 1016 1012 988 992 +444 5 2 11 85 1016 1012 988 992 455 456 462 461 +445 5 2 11 85 291 290 284 285 1017 1013 989 993 +446 5 2 11 85 1017 1013 989 993 1018 1014 990 994 +447 5 2 11 85 1018 1014 990 994 1019 1015 991 995 +448 5 2 11 85 1019 1015 991 995 1020 1016 992 996 +449 5 2 11 85 1020 1016 992 996 454 455 461 460 +450 5 2 11 85 292 291 285 286 1021 1017 993 997 +451 5 2 11 85 1021 1017 993 997 1022 1018 994 998 +452 5 2 11 85 1022 1018 994 998 1023 1019 995 999 +453 5 2 11 85 1023 1019 995 999 1024 1020 996 1000 +454 5 2 11 85 1024 1020 996 1000 453 454 460 459 +455 5 2 11 85 293 292 286 287 1025 1021 997 1001 +456 5 2 11 85 1025 1021 997 1001 1026 1022 998 1002 +457 5 2 11 85 1026 1022 998 1002 1027 1023 999 1003 +458 5 2 11 85 1027 1023 999 1003 1028 1024 1000 1004 +459 5 2 11 85 1028 1024 1000 1004 452 453 459 458 +460 5 2 11 85 294 293 287 288 1029 1025 1001 1005 +461 5 2 11 85 1029 1025 1001 1005 1030 1026 1002 1006 +462 5 2 11 85 1030 1026 1002 1006 1031 1027 1003 1007 +463 5 2 11 85 1031 1027 1003 1007 1032 1028 1004 1008 +464 5 2 11 85 1032 1028 1004 1008 451 452 458 457 +465 5 2 11 85 51 294 288 50 692 1029 1005 693 +466 5 2 11 85 692 1029 1005 693 686 1030 1006 687 +467 5 2 11 85 686 1030 1006 687 680 1031 1007 681 +468 5 2 11 85 680 1031 1007 681 674 1032 1008 675 +469 5 2 11 85 674 1032 1008 675 114 451 457 115 +470 5 2 11 85 295 22 21 289 1033 643 644 1009 +471 5 2 11 85 1033 643 644 1009 1034 637 638 1010 +472 5 2 11 85 1034 637 638 1010 1035 631 632 1011 +473 5 2 11 85 1035 631 632 1011 1036 625 626 1012 +474 5 2 11 85 1036 625 626 1012 450 89 90 456 +475 5 2 11 85 296 295 289 290 1037 1033 1009 1013 +476 5 2 11 85 1037 1033 1009 1013 1038 1034 1010 1014 +477 5 2 11 85 1038 1034 1010 1014 1039 1035 1011 1015 +478 5 2 11 85 1039 1035 1011 1015 1040 1036 1012 1016 +479 5 2 11 85 1040 1036 1012 1016 449 450 456 455 +480 5 2 11 85 297 296 290 291 1041 1037 1013 1017 +481 5 2 11 85 1041 1037 1013 1017 1042 1038 1014 1018 +482 5 2 11 85 1042 1038 1014 1018 1043 1039 1015 1019 +483 5 2 11 85 1043 1039 1015 1019 1044 1040 1016 1020 +484 5 2 11 85 1044 1040 1016 1020 448 449 455 454 +485 5 2 11 85 298 297 291 292 1045 1041 1017 1021 +486 5 2 11 85 1045 1041 1017 1021 1046 1042 1018 1022 +487 5 2 11 85 1046 1042 1018 1022 1047 1043 1019 1023 +488 5 2 11 85 1047 1043 1019 1023 1048 1044 1020 1024 +489 5 2 11 85 1048 1044 1020 1024 447 448 454 453 +490 5 2 11 85 299 298 292 293 1049 1045 1021 1025 +491 5 2 11 85 1049 1045 1021 1025 1050 1046 1022 1026 +492 5 2 11 85 1050 1046 1022 1026 1051 1047 1023 1027 +493 5 2 11 85 1051 1047 1023 1027 1052 1048 1024 1028 +494 5 2 11 85 1052 1048 1024 1028 446 447 453 452 +495 5 2 11 85 300 299 293 294 1053 1049 1025 1029 +496 5 2 11 85 1053 1049 1025 1029 1054 1050 1026 1030 +497 5 2 11 85 1054 1050 1026 1030 1055 1051 1027 1031 +498 5 2 11 85 1055 1051 1027 1031 1056 1052 1028 1032 +499 5 2 11 85 1056 1052 1028 1032 445 446 452 451 +500 5 2 11 85 52 300 294 51 691 1053 1029 692 +501 5 2 11 85 691 1053 1029 692 685 1054 1030 686 +502 5 2 11 85 685 1054 1030 686 679 1055 1031 680 +503 5 2 11 85 679 1055 1031 680 673 1056 1032 674 +504 5 2 11 85 673 1056 1032 674 113 445 451 114 +505 5 2 11 85 77 2 22 295 667 188 643 1033 +506 5 2 11 85 667 188 643 1033 661 187 637 1034 +507 5 2 11 85 661 187 637 1034 655 186 631 1035 +508 5 2 11 85 655 186 631 1035 649 185 625 1036 +509 5 2 11 85 649 185 625 1036 125 10 89 450 +510 5 2 11 85 78 77 295 296 668 667 1033 1037 +511 5 2 11 85 668 667 1033 1037 662 661 1034 1038 +512 5 2 11 85 662 661 1034 1038 656 655 1035 1039 +513 5 2 11 85 656 655 1035 1039 650 649 1036 1040 +514 5 2 11 85 650 649 1036 1040 126 125 450 449 +515 5 2 11 85 79 78 296 297 669 668 1037 1041 +516 5 2 11 85 669 668 1037 1041 663 662 1038 1042 +517 5 2 11 85 663 662 1038 1042 657 656 1039 1043 +518 5 2 11 85 657 656 1039 1043 651 650 1040 1044 +519 5 2 11 85 651 650 1040 1044 127 126 449 448 +520 5 2 11 85 80 79 297 298 670 669 1041 1045 +521 5 2 11 85 670 669 1041 1045 664 663 1042 1046 +522 5 2 11 85 664 663 1042 1046 658 657 1043 1047 +523 5 2 11 85 658 657 1043 1047 652 651 1044 1048 +524 5 2 11 85 652 651 1044 1048 128 127 448 447 +525 5 2 11 85 81 80 298 299 671 670 1045 1049 +526 5 2 11 85 671 670 1045 1049 665 664 1046 1050 +527 5 2 11 85 665 664 1046 1050 659 658 1047 1051 +528 5 2 11 85 659 658 1047 1051 653 652 1048 1052 +529 5 2 11 85 653 652 1048 1052 129 128 447 446 +530 5 2 11 85 82 81 299 300 672 671 1049 1053 +531 5 2 11 85 672 671 1049 1053 666 665 1050 1054 +532 5 2 11 85 666 665 1050 1054 660 659 1051 1055 +533 5 2 11 85 660 659 1051 1055 654 653 1052 1056 +534 5 2 11 85 654 653 1052 1056 130 129 446 445 +535 5 2 11 85 7 82 300 52 192 672 1053 691 +536 5 2 11 85 192 672 1053 691 191 666 1054 685 +537 5 2 11 85 191 666 1054 685 190 660 1055 679 +538 5 2 11 85 190 660 1055 679 189 654 1056 673 +539 5 2 11 85 189 654 1056 673 13 130 445 113 +540 5 2 11 87 10 89 409 112 185 625 1057 841 +541 5 2 11 87 185 625 1057 841 186 631 1058 847 +542 5 2 11 87 186 631 1058 847 187 637 1059 853 +543 5 2 11 87 187 637 1059 853 188 643 1060 859 +544 5 2 11 87 188 643 1060 859 2 22 228 23 +545 5 2 11 87 112 409 410 111 841 1057 1061 842 +546 5 2 11 87 841 1057 1061 842 847 1058 1062 848 +547 5 2 11 87 847 1058 1062 848 853 1059 1063 854 +548 5 2 11 87 853 1059 1063 854 859 1060 1064 860 +549 5 2 11 87 859 1060 1064 860 23 228 222 24 +550 5 2 11 87 111 410 411 110 842 1061 1065 843 +551 5 2 11 87 842 1061 1065 843 848 1062 1066 849 +552 5 2 11 87 848 1062 1066 849 854 1063 1067 855 +553 5 2 11 87 854 1063 1067 855 860 1064 1068 861 +554 5 2 11 87 860 1064 1068 861 24 222 216 25 +555 5 2 11 87 110 411 412 109 843 1065 1069 844 +556 5 2 11 87 843 1065 1069 844 849 1066 1070 850 +557 5 2 11 87 849 1066 1070 850 855 1067 1071 856 +558 5 2 11 87 855 1067 1071 856 861 1068 1072 862 +559 5 2 11 87 861 1068 1072 862 25 216 210 26 +560 5 2 11 87 109 412 413 108 844 1069 1073 845 +561 5 2 11 87 844 1069 1073 845 850 1070 1074 851 +562 5 2 11 87 850 1070 1074 851 856 1071 1075 857 +563 5 2 11 87 856 1071 1075 857 862 1072 1076 863 +564 5 2 11 87 862 1072 1076 863 26 210 204 27 +565 5 2 11 87 108 413 414 107 845 1073 1077 846 +566 5 2 11 87 845 1073 1077 846 851 1074 1078 852 +567 5 2 11 87 851 1074 1078 852 857 1075 1079 858 +568 5 2 11 87 857 1075 1079 858 863 1076 1080 864 +569 5 2 11 87 863 1076 1080 864 27 204 198 28 +570 5 2 11 87 107 414 106 11 846 1077 765 181 +571 5 2 11 87 846 1077 765 181 852 1078 766 182 +572 5 2 11 87 852 1078 766 182 858 1079 767 183 +573 5 2 11 87 858 1079 767 183 864 1080 768 184 +574 5 2 11 87 864 1080 768 184 28 198 29 3 +575 5 2 11 87 89 90 415 409 625 626 1081 1057 +576 5 2 11 87 625 626 1081 1057 631 632 1082 1058 +577 5 2 11 87 631 632 1082 1058 637 638 1083 1059 +578 5 2 11 87 637 638 1083 1059 643 644 1084 1060 +579 5 2 11 87 643 644 1084 1060 22 21 227 228 +580 5 2 11 87 409 415 416 410 1057 1081 1085 1061 +581 5 2 11 87 1057 1081 1085 1061 1058 1082 1086 1062 +582 5 2 11 87 1058 1082 1086 1062 1059 1083 1087 1063 +583 5 2 11 87 1059 1083 1087 1063 1060 1084 1088 1064 +584 5 2 11 87 1060 1084 1088 1064 228 227 221 222 +585 5 2 11 87 410 416 417 411 1061 1085 1089 1065 +586 5 2 11 87 1061 1085 1089 1065 1062 1086 1090 1066 +587 5 2 11 87 1062 1086 1090 1066 1063 1087 1091 1067 +588 5 2 11 87 1063 1087 1091 1067 1064 1088 1092 1068 +589 5 2 11 87 1064 1088 1092 1068 222 221 215 216 +590 5 2 11 87 411 417 418 412 1065 1089 1093 1069 +591 5 2 11 87 1065 1089 1093 1069 1066 1090 1094 1070 +592 5 2 11 87 1066 1090 1094 1070 1067 1091 1095 1071 +593 5 2 11 87 1067 1091 1095 1071 1068 1092 1096 1072 +594 5 2 11 87 1068 1092 1096 1072 216 215 209 210 +595 5 2 11 87 412 418 419 413 1069 1093 1097 1073 +596 5 2 11 87 1069 1093 1097 1073 1070 1094 1098 1074 +597 5 2 11 87 1070 1094 1098 1074 1071 1095 1099 1075 +598 5 2 11 87 1071 1095 1099 1075 1072 1096 1100 1076 +599 5 2 11 87 1072 1096 1100 1076 210 209 203 204 +600 5 2 11 87 413 419 420 414 1073 1097 1101 1077 +601 5 2 11 87 1073 1097 1101 1077 1074 1098 1102 1078 +602 5 2 11 87 1074 1098 1102 1078 1075 1099 1103 1079 +603 5 2 11 87 1075 1099 1103 1079 1076 1100 1104 1080 +604 5 2 11 87 1076 1100 1104 1080 204 203 197 198 +605 5 2 11 87 414 420 105 106 1077 1101 761 765 +606 5 2 11 87 1077 1101 761 765 1078 1102 762 766 +607 5 2 11 87 1078 1102 762 766 1079 1103 763 767 +608 5 2 11 87 1079 1103 763 767 1080 1104 764 768 +609 5 2 11 87 1080 1104 764 768 198 197 30 29 +610 5 2 11 87 90 91 421 415 626 627 1105 1081 +611 5 2 11 87 626 627 1105 1081 632 633 1106 1082 +612 5 2 11 87 632 633 1106 1082 638 639 1107 1083 +613 5 2 11 87 638 639 1107 1083 644 645 1108 1084 +614 5 2 11 87 644 645 1108 1084 21 20 226 227 +615 5 2 11 87 415 421 422 416 1081 1105 1109 1085 +616 5 2 11 87 1081 1105 1109 1085 1082 1106 1110 1086 +617 5 2 11 87 1082 1106 1110 1086 1083 1107 1111 1087 +618 5 2 11 87 1083 1107 1111 1087 1084 1108 1112 1088 +619 5 2 11 87 1084 1108 1112 1088 227 226 220 221 +620 5 2 11 87 416 422 423 417 1085 1109 1113 1089 +621 5 2 11 87 1085 1109 1113 1089 1086 1110 1114 1090 +622 5 2 11 87 1086 1110 1114 1090 1087 1111 1115 1091 +623 5 2 11 87 1087 1111 1115 1091 1088 1112 1116 1092 +624 5 2 11 87 1088 1112 1116 1092 221 220 214 215 +625 5 2 11 87 417 423 424 418 1089 1113 1117 1093 +626 5 2 11 87 1089 1113 1117 1093 1090 1114 1118 1094 +627 5 2 11 87 1090 1114 1118 1094 1091 1115 1119 1095 +628 5 2 11 87 1091 1115 1119 1095 1092 1116 1120 1096 +629 5 2 11 87 1092 1116 1120 1096 215 214 208 209 +630 5 2 11 87 418 424 425 419 1093 1117 1121 1097 +631 5 2 11 87 1093 1117 1121 1097 1094 1118 1122 1098 +632 5 2 11 87 1094 1118 1122 1098 1095 1119 1123 1099 +633 5 2 11 87 1095 1119 1123 1099 1096 1120 1124 1100 +634 5 2 11 87 1096 1120 1124 1100 209 208 202 203 +635 5 2 11 87 419 425 426 420 1097 1121 1125 1101 +636 5 2 11 87 1097 1121 1125 1101 1098 1122 1126 1102 +637 5 2 11 87 1098 1122 1126 1102 1099 1123 1127 1103 +638 5 2 11 87 1099 1123 1127 1103 1100 1124 1128 1104 +639 5 2 11 87 1100 1124 1128 1104 203 202 196 197 +640 5 2 11 87 420 426 104 105 1101 1125 757 761 +641 5 2 11 87 1101 1125 757 761 1102 1126 758 762 +642 5 2 11 87 1102 1126 758 762 1103 1127 759 763 +643 5 2 11 87 1103 1127 759 763 1104 1128 760 764 +644 5 2 11 87 1104 1128 760 764 197 196 31 30 +645 5 2 11 87 91 92 427 421 627 628 1129 1105 +646 5 2 11 87 627 628 1129 1105 633 634 1130 1106 +647 5 2 11 87 633 634 1130 1106 639 640 1131 1107 +648 5 2 11 87 639 640 1131 1107 645 646 1132 1108 +649 5 2 11 87 645 646 1132 1108 20 19 225 226 +650 5 2 11 87 421 427 428 422 1105 1129 1133 1109 +651 5 2 11 87 1105 1129 1133 1109 1106 1130 1134 1110 +652 5 2 11 87 1106 1130 1134 1110 1107 1131 1135 1111 +653 5 2 11 87 1107 1131 1135 1111 1108 1132 1136 1112 +654 5 2 11 87 1108 1132 1136 1112 226 225 219 220 +655 5 2 11 87 422 428 429 423 1109 1133 1137 1113 +656 5 2 11 87 1109 1133 1137 1113 1110 1134 1138 1114 +657 5 2 11 87 1110 1134 1138 1114 1111 1135 1139 1115 +658 5 2 11 87 1111 1135 1139 1115 1112 1136 1140 1116 +659 5 2 11 87 1112 1136 1140 1116 220 219 213 214 +660 5 2 11 87 423 429 430 424 1113 1137 1141 1117 +661 5 2 11 87 1113 1137 1141 1117 1114 1138 1142 1118 +662 5 2 11 87 1114 1138 1142 1118 1115 1139 1143 1119 +663 5 2 11 87 1115 1139 1143 1119 1116 1140 1144 1120 +664 5 2 11 87 1116 1140 1144 1120 214 213 207 208 +665 5 2 11 87 424 430 431 425 1117 1141 1145 1121 +666 5 2 11 87 1117 1141 1145 1121 1118 1142 1146 1122 +667 5 2 11 87 1118 1142 1146 1122 1119 1143 1147 1123 +668 5 2 11 87 1119 1143 1147 1123 1120 1144 1148 1124 +669 5 2 11 87 1120 1144 1148 1124 208 207 201 202 +670 5 2 11 87 425 431 432 426 1121 1145 1149 1125 +671 5 2 11 87 1121 1145 1149 1125 1122 1146 1150 1126 +672 5 2 11 87 1122 1146 1150 1126 1123 1147 1151 1127 +673 5 2 11 87 1123 1147 1151 1127 1124 1148 1152 1128 +674 5 2 11 87 1124 1148 1152 1128 202 201 195 196 +675 5 2 11 87 426 432 103 104 1125 1149 753 757 +676 5 2 11 87 1125 1149 753 757 1126 1150 754 758 +677 5 2 11 87 1126 1150 754 758 1127 1151 755 759 +678 5 2 11 87 1127 1151 755 759 1128 1152 756 760 +679 5 2 11 87 1128 1152 756 760 196 195 32 31 +680 5 2 11 87 92 93 433 427 628 629 1153 1129 +681 5 2 11 87 628 629 1153 1129 634 635 1154 1130 +682 5 2 11 87 634 635 1154 1130 640 641 1155 1131 +683 5 2 11 87 640 641 1155 1131 646 647 1156 1132 +684 5 2 11 87 646 647 1156 1132 19 18 224 225 +685 5 2 11 87 427 433 434 428 1129 1153 1157 1133 +686 5 2 11 87 1129 1153 1157 1133 1130 1154 1158 1134 +687 5 2 11 87 1130 1154 1158 1134 1131 1155 1159 1135 +688 5 2 11 87 1131 1155 1159 1135 1132 1156 1160 1136 +689 5 2 11 87 1132 1156 1160 1136 225 224 218 219 +690 5 2 11 87 428 434 435 429 1133 1157 1161 1137 +691 5 2 11 87 1133 1157 1161 1137 1134 1158 1162 1138 +692 5 2 11 87 1134 1158 1162 1138 1135 1159 1163 1139 +693 5 2 11 87 1135 1159 1163 1139 1136 1160 1164 1140 +694 5 2 11 87 1136 1160 1164 1140 219 218 212 213 +695 5 2 11 87 429 435 436 430 1137 1161 1165 1141 +696 5 2 11 87 1137 1161 1165 1141 1138 1162 1166 1142 +697 5 2 11 87 1138 1162 1166 1142 1139 1163 1167 1143 +698 5 2 11 87 1139 1163 1167 1143 1140 1164 1168 1144 +699 5 2 11 87 1140 1164 1168 1144 213 212 206 207 +700 5 2 11 87 430 436 437 431 1141 1165 1169 1145 +701 5 2 11 87 1141 1165 1169 1145 1142 1166 1170 1146 +702 5 2 11 87 1142 1166 1170 1146 1143 1167 1171 1147 +703 5 2 11 87 1143 1167 1171 1147 1144 1168 1172 1148 +704 5 2 11 87 1144 1168 1172 1148 207 206 200 201 +705 5 2 11 87 431 437 438 432 1145 1169 1173 1149 +706 5 2 11 87 1145 1169 1173 1149 1146 1170 1174 1150 +707 5 2 11 87 1146 1170 1174 1150 1147 1171 1175 1151 +708 5 2 11 87 1147 1171 1175 1151 1148 1172 1176 1152 +709 5 2 11 87 1148 1172 1176 1152 201 200 194 195 +710 5 2 11 87 432 438 102 103 1149 1173 749 753 +711 5 2 11 87 1149 1173 749 753 1150 1174 750 754 +712 5 2 11 87 1150 1174 750 754 1151 1175 751 755 +713 5 2 11 87 1151 1175 751 755 1152 1176 752 756 +714 5 2 11 87 1152 1176 752 756 195 194 33 32 +715 5 2 11 87 93 94 439 433 629 630 1177 1153 +716 5 2 11 87 629 630 1177 1153 635 636 1178 1154 +717 5 2 11 87 635 636 1178 1154 641 642 1179 1155 +718 5 2 11 87 641 642 1179 1155 647 648 1180 1156 +719 5 2 11 87 647 648 1180 1156 18 17 223 224 +720 5 2 11 87 433 439 440 434 1153 1177 1181 1157 +721 5 2 11 87 1153 1177 1181 1157 1154 1178 1182 1158 +722 5 2 11 87 1154 1178 1182 1158 1155 1179 1183 1159 +723 5 2 11 87 1155 1179 1183 1159 1156 1180 1184 1160 +724 5 2 11 87 1156 1180 1184 1160 224 223 217 218 +725 5 2 11 87 434 440 441 435 1157 1181 1185 1161 +726 5 2 11 87 1157 1181 1185 1161 1158 1182 1186 1162 +727 5 2 11 87 1158 1182 1186 1162 1159 1183 1187 1163 +728 5 2 11 87 1159 1183 1187 1163 1160 1184 1188 1164 +729 5 2 11 87 1160 1184 1188 1164 218 217 211 212 +730 5 2 11 87 435 441 442 436 1161 1185 1189 1165 +731 5 2 11 87 1161 1185 1189 1165 1162 1186 1190 1166 +732 5 2 11 87 1162 1186 1190 1166 1163 1187 1191 1167 +733 5 2 11 87 1163 1187 1191 1167 1164 1188 1192 1168 +734 5 2 11 87 1164 1188 1192 1168 212 211 205 206 +735 5 2 11 87 436 442 443 437 1165 1189 1193 1169 +736 5 2 11 87 1165 1189 1193 1169 1166 1190 1194 1170 +737 5 2 11 87 1166 1190 1194 1170 1167 1191 1195 1171 +738 5 2 11 87 1167 1191 1195 1171 1168 1192 1196 1172 +739 5 2 11 87 1168 1192 1196 1172 206 205 199 200 +740 5 2 11 87 437 443 444 438 1169 1193 1197 1173 +741 5 2 11 87 1169 1193 1197 1173 1170 1194 1198 1174 +742 5 2 11 87 1170 1194 1198 1174 1171 1195 1199 1175 +743 5 2 11 87 1171 1195 1199 1175 1172 1196 1200 1176 +744 5 2 11 87 1172 1196 1200 1176 200 199 193 194 +745 5 2 11 87 438 444 101 102 1173 1197 745 749 +746 5 2 11 87 1173 1197 745 749 1174 1198 746 750 +747 5 2 11 87 1174 1198 746 750 1175 1199 747 751 +748 5 2 11 87 1175 1199 747 751 1176 1200 748 752 +749 5 2 11 87 1176 1200 748 752 194 193 34 33 +750 5 2 11 87 94 9 95 439 630 161 865 1177 +751 5 2 11 87 630 161 865 1177 636 162 871 1178 +752 5 2 11 87 636 162 871 1178 642 163 877 1179 +753 5 2 11 87 642 163 877 1179 648 164 883 1180 +754 5 2 11 87 648 164 883 1180 17 1 40 223 +755 5 2 11 87 439 95 96 440 1177 865 866 1181 +756 5 2 11 87 1177 865 866 1181 1178 871 872 1182 +757 5 2 11 87 1178 871 872 1182 1179 877 878 1183 +758 5 2 11 87 1179 877 878 1183 1180 883 884 1184 +759 5 2 11 87 1180 883 884 1184 223 40 39 217 +760 5 2 11 87 440 96 97 441 1181 866 867 1185 +761 5 2 11 87 1181 866 867 1185 1182 872 873 1186 +762 5 2 11 87 1182 872 873 1186 1183 878 879 1187 +763 5 2 11 87 1183 878 879 1187 1184 884 885 1188 +764 5 2 11 87 1184 884 885 1188 217 39 38 211 +765 5 2 11 87 441 97 98 442 1185 867 868 1189 +766 5 2 11 87 1185 867 868 1189 1186 873 874 1190 +767 5 2 11 87 1186 873 874 1190 1187 879 880 1191 +768 5 2 11 87 1187 879 880 1191 1188 885 886 1192 +769 5 2 11 87 1188 885 886 1192 211 38 37 205 +770 5 2 11 87 442 98 99 443 1189 868 869 1193 +771 5 2 11 87 1189 868 869 1193 1190 874 875 1194 +772 5 2 11 87 1190 874 875 1194 1191 880 881 1195 +773 5 2 11 87 1191 880 881 1195 1192 886 887 1196 +774 5 2 11 87 1192 886 887 1196 205 37 36 199 +775 5 2 11 87 443 99 100 444 1193 869 870 1197 +776 5 2 11 87 1193 869 870 1197 1194 875 876 1198 +777 5 2 11 87 1194 875 876 1198 1195 881 882 1199 +778 5 2 11 87 1195 881 882 1199 1196 887 888 1200 +779 5 2 11 87 1196 887 888 1200 199 36 35 193 +780 5 2 11 87 444 100 12 101 1197 870 169 745 +781 5 2 11 87 1197 870 169 745 1198 876 170 746 +782 5 2 11 87 1198 876 170 746 1199 882 171 747 +783 5 2 11 87 1199 882 171 747 1200 888 172 748 +784 5 2 11 87 1200 888 172 748 193 35 4 34 +785 5 2 11 89 301 23 2 77 1201 859 188 667 +786 5 2 11 89 1201 859 188 667 1202 853 187 661 +787 5 2 11 89 1202 853 187 661 1203 847 186 655 +788 5 2 11 89 1203 847 186 655 1204 841 185 649 +789 5 2 11 89 1204 841 185 649 553 112 10 125 +790 5 2 11 89 302 301 77 78 1205 1201 667 668 +791 5 2 11 89 1205 1201 667 668 1206 1202 661 662 +792 5 2 11 89 1206 1202 661 662 1207 1203 655 656 +793 5 2 11 89 1207 1203 655 656 1208 1204 649 650 +794 5 2 11 89 1208 1204 649 650 559 553 125 126 +795 5 2 11 89 303 302 78 79 1209 1205 668 669 +796 5 2 11 89 1209 1205 668 669 1210 1206 662 663 +797 5 2 11 89 1210 1206 662 663 1211 1207 656 657 +798 5 2 11 89 1211 1207 656 657 1212 1208 650 651 +799 5 2 11 89 1212 1208 650 651 565 559 126 127 +800 5 2 11 89 304 303 79 80 1213 1209 669 670 +801 5 2 11 89 1213 1209 669 670 1214 1210 663 664 +802 5 2 11 89 1214 1210 663 664 1215 1211 657 658 +803 5 2 11 89 1215 1211 657 658 1216 1212 651 652 +804 5 2 11 89 1216 1212 651 652 571 565 127 128 +805 5 2 11 89 305 304 80 81 1217 1213 670 671 +806 5 2 11 89 1217 1213 670 671 1218 1214 664 665 +807 5 2 11 89 1218 1214 664 665 1219 1215 658 659 +808 5 2 11 89 1219 1215 658 659 1220 1216 652 653 +809 5 2 11 89 1220 1216 652 653 577 571 128 129 +810 5 2 11 89 306 305 81 82 1221 1217 671 672 +811 5 2 11 89 1221 1217 671 672 1222 1218 665 666 +812 5 2 11 89 1222 1218 665 666 1223 1219 659 660 +813 5 2 11 89 1223 1219 659 660 1224 1220 653 654 +814 5 2 11 89 1224 1220 653 654 583 577 129 130 +815 5 2 11 89 53 306 82 7 835 1221 672 192 +816 5 2 11 89 835 1221 672 192 829 1222 666 191 +817 5 2 11 89 829 1222 666 191 823 1223 660 190 +818 5 2 11 89 823 1223 660 190 817 1224 654 189 +819 5 2 11 89 817 1224 654 189 143 583 130 13 +820 5 2 11 89 307 24 23 301 1225 860 859 1201 +821 5 2 11 89 1225 860 859 1201 1226 854 853 1202 +822 5 2 11 89 1226 854 853 1202 1227 848 847 1203 +823 5 2 11 89 1227 848 847 1203 1228 842 841 1204 +824 5 2 11 89 1228 842 841 1204 554 111 112 553 +825 5 2 11 89 308 307 301 302 1229 1225 1201 1205 +826 5 2 11 89 1229 1225 1201 1205 1230 1226 1202 1206 +827 5 2 11 89 1230 1226 1202 1206 1231 1227 1203 1207 +828 5 2 11 89 1231 1227 1203 1207 1232 1228 1204 1208 +829 5 2 11 89 1232 1228 1204 1208 560 554 553 559 +830 5 2 11 89 309 308 302 303 1233 1229 1205 1209 +831 5 2 11 89 1233 1229 1205 1209 1234 1230 1206 1210 +832 5 2 11 89 1234 1230 1206 1210 1235 1231 1207 1211 +833 5 2 11 89 1235 1231 1207 1211 1236 1232 1208 1212 +834 5 2 11 89 1236 1232 1208 1212 566 560 559 565 +835 5 2 11 89 310 309 303 304 1237 1233 1209 1213 +836 5 2 11 89 1237 1233 1209 1213 1238 1234 1210 1214 +837 5 2 11 89 1238 1234 1210 1214 1239 1235 1211 1215 +838 5 2 11 89 1239 1235 1211 1215 1240 1236 1212 1216 +839 5 2 11 89 1240 1236 1212 1216 572 566 565 571 +840 5 2 11 89 311 310 304 305 1241 1237 1213 1217 +841 5 2 11 89 1241 1237 1213 1217 1242 1238 1214 1218 +842 5 2 11 89 1242 1238 1214 1218 1243 1239 1215 1219 +843 5 2 11 89 1243 1239 1215 1219 1244 1240 1216 1220 +844 5 2 11 89 1244 1240 1216 1220 578 572 571 577 +845 5 2 11 89 312 311 305 306 1245 1241 1217 1221 +846 5 2 11 89 1245 1241 1217 1221 1246 1242 1218 1222 +847 5 2 11 89 1246 1242 1218 1222 1247 1243 1219 1223 +848 5 2 11 89 1247 1243 1219 1223 1248 1244 1220 1224 +849 5 2 11 89 1248 1244 1220 1224 584 578 577 583 +850 5 2 11 89 54 312 306 53 836 1245 1221 835 +851 5 2 11 89 836 1245 1221 835 830 1246 1222 829 +852 5 2 11 89 830 1246 1222 829 824 1247 1223 823 +853 5 2 11 89 824 1247 1223 823 818 1248 1224 817 +854 5 2 11 89 818 1248 1224 817 144 584 583 143 +855 5 2 11 89 313 25 24 307 1249 861 860 1225 +856 5 2 11 89 1249 861 860 1225 1250 855 854 1226 +857 5 2 11 89 1250 855 854 1226 1251 849 848 1227 +858 5 2 11 89 1251 849 848 1227 1252 843 842 1228 +859 5 2 11 89 1252 843 842 1228 555 110 111 554 +860 5 2 11 89 314 313 307 308 1253 1249 1225 1229 +861 5 2 11 89 1253 1249 1225 1229 1254 1250 1226 1230 +862 5 2 11 89 1254 1250 1226 1230 1255 1251 1227 1231 +863 5 2 11 89 1255 1251 1227 1231 1256 1252 1228 1232 +864 5 2 11 89 1256 1252 1228 1232 561 555 554 560 +865 5 2 11 89 315 314 308 309 1257 1253 1229 1233 +866 5 2 11 89 1257 1253 1229 1233 1258 1254 1230 1234 +867 5 2 11 89 1258 1254 1230 1234 1259 1255 1231 1235 +868 5 2 11 89 1259 1255 1231 1235 1260 1256 1232 1236 +869 5 2 11 89 1260 1256 1232 1236 567 561 560 566 +870 5 2 11 89 316 315 309 310 1261 1257 1233 1237 +871 5 2 11 89 1261 1257 1233 1237 1262 1258 1234 1238 +872 5 2 11 89 1262 1258 1234 1238 1263 1259 1235 1239 +873 5 2 11 89 1263 1259 1235 1239 1264 1260 1236 1240 +874 5 2 11 89 1264 1260 1236 1240 573 567 566 572 +875 5 2 11 89 317 316 310 311 1265 1261 1237 1241 +876 5 2 11 89 1265 1261 1237 1241 1266 1262 1238 1242 +877 5 2 11 89 1266 1262 1238 1242 1267 1263 1239 1243 +878 5 2 11 89 1267 1263 1239 1243 1268 1264 1240 1244 +879 5 2 11 89 1268 1264 1240 1244 579 573 572 578 +880 5 2 11 89 318 317 311 312 1269 1265 1241 1245 +881 5 2 11 89 1269 1265 1241 1245 1270 1266 1242 1246 +882 5 2 11 89 1270 1266 1242 1246 1271 1267 1243 1247 +883 5 2 11 89 1271 1267 1243 1247 1272 1268 1244 1248 +884 5 2 11 89 1272 1268 1244 1248 585 579 578 584 +885 5 2 11 89 55 318 312 54 837 1269 1245 836 +886 5 2 11 89 837 1269 1245 836 831 1270 1246 830 +887 5 2 11 89 831 1270 1246 830 825 1271 1247 824 +888 5 2 11 89 825 1271 1247 824 819 1272 1248 818 +889 5 2 11 89 819 1272 1248 818 145 585 584 144 +890 5 2 11 89 319 26 25 313 1273 862 861 1249 +891 5 2 11 89 1273 862 861 1249 1274 856 855 1250 +892 5 2 11 89 1274 856 855 1250 1275 850 849 1251 +893 5 2 11 89 1275 850 849 1251 1276 844 843 1252 +894 5 2 11 89 1276 844 843 1252 556 109 110 555 +895 5 2 11 89 320 319 313 314 1277 1273 1249 1253 +896 5 2 11 89 1277 1273 1249 1253 1278 1274 1250 1254 +897 5 2 11 89 1278 1274 1250 1254 1279 1275 1251 1255 +898 5 2 11 89 1279 1275 1251 1255 1280 1276 1252 1256 +899 5 2 11 89 1280 1276 1252 1256 562 556 555 561 +900 5 2 11 89 321 320 314 315 1281 1277 1253 1257 +901 5 2 11 89 1281 1277 1253 1257 1282 1278 1254 1258 +902 5 2 11 89 1282 1278 1254 1258 1283 1279 1255 1259 +903 5 2 11 89 1283 1279 1255 1259 1284 1280 1256 1260 +904 5 2 11 89 1284 1280 1256 1260 568 562 561 567 +905 5 2 11 89 322 321 315 316 1285 1281 1257 1261 +906 5 2 11 89 1285 1281 1257 1261 1286 1282 1258 1262 +907 5 2 11 89 1286 1282 1258 1262 1287 1283 1259 1263 +908 5 2 11 89 1287 1283 1259 1263 1288 1284 1260 1264 +909 5 2 11 89 1288 1284 1260 1264 574 568 567 573 +910 5 2 11 89 323 322 316 317 1289 1285 1261 1265 +911 5 2 11 89 1289 1285 1261 1265 1290 1286 1262 1266 +912 5 2 11 89 1290 1286 1262 1266 1291 1287 1263 1267 +913 5 2 11 89 1291 1287 1263 1267 1292 1288 1264 1268 +914 5 2 11 89 1292 1288 1264 1268 580 574 573 579 +915 5 2 11 89 324 323 317 318 1293 1289 1265 1269 +916 5 2 11 89 1293 1289 1265 1269 1294 1290 1266 1270 +917 5 2 11 89 1294 1290 1266 1270 1295 1291 1267 1271 +918 5 2 11 89 1295 1291 1267 1271 1296 1292 1268 1272 +919 5 2 11 89 1296 1292 1268 1272 586 580 579 585 +920 5 2 11 89 56 324 318 55 838 1293 1269 837 +921 5 2 11 89 838 1293 1269 837 832 1294 1270 831 +922 5 2 11 89 832 1294 1270 831 826 1295 1271 825 +923 5 2 11 89 826 1295 1271 825 820 1296 1272 819 +924 5 2 11 89 820 1296 1272 819 146 586 585 145 +925 5 2 11 89 325 27 26 319 1297 863 862 1273 +926 5 2 11 89 1297 863 862 1273 1298 857 856 1274 +927 5 2 11 89 1298 857 856 1274 1299 851 850 1275 +928 5 2 11 89 1299 851 850 1275 1300 845 844 1276 +929 5 2 11 89 1300 845 844 1276 557 108 109 556 +930 5 2 11 89 326 325 319 320 1301 1297 1273 1277 +931 5 2 11 89 1301 1297 1273 1277 1302 1298 1274 1278 +932 5 2 11 89 1302 1298 1274 1278 1303 1299 1275 1279 +933 5 2 11 89 1303 1299 1275 1279 1304 1300 1276 1280 +934 5 2 11 89 1304 1300 1276 1280 563 557 556 562 +935 5 2 11 89 327 326 320 321 1305 1301 1277 1281 +936 5 2 11 89 1305 1301 1277 1281 1306 1302 1278 1282 +937 5 2 11 89 1306 1302 1278 1282 1307 1303 1279 1283 +938 5 2 11 89 1307 1303 1279 1283 1308 1304 1280 1284 +939 5 2 11 89 1308 1304 1280 1284 569 563 562 568 +940 5 2 11 89 328 327 321 322 1309 1305 1281 1285 +941 5 2 11 89 1309 1305 1281 1285 1310 1306 1282 1286 +942 5 2 11 89 1310 1306 1282 1286 1311 1307 1283 1287 +943 5 2 11 89 1311 1307 1283 1287 1312 1308 1284 1288 +944 5 2 11 89 1312 1308 1284 1288 575 569 568 574 +945 5 2 11 89 329 328 322 323 1313 1309 1285 1289 +946 5 2 11 89 1313 1309 1285 1289 1314 1310 1286 1290 +947 5 2 11 89 1314 1310 1286 1290 1315 1311 1287 1291 +948 5 2 11 89 1315 1311 1287 1291 1316 1312 1288 1292 +949 5 2 11 89 1316 1312 1288 1292 581 575 574 580 +950 5 2 11 89 330 329 323 324 1317 1313 1289 1293 +951 5 2 11 89 1317 1313 1289 1293 1318 1314 1290 1294 +952 5 2 11 89 1318 1314 1290 1294 1319 1315 1291 1295 +953 5 2 11 89 1319 1315 1291 1295 1320 1316 1292 1296 +954 5 2 11 89 1320 1316 1292 1296 587 581 580 586 +955 5 2 11 89 57 330 324 56 839 1317 1293 838 +956 5 2 11 89 839 1317 1293 838 833 1318 1294 832 +957 5 2 11 89 833 1318 1294 832 827 1319 1295 826 +958 5 2 11 89 827 1319 1295 826 821 1320 1296 820 +959 5 2 11 89 821 1320 1296 820 147 587 586 146 +960 5 2 11 89 331 28 27 325 1321 864 863 1297 +961 5 2 11 89 1321 864 863 1297 1322 858 857 1298 +962 5 2 11 89 1322 858 857 1298 1323 852 851 1299 +963 5 2 11 89 1323 852 851 1299 1324 846 845 1300 +964 5 2 11 89 1324 846 845 1300 558 107 108 557 +965 5 2 11 89 332 331 325 326 1325 1321 1297 1301 +966 5 2 11 89 1325 1321 1297 1301 1326 1322 1298 1302 +967 5 2 11 89 1326 1322 1298 1302 1327 1323 1299 1303 +968 5 2 11 89 1327 1323 1299 1303 1328 1324 1300 1304 +969 5 2 11 89 1328 1324 1300 1304 564 558 557 563 +970 5 2 11 89 333 332 326 327 1329 1325 1301 1305 +971 5 2 11 89 1329 1325 1301 1305 1330 1326 1302 1306 +972 5 2 11 89 1330 1326 1302 1306 1331 1327 1303 1307 +973 5 2 11 89 1331 1327 1303 1307 1332 1328 1304 1308 +974 5 2 11 89 1332 1328 1304 1308 570 564 563 569 +975 5 2 11 89 334 333 327 328 1333 1329 1305 1309 +976 5 2 11 89 1333 1329 1305 1309 1334 1330 1306 1310 +977 5 2 11 89 1334 1330 1306 1310 1335 1331 1307 1311 +978 5 2 11 89 1335 1331 1307 1311 1336 1332 1308 1312 +979 5 2 11 89 1336 1332 1308 1312 576 570 569 575 +980 5 2 11 89 335 334 328 329 1337 1333 1309 1313 +981 5 2 11 89 1337 1333 1309 1313 1338 1334 1310 1314 +982 5 2 11 89 1338 1334 1310 1314 1339 1335 1311 1315 +983 5 2 11 89 1339 1335 1311 1315 1340 1336 1312 1316 +984 5 2 11 89 1340 1336 1312 1316 582 576 575 581 +985 5 2 11 89 336 335 329 330 1341 1337 1313 1317 +986 5 2 11 89 1341 1337 1313 1317 1342 1338 1314 1318 +987 5 2 11 89 1342 1338 1314 1318 1343 1339 1315 1319 +988 5 2 11 89 1343 1339 1315 1319 1344 1340 1316 1320 +989 5 2 11 89 1344 1340 1316 1320 588 582 581 587 +990 5 2 11 89 58 336 330 57 840 1341 1317 839 +991 5 2 11 89 840 1341 1317 839 834 1342 1318 833 +992 5 2 11 89 834 1342 1318 833 828 1343 1319 827 +993 5 2 11 89 828 1343 1319 827 822 1344 1320 821 +994 5 2 11 89 822 1344 1320 821 148 588 587 147 +995 5 2 11 89 83 3 28 331 744 184 864 1321 +996 5 2 11 89 744 184 864 1321 738 183 858 1322 +997 5 2 11 89 738 183 858 1322 732 182 852 1323 +998 5 2 11 89 732 182 852 1323 726 181 846 1324 +999 5 2 11 89 726 181 846 1324 160 11 107 558 +1000 5 2 11 89 84 83 331 332 743 744 1321 1325 +1001 5 2 11 89 743 744 1321 1325 737 738 1322 1326 +1002 5 2 11 89 737 738 1322 1326 731 732 1323 1327 +1003 5 2 11 89 731 732 1323 1327 725 726 1324 1328 +1004 5 2 11 89 725 726 1324 1328 159 160 558 564 +1005 5 2 11 89 85 84 332 333 742 743 1325 1329 +1006 5 2 11 89 742 743 1325 1329 736 737 1326 1330 +1007 5 2 11 89 736 737 1326 1330 730 731 1327 1331 +1008 5 2 11 89 730 731 1327 1331 724 725 1328 1332 +1009 5 2 11 89 724 725 1328 1332 158 159 564 570 +1010 5 2 11 89 86 85 333 334 741 742 1329 1333 +1011 5 2 11 89 741 742 1329 1333 735 736 1330 1334 +1012 5 2 11 89 735 736 1330 1334 729 730 1331 1335 +1013 5 2 11 89 729 730 1331 1335 723 724 1332 1336 +1014 5 2 11 89 723 724 1332 1336 157 158 570 576 +1015 5 2 11 89 87 86 334 335 740 741 1333 1337 +1016 5 2 11 89 740 741 1333 1337 734 735 1334 1338 +1017 5 2 11 89 734 735 1334 1338 728 729 1335 1339 +1018 5 2 11 89 728 729 1335 1339 722 723 1336 1340 +1019 5 2 11 89 722 723 1336 1340 156 157 576 582 +1020 5 2 11 89 88 87 335 336 739 740 1337 1341 +1021 5 2 11 89 739 740 1337 1341 733 734 1338 1342 +1022 5 2 11 89 733 734 1338 1342 727 728 1339 1343 +1023 5 2 11 89 727 728 1339 1343 721 722 1340 1344 +1024 5 2 11 89 721 722 1340 1344 155 156 582 588 +1025 5 2 11 89 8 88 336 58 180 739 1341 840 +1026 5 2 11 89 180 739 1341 840 179 733 1342 834 +1027 5 2 11 89 179 733 1342 834 178 727 1343 828 +1028 5 2 11 89 178 727 1343 828 177 721 1344 822 +1029 5 2 11 89 177 721 1344 822 15 155 588 148 +1030 5 2 11 91 373 41 5 64 1345 892 176 811 +1031 5 2 11 91 1345 892 176 811 1346 891 175 805 +1032 5 2 11 91 1346 891 175 805 1347 890 174 799 +1033 5 2 11 91 1347 890 174 799 1348 889 173 793 +1034 5 2 11 91 1348 889 173 793 511 137 16 136 +1035 5 2 11 91 374 373 64 63 1349 1345 811 812 +1036 5 2 11 91 1349 1345 811 812 1350 1346 805 806 +1037 5 2 11 91 1350 1346 805 806 1351 1347 799 800 +1038 5 2 11 91 1351 1347 799 800 1352 1348 793 794 +1039 5 2 11 91 1352 1348 793 794 505 511 136 135 +1040 5 2 11 91 375 374 63 62 1353 1349 812 813 +1041 5 2 11 91 1353 1349 812 813 1354 1350 806 807 +1042 5 2 11 91 1354 1350 806 807 1355 1351 800 801 +1043 5 2 11 91 1355 1351 800 801 1356 1352 794 795 +1044 5 2 11 91 1356 1352 794 795 499 505 135 134 +1045 5 2 11 91 376 375 62 61 1357 1353 813 814 +1046 5 2 11 91 1357 1353 813 814 1358 1354 807 808 +1047 5 2 11 91 1358 1354 807 808 1359 1355 801 802 +1048 5 2 11 91 1359 1355 801 802 1360 1356 795 796 +1049 5 2 11 91 1360 1356 795 796 493 499 134 133 +1050 5 2 11 91 377 376 61 60 1361 1357 814 815 +1051 5 2 11 91 1361 1357 814 815 1362 1358 808 809 +1052 5 2 11 91 1362 1358 808 809 1363 1359 802 803 +1053 5 2 11 91 1363 1359 802 803 1364 1360 796 797 +1054 5 2 11 91 1364 1360 796 797 487 493 133 132 +1055 5 2 11 91 378 377 60 59 1365 1361 815 816 +1056 5 2 11 91 1365 1361 815 816 1366 1362 809 810 +1057 5 2 11 91 1366 1362 809 810 1367 1363 803 804 +1058 5 2 11 91 1367 1363 803 804 1368 1364 797 798 +1059 5 2 11 91 1368 1364 797 798 481 487 132 131 +1060 5 2 11 91 58 378 59 8 840 1365 816 180 +1061 5 2 11 91 840 1365 816 180 834 1366 810 179 +1062 5 2 11 91 834 1366 810 179 828 1367 804 178 +1063 5 2 11 91 828 1367 804 178 822 1368 798 177 +1064 5 2 11 91 822 1368 798 177 148 481 131 15 +1065 5 2 11 91 379 42 41 373 1369 896 892 1345 +1066 5 2 11 91 1369 896 892 1345 1370 895 891 1346 +1067 5 2 11 91 1370 895 891 1346 1371 894 890 1347 +1068 5 2 11 91 1371 894 890 1347 1372 893 889 1348 +1069 5 2 11 91 1372 893 889 1348 512 138 137 511 +1070 5 2 11 91 380 379 373 374 1373 1369 1345 1349 +1071 5 2 11 91 1373 1369 1345 1349 1374 1370 1346 1350 +1072 5 2 11 91 1374 1370 1346 1350 1375 1371 1347 1351 +1073 5 2 11 91 1375 1371 1347 1351 1376 1372 1348 1352 +1074 5 2 11 91 1376 1372 1348 1352 506 512 511 505 +1075 5 2 11 91 381 380 374 375 1377 1373 1349 1353 +1076 5 2 11 91 1377 1373 1349 1353 1378 1374 1350 1354 +1077 5 2 11 91 1378 1374 1350 1354 1379 1375 1351 1355 +1078 5 2 11 91 1379 1375 1351 1355 1380 1376 1352 1356 +1079 5 2 11 91 1380 1376 1352 1356 500 506 505 499 +1080 5 2 11 91 382 381 375 376 1381 1377 1353 1357 +1081 5 2 11 91 1381 1377 1353 1357 1382 1378 1354 1358 +1082 5 2 11 91 1382 1378 1354 1358 1383 1379 1355 1359 +1083 5 2 11 91 1383 1379 1355 1359 1384 1380 1356 1360 +1084 5 2 11 91 1384 1380 1356 1360 494 500 499 493 +1085 5 2 11 91 383 382 376 377 1385 1381 1357 1361 +1086 5 2 11 91 1385 1381 1357 1361 1386 1382 1358 1362 +1087 5 2 11 91 1386 1382 1358 1362 1387 1383 1359 1363 +1088 5 2 11 91 1387 1383 1359 1363 1388 1384 1360 1364 +1089 5 2 11 91 1388 1384 1360 1364 488 494 493 487 +1090 5 2 11 91 384 383 377 378 1389 1385 1361 1365 +1091 5 2 11 91 1389 1385 1361 1365 1390 1386 1362 1366 +1092 5 2 11 91 1390 1386 1362 1366 1391 1387 1363 1367 +1093 5 2 11 91 1391 1387 1363 1367 1392 1388 1364 1368 +1094 5 2 11 91 1392 1388 1364 1368 482 488 487 481 +1095 5 2 11 91 57 384 378 58 839 1389 1365 840 +1096 5 2 11 91 839 1389 1365 840 833 1390 1366 834 +1097 5 2 11 91 833 1390 1366 834 827 1391 1367 828 +1098 5 2 11 91 827 1391 1367 828 821 1392 1368 822 +1099 5 2 11 91 821 1392 1368 822 147 482 481 148 +1100 5 2 11 91 385 43 42 379 1393 900 896 1369 +1101 5 2 11 91 1393 900 896 1369 1394 899 895 1370 +1102 5 2 11 91 1394 899 895 1370 1395 898 894 1371 +1103 5 2 11 91 1395 898 894 1371 1396 897 893 1372 +1104 5 2 11 91 1396 897 893 1372 513 139 138 512 +1105 5 2 11 91 386 385 379 380 1397 1393 1369 1373 +1106 5 2 11 91 1397 1393 1369 1373 1398 1394 1370 1374 +1107 5 2 11 91 1398 1394 1370 1374 1399 1395 1371 1375 +1108 5 2 11 91 1399 1395 1371 1375 1400 1396 1372 1376 +1109 5 2 11 91 1400 1396 1372 1376 507 513 512 506 +1110 5 2 11 91 387 386 380 381 1401 1397 1373 1377 +1111 5 2 11 91 1401 1397 1373 1377 1402 1398 1374 1378 +1112 5 2 11 91 1402 1398 1374 1378 1403 1399 1375 1379 +1113 5 2 11 91 1403 1399 1375 1379 1404 1400 1376 1380 +1114 5 2 11 91 1404 1400 1376 1380 501 507 506 500 +1115 5 2 11 91 388 387 381 382 1405 1401 1377 1381 +1116 5 2 11 91 1405 1401 1377 1381 1406 1402 1378 1382 +1117 5 2 11 91 1406 1402 1378 1382 1407 1403 1379 1383 +1118 5 2 11 91 1407 1403 1379 1383 1408 1404 1380 1384 +1119 5 2 11 91 1408 1404 1380 1384 495 501 500 494 +1120 5 2 11 91 389 388 382 383 1409 1405 1381 1385 +1121 5 2 11 91 1409 1405 1381 1385 1410 1406 1382 1386 +1122 5 2 11 91 1410 1406 1382 1386 1411 1407 1383 1387 +1123 5 2 11 91 1411 1407 1383 1387 1412 1408 1384 1388 +1124 5 2 11 91 1412 1408 1384 1388 489 495 494 488 +1125 5 2 11 91 390 389 383 384 1413 1409 1385 1389 +1126 5 2 11 91 1413 1409 1385 1389 1414 1410 1386 1390 +1127 5 2 11 91 1414 1410 1386 1390 1415 1411 1387 1391 +1128 5 2 11 91 1415 1411 1387 1391 1416 1412 1388 1392 +1129 5 2 11 91 1416 1412 1388 1392 483 489 488 482 +1130 5 2 11 91 56 390 384 57 838 1413 1389 839 +1131 5 2 11 91 838 1413 1389 839 832 1414 1390 833 +1132 5 2 11 91 832 1414 1390 833 826 1415 1391 827 +1133 5 2 11 91 826 1415 1391 827 820 1416 1392 821 +1134 5 2 11 91 820 1416 1392 821 146 483 482 147 +1135 5 2 11 91 391 44 43 385 1417 904 900 1393 +1136 5 2 11 91 1417 904 900 1393 1418 903 899 1394 +1137 5 2 11 91 1418 903 899 1394 1419 902 898 1395 +1138 5 2 11 91 1419 902 898 1395 1420 901 897 1396 +1139 5 2 11 91 1420 901 897 1396 514 140 139 513 +1140 5 2 11 91 392 391 385 386 1421 1417 1393 1397 +1141 5 2 11 91 1421 1417 1393 1397 1422 1418 1394 1398 +1142 5 2 11 91 1422 1418 1394 1398 1423 1419 1395 1399 +1143 5 2 11 91 1423 1419 1395 1399 1424 1420 1396 1400 +1144 5 2 11 91 1424 1420 1396 1400 508 514 513 507 +1145 5 2 11 91 393 392 386 387 1425 1421 1397 1401 +1146 5 2 11 91 1425 1421 1397 1401 1426 1422 1398 1402 +1147 5 2 11 91 1426 1422 1398 1402 1427 1423 1399 1403 +1148 5 2 11 91 1427 1423 1399 1403 1428 1424 1400 1404 +1149 5 2 11 91 1428 1424 1400 1404 502 508 507 501 +1150 5 2 11 91 394 393 387 388 1429 1425 1401 1405 +1151 5 2 11 91 1429 1425 1401 1405 1430 1426 1402 1406 +1152 5 2 11 91 1430 1426 1402 1406 1431 1427 1403 1407 +1153 5 2 11 91 1431 1427 1403 1407 1432 1428 1404 1408 +1154 5 2 11 91 1432 1428 1404 1408 496 502 501 495 +1155 5 2 11 91 395 394 388 389 1433 1429 1405 1409 +1156 5 2 11 91 1433 1429 1405 1409 1434 1430 1406 1410 +1157 5 2 11 91 1434 1430 1406 1410 1435 1431 1407 1411 +1158 5 2 11 91 1435 1431 1407 1411 1436 1432 1408 1412 +1159 5 2 11 91 1436 1432 1408 1412 490 496 495 489 +1160 5 2 11 91 396 395 389 390 1437 1433 1409 1413 +1161 5 2 11 91 1437 1433 1409 1413 1438 1434 1410 1414 +1162 5 2 11 91 1438 1434 1410 1414 1439 1435 1411 1415 +1163 5 2 11 91 1439 1435 1411 1415 1440 1436 1412 1416 +1164 5 2 11 91 1440 1436 1412 1416 484 490 489 483 +1165 5 2 11 91 55 396 390 56 837 1437 1413 838 +1166 5 2 11 91 837 1437 1413 838 831 1438 1414 832 +1167 5 2 11 91 831 1438 1414 832 825 1439 1415 826 +1168 5 2 11 91 825 1439 1415 826 819 1440 1416 820 +1169 5 2 11 91 819 1440 1416 820 145 484 483 146 +1170 5 2 11 91 397 45 44 391 1441 908 904 1417 +1171 5 2 11 91 1441 908 904 1417 1442 907 903 1418 +1172 5 2 11 91 1442 907 903 1418 1443 906 902 1419 +1173 5 2 11 91 1443 906 902 1419 1444 905 901 1420 +1174 5 2 11 91 1444 905 901 1420 515 141 140 514 +1175 5 2 11 91 398 397 391 392 1445 1441 1417 1421 +1176 5 2 11 91 1445 1441 1417 1421 1446 1442 1418 1422 +1177 5 2 11 91 1446 1442 1418 1422 1447 1443 1419 1423 +1178 5 2 11 91 1447 1443 1419 1423 1448 1444 1420 1424 +1179 5 2 11 91 1448 1444 1420 1424 509 515 514 508 +1180 5 2 11 91 399 398 392 393 1449 1445 1421 1425 +1181 5 2 11 91 1449 1445 1421 1425 1450 1446 1422 1426 +1182 5 2 11 91 1450 1446 1422 1426 1451 1447 1423 1427 +1183 5 2 11 91 1451 1447 1423 1427 1452 1448 1424 1428 +1184 5 2 11 91 1452 1448 1424 1428 503 509 508 502 +1185 5 2 11 91 400 399 393 394 1453 1449 1425 1429 +1186 5 2 11 91 1453 1449 1425 1429 1454 1450 1426 1430 +1187 5 2 11 91 1454 1450 1426 1430 1455 1451 1427 1431 +1188 5 2 11 91 1455 1451 1427 1431 1456 1452 1428 1432 +1189 5 2 11 91 1456 1452 1428 1432 497 503 502 496 +1190 5 2 11 91 401 400 394 395 1457 1453 1429 1433 +1191 5 2 11 91 1457 1453 1429 1433 1458 1454 1430 1434 +1192 5 2 11 91 1458 1454 1430 1434 1459 1455 1431 1435 +1193 5 2 11 91 1459 1455 1431 1435 1460 1456 1432 1436 +1194 5 2 11 91 1460 1456 1432 1436 491 497 496 490 +1195 5 2 11 91 402 401 395 396 1461 1457 1433 1437 +1196 5 2 11 91 1461 1457 1433 1437 1462 1458 1434 1438 +1197 5 2 11 91 1462 1458 1434 1438 1463 1459 1435 1439 +1198 5 2 11 91 1463 1459 1435 1439 1464 1460 1436 1440 +1199 5 2 11 91 1464 1460 1436 1440 485 491 490 484 +1200 5 2 11 91 54 402 396 55 836 1461 1437 837 +1201 5 2 11 91 836 1461 1437 837 830 1462 1438 831 +1202 5 2 11 91 830 1462 1438 831 824 1463 1439 825 +1203 5 2 11 91 824 1463 1439 825 818 1464 1440 819 +1204 5 2 11 91 818 1464 1440 819 144 485 484 145 +1205 5 2 11 91 403 46 45 397 1465 912 908 1441 +1206 5 2 11 91 1465 912 908 1441 1466 911 907 1442 +1207 5 2 11 91 1466 911 907 1442 1467 910 906 1443 +1208 5 2 11 91 1467 910 906 1443 1468 909 905 1444 +1209 5 2 11 91 1468 909 905 1444 516 142 141 515 +1210 5 2 11 91 404 403 397 398 1469 1465 1441 1445 +1211 5 2 11 91 1469 1465 1441 1445 1470 1466 1442 1446 +1212 5 2 11 91 1470 1466 1442 1446 1471 1467 1443 1447 +1213 5 2 11 91 1471 1467 1443 1447 1472 1468 1444 1448 +1214 5 2 11 91 1472 1468 1444 1448 510 516 515 509 +1215 5 2 11 91 405 404 398 399 1473 1469 1445 1449 +1216 5 2 11 91 1473 1469 1445 1449 1474 1470 1446 1450 +1217 5 2 11 91 1474 1470 1446 1450 1475 1471 1447 1451 +1218 5 2 11 91 1475 1471 1447 1451 1476 1472 1448 1452 +1219 5 2 11 91 1476 1472 1448 1452 504 510 509 503 +1220 5 2 11 91 406 405 399 400 1477 1473 1449 1453 +1221 5 2 11 91 1477 1473 1449 1453 1478 1474 1450 1454 +1222 5 2 11 91 1478 1474 1450 1454 1479 1475 1451 1455 +1223 5 2 11 91 1479 1475 1451 1455 1480 1476 1452 1456 +1224 5 2 11 91 1480 1476 1452 1456 498 504 503 497 +1225 5 2 11 91 407 406 400 401 1481 1477 1453 1457 +1226 5 2 11 91 1481 1477 1453 1457 1482 1478 1454 1458 +1227 5 2 11 91 1482 1478 1454 1458 1483 1479 1455 1459 +1228 5 2 11 91 1483 1479 1455 1459 1484 1480 1456 1460 +1229 5 2 11 91 1484 1480 1456 1460 492 498 497 491 +1230 5 2 11 91 408 407 401 402 1485 1481 1457 1461 +1231 5 2 11 91 1485 1481 1457 1461 1486 1482 1458 1462 +1232 5 2 11 91 1486 1482 1458 1462 1487 1483 1459 1463 +1233 5 2 11 91 1487 1483 1459 1463 1488 1484 1460 1464 +1234 5 2 11 91 1488 1484 1460 1464 486 492 491 485 +1235 5 2 11 91 53 408 402 54 835 1485 1461 836 +1236 5 2 11 91 835 1485 1461 836 829 1486 1462 830 +1237 5 2 11 91 829 1486 1462 830 823 1487 1463 824 +1238 5 2 11 91 823 1487 1463 824 817 1488 1464 818 +1239 5 2 11 91 817 1488 1464 818 143 486 485 144 +1240 5 2 11 91 47 6 46 403 696 168 912 1465 +1241 5 2 11 91 696 168 912 1465 690 167 911 1466 +1242 5 2 11 91 690 167 911 1466 684 166 910 1467 +1243 5 2 11 91 684 166 910 1467 678 165 909 1468 +1244 5 2 11 91 678 165 909 1468 118 14 142 516 +1245 5 2 11 91 48 47 403 404 695 696 1465 1469 +1246 5 2 11 91 695 696 1465 1469 689 690 1466 1470 +1247 5 2 11 91 689 690 1466 1470 683 684 1467 1471 +1248 5 2 11 91 683 684 1467 1471 677 678 1468 1472 +1249 5 2 11 91 677 678 1468 1472 117 118 516 510 +1250 5 2 11 91 49 48 404 405 694 695 1469 1473 +1251 5 2 11 91 694 695 1469 1473 688 689 1470 1474 +1252 5 2 11 91 688 689 1470 1474 682 683 1471 1475 +1253 5 2 11 91 682 683 1471 1475 676 677 1472 1476 +1254 5 2 11 91 676 677 1472 1476 116 117 510 504 +1255 5 2 11 91 50 49 405 406 693 694 1473 1477 +1256 5 2 11 91 693 694 1473 1477 687 688 1474 1478 +1257 5 2 11 91 687 688 1474 1478 681 682 1475 1479 +1258 5 2 11 91 681 682 1475 1479 675 676 1476 1480 +1259 5 2 11 91 675 676 1476 1480 115 116 504 498 +1260 5 2 11 91 51 50 406 407 692 693 1477 1481 +1261 5 2 11 91 692 693 1477 1481 686 687 1478 1482 +1262 5 2 11 91 686 687 1478 1482 680 681 1479 1483 +1263 5 2 11 91 680 681 1479 1483 674 675 1480 1484 +1264 5 2 11 91 674 675 1480 1484 114 115 498 492 +1265 5 2 11 91 52 51 407 408 691 692 1481 1485 +1266 5 2 11 91 691 692 1481 1485 685 686 1482 1486 +1267 5 2 11 91 685 686 1482 1486 679 680 1483 1487 +1268 5 2 11 91 679 680 1483 1487 673 674 1484 1488 +1269 5 2 11 91 673 674 1484 1488 113 114 492 486 +1270 5 2 11 91 7 52 408 53 192 691 1485 835 +1271 5 2 11 91 192 691 1485 835 191 685 1486 829 +1272 5 2 11 91 191 685 1486 829 190 679 1487 823 +1273 5 2 11 91 190 679 1487 823 189 673 1488 817 +1274 5 2 11 91 189 673 1488 817 13 113 486 143 +1275 5 2 11 93 229 35 4 65 1489 888 172 787 +1276 5 2 11 93 1489 888 172 787 1490 882 171 781 +1277 5 2 11 93 1490 882 171 781 1491 876 170 775 +1278 5 2 11 93 1491 876 170 775 1492 870 169 769 +1279 5 2 11 93 1492 870 169 769 624 100 12 149 +1280 5 2 11 93 230 229 65 66 1493 1489 787 788 +1281 5 2 11 93 1493 1489 787 788 1494 1490 781 782 +1282 5 2 11 93 1494 1490 781 782 1495 1491 775 776 +1283 5 2 11 93 1495 1491 775 776 1496 1492 769 770 +1284 5 2 11 93 1496 1492 769 770 618 624 149 150 +1285 5 2 11 93 231 230 66 67 1497 1493 788 789 +1286 5 2 11 93 1497 1493 788 789 1498 1494 782 783 +1287 5 2 11 93 1498 1494 782 783 1499 1495 776 777 +1288 5 2 11 93 1499 1495 776 777 1500 1496 770 771 +1289 5 2 11 93 1500 1496 770 771 612 618 150 151 +1290 5 2 11 93 232 231 67 68 1501 1497 789 790 +1291 5 2 11 93 1501 1497 789 790 1502 1498 783 784 +1292 5 2 11 93 1502 1498 783 784 1503 1499 777 778 +1293 5 2 11 93 1503 1499 777 778 1504 1500 771 772 +1294 5 2 11 93 1504 1500 771 772 606 612 151 152 +1295 5 2 11 93 233 232 68 69 1505 1501 790 791 +1296 5 2 11 93 1505 1501 790 791 1506 1502 784 785 +1297 5 2 11 93 1506 1502 784 785 1507 1503 778 779 +1298 5 2 11 93 1507 1503 778 779 1508 1504 772 773 +1299 5 2 11 93 1508 1504 772 773 600 606 152 153 +1300 5 2 11 93 234 233 69 70 1509 1505 791 792 +1301 5 2 11 93 1509 1505 791 792 1510 1506 785 786 +1302 5 2 11 93 1510 1506 785 786 1511 1507 779 780 +1303 5 2 11 93 1511 1507 779 780 1512 1508 773 774 +1304 5 2 11 93 1512 1508 773 774 594 600 153 154 +1305 5 2 11 93 41 234 70 5 892 1509 792 176 +1306 5 2 11 93 892 1509 792 176 891 1510 786 175 +1307 5 2 11 93 891 1510 786 175 890 1511 780 174 +1308 5 2 11 93 890 1511 780 174 889 1512 774 173 +1309 5 2 11 93 889 1512 774 173 137 594 154 16 +1310 5 2 11 93 235 36 35 229 1513 887 888 1489 +1311 5 2 11 93 1513 887 888 1489 1514 881 882 1490 +1312 5 2 11 93 1514 881 882 1490 1515 875 876 1491 +1313 5 2 11 93 1515 875 876 1491 1516 869 870 1492 +1314 5 2 11 93 1516 869 870 1492 623 99 100 624 +1315 5 2 11 93 236 235 229 230 1517 1513 1489 1493 +1316 5 2 11 93 1517 1513 1489 1493 1518 1514 1490 1494 +1317 5 2 11 93 1518 1514 1490 1494 1519 1515 1491 1495 +1318 5 2 11 93 1519 1515 1491 1495 1520 1516 1492 1496 +1319 5 2 11 93 1520 1516 1492 1496 617 623 624 618 +1320 5 2 11 93 237 236 230 231 1521 1517 1493 1497 +1321 5 2 11 93 1521 1517 1493 1497 1522 1518 1494 1498 +1322 5 2 11 93 1522 1518 1494 1498 1523 1519 1495 1499 +1323 5 2 11 93 1523 1519 1495 1499 1524 1520 1496 1500 +1324 5 2 11 93 1524 1520 1496 1500 611 617 618 612 +1325 5 2 11 93 238 237 231 232 1525 1521 1497 1501 +1326 5 2 11 93 1525 1521 1497 1501 1526 1522 1498 1502 +1327 5 2 11 93 1526 1522 1498 1502 1527 1523 1499 1503 +1328 5 2 11 93 1527 1523 1499 1503 1528 1524 1500 1504 +1329 5 2 11 93 1528 1524 1500 1504 605 611 612 606 +1330 5 2 11 93 239 238 232 233 1529 1525 1501 1505 +1331 5 2 11 93 1529 1525 1501 1505 1530 1526 1502 1506 +1332 5 2 11 93 1530 1526 1502 1506 1531 1527 1503 1507 +1333 5 2 11 93 1531 1527 1503 1507 1532 1528 1504 1508 +1334 5 2 11 93 1532 1528 1504 1508 599 605 606 600 +1335 5 2 11 93 240 239 233 234 1533 1529 1505 1509 +1336 5 2 11 93 1533 1529 1505 1509 1534 1530 1506 1510 +1337 5 2 11 93 1534 1530 1506 1510 1535 1531 1507 1511 +1338 5 2 11 93 1535 1531 1507 1511 1536 1532 1508 1512 +1339 5 2 11 93 1536 1532 1508 1512 593 599 600 594 +1340 5 2 11 93 42 240 234 41 896 1533 1509 892 +1341 5 2 11 93 896 1533 1509 892 895 1534 1510 891 +1342 5 2 11 93 895 1534 1510 891 894 1535 1511 890 +1343 5 2 11 93 894 1535 1511 890 893 1536 1512 889 +1344 5 2 11 93 893 1536 1512 889 138 593 594 137 +1345 5 2 11 93 241 37 36 235 1537 886 887 1513 +1346 5 2 11 93 1537 886 887 1513 1538 880 881 1514 +1347 5 2 11 93 1538 880 881 1514 1539 874 875 1515 +1348 5 2 11 93 1539 874 875 1515 1540 868 869 1516 +1349 5 2 11 93 1540 868 869 1516 622 98 99 623 +1350 5 2 11 93 242 241 235 236 1541 1537 1513 1517 +1351 5 2 11 93 1541 1537 1513 1517 1542 1538 1514 1518 +1352 5 2 11 93 1542 1538 1514 1518 1543 1539 1515 1519 +1353 5 2 11 93 1543 1539 1515 1519 1544 1540 1516 1520 +1354 5 2 11 93 1544 1540 1516 1520 616 622 623 617 +1355 5 2 11 93 243 242 236 237 1545 1541 1517 1521 +1356 5 2 11 93 1545 1541 1517 1521 1546 1542 1518 1522 +1357 5 2 11 93 1546 1542 1518 1522 1547 1543 1519 1523 +1358 5 2 11 93 1547 1543 1519 1523 1548 1544 1520 1524 +1359 5 2 11 93 1548 1544 1520 1524 610 616 617 611 +1360 5 2 11 93 244 243 237 238 1549 1545 1521 1525 +1361 5 2 11 93 1549 1545 1521 1525 1550 1546 1522 1526 +1362 5 2 11 93 1550 1546 1522 1526 1551 1547 1523 1527 +1363 5 2 11 93 1551 1547 1523 1527 1552 1548 1524 1528 +1364 5 2 11 93 1552 1548 1524 1528 604 610 611 605 +1365 5 2 11 93 245 244 238 239 1553 1549 1525 1529 +1366 5 2 11 93 1553 1549 1525 1529 1554 1550 1526 1530 +1367 5 2 11 93 1554 1550 1526 1530 1555 1551 1527 1531 +1368 5 2 11 93 1555 1551 1527 1531 1556 1552 1528 1532 +1369 5 2 11 93 1556 1552 1528 1532 598 604 605 599 +1370 5 2 11 93 246 245 239 240 1557 1553 1529 1533 +1371 5 2 11 93 1557 1553 1529 1533 1558 1554 1530 1534 +1372 5 2 11 93 1558 1554 1530 1534 1559 1555 1531 1535 +1373 5 2 11 93 1559 1555 1531 1535 1560 1556 1532 1536 +1374 5 2 11 93 1560 1556 1532 1536 592 598 599 593 +1375 5 2 11 93 43 246 240 42 900 1557 1533 896 +1376 5 2 11 93 900 1557 1533 896 899 1558 1534 895 +1377 5 2 11 93 899 1558 1534 895 898 1559 1535 894 +1378 5 2 11 93 898 1559 1535 894 897 1560 1536 893 +1379 5 2 11 93 897 1560 1536 893 139 592 593 138 +1380 5 2 11 93 247 38 37 241 1561 885 886 1537 +1381 5 2 11 93 1561 885 886 1537 1562 879 880 1538 +1382 5 2 11 93 1562 879 880 1538 1563 873 874 1539 +1383 5 2 11 93 1563 873 874 1539 1564 867 868 1540 +1384 5 2 11 93 1564 867 868 1540 621 97 98 622 +1385 5 2 11 93 248 247 241 242 1565 1561 1537 1541 +1386 5 2 11 93 1565 1561 1537 1541 1566 1562 1538 1542 +1387 5 2 11 93 1566 1562 1538 1542 1567 1563 1539 1543 +1388 5 2 11 93 1567 1563 1539 1543 1568 1564 1540 1544 +1389 5 2 11 93 1568 1564 1540 1544 615 621 622 616 +1390 5 2 11 93 249 248 242 243 1569 1565 1541 1545 +1391 5 2 11 93 1569 1565 1541 1545 1570 1566 1542 1546 +1392 5 2 11 93 1570 1566 1542 1546 1571 1567 1543 1547 +1393 5 2 11 93 1571 1567 1543 1547 1572 1568 1544 1548 +1394 5 2 11 93 1572 1568 1544 1548 609 615 616 610 +1395 5 2 11 93 250 249 243 244 1573 1569 1545 1549 +1396 5 2 11 93 1573 1569 1545 1549 1574 1570 1546 1550 +1397 5 2 11 93 1574 1570 1546 1550 1575 1571 1547 1551 +1398 5 2 11 93 1575 1571 1547 1551 1576 1572 1548 1552 +1399 5 2 11 93 1576 1572 1548 1552 603 609 610 604 +1400 5 2 11 93 251 250 244 245 1577 1573 1549 1553 +1401 5 2 11 93 1577 1573 1549 1553 1578 1574 1550 1554 +1402 5 2 11 93 1578 1574 1550 1554 1579 1575 1551 1555 +1403 5 2 11 93 1579 1575 1551 1555 1580 1576 1552 1556 +1404 5 2 11 93 1580 1576 1552 1556 597 603 604 598 +1405 5 2 11 93 252 251 245 246 1581 1577 1553 1557 +1406 5 2 11 93 1581 1577 1553 1557 1582 1578 1554 1558 +1407 5 2 11 93 1582 1578 1554 1558 1583 1579 1555 1559 +1408 5 2 11 93 1583 1579 1555 1559 1584 1580 1556 1560 +1409 5 2 11 93 1584 1580 1556 1560 591 597 598 592 +1410 5 2 11 93 44 252 246 43 904 1581 1557 900 +1411 5 2 11 93 904 1581 1557 900 903 1582 1558 899 +1412 5 2 11 93 903 1582 1558 899 902 1583 1559 898 +1413 5 2 11 93 902 1583 1559 898 901 1584 1560 897 +1414 5 2 11 93 901 1584 1560 897 140 591 592 139 +1415 5 2 11 93 253 39 38 247 1585 884 885 1561 +1416 5 2 11 93 1585 884 885 1561 1586 878 879 1562 +1417 5 2 11 93 1586 878 879 1562 1587 872 873 1563 +1418 5 2 11 93 1587 872 873 1563 1588 866 867 1564 +1419 5 2 11 93 1588 866 867 1564 620 96 97 621 +1420 5 2 11 93 254 253 247 248 1589 1585 1561 1565 +1421 5 2 11 93 1589 1585 1561 1565 1590 1586 1562 1566 +1422 5 2 11 93 1590 1586 1562 1566 1591 1587 1563 1567 +1423 5 2 11 93 1591 1587 1563 1567 1592 1588 1564 1568 +1424 5 2 11 93 1592 1588 1564 1568 614 620 621 615 +1425 5 2 11 93 255 254 248 249 1593 1589 1565 1569 +1426 5 2 11 93 1593 1589 1565 1569 1594 1590 1566 1570 +1427 5 2 11 93 1594 1590 1566 1570 1595 1591 1567 1571 +1428 5 2 11 93 1595 1591 1567 1571 1596 1592 1568 1572 +1429 5 2 11 93 1596 1592 1568 1572 608 614 615 609 +1430 5 2 11 93 256 255 249 250 1597 1593 1569 1573 +1431 5 2 11 93 1597 1593 1569 1573 1598 1594 1570 1574 +1432 5 2 11 93 1598 1594 1570 1574 1599 1595 1571 1575 +1433 5 2 11 93 1599 1595 1571 1575 1600 1596 1572 1576 +1434 5 2 11 93 1600 1596 1572 1576 602 608 609 603 +1435 5 2 11 93 257 256 250 251 1601 1597 1573 1577 +1436 5 2 11 93 1601 1597 1573 1577 1602 1598 1574 1578 +1437 5 2 11 93 1602 1598 1574 1578 1603 1599 1575 1579 +1438 5 2 11 93 1603 1599 1575 1579 1604 1600 1576 1580 +1439 5 2 11 93 1604 1600 1576 1580 596 602 603 597 +1440 5 2 11 93 258 257 251 252 1605 1601 1577 1581 +1441 5 2 11 93 1605 1601 1577 1581 1606 1602 1578 1582 +1442 5 2 11 93 1606 1602 1578 1582 1607 1603 1579 1583 +1443 5 2 11 93 1607 1603 1579 1583 1608 1604 1580 1584 +1444 5 2 11 93 1608 1604 1580 1584 590 596 597 591 +1445 5 2 11 93 45 258 252 44 908 1605 1581 904 +1446 5 2 11 93 908 1605 1581 904 907 1606 1582 903 +1447 5 2 11 93 907 1606 1582 903 906 1607 1583 902 +1448 5 2 11 93 906 1607 1583 902 905 1608 1584 901 +1449 5 2 11 93 905 1608 1584 901 141 590 591 140 +1450 5 2 11 93 259 40 39 253 1609 883 884 1585 +1451 5 2 11 93 1609 883 884 1585 1610 877 878 1586 +1452 5 2 11 93 1610 877 878 1586 1611 871 872 1587 +1453 5 2 11 93 1611 871 872 1587 1612 865 866 1588 +1454 5 2 11 93 1612 865 866 1588 619 95 96 620 +1455 5 2 11 93 260 259 253 254 1613 1609 1585 1589 +1456 5 2 11 93 1613 1609 1585 1589 1614 1610 1586 1590 +1457 5 2 11 93 1614 1610 1586 1590 1615 1611 1587 1591 +1458 5 2 11 93 1615 1611 1587 1591 1616 1612 1588 1592 +1459 5 2 11 93 1616 1612 1588 1592 613 619 620 614 +1460 5 2 11 93 261 260 254 255 1617 1613 1589 1593 +1461 5 2 11 93 1617 1613 1589 1593 1618 1614 1590 1594 +1462 5 2 11 93 1618 1614 1590 1594 1619 1615 1591 1595 +1463 5 2 11 93 1619 1615 1591 1595 1620 1616 1592 1596 +1464 5 2 11 93 1620 1616 1592 1596 607 613 614 608 +1465 5 2 11 93 262 261 255 256 1621 1617 1593 1597 +1466 5 2 11 93 1621 1617 1593 1597 1622 1618 1594 1598 +1467 5 2 11 93 1622 1618 1594 1598 1623 1619 1595 1599 +1468 5 2 11 93 1623 1619 1595 1599 1624 1620 1596 1600 +1469 5 2 11 93 1624 1620 1596 1600 601 607 608 602 +1470 5 2 11 93 263 262 256 257 1625 1621 1597 1601 +1471 5 2 11 93 1625 1621 1597 1601 1626 1622 1598 1602 +1472 5 2 11 93 1626 1622 1598 1602 1627 1623 1599 1603 +1473 5 2 11 93 1627 1623 1599 1603 1628 1624 1600 1604 +1474 5 2 11 93 1628 1624 1600 1604 595 601 602 596 +1475 5 2 11 93 264 263 257 258 1629 1625 1601 1605 +1476 5 2 11 93 1629 1625 1601 1605 1630 1626 1602 1606 +1477 5 2 11 93 1630 1626 1602 1606 1631 1627 1603 1607 +1478 5 2 11 93 1631 1627 1603 1607 1632 1628 1604 1608 +1479 5 2 11 93 1632 1628 1604 1608 589 595 596 590 +1480 5 2 11 93 46 264 258 45 912 1629 1605 908 +1481 5 2 11 93 912 1629 1605 908 911 1630 1606 907 +1482 5 2 11 93 911 1630 1606 907 910 1631 1607 906 +1483 5 2 11 93 910 1631 1607 906 909 1632 1608 905 +1484 5 2 11 93 909 1632 1608 905 142 589 590 141 +1485 5 2 11 93 71 1 40 259 720 164 883 1609 +1486 5 2 11 93 720 164 883 1609 719 163 877 1610 +1487 5 2 11 93 719 163 877 1610 718 162 871 1611 +1488 5 2 11 93 718 162 871 1611 717 161 865 1612 +1489 5 2 11 93 717 161 865 1612 124 9 95 619 +1490 5 2 11 93 72 71 259 260 716 720 1609 1613 +1491 5 2 11 93 716 720 1609 1613 715 719 1610 1614 +1492 5 2 11 93 715 719 1610 1614 714 718 1611 1615 +1493 5 2 11 93 714 718 1611 1615 713 717 1612 1616 +1494 5 2 11 93 713 717 1612 1616 123 124 619 613 +1495 5 2 11 93 73 72 260 261 712 716 1613 1617 +1496 5 2 11 93 712 716 1613 1617 711 715 1614 1618 +1497 5 2 11 93 711 715 1614 1618 710 714 1615 1619 +1498 5 2 11 93 710 714 1615 1619 709 713 1616 1620 +1499 5 2 11 93 709 713 1616 1620 122 123 613 607 +1500 5 2 11 93 74 73 261 262 708 712 1617 1621 +1501 5 2 11 93 708 712 1617 1621 707 711 1618 1622 +1502 5 2 11 93 707 711 1618 1622 706 710 1619 1623 +1503 5 2 11 93 706 710 1619 1623 705 709 1620 1624 +1504 5 2 11 93 705 709 1620 1624 121 122 607 601 +1505 5 2 11 93 75 74 262 263 704 708 1621 1625 +1506 5 2 11 93 704 708 1621 1625 703 707 1622 1626 +1507 5 2 11 93 703 707 1622 1626 702 706 1623 1627 +1508 5 2 11 93 702 706 1623 1627 701 705 1624 1628 +1509 5 2 11 93 701 705 1624 1628 120 121 601 595 +1510 5 2 11 93 76 75 263 264 700 704 1625 1629 +1511 5 2 11 93 700 704 1625 1629 699 703 1626 1630 +1512 5 2 11 93 699 703 1626 1630 698 702 1627 1631 +1513 5 2 11 93 698 702 1627 1631 697 701 1628 1632 +1514 5 2 11 93 697 701 1628 1632 119 120 595 589 +1515 5 2 11 93 6 76 264 46 168 700 1629 912 +1516 5 2 11 93 168 700 1629 912 167 699 1630 911 +1517 5 2 11 93 167 699 1630 911 166 698 1631 910 +1518 5 2 11 93 166 698 1631 910 165 697 1632 909 +1519 5 2 11 93 165 697 1632 909 14 119 589 142 +1520 5 2 11 95 337 29 3 83 1633 768 184 744 +1521 5 2 11 95 1633 768 184 744 1634 767 183 738 +1522 5 2 11 95 1634 767 183 738 1635 766 182 732 +1523 5 2 11 95 1635 766 182 732 1636 765 181 726 +1524 5 2 11 95 1636 765 181 726 547 106 11 160 +1525 5 2 11 95 338 337 83 84 1637 1633 744 743 +1526 5 2 11 95 1637 1633 744 743 1638 1634 738 737 +1527 5 2 11 95 1638 1634 738 737 1639 1635 732 731 +1528 5 2 11 95 1639 1635 732 731 1640 1636 726 725 +1529 5 2 11 95 1640 1636 726 725 548 547 160 159 +1530 5 2 11 95 339 338 84 85 1641 1637 743 742 +1531 5 2 11 95 1641 1637 743 742 1642 1638 737 736 +1532 5 2 11 95 1642 1638 737 736 1643 1639 731 730 +1533 5 2 11 95 1643 1639 731 730 1644 1640 725 724 +1534 5 2 11 95 1644 1640 725 724 549 548 159 158 +1535 5 2 11 95 340 339 85 86 1645 1641 742 741 +1536 5 2 11 95 1645 1641 742 741 1646 1642 736 735 +1537 5 2 11 95 1646 1642 736 735 1647 1643 730 729 +1538 5 2 11 95 1647 1643 730 729 1648 1644 724 723 +1539 5 2 11 95 1648 1644 724 723 550 549 158 157 +1540 5 2 11 95 341 340 86 87 1649 1645 741 740 +1541 5 2 11 95 1649 1645 741 740 1650 1646 735 734 +1542 5 2 11 95 1650 1646 735 734 1651 1647 729 728 +1543 5 2 11 95 1651 1647 729 728 1652 1648 723 722 +1544 5 2 11 95 1652 1648 723 722 551 550 157 156 +1545 5 2 11 95 342 341 87 88 1653 1649 740 739 +1546 5 2 11 95 1653 1649 740 739 1654 1650 734 733 +1547 5 2 11 95 1654 1650 734 733 1655 1651 728 727 +1548 5 2 11 95 1655 1651 728 727 1656 1652 722 721 +1549 5 2 11 95 1656 1652 722 721 552 551 156 155 +1550 5 2 11 95 59 342 88 8 816 1653 739 180 +1551 5 2 11 95 816 1653 739 180 810 1654 733 179 +1552 5 2 11 95 810 1654 733 179 804 1655 727 178 +1553 5 2 11 95 804 1655 727 178 798 1656 721 177 +1554 5 2 11 95 798 1656 721 177 131 552 155 15 +1555 5 2 11 95 343 30 29 337 1657 764 768 1633 +1556 5 2 11 95 1657 764 768 1633 1658 763 767 1634 +1557 5 2 11 95 1658 763 767 1634 1659 762 766 1635 +1558 5 2 11 95 1659 762 766 1635 1660 761 765 1636 +1559 5 2 11 95 1660 761 765 1636 541 105 106 547 +1560 5 2 11 95 344 343 337 338 1661 1657 1633 1637 +1561 5 2 11 95 1661 1657 1633 1637 1662 1658 1634 1638 +1562 5 2 11 95 1662 1658 1634 1638 1663 1659 1635 1639 +1563 5 2 11 95 1663 1659 1635 1639 1664 1660 1636 1640 +1564 5 2 11 95 1664 1660 1636 1640 542 541 547 548 +1565 5 2 11 95 345 344 338 339 1665 1661 1637 1641 +1566 5 2 11 95 1665 1661 1637 1641 1666 1662 1638 1642 +1567 5 2 11 95 1666 1662 1638 1642 1667 1663 1639 1643 +1568 5 2 11 95 1667 1663 1639 1643 1668 1664 1640 1644 +1569 5 2 11 95 1668 1664 1640 1644 543 542 548 549 +1570 5 2 11 95 346 345 339 340 1669 1665 1641 1645 +1571 5 2 11 95 1669 1665 1641 1645 1670 1666 1642 1646 +1572 5 2 11 95 1670 1666 1642 1646 1671 1667 1643 1647 +1573 5 2 11 95 1671 1667 1643 1647 1672 1668 1644 1648 +1574 5 2 11 95 1672 1668 1644 1648 544 543 549 550 +1575 5 2 11 95 347 346 340 341 1673 1669 1645 1649 +1576 5 2 11 95 1673 1669 1645 1649 1674 1670 1646 1650 +1577 5 2 11 95 1674 1670 1646 1650 1675 1671 1647 1651 +1578 5 2 11 95 1675 1671 1647 1651 1676 1672 1648 1652 +1579 5 2 11 95 1676 1672 1648 1652 545 544 550 551 +1580 5 2 11 95 348 347 341 342 1677 1673 1649 1653 +1581 5 2 11 95 1677 1673 1649 1653 1678 1674 1650 1654 +1582 5 2 11 95 1678 1674 1650 1654 1679 1675 1651 1655 +1583 5 2 11 95 1679 1675 1651 1655 1680 1676 1652 1656 +1584 5 2 11 95 1680 1676 1652 1656 546 545 551 552 +1585 5 2 11 95 60 348 342 59 815 1677 1653 816 +1586 5 2 11 95 815 1677 1653 816 809 1678 1654 810 +1587 5 2 11 95 809 1678 1654 810 803 1679 1655 804 +1588 5 2 11 95 803 1679 1655 804 797 1680 1656 798 +1589 5 2 11 95 797 1680 1656 798 132 546 552 131 +1590 5 2 11 95 349 31 30 343 1681 760 764 1657 +1591 5 2 11 95 1681 760 764 1657 1682 759 763 1658 +1592 5 2 11 95 1682 759 763 1658 1683 758 762 1659 +1593 5 2 11 95 1683 758 762 1659 1684 757 761 1660 +1594 5 2 11 95 1684 757 761 1660 535 104 105 541 +1595 5 2 11 95 350 349 343 344 1685 1681 1657 1661 +1596 5 2 11 95 1685 1681 1657 1661 1686 1682 1658 1662 +1597 5 2 11 95 1686 1682 1658 1662 1687 1683 1659 1663 +1598 5 2 11 95 1687 1683 1659 1663 1688 1684 1660 1664 +1599 5 2 11 95 1688 1684 1660 1664 536 535 541 542 +1600 5 2 11 95 351 350 344 345 1689 1685 1661 1665 +1601 5 2 11 95 1689 1685 1661 1665 1690 1686 1662 1666 +1602 5 2 11 95 1690 1686 1662 1666 1691 1687 1663 1667 +1603 5 2 11 95 1691 1687 1663 1667 1692 1688 1664 1668 +1604 5 2 11 95 1692 1688 1664 1668 537 536 542 543 +1605 5 2 11 95 352 351 345 346 1693 1689 1665 1669 +1606 5 2 11 95 1693 1689 1665 1669 1694 1690 1666 1670 +1607 5 2 11 95 1694 1690 1666 1670 1695 1691 1667 1671 +1608 5 2 11 95 1695 1691 1667 1671 1696 1692 1668 1672 +1609 5 2 11 95 1696 1692 1668 1672 538 537 543 544 +1610 5 2 11 95 353 352 346 347 1697 1693 1669 1673 +1611 5 2 11 95 1697 1693 1669 1673 1698 1694 1670 1674 +1612 5 2 11 95 1698 1694 1670 1674 1699 1695 1671 1675 +1613 5 2 11 95 1699 1695 1671 1675 1700 1696 1672 1676 +1614 5 2 11 95 1700 1696 1672 1676 539 538 544 545 +1615 5 2 11 95 354 353 347 348 1701 1697 1673 1677 +1616 5 2 11 95 1701 1697 1673 1677 1702 1698 1674 1678 +1617 5 2 11 95 1702 1698 1674 1678 1703 1699 1675 1679 +1618 5 2 11 95 1703 1699 1675 1679 1704 1700 1676 1680 +1619 5 2 11 95 1704 1700 1676 1680 540 539 545 546 +1620 5 2 11 95 61 354 348 60 814 1701 1677 815 +1621 5 2 11 95 814 1701 1677 815 808 1702 1678 809 +1622 5 2 11 95 808 1702 1678 809 802 1703 1679 803 +1623 5 2 11 95 802 1703 1679 803 796 1704 1680 797 +1624 5 2 11 95 796 1704 1680 797 133 540 546 132 +1625 5 2 11 95 355 32 31 349 1705 756 760 1681 +1626 5 2 11 95 1705 756 760 1681 1706 755 759 1682 +1627 5 2 11 95 1706 755 759 1682 1707 754 758 1683 +1628 5 2 11 95 1707 754 758 1683 1708 753 757 1684 +1629 5 2 11 95 1708 753 757 1684 529 103 104 535 +1630 5 2 11 95 356 355 349 350 1709 1705 1681 1685 +1631 5 2 11 95 1709 1705 1681 1685 1710 1706 1682 1686 +1632 5 2 11 95 1710 1706 1682 1686 1711 1707 1683 1687 +1633 5 2 11 95 1711 1707 1683 1687 1712 1708 1684 1688 +1634 5 2 11 95 1712 1708 1684 1688 530 529 535 536 +1635 5 2 11 95 357 356 350 351 1713 1709 1685 1689 +1636 5 2 11 95 1713 1709 1685 1689 1714 1710 1686 1690 +1637 5 2 11 95 1714 1710 1686 1690 1715 1711 1687 1691 +1638 5 2 11 95 1715 1711 1687 1691 1716 1712 1688 1692 +1639 5 2 11 95 1716 1712 1688 1692 531 530 536 537 +1640 5 2 11 95 358 357 351 352 1717 1713 1689 1693 +1641 5 2 11 95 1717 1713 1689 1693 1718 1714 1690 1694 +1642 5 2 11 95 1718 1714 1690 1694 1719 1715 1691 1695 +1643 5 2 11 95 1719 1715 1691 1695 1720 1716 1692 1696 +1644 5 2 11 95 1720 1716 1692 1696 532 531 537 538 +1645 5 2 11 95 359 358 352 353 1721 1717 1693 1697 +1646 5 2 11 95 1721 1717 1693 1697 1722 1718 1694 1698 +1647 5 2 11 95 1722 1718 1694 1698 1723 1719 1695 1699 +1648 5 2 11 95 1723 1719 1695 1699 1724 1720 1696 1700 +1649 5 2 11 95 1724 1720 1696 1700 533 532 538 539 +1650 5 2 11 95 360 359 353 354 1725 1721 1697 1701 +1651 5 2 11 95 1725 1721 1697 1701 1726 1722 1698 1702 +1652 5 2 11 95 1726 1722 1698 1702 1727 1723 1699 1703 +1653 5 2 11 95 1727 1723 1699 1703 1728 1724 1700 1704 +1654 5 2 11 95 1728 1724 1700 1704 534 533 539 540 +1655 5 2 11 95 62 360 354 61 813 1725 1701 814 +1656 5 2 11 95 813 1725 1701 814 807 1726 1702 808 +1657 5 2 11 95 807 1726 1702 808 801 1727 1703 802 +1658 5 2 11 95 801 1727 1703 802 795 1728 1704 796 +1659 5 2 11 95 795 1728 1704 796 134 534 540 133 +1660 5 2 11 95 361 33 32 355 1729 752 756 1705 +1661 5 2 11 95 1729 752 756 1705 1730 751 755 1706 +1662 5 2 11 95 1730 751 755 1706 1731 750 754 1707 +1663 5 2 11 95 1731 750 754 1707 1732 749 753 1708 +1664 5 2 11 95 1732 749 753 1708 523 102 103 529 +1665 5 2 11 95 362 361 355 356 1733 1729 1705 1709 +1666 5 2 11 95 1733 1729 1705 1709 1734 1730 1706 1710 +1667 5 2 11 95 1734 1730 1706 1710 1735 1731 1707 1711 +1668 5 2 11 95 1735 1731 1707 1711 1736 1732 1708 1712 +1669 5 2 11 95 1736 1732 1708 1712 524 523 529 530 +1670 5 2 11 95 363 362 356 357 1737 1733 1709 1713 +1671 5 2 11 95 1737 1733 1709 1713 1738 1734 1710 1714 +1672 5 2 11 95 1738 1734 1710 1714 1739 1735 1711 1715 +1673 5 2 11 95 1739 1735 1711 1715 1740 1736 1712 1716 +1674 5 2 11 95 1740 1736 1712 1716 525 524 530 531 +1675 5 2 11 95 364 363 357 358 1741 1737 1713 1717 +1676 5 2 11 95 1741 1737 1713 1717 1742 1738 1714 1718 +1677 5 2 11 95 1742 1738 1714 1718 1743 1739 1715 1719 +1678 5 2 11 95 1743 1739 1715 1719 1744 1740 1716 1720 +1679 5 2 11 95 1744 1740 1716 1720 526 525 531 532 +1680 5 2 11 95 365 364 358 359 1745 1741 1717 1721 +1681 5 2 11 95 1745 1741 1717 1721 1746 1742 1718 1722 +1682 5 2 11 95 1746 1742 1718 1722 1747 1743 1719 1723 +1683 5 2 11 95 1747 1743 1719 1723 1748 1744 1720 1724 +1684 5 2 11 95 1748 1744 1720 1724 527 526 532 533 +1685 5 2 11 95 366 365 359 360 1749 1745 1721 1725 +1686 5 2 11 95 1749 1745 1721 1725 1750 1746 1722 1726 +1687 5 2 11 95 1750 1746 1722 1726 1751 1747 1723 1727 +1688 5 2 11 95 1751 1747 1723 1727 1752 1748 1724 1728 +1689 5 2 11 95 1752 1748 1724 1728 528 527 533 534 +1690 5 2 11 95 63 366 360 62 812 1749 1725 813 +1691 5 2 11 95 812 1749 1725 813 806 1750 1726 807 +1692 5 2 11 95 806 1750 1726 807 800 1751 1727 801 +1693 5 2 11 95 800 1751 1727 801 794 1752 1728 795 +1694 5 2 11 95 794 1752 1728 795 135 528 534 134 +1695 5 2 11 95 367 34 33 361 1753 748 752 1729 +1696 5 2 11 95 1753 748 752 1729 1754 747 751 1730 +1697 5 2 11 95 1754 747 751 1730 1755 746 750 1731 +1698 5 2 11 95 1755 746 750 1731 1756 745 749 1732 +1699 5 2 11 95 1756 745 749 1732 517 101 102 523 +1700 5 2 11 95 368 367 361 362 1757 1753 1729 1733 +1701 5 2 11 95 1757 1753 1729 1733 1758 1754 1730 1734 +1702 5 2 11 95 1758 1754 1730 1734 1759 1755 1731 1735 +1703 5 2 11 95 1759 1755 1731 1735 1760 1756 1732 1736 +1704 5 2 11 95 1760 1756 1732 1736 518 517 523 524 +1705 5 2 11 95 369 368 362 363 1761 1757 1733 1737 +1706 5 2 11 95 1761 1757 1733 1737 1762 1758 1734 1738 +1707 5 2 11 95 1762 1758 1734 1738 1763 1759 1735 1739 +1708 5 2 11 95 1763 1759 1735 1739 1764 1760 1736 1740 +1709 5 2 11 95 1764 1760 1736 1740 519 518 524 525 +1710 5 2 11 95 370 369 363 364 1765 1761 1737 1741 +1711 5 2 11 95 1765 1761 1737 1741 1766 1762 1738 1742 +1712 5 2 11 95 1766 1762 1738 1742 1767 1763 1739 1743 +1713 5 2 11 95 1767 1763 1739 1743 1768 1764 1740 1744 +1714 5 2 11 95 1768 1764 1740 1744 520 519 525 526 +1715 5 2 11 95 371 370 364 365 1769 1765 1741 1745 +1716 5 2 11 95 1769 1765 1741 1745 1770 1766 1742 1746 +1717 5 2 11 95 1770 1766 1742 1746 1771 1767 1743 1747 +1718 5 2 11 95 1771 1767 1743 1747 1772 1768 1744 1748 +1719 5 2 11 95 1772 1768 1744 1748 521 520 526 527 +1720 5 2 11 95 372 371 365 366 1773 1769 1745 1749 +1721 5 2 11 95 1773 1769 1745 1749 1774 1770 1746 1750 +1722 5 2 11 95 1774 1770 1746 1750 1775 1771 1747 1751 +1723 5 2 11 95 1775 1771 1747 1751 1776 1772 1748 1752 +1724 5 2 11 95 1776 1772 1748 1752 522 521 527 528 +1725 5 2 11 95 64 372 366 63 811 1773 1749 812 +1726 5 2 11 95 811 1773 1749 812 805 1774 1750 806 +1727 5 2 11 95 805 1774 1750 806 799 1775 1751 800 +1728 5 2 11 95 799 1775 1751 800 793 1776 1752 794 +1729 5 2 11 95 793 1776 1752 794 136 522 528 135 +1730 5 2 11 95 65 4 34 367 787 172 748 1753 +1731 5 2 11 95 787 172 748 1753 781 171 747 1754 +1732 5 2 11 95 781 171 747 1754 775 170 746 1755 +1733 5 2 11 95 775 170 746 1755 769 169 745 1756 +1734 5 2 11 95 769 169 745 1756 149 12 101 517 +1735 5 2 11 95 66 65 367 368 788 787 1753 1757 +1736 5 2 11 95 788 787 1753 1757 782 781 1754 1758 +1737 5 2 11 95 782 781 1754 1758 776 775 1755 1759 +1738 5 2 11 95 776 775 1755 1759 770 769 1756 1760 +1739 5 2 11 95 770 769 1756 1760 150 149 517 518 +1740 5 2 11 95 67 66 368 369 789 788 1757 1761 +1741 5 2 11 95 789 788 1757 1761 783 782 1758 1762 +1742 5 2 11 95 783 782 1758 1762 777 776 1759 1763 +1743 5 2 11 95 777 776 1759 1763 771 770 1760 1764 +1744 5 2 11 95 771 770 1760 1764 151 150 518 519 +1745 5 2 11 95 68 67 369 370 790 789 1761 1765 +1746 5 2 11 95 790 789 1761 1765 784 783 1762 1766 +1747 5 2 11 95 784 783 1762 1766 778 777 1763 1767 +1748 5 2 11 95 778 777 1763 1767 772 771 1764 1768 +1749 5 2 11 95 772 771 1764 1768 152 151 519 520 +1750 5 2 11 95 69 68 370 371 791 790 1765 1769 +1751 5 2 11 95 791 790 1765 1769 785 784 1766 1770 +1752 5 2 11 95 785 784 1766 1770 779 778 1767 1771 +1753 5 2 11 95 779 778 1767 1771 773 772 1768 1772 +1754 5 2 11 95 773 772 1768 1772 153 152 520 521 +1755 5 2 11 95 70 69 371 372 792 791 1769 1773 +1756 5 2 11 95 792 791 1769 1773 786 785 1770 1774 +1757 5 2 11 95 786 785 1770 1774 780 779 1771 1775 +1758 5 2 11 95 780 779 1771 1775 774 773 1772 1776 +1759 5 2 11 95 774 773 1772 1776 154 153 521 522 +1760 5 2 11 95 5 70 372 64 176 792 1773 811 +1761 5 2 11 95 176 792 1773 811 175 786 1774 805 +1762 5 2 11 95 175 786 1774 805 174 780 1775 799 +1763 5 2 11 95 174 780 1775 799 173 774 1776 793 +1764 5 2 11 95 173 774 1776 793 16 154 522 136 +$EndElements diff --git a/dG3D/benchmarks/multiscaleAdhesiveTest2D/model.py b/dG3D/benchmarks/multiscaleAdhesiveTest2D/model.py index 42ce256287d14279ea801b7553ff90b55f02b9fb..14a8f141f1b7412879c2c9e7cd74a5afe7d61f56 100644 --- a/dG3D/benchmarks/multiscaleAdhesiveTest2D/model.py +++ b/dG3D/benchmarks/multiscaleAdhesiveTest2D/model.py @@ -32,7 +32,7 @@ myfield1 = nonLocalDamageDG3DDomain(1000,nfield,0,lawnum1,0,1e3,2,1) microBC = nonLinearPeriodicBC(1000,2) microBC.setOrder(1) -microBC.setBCPhysical(1,2,3,4) +microBC.setBCPhysical(1,4,3,2) # periodiodic BC method = 0 # Periodic mesh = 0 Langrange interpolation = 1 Cubic spline interpolation =2 degree = 5 diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D/model.py b/dG3D/benchmarks/multiscaleCohesiveTest2D/model.py index c4e554c7c69c997f27afbd256800c1ca6939d839..078ffcbfe138de617e95cdf86db8d31286b49cab 100644 --- a/dG3D/benchmarks/multiscaleCohesiveTest2D/model.py +++ b/dG3D/benchmarks/multiscaleCohesiveTest2D/model.py @@ -31,7 +31,7 @@ myfield1 = nonLocalDamageDG3DDomain(1000,nfield,0,lawnum1,0,1e3,2,1) microBC = nonLinearPeriodicBC(1000,2) microBC.setOrder(1) -microBC.setBCPhysical(1,2,3,4) +microBC.setBCPhysical(1,4,3,2) # periodiodic BC method = 0 # Periodic mesh = 0 Langrange interpolation = 1 Cubic spline interpolation =2 degree = 5 @@ -98,7 +98,6 @@ macromat1.dirichletBC("Face",11,2,0.) lcohNum = 13 lawCoh = TwoFieldMultiscaleCohesive3DLaw(lcohNum,0.7) lawCoh.setCharacteristicLength(1.) -lawCoh.setExtractCohesiveLawFromMicroDamage(True) lawCoh.setLostSolutionUniquenssTolerance(0.9) macromeshfile="model.msh" # name of mesh file diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG/model.py b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG/model.py index 8a0c1ae67a088f93c6e2e9ec3274e622ec6be637..9246d35e19c7a1a01f117a92eff5438d53f56a60 100644 --- a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG/model.py +++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG/model.py @@ -31,7 +31,7 @@ myfield1 = nonLocalDamageDG3DDomain(1000,nfield,0,lawnum1,0,1e3,2,1) microBC = nonLinearPeriodicBC(1000,2) microBC.setOrder(1) -microBC.setBCPhysical(1,2,3,4) +microBC.setBCPhysical(1,4,3,2) # periodiodic BC method = 0 # Periodic mesh = 0 Langrange interpolation = 1 Cubic spline interpolation =2 degree = 5 @@ -98,7 +98,6 @@ macromat1.dirichletBC("Face",11,2,0.) lcohNum = 13 lawCoh = dG3DMultiscaleCohesiveLaw(lcohNum,0.7) lawCoh.setCharacteristicLength(1.) -lawCoh.setExtractCohesiveLawFromMicroDamage(True) lawCoh.setLostSolutionUniquenssTolerance(0.) macromeshfile="model.msh" # name of mesh file @@ -204,5 +203,5 @@ mysolver.archivingInterfaceElementIP(11,12,IPField.INCOMPATIBLE_STRAIN_Y,4,0,1) mysolver.solve() check = TestCheck() -check.equal(-8.808509e+00,mysolver.getArchivedForceOnPhysicalGroup("Edge", 4, 0),1.e-4) +check.equal(-1.362276e+01,mysolver.getArchivedForceOnPhysicalGroup("Edge", 4, 0),1.e-4) diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_changeBCAfterFailure/CMakeLists.txt b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_changeBCAfterFailure/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..bc54bc2ce5018e76600e6490a5013c6c5d8aed59 --- /dev/null +++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_changeBCAfterFailure/CMakeLists.txt @@ -0,0 +1,14 @@ +# test file + +set(PYFILE model.py) + +set(FILES2DELETE + E_*.msh + *.txt + *.csv + disp* + stress* + *Rotated*.msh +) + +add_cm3python_mpi_test(4 ${PYFILE} "${FILES2DELETE}") diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_changeBCAfterFailure/micro.geo b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_changeBCAfterFailure/micro.geo new file mode 100644 index 0000000000000000000000000000000000000000..5e0b62d6d05215e12989e4cd6bfebc54d1a5517e --- /dev/null +++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_changeBCAfterFailure/micro.geo @@ -0,0 +1,45 @@ +mm = 1.; +L = 1.*mm; +R = 0.15*L; +lsca1 = 0.2*L; +lsca2 = 0.4*lsca1; + +Point(1) = {0,0,0,lsca1}; +Point(2) = {-R,0,0,lsca2}; +Point(3) = {-0.5*L,0,0,lsca2}; +Point(4) = {-0.5*L,-0.5*L,0,lsca1}; +Point(5) = {0,-0.5*L,0,lsca2}; +Point(6) = {0,-R,0,lsca2}; + + +Line(1) = {2, 3}; +Line(2) = {3, 4}; +Line(3) = {4, 5}; +Line(4) = {5, 6}; +Circle(5) = {2, 1, 6}; +Line Loop(6) = {2, 3, 4, -5, 1}; +Plane Surface(7) = {6}; +Symmetry {1, 0, 0, 0} { + Duplicata { Surface{7}; } +} +Symmetry {0, 1, 0, 0} { + Duplicata { Surface{7, 8}; } +} + +//Recombine Surface{14, 20, 8, 7}; +Physical Line(1) = {3, 10}; +Physical Line(2) = {9, 21}; +Physical Line(3) = {22, 16}; +Physical Line(4) = {15, 2}; +Physical Surface(11) = {14, 20, 8, 7}; + + +/* +Translate {0.1, 0, 0} { + Line{17, 24, 18, 5, 12, 4}; +} + +Translate {0, 0.1, 0} { + Line{18, 24, 13, 12, 5, 1}; +} +*/ diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_changeBCAfterFailure/micro.msh b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_changeBCAfterFailure/micro.msh new file mode 100644 index 0000000000000000000000000000000000000000..c6acd5b31b792077590d064be2f4fe7779b47c89 --- /dev/null +++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_changeBCAfterFailure/micro.msh @@ -0,0 +1,787 @@ +$MeshFormat +2.2 0 8 +$EndMeshFormat +$Nodes +512 +1 -0.15 0 0 +2 -0.5 0 0 +3 -0.5 -0.5 0 +4 0 -0.5 0 +5 0 -0.15 0 +6 0.5 0 0 +7 0.5 -0.5 0 +8 0.15 0 0 +9 -0.5 0.5 0 +10 0 0.5 0 +11 0 0.15 0 +12 0.5 0.5 0 +13 -0.2199999999998429 0 0 +14 -0.2899999999995946 0 0 +15 -0.3599999999995793 0 0 +16 -0.4299999999997463 0 0 +17 -0.1849999999999308 0 0 +18 -0.2549999999996413 0 0 +19 -0.3249999999994754 0 0 +20 -0.3949999999996151 0 0 +21 -0.4649999999998321 0 0 +22 -0.5 -0.08581116126524545 0 +23 -0.5 -0.1937129562906754 0 +24 -0.5 -0.3293922803425093 0 +25 -0.5 -0.04290558063262855 0 +26 -0.5 -0.1397620587779604 0 +27 -0.5 -0.261552618316445 0 +28 -0.5 -0.4146961401712547 0 +29 -0.329392280343592 -0.5 0 +30 -0.1937129562919624 -0.5 0 +31 -0.08581116126571686 -0.5 0 +32 -0.4146961401717154 -0.5 0 +33 -0.2615526183179323 -0.5 0 +34 -0.1397620587788396 -0.5 0 +35 -0.04290558063285843 -0.5 0 +36 0 -0.4300000000001734 0 +37 0 -0.3600000000003685 0 +38 0 -0.2900000000003252 0 +39 0 -0.2200000000001519 0 +40 0 -0.4650000000000867 0 +41 0 -0.3950000000003007 0 +42 0 -0.3250000000004448 0 +43 0 -0.2550000000002834 0 +44 0 -0.1850000000000817 0 +45 -0.1299038105677715 -0.07499999999981691 0 +46 -0.07500000000016267 -0.1299038105675719 0 +47 -0.1448888739433795 -0.03882285676530619 0 +48 -0.106066017178175 -0.1060660171777893 0 +49 -0.03882285676546777 -0.1448888739433362 0 +50 0.5 -0.08581116126524545 0 +51 0.5 -0.1937129562906754 0 +52 0.5 -0.3293922803425093 0 +53 0.5 -0.04290558063262855 0 +54 0.5 -0.1397620587779604 0 +55 0.5 -0.261552618316445 0 +56 0.5 -0.4146961401712547 0 +57 0.329392280343592 -0.5 0 +58 0.1937129562919624 -0.5 0 +59 0.08581116126571686 -0.5 0 +60 0.4146961401717154 -0.5 0 +61 0.2615526183179323 -0.5 0 +62 0.1397620587788396 -0.5 0 +63 0.04290558063285843 -0.5 0 +64 0.07499999999980624 -0.1299038105677777 0 +65 0.12990381056752 -0.07500000000025255 0 +66 0.03882285676529234 -0.1448888739433832 0 +67 0.1060660171777162 -0.1060660171782481 0 +68 0.1448888739433208 -0.03882285676552522 0 +69 0.2199999999998429 0 0 +70 0.2899999999995946 0 0 +71 0.3599999999995793 0 0 +72 0.4299999999997463 0 0 +73 0.1849999999999308 0 0 +74 0.2549999999996413 0 0 +75 0.3249999999994754 0 0 +76 0.3949999999996151 0 0 +77 0.4649999999998321 0 0 +78 -0.5 0.08581116126524545 0 +79 -0.5 0.1937129562906754 0 +80 -0.5 0.3293922803425093 0 +81 -0.5 0.04290558063262855 0 +82 -0.5 0.1397620587779604 0 +83 -0.5 0.261552618316445 0 +84 -0.5 0.4146961401712547 0 +85 -0.329392280343592 0.5 0 +86 -0.1937129562919624 0.5 0 +87 -0.08581116126571686 0.5 0 +88 -0.4146961401717154 0.5 0 +89 -0.2615526183179323 0.5 0 +90 -0.1397620587788396 0.5 0 +91 -0.04290558063285843 0.5 0 +92 0 0.4300000000001734 0 +93 0 0.3600000000003685 0 +94 0 0.2900000000003252 0 +95 0 0.2200000000001519 0 +96 0 0.4650000000000867 0 +97 0 0.3950000000003007 0 +98 0 0.3250000000004448 0 +99 0 0.2550000000002834 0 +100 0 0.1850000000000817 0 +101 -0.07499999999980624 0.1299038105677777 0 +102 -0.12990381056752 0.07500000000025255 0 +103 -0.03882285676529234 0.1448888739433832 0 +104 -0.1060660171777162 0.1060660171782481 0 +105 -0.1448888739433208 0.03882285676552522 0 +106 0.5 0.08581116126524545 0 +107 0.5 0.1937129562906754 0 +108 0.5 0.3293922803425093 0 +109 0.5 0.04290558063262855 0 +110 0.5 0.1397620587779604 0 +111 0.5 0.261552618316445 0 +112 0.5 0.4146961401712547 0 +113 0.329392280343592 0.5 0 +114 0.1937129562919624 0.5 0 +115 0.08581116126571686 0.5 0 +116 0.4146961401717154 0.5 0 +117 0.2615526183179323 0.5 0 +118 0.1397620587788396 0.5 0 +119 0.04290558063285843 0.5 0 +120 0.07499999999980624 0.1299038105677777 0 +121 0.12990381056752 0.07500000000025255 0 +122 0.03882285676529234 0.1448888739433832 0 +123 0.1060660171777162 0.1060660171782481 0 +124 0.1448888739433208 0.03882285676552522 0 +125 -0.1632048750113544 -0.1232644810194541 0 +126 -0.2185144679483137 -0.3801534959448527 0 +127 -0.05089028167349786 -0.3584631613501202 0 +128 -0.06084793484707645 -0.1951430174291601 0 +129 -0.3999414826379826 -0.2373669670280938 0 +130 -0.3599999999994629 -0.06999999999986822 0 +131 -0.3654446467373357 -0.3654437046554025 0 +132 -0.4395424499711516 -0.06153088004804232 0 +133 -0.07529335399327118 -0.4336732331852045 0 +134 -0.281150983089465 -0.07390248292404106 0 +135 -0.2004047094340141 -0.06731430289221857 0 +136 -0.2306851351003935 -0.1453676244057918 0 +137 -0.07468286925234641 -0.2723686030373706 0 +138 -0.1452917775342399 -0.193626272412306 0 +139 -0.2595592816824605 -0.2528029361930984 0 +140 -0.1622839878484807 -0.2944285423531688 0 +141 -0.3285804443445061 -0.150165777374023 0 +142 -0.1292296528346454 -0.3731811726451194 0 +143 -0.4267159830345902 -0.1297998703416353 0 +144 -0.3297503821602216 -0.2450849516105961 0 +145 -0.2940698630134833 -0.2014843567835607 0 +146 -0.3642609634912444 -0.1937663722010584 0 +147 -0.1345031551426168 -0.4668366165926022 0 +148 -0.1022615034139583 -0.4034272029151619 0 +149 -0.1614713045633039 -0.4365905863225597 0 +150 -0.1969450050558739 -0.134316052712623 0 +151 -0.1879884563173167 -0.1694969484090489 0 +152 -0.1542483262727972 -0.1584453767158801 0 +153 -0.1191024375057585 -0.126584145793513 0 +154 -0.1101458887672013 -0.1617650414899389 0 +155 -0.245122208391427 -0.1990852802994451 0 +156 -0.2024255296083502 -0.2232146043027022 0 +157 -0.4327223233686679 -0.3474179924989559 0 +158 -0.3826930646876592 -0.3014053358417482 0 +159 -0.4499707413189913 -0.2833796236853016 0 +160 -0.2739533741459528 -0.4400767479724264 0 +161 -0.2919795573428247 -0.3727986003001276 0 +162 -0.3474184635404639 -0.4327218523277012 0 +163 -0.08055225762949403 -0.4668366165926022 0 +164 -0.1465543427895629 -0.09913224050963552 0 +165 -0.1738720603914795 -0.3766673342949861 0 +166 -0.206113712120138 -0.4400767479724264 0 +167 -0.1903992278983972 -0.3372910191490107 0 +168 -0.2109216347654706 -0.2736157392731336 0 +169 -0.239036874815387 -0.3164782160689755 0 +170 -0.06278657546292213 -0.3154158821937454 0 +171 -0.1019562610434959 -0.322774887841245 0 +172 -0.09005996725407162 -0.3658221669976198 0 +173 -0.1184834285504136 -0.2833985726952697 0 +174 -0.145756820341563 -0.3338048574991441 0 +175 -0.4327223233686679 -0.4327218523277012 0 +176 -0.4499707413189913 -0.2155399616593846 0 +177 -0.4133287328362865 -0.1835834186848646 0 +178 -0.4633579915172951 -0.1617564133161554 0 +179 -0.250575491544654 -0.03695124146202053 0 +180 -0.2407778462617395 -0.07060839290812981 0 +181 -0.2102023547169285 -0.03365715144610928 0 +182 -0.0373414346261732 -0.2811843015188479 0 +183 -0.02544514083674893 -0.3242315806752227 0 +184 -0.2796327897224498 -0.1477667008899074 0 +185 -0.4633579915172951 -0.1078055158034404 0 +186 -0.4697712249855758 -0.07367102065664388 0 +187 -0.4697712249855758 -0.03076544002402116 0 +188 -0.03764667699663559 -0.4668366165926022 0 +189 -0.2559180590949293 -0.1096350536649164 0 +190 -0.2155449222672038 -0.1063409636490052 0 +191 -0.1537878826913603 -0.2440274073827374 0 +192 -0.434771224985449 -0.03076544002402116 0 +193 -0.06792396742361956 -0.162523413998366 0 +194 -0.03042396742353823 -0.17257150871458 0 +195 -0.03764667699663559 -0.4318366165926889 0 +196 -0.175202354717007 -0.03365715144610928 0 +197 -0.1651542600008928 -0.07115715144601774 0 +198 -0.3442902221719845 -0.1100828886869456 0 +199 -0.3048657137169856 -0.112034130149032 0 +200 -0.320575491544464 -0.07195124146195464 0 +201 -0.3933579915170266 -0.09989993517075177 0 +202 -0.3776482136895482 -0.1399828238578292 0 +203 -0.3997712249853073 -0.06576544002395526 0 +204 -0.3949999999996046 -0.03499999999993411 0 +205 -0.02544514083674893 -0.3942315806751467 0 +206 -0.06309181783338452 -0.3960681972676623 0 +207 -0.1030698561906582 -0.194384644920733 0 +208 -0.1099873233932932 -0.2329974377248383 0 +209 -0.06776540204971143 -0.2337558102332654 0 +210 -0.2855754915445298 -0.03695124146202053 0 +211 -0.03042396742353823 -0.207571508714656 0 +212 -0.0373414346261732 -0.2461843015187613 0 +213 -0.3599999999995211 -0.03499999999993411 0 +214 -0.3249999999995288 -0.03499999999993411 0 +215 -0.02544514083674893 -0.3592315806752443 0 +216 -0.433129216502871 -0.09566537519483881 0 +217 -0.1818047922226842 -0.09528939195583636 0 +218 -0.3125019642098981 -0.3091233204242504 0 +219 0.1224866355280155 -0.1629072024975547 0 +220 0.3808849436885997 -0.210277224031109 0 +221 0.206743501399355 -0.07464099728276744 0 +222 0.3593515291260043 -0.06361416849824304 0 +223 0.2373889375053712 -0.4000946023341276 0 +224 0.05600596672534444 -0.3582026903534058 0 +225 0.3654446467373352 -0.3654437046554016 0 +226 0.07667776057372377 -0.4233233779044261 0 +227 0.4334916324593139 -0.06393052432330396 0 +228 0.07179343033759225 -0.2810845082405963 0 +229 0.06810735186864317 -0.2009476328841135 0 +230 0.1441955258379768 -0.2303966446545607 0 +231 0.2844391541799908 -0.07552818560281363 0 +232 0.1883841865915948 -0.1499536144563917 0 +233 0.2533917520134046 -0.2547236322031965 0 +234 0.2785219510541916 -0.1476215722506409 0 +235 0.1425674588596785 -0.3441671146532657 0 +236 0.3629155847584906 -0.1147592360453619 0 +237 0.1472316548992905 -0.4335170189783639 0 +238 0.4354584321812809 -0.1336982203911391 0 +239 0.1899781981825249 -0.3721308584936966 0 +240 0.1979796054365416 -0.2994453734282311 0 +241 0.2453903447593879 -0.3274091172686621 0 +242 0.1554354110598052 -0.1564304084769732 0 +243 0.1662898562147858 -0.1901751295554762 0 +244 0.1333410806829962 -0.1966519235760577 0 +245 0.1261952230477678 -0.1189536012489036 0 +246 0.09874331776391088 -0.1464055065326662 0 +247 0.2208879693024997 -0.2023386233297941 0 +248 0.1987936389256907 -0.2425601384288786 0 +249 0.1591439985795574 -0.1124768072283221 0 +250 0.2833906089244816 -0.4500473011670638 0 +251 0.3014167921213532 -0.3827691534947646 0 +252 0.3474184635404636 -0.4327218523277008 0 +253 0.4327223233686676 -0.3474179924989554 0 +254 0.3731647952129674 -0.2878604643432553 0 +255 0.4404424718442999 -0.2698347521868091 0 +256 0.3171383478510021 -0.2325004281171527 0 +257 0.2659568515337981 -0.2011726022269187 0 +258 0.3297034473713957 -0.178949398140875 0 +259 0.3207187679063411 -0.1311904041480014 0 +260 0.3719002642235452 -0.1625182300382355 0 +261 0.4327223233686676 -0.4327218523277008 0 +262 0.1704723055956265 -0.466758509489182 0 +263 0.1923102962023309 -0.4168058106562458 0 +264 0.2155509468986668 -0.4500473011670638 0 +265 0.4404424718442999 -0.2019950901608922 0 +266 0.4081716879349403 -0.1719877222111241 0 +267 0.4677292160906404 -0.1637055883409073 0 +268 0.03405367593432158 -0.2104738164421327 0 +269 0.06995039110311771 -0.2410160705623549 0 +270 0.03589671516879613 -0.2505422541203741 0 +271 0.1433814923488277 -0.2872818796539132 0 +272 0.4677292160906404 -0.1097546908281923 0 +273 0.1165214080825037 -0.466758509489182 0 +274 0.2522195770899168 -0.03776409280140682 0 +275 0.2455913277896729 -0.07508459144279053 0 +276 0.213371750699599 -0.03732049864138372 0 +277 0.4344750323202974 -0.09881437235722154 0 +278 0.3991870084698858 -0.1242287282182505 0 +279 0.3982036086089022 -0.08934488018433293 0 +280 0.2334530688228932 -0.1487875933535163 0 +281 0.03833888028686189 -0.461661688952213 0 +282 0.08124446091972032 -0.461661688952213 0 +283 0.4667458162296569 -0.07487084279427469 0 +284 0.4667458162296569 -0.03196526216165198 0 +285 0.10615143885331 -0.2156721387693371 0 +286 0.1079944780877845 -0.2557405764475785 0 +287 0.2814805526170912 -0.1115748789267273 0 +288 0.2426327262267733 -0.1111312847667042 0 +289 0.1783717506996775 -0.03732049864138372 0 +290 0.1683236559834375 -0.07482049864151 0 +291 0.3236773694692406 -0.09514371082408776 0 +292 0.03833888028686189 -0.4266616889522997 0 +293 0.4317458162295301 -0.03196526216165198 0 +294 0.2872195770897927 -0.03776409280140682 0 +295 0.07155367593422471 -0.1654257217259456 0 +296 0.03405367593432158 -0.1754738164420568 0 +297 0.1975638439954749 -0.1122973058695796 0 +298 0.06389969853146835 -0.319643599297001 0 +299 0.1071804445986354 -0.312625811446931 0 +300 0.09928671279251149 -0.3511849025033358 0 +301 0.1096226097167012 -0.3837452462788459 0 +302 0.06634186364953411 -0.3907630341289159 0 +303 0.1448995568794845 -0.3888420668158148 0 +304 0.1119547077365072 -0.428420198441395 0 +305 0.02800298336267222 -0.3941013451767896 0 +306 0.3964215807926591 -0.06377234641077351 0 +307 0.3946757645628752 -0.03180708424912152 0 +308 0.3246757645627995 -0.03180708424912152 0 +309 0.3218953416529975 -0.06957117705052834 0 +310 0.03589671516879613 -0.2855422541204607 0 +311 0.02800298336267222 -0.3241013451768655 0 +312 0.02800298336267222 -0.3591013451768871 0 +313 0.3596757645627918 -0.03180708424912152 0 +314 0.09529699369832934 -0.1819274176908341 0 +315 0.3611335569422474 -0.08918670227180248 0 +316 0.3094181993753699 -0.310083668429299 0 +317 -0.1224866355280155 0.1629072024975547 0 +318 -0.3808849436885997 0.210277224031109 0 +319 -0.206743501399355 0.07464099728276744 0 +320 -0.3593515291260043 0.06361416849824304 0 +321 -0.2373889375053712 0.4000946023341276 0 +322 -0.05600596672534444 0.3582026903534058 0 +323 -0.3654446467373352 0.3654437046554016 0 +324 -0.07667776057372377 0.4233233779044261 0 +325 -0.4334916324593139 0.06393052432330396 0 +326 -0.07179343033759225 0.2810845082405963 0 +327 -0.06810735186864317 0.2009476328841135 0 +328 -0.1441955258379768 0.2303966446545607 0 +329 -0.2844391541799908 0.07552818560281363 0 +330 -0.1883841865915948 0.1499536144563917 0 +331 -0.2533917520134046 0.2547236322031965 0 +332 -0.2785219510541917 0.1476215722506409 0 +333 -0.1425674588596785 0.3441671146532657 0 +334 -0.3629155847584906 0.1147592360453619 0 +335 -0.1472316548992905 0.4335170189783639 0 +336 -0.4354584321812809 0.1336982203911391 0 +337 -0.1899781981825249 0.3721308584936966 0 +338 -0.1979796054365416 0.2994453734282311 0 +339 -0.2453903447593879 0.3274091172686621 0 +340 -0.1554354110598052 0.1564304084769732 0 +341 -0.1662898562147858 0.1901751295554762 0 +342 -0.1333410806829962 0.1966519235760577 0 +343 -0.1261952230477678 0.1189536012489036 0 +344 -0.09874331776391088 0.1464055065326662 0 +345 -0.2208879693024997 0.2023386233297941 0 +346 -0.1987936389256907 0.2425601384288786 0 +347 -0.1591439985795574 0.1124768072283221 0 +348 -0.2833906089244816 0.4500473011670638 0 +349 -0.3014167921213532 0.3827691534947646 0 +350 -0.3474184635404636 0.4327218523277008 0 +351 -0.4327223233686676 0.3474179924989554 0 +352 -0.3731647952129674 0.2878604643432553 0 +353 -0.4404424718442999 0.2698347521868091 0 +354 -0.3171383478510021 0.2325004281171527 0 +355 -0.2659568515337981 0.2011726022269187 0 +356 -0.3297034473713957 0.178949398140875 0 +357 -0.3207187679063411 0.1311904041480014 0 +358 -0.3719002642235452 0.1625182300382355 0 +359 -0.4327223233686676 0.4327218523277008 0 +360 -0.1704723055956265 0.466758509489182 0 +361 -0.1923102962023309 0.4168058106562458 0 +362 -0.2155509468986668 0.4500473011670638 0 +363 -0.4404424718442999 0.2019950901608922 0 +364 -0.4081716879349403 0.1719877222111241 0 +365 -0.4677292160906404 0.1637055883409073 0 +366 -0.03405367593432158 0.2104738164421327 0 +367 -0.06995039110311771 0.2410160705623549 0 +368 -0.03589671516879613 0.2505422541203741 0 +369 -0.1433814923488277 0.2872818796539132 0 +370 -0.4677292160906404 0.1097546908281923 0 +371 -0.1165214080825037 0.466758509489182 0 +372 -0.2522195770899168 0.03776409280140682 0 +373 -0.2455913277896729 0.07508459144279053 0 +374 -0.213371750699599 0.03732049864138372 0 +375 -0.4344750323202974 0.09881437235722154 0 +376 -0.3991870084698858 0.1242287282182505 0 +377 -0.3982036086089022 0.08934488018433293 0 +378 -0.2334530688228932 0.1487875933535163 0 +379 -0.03833888028686189 0.461661688952213 0 +380 -0.08124446091972032 0.461661688952213 0 +381 -0.4667458162296569 0.07487084279427469 0 +382 -0.4667458162296569 0.03196526216165198 0 +383 -0.10615143885331 0.2156721387693371 0 +384 -0.1079944780877845 0.2557405764475785 0 +385 -0.2814805526170913 0.1115748789267273 0 +386 -0.2426327262267734 0.1111312847667042 0 +387 -0.1783717506996775 0.03732049864138372 0 +388 -0.1683236559834375 0.07482049864151 0 +389 -0.3236773694692406 0.09514371082408776 0 +390 -0.03833888028686189 0.4266616889522997 0 +391 -0.4317458162295301 0.03196526216165198 0 +392 -0.2872195770897927 0.03776409280140682 0 +393 -0.07155367593422471 0.1654257217259456 0 +394 -0.03405367593432158 0.1754738164420568 0 +395 -0.1975638439954749 0.1122973058695796 0 +396 -0.06389969853146835 0.319643599297001 0 +397 -0.1071804445986354 0.312625811446931 0 +398 -0.09928671279251149 0.3511849025033358 0 +399 -0.1096226097167012 0.3837452462788459 0 +400 -0.06634186364953411 0.3907630341289159 0 +401 -0.1448995568794845 0.3888420668158148 0 +402 -0.1119547077365072 0.428420198441395 0 +403 -0.02800298336267222 0.3941013451767896 0 +404 -0.3964215807926591 0.06377234641077351 0 +405 -0.3946757645628753 0.03180708424912152 0 +406 -0.3246757645627995 0.03180708424912152 0 +407 -0.3218953416529975 0.06957117705052834 0 +408 -0.03589671516879613 0.2855422541204607 0 +409 -0.02800298336267222 0.3241013451768655 0 +410 -0.02800298336267222 0.3591013451768871 0 +411 -0.3596757645627918 0.03180708424912152 0 +412 -0.09529699369832934 0.1819274176908341 0 +413 -0.3611335569422475 0.08918670227180248 0 +414 -0.3094181993753699 0.310083668429299 0 +415 0.1224866355280155 0.1629072024975547 0 +416 0.3808849436885997 0.210277224031109 0 +417 0.206743501399355 0.07464099728276744 0 +418 0.3593515291260043 0.06361416849824304 0 +419 0.2373889375053712 0.4000946023341276 0 +420 0.05600596672534444 0.3582026903534058 0 +421 0.3654446467373352 0.3654437046554016 0 +422 0.07667776057372377 0.4233233779044261 0 +423 0.4334916324593139 0.06393052432330396 0 +424 0.07179343033759224 0.2810845082405963 0 +425 0.06810735186864313 0.2009476328841135 0 +426 0.1441955258379768 0.2303966446545607 0 +427 0.2844391541799908 0.07552818560281363 0 +428 0.1883841865915948 0.1499536144563917 0 +429 0.2533917520134046 0.2547236322031965 0 +430 0.2785219510541916 0.1476215722506409 0 +431 0.1425674588596785 0.3441671146532657 0 +432 0.3629155847584906 0.1147592360453619 0 +433 0.1472316548992905 0.4335170189783639 0 +434 0.4354584321812809 0.1336982203911391 0 +435 0.1899781981825249 0.3721308584936966 0 +436 0.1979796054365416 0.2994453734282311 0 +437 0.2453903447593879 0.3274091172686621 0 +438 0.1554354110598052 0.1564304084769732 0 +439 0.1662898562147858 0.1901751295554762 0 +440 0.1333410806829962 0.1966519235760577 0 +441 0.1261952230477678 0.1189536012489036 0 +442 0.09874331776391088 0.1464055065326662 0 +443 0.2208879693024997 0.2023386233297941 0 +444 0.1987936389256907 0.2425601384288786 0 +445 0.1591439985795574 0.1124768072283221 0 +446 0.2833906089244816 0.4500473011670638 0 +447 0.3014167921213532 0.3827691534947646 0 +448 0.3474184635404636 0.4327218523277008 0 +449 0.4327223233686676 0.3474179924989554 0 +450 0.3731647952129674 0.2878604643432553 0 +451 0.4404424718442999 0.2698347521868091 0 +452 0.3171383478510021 0.2325004281171527 0 +453 0.2659568515337981 0.2011726022269187 0 +454 0.3297034473713957 0.178949398140875 0 +455 0.3207187679063411 0.1311904041480014 0 +456 0.3719002642235452 0.1625182300382355 0 +457 0.4327223233686676 0.4327218523277008 0 +458 0.1704723055956265 0.466758509489182 0 +459 0.1923102962023309 0.4168058106562458 0 +460 0.2155509468986668 0.4500473011670638 0 +461 0.4404424718442999 0.2019950901608922 0 +462 0.4081716879349403 0.1719877222111241 0 +463 0.4677292160906404 0.1637055883409073 0 +464 0.03405367593432156 0.2104738164421327 0 +465 0.06995039110311768 0.2410160705623549 0 +466 0.03589671516879612 0.2505422541203741 0 +467 0.1433814923488277 0.2872818796539132 0 +468 0.4677292160906404 0.1097546908281923 0 +469 0.1165214080825037 0.466758509489182 0 +470 0.2522195770899168 0.03776409280140682 0 +471 0.2455913277896729 0.07508459144279053 0 +472 0.213371750699599 0.03732049864138372 0 +473 0.4344750323202974 0.09881437235722154 0 +474 0.3991870084698858 0.1242287282182505 0 +475 0.3982036086089022 0.08934488018433294 0 +476 0.2334530688228932 0.1487875933535163 0 +477 0.03833888028686189 0.461661688952213 0 +478 0.08124446091972032 0.461661688952213 0 +479 0.4667458162296569 0.07487084279427469 0 +480 0.4667458162296569 0.03196526216165198 0 +481 0.10615143885331 0.2156721387693371 0 +482 0.1079944780877845 0.2557405764475785 0 +483 0.2814805526170912 0.1115748789267273 0 +484 0.2426327262267733 0.1111312847667042 0 +485 0.1783717506996775 0.03732049864138372 0 +486 0.1683236559834375 0.07482049864151 0 +487 0.3236773694692406 0.09514371082408778 0 +488 0.03833888028686189 0.4266616889522997 0 +489 0.4317458162295301 0.03196526216165198 0 +490 0.2872195770897927 0.03776409280140682 0 +491 0.07155367593422468 0.1654257217259456 0 +492 0.03405367593432156 0.1754738164420567 0 +493 0.1975638439954749 0.1122973058695796 0 +494 0.06389969853146835 0.319643599297001 0 +495 0.1071804445986354 0.312625811446931 0 +496 0.09928671279251149 0.3511849025033358 0 +497 0.1096226097167012 0.3837452462788459 0 +498 0.06634186364953411 0.3907630341289159 0 +499 0.1448995568794845 0.3888420668158148 0 +500 0.1119547077365072 0.428420198441395 0 +501 0.02800298336267222 0.3941013451767896 0 +502 0.3964215807926591 0.06377234641077351 0 +503 0.3946757645628752 0.03180708424912152 0 +504 0.3246757645627995 0.03180708424912152 0 +505 0.3218953416529975 0.06957117705052834 0 +506 0.03589671516879612 0.2855422541204607 0 +507 0.02800298336267222 0.3241013451768655 0 +508 0.02800298336267222 0.3591013451768871 0 +509 0.3596757645627918 0.03180708424912152 0 +510 0.09529699369832932 0.1819274176908341 0 +511 0.3611335569422474 0.08918670227180248 0 +512 0.3094181993753699 0.310083668429299 0 +$EndNodes +$Elements +266 +1 8 2 4 2 2 22 25 +2 8 2 4 2 22 23 26 +3 8 2 4 2 23 24 27 +4 8 2 4 2 24 3 28 +5 8 2 1 3 3 29 32 +6 8 2 1 3 29 30 33 +7 8 2 1 3 30 31 34 +8 8 2 1 3 31 4 35 +9 8 2 2 9 6 50 53 +10 8 2 2 9 50 51 54 +11 8 2 2 9 51 52 55 +12 8 2 2 9 52 7 56 +13 8 2 1 10 7 57 60 +14 8 2 1 10 57 58 61 +15 8 2 1 10 58 59 62 +16 8 2 1 10 59 4 63 +17 8 2 4 15 2 78 81 +18 8 2 4 15 78 79 82 +19 8 2 4 15 79 80 83 +20 8 2 4 15 80 9 84 +21 8 2 3 16 9 85 88 +22 8 2 3 16 85 86 89 +23 8 2 3 16 86 87 90 +24 8 2 3 16 87 10 91 +25 8 2 2 21 6 106 109 +26 8 2 2 21 106 107 110 +27 8 2 2 21 107 108 111 +28 8 2 2 21 108 12 112 +29 8 2 3 22 12 113 116 +30 8 2 3 22 113 114 117 +31 8 2 3 22 114 115 118 +32 8 2 3 22 115 10 119 +33 9 2 11 7 129 139 141 144 145 146 +34 9 2 11 7 30 133 142 147 148 149 +35 9 2 11 7 125 136 138 150 151 152 +36 9 2 11 7 46 125 138 153 152 154 +37 9 2 11 7 136 139 138 155 156 151 +38 9 2 11 7 24 131 129 157 158 159 +39 9 2 11 7 29 126 131 160 161 162 +40 9 2 11 7 30 31 133 34 163 147 +41 9 2 11 7 45 125 46 164 153 48 +42 9 2 11 7 30 142 126 149 165 166 +43 9 2 11 7 126 140 139 167 168 169 +44 9 2 11 7 127 137 142 170 171 172 +45 9 2 11 7 137 140 142 173 174 171 +46 9 2 11 7 3 131 24 175 157 28 +47 9 2 11 7 3 29 131 32 162 175 +48 9 2 11 7 23 129 143 176 177 178 +49 9 2 11 7 23 24 129 27 159 176 +50 9 2 11 7 13 134 135 179 180 181 +51 9 2 11 7 29 30 126 33 166 160 +52 9 2 11 7 38 137 127 182 170 183 +53 9 2 11 7 136 141 139 184 145 155 +54 9 2 11 7 22 23 143 26 178 185 +55 9 2 11 7 126 142 140 165 174 167 +56 9 2 11 7 2 22 132 25 186 187 +57 9 2 11 7 4 133 31 188 163 35 +58 9 2 11 7 134 136 135 189 190 180 +59 9 2 11 7 138 139 140 156 168 191 +60 9 2 11 7 2 132 16 187 192 21 +61 9 2 11 7 5 46 128 49 193 194 +62 9 2 11 7 4 36 133 40 195 188 +63 9 2 11 7 1 135 45 196 197 47 +64 9 2 11 7 130 141 134 198 199 200 +65 9 2 11 7 130 143 141 201 202 198 +66 9 2 11 7 16 132 130 192 203 204 +67 9 2 11 7 36 127 133 205 206 195 +68 9 2 11 7 128 138 137 207 208 209 +69 9 2 11 7 137 138 140 208 191 173 +70 9 2 11 7 134 141 136 199 184 189 +71 9 2 11 7 46 138 128 154 207 193 +72 9 2 11 7 13 14 134 18 210 179 +73 9 2 11 7 5 128 39 194 211 44 +74 9 2 11 7 1 13 135 17 181 196 +75 9 2 11 7 38 39 137 43 212 182 +76 9 2 11 7 14 15 130 19 213 214 +77 9 2 11 7 15 16 130 20 204 213 +78 9 2 11 7 37 38 127 42 183 215 +79 9 2 11 7 36 37 127 41 215 205 +80 9 2 11 7 130 132 143 203 216 201 +81 9 2 11 7 125 135 136 217 190 150 +82 9 2 11 7 129 141 143 146 202 177 +83 9 2 11 7 39 128 137 211 209 212 +84 9 2 11 7 14 130 134 214 200 210 +85 9 2 11 7 22 143 132 185 216 186 +86 9 2 11 7 45 135 125 197 217 164 +87 9 2 11 7 127 142 133 172 148 206 +88 9 2 11 7 126 139 131 169 218 161 +89 9 2 11 7 129 131 139 158 218 144 +90 9 2 11 8 223 235 233 239 240 241 +91 9 2 11 8 219 232 230 242 243 244 +92 9 2 11 8 64 65 219 67 245 246 +93 9 2 11 8 230 232 233 243 247 248 +94 9 2 11 8 65 232 219 249 242 245 +95 9 2 11 8 57 223 225 250 251 252 +96 9 2 11 8 52 225 220 253 254 255 +97 9 2 11 8 220 233 234 256 257 258 +98 9 2 11 8 220 234 236 258 259 260 +99 9 2 11 8 7 225 52 261 253 56 +100 9 2 11 8 7 57 225 60 252 261 +101 9 2 11 8 58 237 223 262 263 264 +102 9 2 11 8 57 58 223 61 264 250 +103 9 2 11 8 51 220 238 265 266 267 +104 9 2 11 8 51 52 220 55 255 265 +105 9 2 11 8 39 229 228 268 269 270 +106 9 2 11 8 230 233 235 248 240 271 +107 9 2 11 8 50 51 238 54 267 272 +108 9 2 11 8 58 59 237 62 273 262 +109 9 2 11 8 69 231 221 274 275 276 +110 9 2 11 8 227 238 236 277 278 279 +111 9 2 11 8 232 234 233 280 257 247 +112 9 2 11 8 4 226 59 281 282 63 +113 9 2 11 8 6 50 227 53 283 284 +114 9 2 11 8 228 229 230 269 285 286 +115 9 2 11 8 221 231 234 275 287 288 +116 9 2 11 8 8 221 65 289 290 68 +117 9 2 11 8 231 236 234 291 259 287 +118 9 2 11 8 4 36 226 40 292 281 +119 9 2 11 8 6 227 72 284 293 77 +120 9 2 11 8 69 70 231 74 294 274 +121 9 2 11 8 5 64 229 66 295 296 +122 9 2 11 8 221 234 232 288 280 297 +123 9 2 11 8 220 236 238 260 278 266 +124 9 2 11 8 224 228 235 298 299 300 +125 9 2 11 8 224 235 226 300 301 302 +126 9 2 11 8 226 235 237 301 303 304 +127 9 2 11 8 36 224 226 305 302 292 +128 9 2 11 8 72 227 222 293 306 307 +129 9 2 11 8 70 222 231 308 309 294 +130 9 2 11 8 8 69 221 73 276 289 +131 9 2 11 8 228 230 235 286 271 299 +132 9 2 11 8 38 39 228 43 270 310 +133 9 2 11 8 65 221 232 290 297 249 +134 9 2 11 8 5 229 39 296 268 44 +135 9 2 11 8 37 38 224 42 311 312 +136 9 2 11 8 36 37 224 41 312 305 +137 9 2 11 8 70 71 222 75 313 308 +138 9 2 11 8 71 72 222 76 307 313 +139 9 2 11 8 219 230 229 244 285 314 +140 9 2 11 8 223 237 235 263 303 239 +141 9 2 11 8 38 228 224 310 298 311 +142 9 2 11 8 222 236 231 315 291 309 +143 9 2 11 8 50 238 227 272 277 283 +144 9 2 11 8 59 226 237 282 304 273 +145 9 2 11 8 64 219 229 246 314 295 +146 9 2 11 8 222 227 236 306 279 315 +147 9 2 11 8 220 225 233 254 316 256 +148 9 2 11 8 223 233 225 241 316 251 +149 9 2 11 14 321 333 331 337 338 339 +150 9 2 11 14 317 330 328 340 341 342 +151 9 2 11 14 101 102 317 104 343 344 +152 9 2 11 14 328 330 331 341 345 346 +153 9 2 11 14 102 330 317 347 340 343 +154 9 2 11 14 85 321 323 348 349 350 +155 9 2 11 14 80 323 318 351 352 353 +156 9 2 11 14 318 331 332 354 355 356 +157 9 2 11 14 318 332 334 356 357 358 +158 9 2 11 14 9 323 80 359 351 84 +159 9 2 11 14 9 85 323 88 350 359 +160 9 2 11 14 86 335 321 360 361 362 +161 9 2 11 14 85 86 321 89 362 348 +162 9 2 11 14 79 318 336 363 364 365 +163 9 2 11 14 79 80 318 83 353 363 +164 9 2 11 14 95 327 326 366 367 368 +165 9 2 11 14 328 331 333 346 338 369 +166 9 2 11 14 78 79 336 82 365 370 +167 9 2 11 14 86 87 335 90 371 360 +168 9 2 11 14 13 329 319 372 373 374 +169 9 2 11 14 325 336 334 375 376 377 +170 9 2 11 14 330 332 331 378 355 345 +171 9 2 11 14 10 324 87 379 380 91 +172 9 2 11 14 2 78 325 81 381 382 +173 9 2 11 14 326 327 328 367 383 384 +174 9 2 11 14 319 329 332 373 385 386 +175 9 2 11 14 1 319 102 387 388 105 +176 9 2 11 14 329 334 332 389 357 385 +177 9 2 11 14 10 92 324 96 390 379 +178 9 2 11 14 2 325 16 382 391 21 +179 9 2 11 14 13 14 329 18 392 372 +180 9 2 11 14 11 101 327 103 393 394 +181 9 2 11 14 319 332 330 386 378 395 +182 9 2 11 14 318 334 336 358 376 364 +183 9 2 11 14 322 326 333 396 397 398 +184 9 2 11 14 322 333 324 398 399 400 +185 9 2 11 14 324 333 335 399 401 402 +186 9 2 11 14 92 322 324 403 400 390 +187 9 2 11 14 16 325 320 391 404 405 +188 9 2 11 14 14 320 329 406 407 392 +189 9 2 11 14 1 13 319 17 374 387 +190 9 2 11 14 326 328 333 384 369 397 +191 9 2 11 14 94 95 326 99 368 408 +192 9 2 11 14 102 319 330 388 395 347 +193 9 2 11 14 11 327 95 394 366 100 +194 9 2 11 14 93 94 322 98 409 410 +195 9 2 11 14 92 93 322 97 410 403 +196 9 2 11 14 14 15 320 19 411 406 +197 9 2 11 14 15 16 320 20 405 411 +198 9 2 11 14 317 328 327 342 383 412 +199 9 2 11 14 321 335 333 361 401 337 +200 9 2 11 14 94 326 322 408 396 409 +201 9 2 11 14 320 334 329 413 389 407 +202 9 2 11 14 78 336 325 370 375 381 +203 9 2 11 14 87 324 335 380 402 371 +204 9 2 11 14 101 317 327 344 412 393 +205 9 2 11 14 320 325 334 404 377 413 +206 9 2 11 14 318 323 331 352 414 354 +207 9 2 11 14 321 331 323 339 414 349 +208 9 2 11 20 419 431 429 435 436 437 +209 9 2 11 20 415 428 426 438 439 440 +210 9 2 11 20 120 121 415 123 441 442 +211 9 2 11 20 426 428 429 439 443 444 +212 9 2 11 20 121 428 415 445 438 441 +213 9 2 11 20 113 419 421 446 447 448 +214 9 2 11 20 108 421 416 449 450 451 +215 9 2 11 20 416 429 430 452 453 454 +216 9 2 11 20 416 430 432 454 455 456 +217 9 2 11 20 12 421 108 457 449 112 +218 9 2 11 20 12 113 421 116 448 457 +219 9 2 11 20 114 433 419 458 459 460 +220 9 2 11 20 113 114 419 117 460 446 +221 9 2 11 20 107 416 434 461 462 463 +222 9 2 11 20 107 108 416 111 451 461 +223 9 2 11 20 95 425 424 464 465 466 +224 9 2 11 20 426 429 431 444 436 467 +225 9 2 11 20 106 107 434 110 463 468 +226 9 2 11 20 114 115 433 118 469 458 +227 9 2 11 20 69 427 417 470 471 472 +228 9 2 11 20 423 434 432 473 474 475 +229 9 2 11 20 428 430 429 476 453 443 +230 9 2 11 20 10 422 115 477 478 119 +231 9 2 11 20 6 106 423 109 479 480 +232 9 2 11 20 424 425 426 465 481 482 +233 9 2 11 20 417 427 430 471 483 484 +234 9 2 11 20 8 417 121 485 486 124 +235 9 2 11 20 427 432 430 487 455 483 +236 9 2 11 20 10 92 422 96 488 477 +237 9 2 11 20 6 423 72 480 489 77 +238 9 2 11 20 69 70 427 74 490 470 +239 9 2 11 20 11 120 425 122 491 492 +240 9 2 11 20 417 430 428 484 476 493 +241 9 2 11 20 416 432 434 456 474 462 +242 9 2 11 20 420 424 431 494 495 496 +243 9 2 11 20 420 431 422 496 497 498 +244 9 2 11 20 422 431 433 497 499 500 +245 9 2 11 20 92 420 422 501 498 488 +246 9 2 11 20 72 423 418 489 502 503 +247 9 2 11 20 70 418 427 504 505 490 +248 9 2 11 20 8 69 417 73 472 485 +249 9 2 11 20 424 426 431 482 467 495 +250 9 2 11 20 94 95 424 99 466 506 +251 9 2 11 20 121 417 428 486 493 445 +252 9 2 11 20 11 425 95 492 464 100 +253 9 2 11 20 93 94 420 98 507 508 +254 9 2 11 20 92 93 420 97 508 501 +255 9 2 11 20 70 71 418 75 509 504 +256 9 2 11 20 71 72 418 76 503 509 +257 9 2 11 20 415 426 425 440 481 510 +258 9 2 11 20 419 433 431 459 499 435 +259 9 2 11 20 94 424 420 506 494 507 +260 9 2 11 20 418 432 427 511 487 505 +261 9 2 11 20 106 434 423 468 473 479 +262 9 2 11 20 115 422 433 478 500 469 +263 9 2 11 20 120 415 425 442 510 491 +264 9 2 11 20 418 423 432 502 475 511 +265 9 2 11 20 416 421 429 450 512 452 +266 9 2 11 20 419 429 421 437 512 447 +$EndElements diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_changeBCAfterFailure/model.geo b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_changeBCAfterFailure/model.geo new file mode 100644 index 0000000000000000000000000000000000000000..53aaf58a7c3e5bb390202cddd619a49372114450 --- /dev/null +++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_changeBCAfterFailure/model.geo @@ -0,0 +1,47 @@ + +mm=1.0; +L=1.*mm; +H = 1*mm; +sl1=0.5*L; +Point(1)={0,0,0,sl1}; +Point(2)={L,0,0,sl1}; +Point(3)={L,H,0,sl1}; +Point(4)={0,H,0,sl1}; +Point(5)={2*L,0,0,sl1}; +Point(6)={2*L,H,0,sl1}; +Line(1)={1,2}; +Line(2)={2,3}; +Line(3)={3,4}; +Line(4)={4,1}; +Line(5)={2,5}; +Line(6)={5,6}; +Line(7)={6,3}; + +l[0]=newreg; +Line Loop(l[0])={1,2,3,4}; +Plane Surface(11)={l[0]}; + +l[1]=newreg; +Line Loop(l[1])={5,6,7,-2}; +Plane Surface(12)={l[1]}; + +Physical Surface(11)={11}; +Physical Point(1)={1}; +Physical Point(2)={2}; +Physical Point(3)={5}; +Physical Point(4)={6}; + +Transfinite Line {4, 2,6} = 2 Using Progression 1; +Transfinite Line {3, 1,5,7} = 2 Using Progression 1; +Transfinite Surface {11, 12}; +Recombine Surface {11,12}; + +Physical Surface(12) = {12}; +Physical Line(1) = {1, 5}; +Physical Line(2) = {6}; +Physical Line(3) = {7,3}; +Physical Line(4) = {4}; +//+ +Translate {0.3, 0, 0} { + Point{3}; +} diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_changeBCAfterFailure/model.msh b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_changeBCAfterFailure/model.msh new file mode 100644 index 0000000000000000000000000000000000000000..aba0ca64c6428748d97a1abbb98a659e4cd28836 --- /dev/null +++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_changeBCAfterFailure/model.msh @@ -0,0 +1,27 @@ +$MeshFormat +2.2 0 8 +$EndMeshFormat +$Nodes +6 +1 0 0 0 +2 1 0 0 +3 1.3 1 0 +4 0 1 0 +5 2 0 0 +6 2 1 0 +$EndNodes +$Elements +12 +1 15 2 1 1 1 +2 15 2 2 2 2 +3 15 2 3 5 5 +4 15 2 4 6 6 +5 1 2 1 1 1 2 +6 1 2 3 3 3 4 +7 1 2 4 4 4 1 +8 1 2 1 5 2 5 +9 1 2 2 6 5 6 +10 1 2 3 7 6 3 +11 3 2 11 11 1 2 3 4 +12 3 2 12 12 2 5 6 3 +$EndElements diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_changeBCAfterFailure/model.py b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_changeBCAfterFailure/model.py new file mode 100644 index 0000000000000000000000000000000000000000..d79286bae1d18977d465d461778443a77b47e248 --- /dev/null +++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_changeBCAfterFailure/model.py @@ -0,0 +1,219 @@ +#coding-Utf-8-*- +from gmshpy import * +from dG3Dpy import* + +#script to launch PBC problem with a python script + +#DEFINE MICRO PROBLEM + +# micro-material law +lawnum1 = 11 # unique number of law + + +rho = 7850e-9 +young = 28.9e3 +nu = 0.3 +sy0 = 99. +h = young/20. + +harden = LinearExponentialJ2IsotropicHardening(1, sy0, h, 0., 10.) +cl = IsotropicCLengthLaw(1, 1e-2) +damlaw = SimpleSaturateDamageLaw(1, 50.,1.,0.,1.) +law1 = NonLocalDamageJ2HyperDG3DMaterialLaw(lawnum1,rho,young,nu,harden,cl,damlaw) + + +micromeshfile="micro.msh" # name of mesh file +#micromeshfile="square.msh" # name of mesh file + +# creation of part Domain +nfield = 11 # number of the field (physical number of entity) +myfield1 = nonLocalDamageDG3DDomain(1000,nfield,0,lawnum1,0,1e3,2,1) + +microBC = nonLinearPeriodicBC(1000,2) +microBC.setOrder(1) +microBC.setBCPhysical(1,4,3,2) +# periodiodic BC +method = 1 # Periodic mesh = 0 Langrange interpolation = 1 Cubic spline interpolation =2 +degree = 5 +addvertex = False +microBC.setPeriodicBCOptions(method, degree,addvertex) + +# DEFINE MACROPROBLEM +matnum1 = 1; +macromat1 = dG3DMultiscaleMaterialLaw(matnum1, 1000) +macromat1.loadModel(micromeshfile); +macromat1.addDomain(myfield1) +macromat1.addMaterialLaw(law1); +macromat1.setPeriodicity(1.,0,0,"x") +macromat1.setPeriodicity(0,1.,0,"y") +macromat1.setPeriodicity(0,0,1.,"z") +macromat1.addMicroBC(microBC) + +macromat1.setNumStep(3) +macromat1.setTolerance(1e-6,1e-10) +macromat1.setSystemType(1) +macromat1.Solver(2) +#for i in range(0,1): +macromat1.setViewAllMicroProblems(True,0) + +macromat1.setBlockDamageAfterFailureOnset(True) + +macromat1.Scheme(1) +macromat1.setSameStateCriterion(1e-16) +macromat1.stressAveragingFlag(True) # set stress averaging ON- 0 , OFF-1 +macromat1.setStressAveragingMethod(0) +macromat1.tangentAveragingFlag(True) # set tangent averaging ON -0, OFF -1 +macromat1.setTangentAveragingMethod(2,1e-6); + +macromat1.internalPointBuildView("Green-Lagrange_xx",IPField.STRAIN_XX); +macromat1.internalPointBuildView("Green-Lagrange_yy",IPField.STRAIN_YY); +macromat1.internalPointBuildView("Green-Lagrange_xy",IPField.STRAIN_XY); +macromat1.internalPointBuildView("Green-Lagrange_zz",IPField.STRAIN_ZZ); +macromat1.internalPointBuildView("Green-Lagrange_yz",IPField.STRAIN_YZ); +macromat1.internalPointBuildView("Green-Lagrange_xz",IPField.STRAIN_XZ); +macromat1.internalPointBuildView("sig_xx",IPField.SIG_XX); +macromat1.internalPointBuildView("sig_yy",IPField.SIG_YY); +macromat1.internalPointBuildView("sig_xy",IPField.SIG_XY); +macromat1.internalPointBuildView("sig_xz",IPField.SIG_XZ); +macromat1.internalPointBuildView("sig_zz",IPField.SIG_ZZ); +macromat1.internalPointBuildView("sig_yz",IPField.SIG_YZ); +macromat1.internalPointBuildView("sig_VM",IPField.SVM); + +macromat1.internalPointBuildView("F_xx",IPField.F_XX); +macromat1.internalPointBuildView("F_yy",IPField.F_YY); +macromat1.internalPointBuildView("F_xy",IPField.F_XY); +macromat1.internalPointBuildView("F_yx",IPField.F_YX); + +macromat1.internalPointBuildView("P_xx",IPField.P_XX); +macromat1.internalPointBuildView("P_yy",IPField.P_YY); +macromat1.internalPointBuildView("P_xy",IPField.P_XY); +macromat1.internalPointBuildView("P_yx",IPField.P_YX); + +macromat1.internalPointBuildView("Equivalent plastic strain",IPField.PLASTICSTRAIN); +macromat1.internalPointBuildView("Damage",IPField.DAMAGE); + +macromat1.dirichletBC("Face",11,2,0.) + + +lcohNum = 13 +lawCoh = dG3DMultiscaleCohesiveLaw(lcohNum,0.7) +lawCoh.setCharacteristicLength(1.) +lawCoh.setLostSolutionUniquenssTolerance(0.1) + +microBCFailure = nonLinearPeriodicBC(1000,2) +microBCFailure.setOrder(1) +microBCFailure.setBCPhysical(1,4,3,2) +# periodiodic BC +method = 1 # Periodic mesh = 0 Langrange interpolation = 1 Cubic spline interpolation =2 +degree = 5 +addvertex = False +microBCFailure.setPeriodicBCOptions(method, degree,addvertex) +microBCFailure.setShiftedBC(True) # shifted BC at interface only + +lawCoh.addMicroBCFailure(microBCFailure) + +macromeshfile="model.msh" # name of mesh file + +# solver +sol = 2 # Gmm=0 (default) Taucs=1 PETsc=2 +soltype =1 # StaticLinear=0 (default) StaticNonLinear=1 +nstep = 100 # number of step (used only if soltype=1) +ftime =1. # Final time (used only if soltype=1) +tol=1.e-5 # 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 macro part Domain + +dim =2 +beta1 = 50; +fullDG = False; + +averageStrainBased = True + +# non DG domain +nfield1 = 11 +macrodomain1 = dG3DDomain(10,nfield1,0,matnum1,fullDG,dim) +macrodomain1.stabilityParameters(beta1) +macrodomain1.setDistributedOtherRanks(True) +macrodomain1.distributeOnRootRank(False) + +nfield2 = 12 +macrodomain2 = dG3DDomain(11,nfield2,0,matnum1,fullDG,dim) +macrodomain2.stabilityParameters(beta1) +macrodomain2.setDistributedOtherRanks(True) +macrodomain2.distributeOnRootRank(False) + +# interface domain +beta1 = 100; +interdomain1 = interDomainBetween3D(12,macrodomain1,macrodomain2,lcohNum,matnum1) +interdomain1.stabilityParameters(beta1) +interdomain1.averageStrainBased(averageStrainBased) +interdomain1.setDistributedOtherRanks(True) +interdomain1.distributeOnRootRank(False) + +# creation of Solver +mysolver = nonLinearMechSolver(1000) +mysolver.loadModel(macromeshfile) +mysolver.addDomain(macrodomain1) +mysolver.addDomain(macrodomain2) +mysolver.addDomain(interdomain1) +mysolver.addMaterialLaw(macromat1) + +mysolver.addMaterialLaw(lawCoh) +mysolver.setMultiscaleFlag(True) +mysolver.Scheme(soltype) +mysolver.Solver(sol) +mysolver.snlData(nstep,ftime,tol) +mysolver.options("-ksp_type preonly -pc_type lu -pc_factor_shift_type NONZERO -pc_factor_mat_solver_package petsc") + + +# boundary condition +mysolver.displacementBC("Face",11,2,0.0) +mysolver.displacementBC("Face",12,2,0.0) + +mysolver.displacementBC("Face",11,1,0.0) +mysolver.displacementBC("Face",12,1,0.0) + + +mysolver.displacementBC("Edge",1,1,0.0) +mysolver.displacementBC("Edge",2,0,0.02) +mysolver.displacementBC("Edge",4,0,0.0) + + +# archivage +mysolver.internalPointBuildView("Green-Lagrange_xx",IPField.STRAIN_XX, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_yy",IPField.STRAIN_YY, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_zz",IPField.STRAIN_ZZ, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_xy",IPField.STRAIN_XY, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_yz",IPField.STRAIN_YZ, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_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("Green-Lagrange equivalent strain",IPField.GL_EQUIVALENT_STRAIN, 1, 1); +mysolver.internalPointBuildView("Equivalent plastic strain",IPField.PLASTICSTRAIN, 1, 1); +mysolver.internalPointBuildView("Damage",IPField.DAMAGE,1,1); + +mysolver.archivingForceOnPhysicalGroup("Edge",4,0) + +mysolver.archivingInterfaceElementIP(11,12,IPField.DISP_JUMP_X,4,0,1) +mysolver.archivingInterfaceElementIP(11,12,IPField.DISP_JUMP_Y,4,0,1) + +mysolver.archivingInterfaceElementIP(11,12,IPField.COHESIVE_JUMP_X,4,0,1) +mysolver.archivingInterfaceElementIP(11,12,IPField.COHESIVE_JUMP_Y,4,0,1) + +mysolver.archivingInterfaceElementIP(11,12,IPField.INCOMPATIBLE_STRAIN_X,4,0,1) +mysolver.archivingInterfaceElementIP(11,12,IPField.INCOMPATIBLE_STRAIN_Y,4,0,1) + + +# solve +mysolver.solve() + +check = TestCheck() +check.equal(-2.186671e+01,mysolver.getArchivedForceOnPhysicalGroup("Edge", 4, 0),1.e-4) + diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_rotateRVE/CMakeLists.txt b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_rotateRVE/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..bc54bc2ce5018e76600e6490a5013c6c5d8aed59 --- /dev/null +++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_rotateRVE/CMakeLists.txt @@ -0,0 +1,14 @@ +# test file + +set(PYFILE model.py) + +set(FILES2DELETE + E_*.msh + *.txt + *.csv + disp* + stress* + *Rotated*.msh +) + +add_cm3python_mpi_test(4 ${PYFILE} "${FILES2DELETE}") diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_rotateRVE/micro.geo b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_rotateRVE/micro.geo new file mode 100644 index 0000000000000000000000000000000000000000..5e0b62d6d05215e12989e4cd6bfebc54d1a5517e --- /dev/null +++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_rotateRVE/micro.geo @@ -0,0 +1,45 @@ +mm = 1.; +L = 1.*mm; +R = 0.15*L; +lsca1 = 0.2*L; +lsca2 = 0.4*lsca1; + +Point(1) = {0,0,0,lsca1}; +Point(2) = {-R,0,0,lsca2}; +Point(3) = {-0.5*L,0,0,lsca2}; +Point(4) = {-0.5*L,-0.5*L,0,lsca1}; +Point(5) = {0,-0.5*L,0,lsca2}; +Point(6) = {0,-R,0,lsca2}; + + +Line(1) = {2, 3}; +Line(2) = {3, 4}; +Line(3) = {4, 5}; +Line(4) = {5, 6}; +Circle(5) = {2, 1, 6}; +Line Loop(6) = {2, 3, 4, -5, 1}; +Plane Surface(7) = {6}; +Symmetry {1, 0, 0, 0} { + Duplicata { Surface{7}; } +} +Symmetry {0, 1, 0, 0} { + Duplicata { Surface{7, 8}; } +} + +//Recombine Surface{14, 20, 8, 7}; +Physical Line(1) = {3, 10}; +Physical Line(2) = {9, 21}; +Physical Line(3) = {22, 16}; +Physical Line(4) = {15, 2}; +Physical Surface(11) = {14, 20, 8, 7}; + + +/* +Translate {0.1, 0, 0} { + Line{17, 24, 18, 5, 12, 4}; +} + +Translate {0, 0.1, 0} { + Line{18, 24, 13, 12, 5, 1}; +} +*/ diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_rotateRVE/micro.msh b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_rotateRVE/micro.msh new file mode 100644 index 0000000000000000000000000000000000000000..c6acd5b31b792077590d064be2f4fe7779b47c89 --- /dev/null +++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_rotateRVE/micro.msh @@ -0,0 +1,787 @@ +$MeshFormat +2.2 0 8 +$EndMeshFormat +$Nodes +512 +1 -0.15 0 0 +2 -0.5 0 0 +3 -0.5 -0.5 0 +4 0 -0.5 0 +5 0 -0.15 0 +6 0.5 0 0 +7 0.5 -0.5 0 +8 0.15 0 0 +9 -0.5 0.5 0 +10 0 0.5 0 +11 0 0.15 0 +12 0.5 0.5 0 +13 -0.2199999999998429 0 0 +14 -0.2899999999995946 0 0 +15 -0.3599999999995793 0 0 +16 -0.4299999999997463 0 0 +17 -0.1849999999999308 0 0 +18 -0.2549999999996413 0 0 +19 -0.3249999999994754 0 0 +20 -0.3949999999996151 0 0 +21 -0.4649999999998321 0 0 +22 -0.5 -0.08581116126524545 0 +23 -0.5 -0.1937129562906754 0 +24 -0.5 -0.3293922803425093 0 +25 -0.5 -0.04290558063262855 0 +26 -0.5 -0.1397620587779604 0 +27 -0.5 -0.261552618316445 0 +28 -0.5 -0.4146961401712547 0 +29 -0.329392280343592 -0.5 0 +30 -0.1937129562919624 -0.5 0 +31 -0.08581116126571686 -0.5 0 +32 -0.4146961401717154 -0.5 0 +33 -0.2615526183179323 -0.5 0 +34 -0.1397620587788396 -0.5 0 +35 -0.04290558063285843 -0.5 0 +36 0 -0.4300000000001734 0 +37 0 -0.3600000000003685 0 +38 0 -0.2900000000003252 0 +39 0 -0.2200000000001519 0 +40 0 -0.4650000000000867 0 +41 0 -0.3950000000003007 0 +42 0 -0.3250000000004448 0 +43 0 -0.2550000000002834 0 +44 0 -0.1850000000000817 0 +45 -0.1299038105677715 -0.07499999999981691 0 +46 -0.07500000000016267 -0.1299038105675719 0 +47 -0.1448888739433795 -0.03882285676530619 0 +48 -0.106066017178175 -0.1060660171777893 0 +49 -0.03882285676546777 -0.1448888739433362 0 +50 0.5 -0.08581116126524545 0 +51 0.5 -0.1937129562906754 0 +52 0.5 -0.3293922803425093 0 +53 0.5 -0.04290558063262855 0 +54 0.5 -0.1397620587779604 0 +55 0.5 -0.261552618316445 0 +56 0.5 -0.4146961401712547 0 +57 0.329392280343592 -0.5 0 +58 0.1937129562919624 -0.5 0 +59 0.08581116126571686 -0.5 0 +60 0.4146961401717154 -0.5 0 +61 0.2615526183179323 -0.5 0 +62 0.1397620587788396 -0.5 0 +63 0.04290558063285843 -0.5 0 +64 0.07499999999980624 -0.1299038105677777 0 +65 0.12990381056752 -0.07500000000025255 0 +66 0.03882285676529234 -0.1448888739433832 0 +67 0.1060660171777162 -0.1060660171782481 0 +68 0.1448888739433208 -0.03882285676552522 0 +69 0.2199999999998429 0 0 +70 0.2899999999995946 0 0 +71 0.3599999999995793 0 0 +72 0.4299999999997463 0 0 +73 0.1849999999999308 0 0 +74 0.2549999999996413 0 0 +75 0.3249999999994754 0 0 +76 0.3949999999996151 0 0 +77 0.4649999999998321 0 0 +78 -0.5 0.08581116126524545 0 +79 -0.5 0.1937129562906754 0 +80 -0.5 0.3293922803425093 0 +81 -0.5 0.04290558063262855 0 +82 -0.5 0.1397620587779604 0 +83 -0.5 0.261552618316445 0 +84 -0.5 0.4146961401712547 0 +85 -0.329392280343592 0.5 0 +86 -0.1937129562919624 0.5 0 +87 -0.08581116126571686 0.5 0 +88 -0.4146961401717154 0.5 0 +89 -0.2615526183179323 0.5 0 +90 -0.1397620587788396 0.5 0 +91 -0.04290558063285843 0.5 0 +92 0 0.4300000000001734 0 +93 0 0.3600000000003685 0 +94 0 0.2900000000003252 0 +95 0 0.2200000000001519 0 +96 0 0.4650000000000867 0 +97 0 0.3950000000003007 0 +98 0 0.3250000000004448 0 +99 0 0.2550000000002834 0 +100 0 0.1850000000000817 0 +101 -0.07499999999980624 0.1299038105677777 0 +102 -0.12990381056752 0.07500000000025255 0 +103 -0.03882285676529234 0.1448888739433832 0 +104 -0.1060660171777162 0.1060660171782481 0 +105 -0.1448888739433208 0.03882285676552522 0 +106 0.5 0.08581116126524545 0 +107 0.5 0.1937129562906754 0 +108 0.5 0.3293922803425093 0 +109 0.5 0.04290558063262855 0 +110 0.5 0.1397620587779604 0 +111 0.5 0.261552618316445 0 +112 0.5 0.4146961401712547 0 +113 0.329392280343592 0.5 0 +114 0.1937129562919624 0.5 0 +115 0.08581116126571686 0.5 0 +116 0.4146961401717154 0.5 0 +117 0.2615526183179323 0.5 0 +118 0.1397620587788396 0.5 0 +119 0.04290558063285843 0.5 0 +120 0.07499999999980624 0.1299038105677777 0 +121 0.12990381056752 0.07500000000025255 0 +122 0.03882285676529234 0.1448888739433832 0 +123 0.1060660171777162 0.1060660171782481 0 +124 0.1448888739433208 0.03882285676552522 0 +125 -0.1632048750113544 -0.1232644810194541 0 +126 -0.2185144679483137 -0.3801534959448527 0 +127 -0.05089028167349786 -0.3584631613501202 0 +128 -0.06084793484707645 -0.1951430174291601 0 +129 -0.3999414826379826 -0.2373669670280938 0 +130 -0.3599999999994629 -0.06999999999986822 0 +131 -0.3654446467373357 -0.3654437046554025 0 +132 -0.4395424499711516 -0.06153088004804232 0 +133 -0.07529335399327118 -0.4336732331852045 0 +134 -0.281150983089465 -0.07390248292404106 0 +135 -0.2004047094340141 -0.06731430289221857 0 +136 -0.2306851351003935 -0.1453676244057918 0 +137 -0.07468286925234641 -0.2723686030373706 0 +138 -0.1452917775342399 -0.193626272412306 0 +139 -0.2595592816824605 -0.2528029361930984 0 +140 -0.1622839878484807 -0.2944285423531688 0 +141 -0.3285804443445061 -0.150165777374023 0 +142 -0.1292296528346454 -0.3731811726451194 0 +143 -0.4267159830345902 -0.1297998703416353 0 +144 -0.3297503821602216 -0.2450849516105961 0 +145 -0.2940698630134833 -0.2014843567835607 0 +146 -0.3642609634912444 -0.1937663722010584 0 +147 -0.1345031551426168 -0.4668366165926022 0 +148 -0.1022615034139583 -0.4034272029151619 0 +149 -0.1614713045633039 -0.4365905863225597 0 +150 -0.1969450050558739 -0.134316052712623 0 +151 -0.1879884563173167 -0.1694969484090489 0 +152 -0.1542483262727972 -0.1584453767158801 0 +153 -0.1191024375057585 -0.126584145793513 0 +154 -0.1101458887672013 -0.1617650414899389 0 +155 -0.245122208391427 -0.1990852802994451 0 +156 -0.2024255296083502 -0.2232146043027022 0 +157 -0.4327223233686679 -0.3474179924989559 0 +158 -0.3826930646876592 -0.3014053358417482 0 +159 -0.4499707413189913 -0.2833796236853016 0 +160 -0.2739533741459528 -0.4400767479724264 0 +161 -0.2919795573428247 -0.3727986003001276 0 +162 -0.3474184635404639 -0.4327218523277012 0 +163 -0.08055225762949403 -0.4668366165926022 0 +164 -0.1465543427895629 -0.09913224050963552 0 +165 -0.1738720603914795 -0.3766673342949861 0 +166 -0.206113712120138 -0.4400767479724264 0 +167 -0.1903992278983972 -0.3372910191490107 0 +168 -0.2109216347654706 -0.2736157392731336 0 +169 -0.239036874815387 -0.3164782160689755 0 +170 -0.06278657546292213 -0.3154158821937454 0 +171 -0.1019562610434959 -0.322774887841245 0 +172 -0.09005996725407162 -0.3658221669976198 0 +173 -0.1184834285504136 -0.2833985726952697 0 +174 -0.145756820341563 -0.3338048574991441 0 +175 -0.4327223233686679 -0.4327218523277012 0 +176 -0.4499707413189913 -0.2155399616593846 0 +177 -0.4133287328362865 -0.1835834186848646 0 +178 -0.4633579915172951 -0.1617564133161554 0 +179 -0.250575491544654 -0.03695124146202053 0 +180 -0.2407778462617395 -0.07060839290812981 0 +181 -0.2102023547169285 -0.03365715144610928 0 +182 -0.0373414346261732 -0.2811843015188479 0 +183 -0.02544514083674893 -0.3242315806752227 0 +184 -0.2796327897224498 -0.1477667008899074 0 +185 -0.4633579915172951 -0.1078055158034404 0 +186 -0.4697712249855758 -0.07367102065664388 0 +187 -0.4697712249855758 -0.03076544002402116 0 +188 -0.03764667699663559 -0.4668366165926022 0 +189 -0.2559180590949293 -0.1096350536649164 0 +190 -0.2155449222672038 -0.1063409636490052 0 +191 -0.1537878826913603 -0.2440274073827374 0 +192 -0.434771224985449 -0.03076544002402116 0 +193 -0.06792396742361956 -0.162523413998366 0 +194 -0.03042396742353823 -0.17257150871458 0 +195 -0.03764667699663559 -0.4318366165926889 0 +196 -0.175202354717007 -0.03365715144610928 0 +197 -0.1651542600008928 -0.07115715144601774 0 +198 -0.3442902221719845 -0.1100828886869456 0 +199 -0.3048657137169856 -0.112034130149032 0 +200 -0.320575491544464 -0.07195124146195464 0 +201 -0.3933579915170266 -0.09989993517075177 0 +202 -0.3776482136895482 -0.1399828238578292 0 +203 -0.3997712249853073 -0.06576544002395526 0 +204 -0.3949999999996046 -0.03499999999993411 0 +205 -0.02544514083674893 -0.3942315806751467 0 +206 -0.06309181783338452 -0.3960681972676623 0 +207 -0.1030698561906582 -0.194384644920733 0 +208 -0.1099873233932932 -0.2329974377248383 0 +209 -0.06776540204971143 -0.2337558102332654 0 +210 -0.2855754915445298 -0.03695124146202053 0 +211 -0.03042396742353823 -0.207571508714656 0 +212 -0.0373414346261732 -0.2461843015187613 0 +213 -0.3599999999995211 -0.03499999999993411 0 +214 -0.3249999999995288 -0.03499999999993411 0 +215 -0.02544514083674893 -0.3592315806752443 0 +216 -0.433129216502871 -0.09566537519483881 0 +217 -0.1818047922226842 -0.09528939195583636 0 +218 -0.3125019642098981 -0.3091233204242504 0 +219 0.1224866355280155 -0.1629072024975547 0 +220 0.3808849436885997 -0.210277224031109 0 +221 0.206743501399355 -0.07464099728276744 0 +222 0.3593515291260043 -0.06361416849824304 0 +223 0.2373889375053712 -0.4000946023341276 0 +224 0.05600596672534444 -0.3582026903534058 0 +225 0.3654446467373352 -0.3654437046554016 0 +226 0.07667776057372377 -0.4233233779044261 0 +227 0.4334916324593139 -0.06393052432330396 0 +228 0.07179343033759225 -0.2810845082405963 0 +229 0.06810735186864317 -0.2009476328841135 0 +230 0.1441955258379768 -0.2303966446545607 0 +231 0.2844391541799908 -0.07552818560281363 0 +232 0.1883841865915948 -0.1499536144563917 0 +233 0.2533917520134046 -0.2547236322031965 0 +234 0.2785219510541916 -0.1476215722506409 0 +235 0.1425674588596785 -0.3441671146532657 0 +236 0.3629155847584906 -0.1147592360453619 0 +237 0.1472316548992905 -0.4335170189783639 0 +238 0.4354584321812809 -0.1336982203911391 0 +239 0.1899781981825249 -0.3721308584936966 0 +240 0.1979796054365416 -0.2994453734282311 0 +241 0.2453903447593879 -0.3274091172686621 0 +242 0.1554354110598052 -0.1564304084769732 0 +243 0.1662898562147858 -0.1901751295554762 0 +244 0.1333410806829962 -0.1966519235760577 0 +245 0.1261952230477678 -0.1189536012489036 0 +246 0.09874331776391088 -0.1464055065326662 0 +247 0.2208879693024997 -0.2023386233297941 0 +248 0.1987936389256907 -0.2425601384288786 0 +249 0.1591439985795574 -0.1124768072283221 0 +250 0.2833906089244816 -0.4500473011670638 0 +251 0.3014167921213532 -0.3827691534947646 0 +252 0.3474184635404636 -0.4327218523277008 0 +253 0.4327223233686676 -0.3474179924989554 0 +254 0.3731647952129674 -0.2878604643432553 0 +255 0.4404424718442999 -0.2698347521868091 0 +256 0.3171383478510021 -0.2325004281171527 0 +257 0.2659568515337981 -0.2011726022269187 0 +258 0.3297034473713957 -0.178949398140875 0 +259 0.3207187679063411 -0.1311904041480014 0 +260 0.3719002642235452 -0.1625182300382355 0 +261 0.4327223233686676 -0.4327218523277008 0 +262 0.1704723055956265 -0.466758509489182 0 +263 0.1923102962023309 -0.4168058106562458 0 +264 0.2155509468986668 -0.4500473011670638 0 +265 0.4404424718442999 -0.2019950901608922 0 +266 0.4081716879349403 -0.1719877222111241 0 +267 0.4677292160906404 -0.1637055883409073 0 +268 0.03405367593432158 -0.2104738164421327 0 +269 0.06995039110311771 -0.2410160705623549 0 +270 0.03589671516879613 -0.2505422541203741 0 +271 0.1433814923488277 -0.2872818796539132 0 +272 0.4677292160906404 -0.1097546908281923 0 +273 0.1165214080825037 -0.466758509489182 0 +274 0.2522195770899168 -0.03776409280140682 0 +275 0.2455913277896729 -0.07508459144279053 0 +276 0.213371750699599 -0.03732049864138372 0 +277 0.4344750323202974 -0.09881437235722154 0 +278 0.3991870084698858 -0.1242287282182505 0 +279 0.3982036086089022 -0.08934488018433293 0 +280 0.2334530688228932 -0.1487875933535163 0 +281 0.03833888028686189 -0.461661688952213 0 +282 0.08124446091972032 -0.461661688952213 0 +283 0.4667458162296569 -0.07487084279427469 0 +284 0.4667458162296569 -0.03196526216165198 0 +285 0.10615143885331 -0.2156721387693371 0 +286 0.1079944780877845 -0.2557405764475785 0 +287 0.2814805526170912 -0.1115748789267273 0 +288 0.2426327262267733 -0.1111312847667042 0 +289 0.1783717506996775 -0.03732049864138372 0 +290 0.1683236559834375 -0.07482049864151 0 +291 0.3236773694692406 -0.09514371082408776 0 +292 0.03833888028686189 -0.4266616889522997 0 +293 0.4317458162295301 -0.03196526216165198 0 +294 0.2872195770897927 -0.03776409280140682 0 +295 0.07155367593422471 -0.1654257217259456 0 +296 0.03405367593432158 -0.1754738164420568 0 +297 0.1975638439954749 -0.1122973058695796 0 +298 0.06389969853146835 -0.319643599297001 0 +299 0.1071804445986354 -0.312625811446931 0 +300 0.09928671279251149 -0.3511849025033358 0 +301 0.1096226097167012 -0.3837452462788459 0 +302 0.06634186364953411 -0.3907630341289159 0 +303 0.1448995568794845 -0.3888420668158148 0 +304 0.1119547077365072 -0.428420198441395 0 +305 0.02800298336267222 -0.3941013451767896 0 +306 0.3964215807926591 -0.06377234641077351 0 +307 0.3946757645628752 -0.03180708424912152 0 +308 0.3246757645627995 -0.03180708424912152 0 +309 0.3218953416529975 -0.06957117705052834 0 +310 0.03589671516879613 -0.2855422541204607 0 +311 0.02800298336267222 -0.3241013451768655 0 +312 0.02800298336267222 -0.3591013451768871 0 +313 0.3596757645627918 -0.03180708424912152 0 +314 0.09529699369832934 -0.1819274176908341 0 +315 0.3611335569422474 -0.08918670227180248 0 +316 0.3094181993753699 -0.310083668429299 0 +317 -0.1224866355280155 0.1629072024975547 0 +318 -0.3808849436885997 0.210277224031109 0 +319 -0.206743501399355 0.07464099728276744 0 +320 -0.3593515291260043 0.06361416849824304 0 +321 -0.2373889375053712 0.4000946023341276 0 +322 -0.05600596672534444 0.3582026903534058 0 +323 -0.3654446467373352 0.3654437046554016 0 +324 -0.07667776057372377 0.4233233779044261 0 +325 -0.4334916324593139 0.06393052432330396 0 +326 -0.07179343033759225 0.2810845082405963 0 +327 -0.06810735186864317 0.2009476328841135 0 +328 -0.1441955258379768 0.2303966446545607 0 +329 -0.2844391541799908 0.07552818560281363 0 +330 -0.1883841865915948 0.1499536144563917 0 +331 -0.2533917520134046 0.2547236322031965 0 +332 -0.2785219510541917 0.1476215722506409 0 +333 -0.1425674588596785 0.3441671146532657 0 +334 -0.3629155847584906 0.1147592360453619 0 +335 -0.1472316548992905 0.4335170189783639 0 +336 -0.4354584321812809 0.1336982203911391 0 +337 -0.1899781981825249 0.3721308584936966 0 +338 -0.1979796054365416 0.2994453734282311 0 +339 -0.2453903447593879 0.3274091172686621 0 +340 -0.1554354110598052 0.1564304084769732 0 +341 -0.1662898562147858 0.1901751295554762 0 +342 -0.1333410806829962 0.1966519235760577 0 +343 -0.1261952230477678 0.1189536012489036 0 +344 -0.09874331776391088 0.1464055065326662 0 +345 -0.2208879693024997 0.2023386233297941 0 +346 -0.1987936389256907 0.2425601384288786 0 +347 -0.1591439985795574 0.1124768072283221 0 +348 -0.2833906089244816 0.4500473011670638 0 +349 -0.3014167921213532 0.3827691534947646 0 +350 -0.3474184635404636 0.4327218523277008 0 +351 -0.4327223233686676 0.3474179924989554 0 +352 -0.3731647952129674 0.2878604643432553 0 +353 -0.4404424718442999 0.2698347521868091 0 +354 -0.3171383478510021 0.2325004281171527 0 +355 -0.2659568515337981 0.2011726022269187 0 +356 -0.3297034473713957 0.178949398140875 0 +357 -0.3207187679063411 0.1311904041480014 0 +358 -0.3719002642235452 0.1625182300382355 0 +359 -0.4327223233686676 0.4327218523277008 0 +360 -0.1704723055956265 0.466758509489182 0 +361 -0.1923102962023309 0.4168058106562458 0 +362 -0.2155509468986668 0.4500473011670638 0 +363 -0.4404424718442999 0.2019950901608922 0 +364 -0.4081716879349403 0.1719877222111241 0 +365 -0.4677292160906404 0.1637055883409073 0 +366 -0.03405367593432158 0.2104738164421327 0 +367 -0.06995039110311771 0.2410160705623549 0 +368 -0.03589671516879613 0.2505422541203741 0 +369 -0.1433814923488277 0.2872818796539132 0 +370 -0.4677292160906404 0.1097546908281923 0 +371 -0.1165214080825037 0.466758509489182 0 +372 -0.2522195770899168 0.03776409280140682 0 +373 -0.2455913277896729 0.07508459144279053 0 +374 -0.213371750699599 0.03732049864138372 0 +375 -0.4344750323202974 0.09881437235722154 0 +376 -0.3991870084698858 0.1242287282182505 0 +377 -0.3982036086089022 0.08934488018433293 0 +378 -0.2334530688228932 0.1487875933535163 0 +379 -0.03833888028686189 0.461661688952213 0 +380 -0.08124446091972032 0.461661688952213 0 +381 -0.4667458162296569 0.07487084279427469 0 +382 -0.4667458162296569 0.03196526216165198 0 +383 -0.10615143885331 0.2156721387693371 0 +384 -0.1079944780877845 0.2557405764475785 0 +385 -0.2814805526170913 0.1115748789267273 0 +386 -0.2426327262267734 0.1111312847667042 0 +387 -0.1783717506996775 0.03732049864138372 0 +388 -0.1683236559834375 0.07482049864151 0 +389 -0.3236773694692406 0.09514371082408776 0 +390 -0.03833888028686189 0.4266616889522997 0 +391 -0.4317458162295301 0.03196526216165198 0 +392 -0.2872195770897927 0.03776409280140682 0 +393 -0.07155367593422471 0.1654257217259456 0 +394 -0.03405367593432158 0.1754738164420568 0 +395 -0.1975638439954749 0.1122973058695796 0 +396 -0.06389969853146835 0.319643599297001 0 +397 -0.1071804445986354 0.312625811446931 0 +398 -0.09928671279251149 0.3511849025033358 0 +399 -0.1096226097167012 0.3837452462788459 0 +400 -0.06634186364953411 0.3907630341289159 0 +401 -0.1448995568794845 0.3888420668158148 0 +402 -0.1119547077365072 0.428420198441395 0 +403 -0.02800298336267222 0.3941013451767896 0 +404 -0.3964215807926591 0.06377234641077351 0 +405 -0.3946757645628753 0.03180708424912152 0 +406 -0.3246757645627995 0.03180708424912152 0 +407 -0.3218953416529975 0.06957117705052834 0 +408 -0.03589671516879613 0.2855422541204607 0 +409 -0.02800298336267222 0.3241013451768655 0 +410 -0.02800298336267222 0.3591013451768871 0 +411 -0.3596757645627918 0.03180708424912152 0 +412 -0.09529699369832934 0.1819274176908341 0 +413 -0.3611335569422475 0.08918670227180248 0 +414 -0.3094181993753699 0.310083668429299 0 +415 0.1224866355280155 0.1629072024975547 0 +416 0.3808849436885997 0.210277224031109 0 +417 0.206743501399355 0.07464099728276744 0 +418 0.3593515291260043 0.06361416849824304 0 +419 0.2373889375053712 0.4000946023341276 0 +420 0.05600596672534444 0.3582026903534058 0 +421 0.3654446467373352 0.3654437046554016 0 +422 0.07667776057372377 0.4233233779044261 0 +423 0.4334916324593139 0.06393052432330396 0 +424 0.07179343033759224 0.2810845082405963 0 +425 0.06810735186864313 0.2009476328841135 0 +426 0.1441955258379768 0.2303966446545607 0 +427 0.2844391541799908 0.07552818560281363 0 +428 0.1883841865915948 0.1499536144563917 0 +429 0.2533917520134046 0.2547236322031965 0 +430 0.2785219510541916 0.1476215722506409 0 +431 0.1425674588596785 0.3441671146532657 0 +432 0.3629155847584906 0.1147592360453619 0 +433 0.1472316548992905 0.4335170189783639 0 +434 0.4354584321812809 0.1336982203911391 0 +435 0.1899781981825249 0.3721308584936966 0 +436 0.1979796054365416 0.2994453734282311 0 +437 0.2453903447593879 0.3274091172686621 0 +438 0.1554354110598052 0.1564304084769732 0 +439 0.1662898562147858 0.1901751295554762 0 +440 0.1333410806829962 0.1966519235760577 0 +441 0.1261952230477678 0.1189536012489036 0 +442 0.09874331776391088 0.1464055065326662 0 +443 0.2208879693024997 0.2023386233297941 0 +444 0.1987936389256907 0.2425601384288786 0 +445 0.1591439985795574 0.1124768072283221 0 +446 0.2833906089244816 0.4500473011670638 0 +447 0.3014167921213532 0.3827691534947646 0 +448 0.3474184635404636 0.4327218523277008 0 +449 0.4327223233686676 0.3474179924989554 0 +450 0.3731647952129674 0.2878604643432553 0 +451 0.4404424718442999 0.2698347521868091 0 +452 0.3171383478510021 0.2325004281171527 0 +453 0.2659568515337981 0.2011726022269187 0 +454 0.3297034473713957 0.178949398140875 0 +455 0.3207187679063411 0.1311904041480014 0 +456 0.3719002642235452 0.1625182300382355 0 +457 0.4327223233686676 0.4327218523277008 0 +458 0.1704723055956265 0.466758509489182 0 +459 0.1923102962023309 0.4168058106562458 0 +460 0.2155509468986668 0.4500473011670638 0 +461 0.4404424718442999 0.2019950901608922 0 +462 0.4081716879349403 0.1719877222111241 0 +463 0.4677292160906404 0.1637055883409073 0 +464 0.03405367593432156 0.2104738164421327 0 +465 0.06995039110311768 0.2410160705623549 0 +466 0.03589671516879612 0.2505422541203741 0 +467 0.1433814923488277 0.2872818796539132 0 +468 0.4677292160906404 0.1097546908281923 0 +469 0.1165214080825037 0.466758509489182 0 +470 0.2522195770899168 0.03776409280140682 0 +471 0.2455913277896729 0.07508459144279053 0 +472 0.213371750699599 0.03732049864138372 0 +473 0.4344750323202974 0.09881437235722154 0 +474 0.3991870084698858 0.1242287282182505 0 +475 0.3982036086089022 0.08934488018433294 0 +476 0.2334530688228932 0.1487875933535163 0 +477 0.03833888028686189 0.461661688952213 0 +478 0.08124446091972032 0.461661688952213 0 +479 0.4667458162296569 0.07487084279427469 0 +480 0.4667458162296569 0.03196526216165198 0 +481 0.10615143885331 0.2156721387693371 0 +482 0.1079944780877845 0.2557405764475785 0 +483 0.2814805526170912 0.1115748789267273 0 +484 0.2426327262267733 0.1111312847667042 0 +485 0.1783717506996775 0.03732049864138372 0 +486 0.1683236559834375 0.07482049864151 0 +487 0.3236773694692406 0.09514371082408778 0 +488 0.03833888028686189 0.4266616889522997 0 +489 0.4317458162295301 0.03196526216165198 0 +490 0.2872195770897927 0.03776409280140682 0 +491 0.07155367593422468 0.1654257217259456 0 +492 0.03405367593432156 0.1754738164420567 0 +493 0.1975638439954749 0.1122973058695796 0 +494 0.06389969853146835 0.319643599297001 0 +495 0.1071804445986354 0.312625811446931 0 +496 0.09928671279251149 0.3511849025033358 0 +497 0.1096226097167012 0.3837452462788459 0 +498 0.06634186364953411 0.3907630341289159 0 +499 0.1448995568794845 0.3888420668158148 0 +500 0.1119547077365072 0.428420198441395 0 +501 0.02800298336267222 0.3941013451767896 0 +502 0.3964215807926591 0.06377234641077351 0 +503 0.3946757645628752 0.03180708424912152 0 +504 0.3246757645627995 0.03180708424912152 0 +505 0.3218953416529975 0.06957117705052834 0 +506 0.03589671516879612 0.2855422541204607 0 +507 0.02800298336267222 0.3241013451768655 0 +508 0.02800298336267222 0.3591013451768871 0 +509 0.3596757645627918 0.03180708424912152 0 +510 0.09529699369832932 0.1819274176908341 0 +511 0.3611335569422474 0.08918670227180248 0 +512 0.3094181993753699 0.310083668429299 0 +$EndNodes +$Elements +266 +1 8 2 4 2 2 22 25 +2 8 2 4 2 22 23 26 +3 8 2 4 2 23 24 27 +4 8 2 4 2 24 3 28 +5 8 2 1 3 3 29 32 +6 8 2 1 3 29 30 33 +7 8 2 1 3 30 31 34 +8 8 2 1 3 31 4 35 +9 8 2 2 9 6 50 53 +10 8 2 2 9 50 51 54 +11 8 2 2 9 51 52 55 +12 8 2 2 9 52 7 56 +13 8 2 1 10 7 57 60 +14 8 2 1 10 57 58 61 +15 8 2 1 10 58 59 62 +16 8 2 1 10 59 4 63 +17 8 2 4 15 2 78 81 +18 8 2 4 15 78 79 82 +19 8 2 4 15 79 80 83 +20 8 2 4 15 80 9 84 +21 8 2 3 16 9 85 88 +22 8 2 3 16 85 86 89 +23 8 2 3 16 86 87 90 +24 8 2 3 16 87 10 91 +25 8 2 2 21 6 106 109 +26 8 2 2 21 106 107 110 +27 8 2 2 21 107 108 111 +28 8 2 2 21 108 12 112 +29 8 2 3 22 12 113 116 +30 8 2 3 22 113 114 117 +31 8 2 3 22 114 115 118 +32 8 2 3 22 115 10 119 +33 9 2 11 7 129 139 141 144 145 146 +34 9 2 11 7 30 133 142 147 148 149 +35 9 2 11 7 125 136 138 150 151 152 +36 9 2 11 7 46 125 138 153 152 154 +37 9 2 11 7 136 139 138 155 156 151 +38 9 2 11 7 24 131 129 157 158 159 +39 9 2 11 7 29 126 131 160 161 162 +40 9 2 11 7 30 31 133 34 163 147 +41 9 2 11 7 45 125 46 164 153 48 +42 9 2 11 7 30 142 126 149 165 166 +43 9 2 11 7 126 140 139 167 168 169 +44 9 2 11 7 127 137 142 170 171 172 +45 9 2 11 7 137 140 142 173 174 171 +46 9 2 11 7 3 131 24 175 157 28 +47 9 2 11 7 3 29 131 32 162 175 +48 9 2 11 7 23 129 143 176 177 178 +49 9 2 11 7 23 24 129 27 159 176 +50 9 2 11 7 13 134 135 179 180 181 +51 9 2 11 7 29 30 126 33 166 160 +52 9 2 11 7 38 137 127 182 170 183 +53 9 2 11 7 136 141 139 184 145 155 +54 9 2 11 7 22 23 143 26 178 185 +55 9 2 11 7 126 142 140 165 174 167 +56 9 2 11 7 2 22 132 25 186 187 +57 9 2 11 7 4 133 31 188 163 35 +58 9 2 11 7 134 136 135 189 190 180 +59 9 2 11 7 138 139 140 156 168 191 +60 9 2 11 7 2 132 16 187 192 21 +61 9 2 11 7 5 46 128 49 193 194 +62 9 2 11 7 4 36 133 40 195 188 +63 9 2 11 7 1 135 45 196 197 47 +64 9 2 11 7 130 141 134 198 199 200 +65 9 2 11 7 130 143 141 201 202 198 +66 9 2 11 7 16 132 130 192 203 204 +67 9 2 11 7 36 127 133 205 206 195 +68 9 2 11 7 128 138 137 207 208 209 +69 9 2 11 7 137 138 140 208 191 173 +70 9 2 11 7 134 141 136 199 184 189 +71 9 2 11 7 46 138 128 154 207 193 +72 9 2 11 7 13 14 134 18 210 179 +73 9 2 11 7 5 128 39 194 211 44 +74 9 2 11 7 1 13 135 17 181 196 +75 9 2 11 7 38 39 137 43 212 182 +76 9 2 11 7 14 15 130 19 213 214 +77 9 2 11 7 15 16 130 20 204 213 +78 9 2 11 7 37 38 127 42 183 215 +79 9 2 11 7 36 37 127 41 215 205 +80 9 2 11 7 130 132 143 203 216 201 +81 9 2 11 7 125 135 136 217 190 150 +82 9 2 11 7 129 141 143 146 202 177 +83 9 2 11 7 39 128 137 211 209 212 +84 9 2 11 7 14 130 134 214 200 210 +85 9 2 11 7 22 143 132 185 216 186 +86 9 2 11 7 45 135 125 197 217 164 +87 9 2 11 7 127 142 133 172 148 206 +88 9 2 11 7 126 139 131 169 218 161 +89 9 2 11 7 129 131 139 158 218 144 +90 9 2 11 8 223 235 233 239 240 241 +91 9 2 11 8 219 232 230 242 243 244 +92 9 2 11 8 64 65 219 67 245 246 +93 9 2 11 8 230 232 233 243 247 248 +94 9 2 11 8 65 232 219 249 242 245 +95 9 2 11 8 57 223 225 250 251 252 +96 9 2 11 8 52 225 220 253 254 255 +97 9 2 11 8 220 233 234 256 257 258 +98 9 2 11 8 220 234 236 258 259 260 +99 9 2 11 8 7 225 52 261 253 56 +100 9 2 11 8 7 57 225 60 252 261 +101 9 2 11 8 58 237 223 262 263 264 +102 9 2 11 8 57 58 223 61 264 250 +103 9 2 11 8 51 220 238 265 266 267 +104 9 2 11 8 51 52 220 55 255 265 +105 9 2 11 8 39 229 228 268 269 270 +106 9 2 11 8 230 233 235 248 240 271 +107 9 2 11 8 50 51 238 54 267 272 +108 9 2 11 8 58 59 237 62 273 262 +109 9 2 11 8 69 231 221 274 275 276 +110 9 2 11 8 227 238 236 277 278 279 +111 9 2 11 8 232 234 233 280 257 247 +112 9 2 11 8 4 226 59 281 282 63 +113 9 2 11 8 6 50 227 53 283 284 +114 9 2 11 8 228 229 230 269 285 286 +115 9 2 11 8 221 231 234 275 287 288 +116 9 2 11 8 8 221 65 289 290 68 +117 9 2 11 8 231 236 234 291 259 287 +118 9 2 11 8 4 36 226 40 292 281 +119 9 2 11 8 6 227 72 284 293 77 +120 9 2 11 8 69 70 231 74 294 274 +121 9 2 11 8 5 64 229 66 295 296 +122 9 2 11 8 221 234 232 288 280 297 +123 9 2 11 8 220 236 238 260 278 266 +124 9 2 11 8 224 228 235 298 299 300 +125 9 2 11 8 224 235 226 300 301 302 +126 9 2 11 8 226 235 237 301 303 304 +127 9 2 11 8 36 224 226 305 302 292 +128 9 2 11 8 72 227 222 293 306 307 +129 9 2 11 8 70 222 231 308 309 294 +130 9 2 11 8 8 69 221 73 276 289 +131 9 2 11 8 228 230 235 286 271 299 +132 9 2 11 8 38 39 228 43 270 310 +133 9 2 11 8 65 221 232 290 297 249 +134 9 2 11 8 5 229 39 296 268 44 +135 9 2 11 8 37 38 224 42 311 312 +136 9 2 11 8 36 37 224 41 312 305 +137 9 2 11 8 70 71 222 75 313 308 +138 9 2 11 8 71 72 222 76 307 313 +139 9 2 11 8 219 230 229 244 285 314 +140 9 2 11 8 223 237 235 263 303 239 +141 9 2 11 8 38 228 224 310 298 311 +142 9 2 11 8 222 236 231 315 291 309 +143 9 2 11 8 50 238 227 272 277 283 +144 9 2 11 8 59 226 237 282 304 273 +145 9 2 11 8 64 219 229 246 314 295 +146 9 2 11 8 222 227 236 306 279 315 +147 9 2 11 8 220 225 233 254 316 256 +148 9 2 11 8 223 233 225 241 316 251 +149 9 2 11 14 321 333 331 337 338 339 +150 9 2 11 14 317 330 328 340 341 342 +151 9 2 11 14 101 102 317 104 343 344 +152 9 2 11 14 328 330 331 341 345 346 +153 9 2 11 14 102 330 317 347 340 343 +154 9 2 11 14 85 321 323 348 349 350 +155 9 2 11 14 80 323 318 351 352 353 +156 9 2 11 14 318 331 332 354 355 356 +157 9 2 11 14 318 332 334 356 357 358 +158 9 2 11 14 9 323 80 359 351 84 +159 9 2 11 14 9 85 323 88 350 359 +160 9 2 11 14 86 335 321 360 361 362 +161 9 2 11 14 85 86 321 89 362 348 +162 9 2 11 14 79 318 336 363 364 365 +163 9 2 11 14 79 80 318 83 353 363 +164 9 2 11 14 95 327 326 366 367 368 +165 9 2 11 14 328 331 333 346 338 369 +166 9 2 11 14 78 79 336 82 365 370 +167 9 2 11 14 86 87 335 90 371 360 +168 9 2 11 14 13 329 319 372 373 374 +169 9 2 11 14 325 336 334 375 376 377 +170 9 2 11 14 330 332 331 378 355 345 +171 9 2 11 14 10 324 87 379 380 91 +172 9 2 11 14 2 78 325 81 381 382 +173 9 2 11 14 326 327 328 367 383 384 +174 9 2 11 14 319 329 332 373 385 386 +175 9 2 11 14 1 319 102 387 388 105 +176 9 2 11 14 329 334 332 389 357 385 +177 9 2 11 14 10 92 324 96 390 379 +178 9 2 11 14 2 325 16 382 391 21 +179 9 2 11 14 13 14 329 18 392 372 +180 9 2 11 14 11 101 327 103 393 394 +181 9 2 11 14 319 332 330 386 378 395 +182 9 2 11 14 318 334 336 358 376 364 +183 9 2 11 14 322 326 333 396 397 398 +184 9 2 11 14 322 333 324 398 399 400 +185 9 2 11 14 324 333 335 399 401 402 +186 9 2 11 14 92 322 324 403 400 390 +187 9 2 11 14 16 325 320 391 404 405 +188 9 2 11 14 14 320 329 406 407 392 +189 9 2 11 14 1 13 319 17 374 387 +190 9 2 11 14 326 328 333 384 369 397 +191 9 2 11 14 94 95 326 99 368 408 +192 9 2 11 14 102 319 330 388 395 347 +193 9 2 11 14 11 327 95 394 366 100 +194 9 2 11 14 93 94 322 98 409 410 +195 9 2 11 14 92 93 322 97 410 403 +196 9 2 11 14 14 15 320 19 411 406 +197 9 2 11 14 15 16 320 20 405 411 +198 9 2 11 14 317 328 327 342 383 412 +199 9 2 11 14 321 335 333 361 401 337 +200 9 2 11 14 94 326 322 408 396 409 +201 9 2 11 14 320 334 329 413 389 407 +202 9 2 11 14 78 336 325 370 375 381 +203 9 2 11 14 87 324 335 380 402 371 +204 9 2 11 14 101 317 327 344 412 393 +205 9 2 11 14 320 325 334 404 377 413 +206 9 2 11 14 318 323 331 352 414 354 +207 9 2 11 14 321 331 323 339 414 349 +208 9 2 11 20 419 431 429 435 436 437 +209 9 2 11 20 415 428 426 438 439 440 +210 9 2 11 20 120 121 415 123 441 442 +211 9 2 11 20 426 428 429 439 443 444 +212 9 2 11 20 121 428 415 445 438 441 +213 9 2 11 20 113 419 421 446 447 448 +214 9 2 11 20 108 421 416 449 450 451 +215 9 2 11 20 416 429 430 452 453 454 +216 9 2 11 20 416 430 432 454 455 456 +217 9 2 11 20 12 421 108 457 449 112 +218 9 2 11 20 12 113 421 116 448 457 +219 9 2 11 20 114 433 419 458 459 460 +220 9 2 11 20 113 114 419 117 460 446 +221 9 2 11 20 107 416 434 461 462 463 +222 9 2 11 20 107 108 416 111 451 461 +223 9 2 11 20 95 425 424 464 465 466 +224 9 2 11 20 426 429 431 444 436 467 +225 9 2 11 20 106 107 434 110 463 468 +226 9 2 11 20 114 115 433 118 469 458 +227 9 2 11 20 69 427 417 470 471 472 +228 9 2 11 20 423 434 432 473 474 475 +229 9 2 11 20 428 430 429 476 453 443 +230 9 2 11 20 10 422 115 477 478 119 +231 9 2 11 20 6 106 423 109 479 480 +232 9 2 11 20 424 425 426 465 481 482 +233 9 2 11 20 417 427 430 471 483 484 +234 9 2 11 20 8 417 121 485 486 124 +235 9 2 11 20 427 432 430 487 455 483 +236 9 2 11 20 10 92 422 96 488 477 +237 9 2 11 20 6 423 72 480 489 77 +238 9 2 11 20 69 70 427 74 490 470 +239 9 2 11 20 11 120 425 122 491 492 +240 9 2 11 20 417 430 428 484 476 493 +241 9 2 11 20 416 432 434 456 474 462 +242 9 2 11 20 420 424 431 494 495 496 +243 9 2 11 20 420 431 422 496 497 498 +244 9 2 11 20 422 431 433 497 499 500 +245 9 2 11 20 92 420 422 501 498 488 +246 9 2 11 20 72 423 418 489 502 503 +247 9 2 11 20 70 418 427 504 505 490 +248 9 2 11 20 8 69 417 73 472 485 +249 9 2 11 20 424 426 431 482 467 495 +250 9 2 11 20 94 95 424 99 466 506 +251 9 2 11 20 121 417 428 486 493 445 +252 9 2 11 20 11 425 95 492 464 100 +253 9 2 11 20 93 94 420 98 507 508 +254 9 2 11 20 92 93 420 97 508 501 +255 9 2 11 20 70 71 418 75 509 504 +256 9 2 11 20 71 72 418 76 503 509 +257 9 2 11 20 415 426 425 440 481 510 +258 9 2 11 20 419 433 431 459 499 435 +259 9 2 11 20 94 424 420 506 494 507 +260 9 2 11 20 418 432 427 511 487 505 +261 9 2 11 20 106 434 423 468 473 479 +262 9 2 11 20 115 422 433 478 500 469 +263 9 2 11 20 120 415 425 442 510 491 +264 9 2 11 20 418 423 432 502 475 511 +265 9 2 11 20 416 421 429 450 512 452 +266 9 2 11 20 419 429 421 437 512 447 +$EndElements diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_rotateRVE/model.geo b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_rotateRVE/model.geo new file mode 100644 index 0000000000000000000000000000000000000000..53aaf58a7c3e5bb390202cddd619a49372114450 --- /dev/null +++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_rotateRVE/model.geo @@ -0,0 +1,47 @@ + +mm=1.0; +L=1.*mm; +H = 1*mm; +sl1=0.5*L; +Point(1)={0,0,0,sl1}; +Point(2)={L,0,0,sl1}; +Point(3)={L,H,0,sl1}; +Point(4)={0,H,0,sl1}; +Point(5)={2*L,0,0,sl1}; +Point(6)={2*L,H,0,sl1}; +Line(1)={1,2}; +Line(2)={2,3}; +Line(3)={3,4}; +Line(4)={4,1}; +Line(5)={2,5}; +Line(6)={5,6}; +Line(7)={6,3}; + +l[0]=newreg; +Line Loop(l[0])={1,2,3,4}; +Plane Surface(11)={l[0]}; + +l[1]=newreg; +Line Loop(l[1])={5,6,7,-2}; +Plane Surface(12)={l[1]}; + +Physical Surface(11)={11}; +Physical Point(1)={1}; +Physical Point(2)={2}; +Physical Point(3)={5}; +Physical Point(4)={6}; + +Transfinite Line {4, 2,6} = 2 Using Progression 1; +Transfinite Line {3, 1,5,7} = 2 Using Progression 1; +Transfinite Surface {11, 12}; +Recombine Surface {11,12}; + +Physical Surface(12) = {12}; +Physical Line(1) = {1, 5}; +Physical Line(2) = {6}; +Physical Line(3) = {7,3}; +Physical Line(4) = {4}; +//+ +Translate {0.3, 0, 0} { + Point{3}; +} diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_rotateRVE/model.msh b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_rotateRVE/model.msh new file mode 100644 index 0000000000000000000000000000000000000000..aba0ca64c6428748d97a1abbb98a659e4cd28836 --- /dev/null +++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_rotateRVE/model.msh @@ -0,0 +1,27 @@ +$MeshFormat +2.2 0 8 +$EndMeshFormat +$Nodes +6 +1 0 0 0 +2 1 0 0 +3 1.3 1 0 +4 0 1 0 +5 2 0 0 +6 2 1 0 +$EndNodes +$Elements +12 +1 15 2 1 1 1 +2 15 2 2 2 2 +3 15 2 3 5 5 +4 15 2 4 6 6 +5 1 2 1 1 1 2 +6 1 2 3 3 3 4 +7 1 2 4 4 4 1 +8 1 2 1 5 2 5 +9 1 2 2 6 5 6 +10 1 2 3 7 6 3 +11 3 2 11 11 1 2 3 4 +12 3 2 12 12 2 5 6 3 +$EndElements diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_rotateRVE/model.py b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_rotateRVE/model.py new file mode 100644 index 0000000000000000000000000000000000000000..a26653258a12ccaf1968f69ee84c258adbe789ad --- /dev/null +++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_rotateRVE/model.py @@ -0,0 +1,208 @@ +#coding-Utf-8-*- +from gmshpy import * +from dG3Dpy import* + +#script to launch PBC problem with a python script + +#DEFINE MICRO PROBLEM + +# micro-material law +lawnum1 = 11 # unique number of law + + +rho = 7850e-9 +young = 28.9e3 +nu = 0.3 +sy0 = 99. +h = young/20. + +harden = LinearExponentialJ2IsotropicHardening(1, sy0, h, 0., 10.) +cl = IsotropicCLengthLaw(1, 1e-2) +damlaw = SimpleSaturateDamageLaw(1, 50.,1.,0.,1.) +law1 = NonLocalDamageJ2HyperDG3DMaterialLaw(lawnum1,rho,young,nu,harden,cl,damlaw) + + +micromeshfile="micro.msh" # name of mesh file +#micromeshfile="square.msh" # name of mesh file + +# creation of part Domain +nfield = 11 # number of the field (physical number of entity) +myfield1 = nonLocalDamageDG3DDomain(1000,nfield,0,lawnum1,0,1e3,2,1) + +microBC = nonLinearPeriodicBC(1000,2) +microBC.setOrder(1) +microBC.setBCPhysical(1,4,3,2) +# periodiodic BC +method = 0 # Periodic mesh = 0 Langrange interpolation = 1 Cubic spline interpolation =2 +degree = 5 +addvertex = False +microBC.setPeriodicBCOptions(method, degree,addvertex) + +# DEFINE MACROPROBLEM +matnum1 = 1; +macromat1 = dG3DMultiscaleMaterialLaw(matnum1, 1000) +macromat1.loadModel(micromeshfile); +macromat1.addDomain(myfield1) +macromat1.addMaterialLaw(law1); +macromat1.setPeriodicity(1.,0,0,"x") +macromat1.setPeriodicity(0,1.,0,"y") +macromat1.setPeriodicity(0,0,1.,"z") +macromat1.addMicroBC(microBC) + +macromat1.setNumStep(3) +macromat1.setTolerance(1e-6,1e-10) +macromat1.setSystemType(1) +macromat1.Solver(2) +#for i in range(0,1): +macromat1.setViewAllMicroProblems(True,0) + +macromat1.setBlockDamageAfterFailureOnset(True) + +macromat1.Scheme(1) +macromat1.setSameStateCriterion(1e-16) +macromat1.stressAveragingFlag(True) # set stress averaging ON- 0 , OFF-1 +macromat1.setStressAveragingMethod(0) +macromat1.tangentAveragingFlag(True) # set tangent averaging ON -0, OFF -1 +macromat1.setTangentAveragingMethod(2,1e-6); + +macromat1.internalPointBuildView("Green-Lagrange_xx",IPField.STRAIN_XX); +macromat1.internalPointBuildView("Green-Lagrange_yy",IPField.STRAIN_YY); +macromat1.internalPointBuildView("Green-Lagrange_xy",IPField.STRAIN_XY); +macromat1.internalPointBuildView("Green-Lagrange_zz",IPField.STRAIN_ZZ); +macromat1.internalPointBuildView("Green-Lagrange_yz",IPField.STRAIN_YZ); +macromat1.internalPointBuildView("Green-Lagrange_xz",IPField.STRAIN_XZ); +macromat1.internalPointBuildView("sig_xx",IPField.SIG_XX); +macromat1.internalPointBuildView("sig_yy",IPField.SIG_YY); +macromat1.internalPointBuildView("sig_xy",IPField.SIG_XY); +macromat1.internalPointBuildView("sig_xz",IPField.SIG_XZ); +macromat1.internalPointBuildView("sig_zz",IPField.SIG_ZZ); +macromat1.internalPointBuildView("sig_yz",IPField.SIG_YZ); +macromat1.internalPointBuildView("sig_VM",IPField.SVM); + +macromat1.internalPointBuildView("F_xx",IPField.F_XX); +macromat1.internalPointBuildView("F_yy",IPField.F_YY); +macromat1.internalPointBuildView("F_xy",IPField.F_XY); +macromat1.internalPointBuildView("F_yx",IPField.F_YX); + +macromat1.internalPointBuildView("P_xx",IPField.P_XX); +macromat1.internalPointBuildView("P_yy",IPField.P_YY); +macromat1.internalPointBuildView("P_xy",IPField.P_XY); +macromat1.internalPointBuildView("P_yx",IPField.P_YX); + +macromat1.internalPointBuildView("Equivalent plastic strain",IPField.PLASTICSTRAIN); +macromat1.internalPointBuildView("Damage",IPField.DAMAGE); + +macromat1.dirichletBC("Face",11,2,0.) + + +lcohNum = 13 +lawCoh = dG3DMultiscaleCohesiveLaw(lcohNum,0.7) +lawCoh.setCharacteristicLength(1.) +lawCoh.setLostSolutionUniquenssTolerance(0.) +lawCoh.setRotationOfRVEFollowingInterfaceLocalBasis(True) + +macromeshfile="model.msh" # name of mesh file + +# solver +sol = 2 # Gmm=0 (default) Taucs=1 PETsc=2 +soltype =1 # StaticLinear=0 (default) StaticNonLinear=1 +nstep = 100 # number of step (used only if soltype=1) +ftime =1. # Final time (used only if soltype=1) +tol=1.e-5 # 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 macro part Domain + +dim =2 +beta1 = 50; +fullDG = False; + +averageStrainBased = True + +# non DG domain +nfield1 = 11 +macrodomain1 = dG3DDomain(10,nfield1,0,matnum1,fullDG,dim) +macrodomain1.stabilityParameters(beta1) +macrodomain1.setDistributedOtherRanks(True) +macrodomain1.distributeOnRootRank(False) + +nfield2 = 12 +macrodomain2 = dG3DDomain(11,nfield2,0,matnum1,fullDG,dim) +macrodomain2.stabilityParameters(beta1) +macrodomain2.setDistributedOtherRanks(True) +macrodomain2.distributeOnRootRank(False) + +# interface domain +beta1 = 100; +interdomain1 = interDomainBetween3D(12,macrodomain1,macrodomain2,lcohNum,matnum1) +interdomain1.stabilityParameters(beta1) +interdomain1.averageStrainBased(averageStrainBased) +interdomain1.setDistributedOtherRanks(True) +interdomain1.distributeOnRootRank(False) + +# creation of Solver +mysolver = nonLinearMechSolver(1000) +mysolver.loadModel(macromeshfile) +mysolver.addDomain(macrodomain1) +mysolver.addDomain(macrodomain2) +mysolver.addDomain(interdomain1) +mysolver.addMaterialLaw(macromat1) + +mysolver.addMaterialLaw(lawCoh) +mysolver.setMultiscaleFlag(True) +mysolver.Scheme(soltype) +mysolver.Solver(sol) +mysolver.snlData(nstep,ftime,tol) +mysolver.options("-ksp_type preonly -pc_type lu -pc_factor_shift_type NONZERO -pc_factor_mat_solver_package petsc") + + +# boundary condition +mysolver.displacementBC("Face",11,2,0.0) +mysolver.displacementBC("Face",12,2,0.0) + +mysolver.displacementBC("Face",11,1,0.0) +mysolver.displacementBC("Face",12,1,0.0) + + +mysolver.displacementBC("Edge",1,1,0.0) +mysolver.displacementBC("Edge",2,0,0.02) +mysolver.displacementBC("Edge",4,0,0.0) + + +# archivage +mysolver.internalPointBuildView("Green-Lagrange_xx",IPField.STRAIN_XX, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_yy",IPField.STRAIN_YY, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_zz",IPField.STRAIN_ZZ, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_xy",IPField.STRAIN_XY, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_yz",IPField.STRAIN_YZ, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_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("Green-Lagrange equivalent strain",IPField.GL_EQUIVALENT_STRAIN, 1, 1); +mysolver.internalPointBuildView("Equivalent plastic strain",IPField.PLASTICSTRAIN, 1, 1); +mysolver.internalPointBuildView("Damage",IPField.DAMAGE,1,1); + +mysolver.archivingForceOnPhysicalGroup("Edge",4,0) + +mysolver.archivingInterfaceElementIP(11,12,IPField.DISP_JUMP_X,4,0,1) +mysolver.archivingInterfaceElementIP(11,12,IPField.DISP_JUMP_Y,4,0,1) + +mysolver.archivingInterfaceElementIP(11,12,IPField.COHESIVE_JUMP_X,4,0,1) +mysolver.archivingInterfaceElementIP(11,12,IPField.COHESIVE_JUMP_Y,4,0,1) + +mysolver.archivingInterfaceElementIP(11,12,IPField.INCOMPATIBLE_STRAIN_X,4,0,1) +mysolver.archivingInterfaceElementIP(11,12,IPField.INCOMPATIBLE_STRAIN_Y,4,0,1) + + +# solve +mysolver.solve() + +check = TestCheck() +check.equal(-1.306794e+01,mysolver.getArchivedForceOnPhysicalGroup("Edge", 4, 0),1.e-4) + diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_shiftedBC/CMakeLists.txt b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_shiftedBC/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..bc54bc2ce5018e76600e6490a5013c6c5d8aed59 --- /dev/null +++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_shiftedBC/CMakeLists.txt @@ -0,0 +1,14 @@ +# test file + +set(PYFILE model.py) + +set(FILES2DELETE + E_*.msh + *.txt + *.csv + disp* + stress* + *Rotated*.msh +) + +add_cm3python_mpi_test(4 ${PYFILE} "${FILES2DELETE}") diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_shiftedBC/micro.geo b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_shiftedBC/micro.geo new file mode 100644 index 0000000000000000000000000000000000000000..5e0b62d6d05215e12989e4cd6bfebc54d1a5517e --- /dev/null +++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_shiftedBC/micro.geo @@ -0,0 +1,45 @@ +mm = 1.; +L = 1.*mm; +R = 0.15*L; +lsca1 = 0.2*L; +lsca2 = 0.4*lsca1; + +Point(1) = {0,0,0,lsca1}; +Point(2) = {-R,0,0,lsca2}; +Point(3) = {-0.5*L,0,0,lsca2}; +Point(4) = {-0.5*L,-0.5*L,0,lsca1}; +Point(5) = {0,-0.5*L,0,lsca2}; +Point(6) = {0,-R,0,lsca2}; + + +Line(1) = {2, 3}; +Line(2) = {3, 4}; +Line(3) = {4, 5}; +Line(4) = {5, 6}; +Circle(5) = {2, 1, 6}; +Line Loop(6) = {2, 3, 4, -5, 1}; +Plane Surface(7) = {6}; +Symmetry {1, 0, 0, 0} { + Duplicata { Surface{7}; } +} +Symmetry {0, 1, 0, 0} { + Duplicata { Surface{7, 8}; } +} + +//Recombine Surface{14, 20, 8, 7}; +Physical Line(1) = {3, 10}; +Physical Line(2) = {9, 21}; +Physical Line(3) = {22, 16}; +Physical Line(4) = {15, 2}; +Physical Surface(11) = {14, 20, 8, 7}; + + +/* +Translate {0.1, 0, 0} { + Line{17, 24, 18, 5, 12, 4}; +} + +Translate {0, 0.1, 0} { + Line{18, 24, 13, 12, 5, 1}; +} +*/ diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_shiftedBC/micro.msh b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_shiftedBC/micro.msh new file mode 100644 index 0000000000000000000000000000000000000000..c6acd5b31b792077590d064be2f4fe7779b47c89 --- /dev/null +++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_shiftedBC/micro.msh @@ -0,0 +1,787 @@ +$MeshFormat +2.2 0 8 +$EndMeshFormat +$Nodes +512 +1 -0.15 0 0 +2 -0.5 0 0 +3 -0.5 -0.5 0 +4 0 -0.5 0 +5 0 -0.15 0 +6 0.5 0 0 +7 0.5 -0.5 0 +8 0.15 0 0 +9 -0.5 0.5 0 +10 0 0.5 0 +11 0 0.15 0 +12 0.5 0.5 0 +13 -0.2199999999998429 0 0 +14 -0.2899999999995946 0 0 +15 -0.3599999999995793 0 0 +16 -0.4299999999997463 0 0 +17 -0.1849999999999308 0 0 +18 -0.2549999999996413 0 0 +19 -0.3249999999994754 0 0 +20 -0.3949999999996151 0 0 +21 -0.4649999999998321 0 0 +22 -0.5 -0.08581116126524545 0 +23 -0.5 -0.1937129562906754 0 +24 -0.5 -0.3293922803425093 0 +25 -0.5 -0.04290558063262855 0 +26 -0.5 -0.1397620587779604 0 +27 -0.5 -0.261552618316445 0 +28 -0.5 -0.4146961401712547 0 +29 -0.329392280343592 -0.5 0 +30 -0.1937129562919624 -0.5 0 +31 -0.08581116126571686 -0.5 0 +32 -0.4146961401717154 -0.5 0 +33 -0.2615526183179323 -0.5 0 +34 -0.1397620587788396 -0.5 0 +35 -0.04290558063285843 -0.5 0 +36 0 -0.4300000000001734 0 +37 0 -0.3600000000003685 0 +38 0 -0.2900000000003252 0 +39 0 -0.2200000000001519 0 +40 0 -0.4650000000000867 0 +41 0 -0.3950000000003007 0 +42 0 -0.3250000000004448 0 +43 0 -0.2550000000002834 0 +44 0 -0.1850000000000817 0 +45 -0.1299038105677715 -0.07499999999981691 0 +46 -0.07500000000016267 -0.1299038105675719 0 +47 -0.1448888739433795 -0.03882285676530619 0 +48 -0.106066017178175 -0.1060660171777893 0 +49 -0.03882285676546777 -0.1448888739433362 0 +50 0.5 -0.08581116126524545 0 +51 0.5 -0.1937129562906754 0 +52 0.5 -0.3293922803425093 0 +53 0.5 -0.04290558063262855 0 +54 0.5 -0.1397620587779604 0 +55 0.5 -0.261552618316445 0 +56 0.5 -0.4146961401712547 0 +57 0.329392280343592 -0.5 0 +58 0.1937129562919624 -0.5 0 +59 0.08581116126571686 -0.5 0 +60 0.4146961401717154 -0.5 0 +61 0.2615526183179323 -0.5 0 +62 0.1397620587788396 -0.5 0 +63 0.04290558063285843 -0.5 0 +64 0.07499999999980624 -0.1299038105677777 0 +65 0.12990381056752 -0.07500000000025255 0 +66 0.03882285676529234 -0.1448888739433832 0 +67 0.1060660171777162 -0.1060660171782481 0 +68 0.1448888739433208 -0.03882285676552522 0 +69 0.2199999999998429 0 0 +70 0.2899999999995946 0 0 +71 0.3599999999995793 0 0 +72 0.4299999999997463 0 0 +73 0.1849999999999308 0 0 +74 0.2549999999996413 0 0 +75 0.3249999999994754 0 0 +76 0.3949999999996151 0 0 +77 0.4649999999998321 0 0 +78 -0.5 0.08581116126524545 0 +79 -0.5 0.1937129562906754 0 +80 -0.5 0.3293922803425093 0 +81 -0.5 0.04290558063262855 0 +82 -0.5 0.1397620587779604 0 +83 -0.5 0.261552618316445 0 +84 -0.5 0.4146961401712547 0 +85 -0.329392280343592 0.5 0 +86 -0.1937129562919624 0.5 0 +87 -0.08581116126571686 0.5 0 +88 -0.4146961401717154 0.5 0 +89 -0.2615526183179323 0.5 0 +90 -0.1397620587788396 0.5 0 +91 -0.04290558063285843 0.5 0 +92 0 0.4300000000001734 0 +93 0 0.3600000000003685 0 +94 0 0.2900000000003252 0 +95 0 0.2200000000001519 0 +96 0 0.4650000000000867 0 +97 0 0.3950000000003007 0 +98 0 0.3250000000004448 0 +99 0 0.2550000000002834 0 +100 0 0.1850000000000817 0 +101 -0.07499999999980624 0.1299038105677777 0 +102 -0.12990381056752 0.07500000000025255 0 +103 -0.03882285676529234 0.1448888739433832 0 +104 -0.1060660171777162 0.1060660171782481 0 +105 -0.1448888739433208 0.03882285676552522 0 +106 0.5 0.08581116126524545 0 +107 0.5 0.1937129562906754 0 +108 0.5 0.3293922803425093 0 +109 0.5 0.04290558063262855 0 +110 0.5 0.1397620587779604 0 +111 0.5 0.261552618316445 0 +112 0.5 0.4146961401712547 0 +113 0.329392280343592 0.5 0 +114 0.1937129562919624 0.5 0 +115 0.08581116126571686 0.5 0 +116 0.4146961401717154 0.5 0 +117 0.2615526183179323 0.5 0 +118 0.1397620587788396 0.5 0 +119 0.04290558063285843 0.5 0 +120 0.07499999999980624 0.1299038105677777 0 +121 0.12990381056752 0.07500000000025255 0 +122 0.03882285676529234 0.1448888739433832 0 +123 0.1060660171777162 0.1060660171782481 0 +124 0.1448888739433208 0.03882285676552522 0 +125 -0.1632048750113544 -0.1232644810194541 0 +126 -0.2185144679483137 -0.3801534959448527 0 +127 -0.05089028167349786 -0.3584631613501202 0 +128 -0.06084793484707645 -0.1951430174291601 0 +129 -0.3999414826379826 -0.2373669670280938 0 +130 -0.3599999999994629 -0.06999999999986822 0 +131 -0.3654446467373357 -0.3654437046554025 0 +132 -0.4395424499711516 -0.06153088004804232 0 +133 -0.07529335399327118 -0.4336732331852045 0 +134 -0.281150983089465 -0.07390248292404106 0 +135 -0.2004047094340141 -0.06731430289221857 0 +136 -0.2306851351003935 -0.1453676244057918 0 +137 -0.07468286925234641 -0.2723686030373706 0 +138 -0.1452917775342399 -0.193626272412306 0 +139 -0.2595592816824605 -0.2528029361930984 0 +140 -0.1622839878484807 -0.2944285423531688 0 +141 -0.3285804443445061 -0.150165777374023 0 +142 -0.1292296528346454 -0.3731811726451194 0 +143 -0.4267159830345902 -0.1297998703416353 0 +144 -0.3297503821602216 -0.2450849516105961 0 +145 -0.2940698630134833 -0.2014843567835607 0 +146 -0.3642609634912444 -0.1937663722010584 0 +147 -0.1345031551426168 -0.4668366165926022 0 +148 -0.1022615034139583 -0.4034272029151619 0 +149 -0.1614713045633039 -0.4365905863225597 0 +150 -0.1969450050558739 -0.134316052712623 0 +151 -0.1879884563173167 -0.1694969484090489 0 +152 -0.1542483262727972 -0.1584453767158801 0 +153 -0.1191024375057585 -0.126584145793513 0 +154 -0.1101458887672013 -0.1617650414899389 0 +155 -0.245122208391427 -0.1990852802994451 0 +156 -0.2024255296083502 -0.2232146043027022 0 +157 -0.4327223233686679 -0.3474179924989559 0 +158 -0.3826930646876592 -0.3014053358417482 0 +159 -0.4499707413189913 -0.2833796236853016 0 +160 -0.2739533741459528 -0.4400767479724264 0 +161 -0.2919795573428247 -0.3727986003001276 0 +162 -0.3474184635404639 -0.4327218523277012 0 +163 -0.08055225762949403 -0.4668366165926022 0 +164 -0.1465543427895629 -0.09913224050963552 0 +165 -0.1738720603914795 -0.3766673342949861 0 +166 -0.206113712120138 -0.4400767479724264 0 +167 -0.1903992278983972 -0.3372910191490107 0 +168 -0.2109216347654706 -0.2736157392731336 0 +169 -0.239036874815387 -0.3164782160689755 0 +170 -0.06278657546292213 -0.3154158821937454 0 +171 -0.1019562610434959 -0.322774887841245 0 +172 -0.09005996725407162 -0.3658221669976198 0 +173 -0.1184834285504136 -0.2833985726952697 0 +174 -0.145756820341563 -0.3338048574991441 0 +175 -0.4327223233686679 -0.4327218523277012 0 +176 -0.4499707413189913 -0.2155399616593846 0 +177 -0.4133287328362865 -0.1835834186848646 0 +178 -0.4633579915172951 -0.1617564133161554 0 +179 -0.250575491544654 -0.03695124146202053 0 +180 -0.2407778462617395 -0.07060839290812981 0 +181 -0.2102023547169285 -0.03365715144610928 0 +182 -0.0373414346261732 -0.2811843015188479 0 +183 -0.02544514083674893 -0.3242315806752227 0 +184 -0.2796327897224498 -0.1477667008899074 0 +185 -0.4633579915172951 -0.1078055158034404 0 +186 -0.4697712249855758 -0.07367102065664388 0 +187 -0.4697712249855758 -0.03076544002402116 0 +188 -0.03764667699663559 -0.4668366165926022 0 +189 -0.2559180590949293 -0.1096350536649164 0 +190 -0.2155449222672038 -0.1063409636490052 0 +191 -0.1537878826913603 -0.2440274073827374 0 +192 -0.434771224985449 -0.03076544002402116 0 +193 -0.06792396742361956 -0.162523413998366 0 +194 -0.03042396742353823 -0.17257150871458 0 +195 -0.03764667699663559 -0.4318366165926889 0 +196 -0.175202354717007 -0.03365715144610928 0 +197 -0.1651542600008928 -0.07115715144601774 0 +198 -0.3442902221719845 -0.1100828886869456 0 +199 -0.3048657137169856 -0.112034130149032 0 +200 -0.320575491544464 -0.07195124146195464 0 +201 -0.3933579915170266 -0.09989993517075177 0 +202 -0.3776482136895482 -0.1399828238578292 0 +203 -0.3997712249853073 -0.06576544002395526 0 +204 -0.3949999999996046 -0.03499999999993411 0 +205 -0.02544514083674893 -0.3942315806751467 0 +206 -0.06309181783338452 -0.3960681972676623 0 +207 -0.1030698561906582 -0.194384644920733 0 +208 -0.1099873233932932 -0.2329974377248383 0 +209 -0.06776540204971143 -0.2337558102332654 0 +210 -0.2855754915445298 -0.03695124146202053 0 +211 -0.03042396742353823 -0.207571508714656 0 +212 -0.0373414346261732 -0.2461843015187613 0 +213 -0.3599999999995211 -0.03499999999993411 0 +214 -0.3249999999995288 -0.03499999999993411 0 +215 -0.02544514083674893 -0.3592315806752443 0 +216 -0.433129216502871 -0.09566537519483881 0 +217 -0.1818047922226842 -0.09528939195583636 0 +218 -0.3125019642098981 -0.3091233204242504 0 +219 0.1224866355280155 -0.1629072024975547 0 +220 0.3808849436885997 -0.210277224031109 0 +221 0.206743501399355 -0.07464099728276744 0 +222 0.3593515291260043 -0.06361416849824304 0 +223 0.2373889375053712 -0.4000946023341276 0 +224 0.05600596672534444 -0.3582026903534058 0 +225 0.3654446467373352 -0.3654437046554016 0 +226 0.07667776057372377 -0.4233233779044261 0 +227 0.4334916324593139 -0.06393052432330396 0 +228 0.07179343033759225 -0.2810845082405963 0 +229 0.06810735186864317 -0.2009476328841135 0 +230 0.1441955258379768 -0.2303966446545607 0 +231 0.2844391541799908 -0.07552818560281363 0 +232 0.1883841865915948 -0.1499536144563917 0 +233 0.2533917520134046 -0.2547236322031965 0 +234 0.2785219510541916 -0.1476215722506409 0 +235 0.1425674588596785 -0.3441671146532657 0 +236 0.3629155847584906 -0.1147592360453619 0 +237 0.1472316548992905 -0.4335170189783639 0 +238 0.4354584321812809 -0.1336982203911391 0 +239 0.1899781981825249 -0.3721308584936966 0 +240 0.1979796054365416 -0.2994453734282311 0 +241 0.2453903447593879 -0.3274091172686621 0 +242 0.1554354110598052 -0.1564304084769732 0 +243 0.1662898562147858 -0.1901751295554762 0 +244 0.1333410806829962 -0.1966519235760577 0 +245 0.1261952230477678 -0.1189536012489036 0 +246 0.09874331776391088 -0.1464055065326662 0 +247 0.2208879693024997 -0.2023386233297941 0 +248 0.1987936389256907 -0.2425601384288786 0 +249 0.1591439985795574 -0.1124768072283221 0 +250 0.2833906089244816 -0.4500473011670638 0 +251 0.3014167921213532 -0.3827691534947646 0 +252 0.3474184635404636 -0.4327218523277008 0 +253 0.4327223233686676 -0.3474179924989554 0 +254 0.3731647952129674 -0.2878604643432553 0 +255 0.4404424718442999 -0.2698347521868091 0 +256 0.3171383478510021 -0.2325004281171527 0 +257 0.2659568515337981 -0.2011726022269187 0 +258 0.3297034473713957 -0.178949398140875 0 +259 0.3207187679063411 -0.1311904041480014 0 +260 0.3719002642235452 -0.1625182300382355 0 +261 0.4327223233686676 -0.4327218523277008 0 +262 0.1704723055956265 -0.466758509489182 0 +263 0.1923102962023309 -0.4168058106562458 0 +264 0.2155509468986668 -0.4500473011670638 0 +265 0.4404424718442999 -0.2019950901608922 0 +266 0.4081716879349403 -0.1719877222111241 0 +267 0.4677292160906404 -0.1637055883409073 0 +268 0.03405367593432158 -0.2104738164421327 0 +269 0.06995039110311771 -0.2410160705623549 0 +270 0.03589671516879613 -0.2505422541203741 0 +271 0.1433814923488277 -0.2872818796539132 0 +272 0.4677292160906404 -0.1097546908281923 0 +273 0.1165214080825037 -0.466758509489182 0 +274 0.2522195770899168 -0.03776409280140682 0 +275 0.2455913277896729 -0.07508459144279053 0 +276 0.213371750699599 -0.03732049864138372 0 +277 0.4344750323202974 -0.09881437235722154 0 +278 0.3991870084698858 -0.1242287282182505 0 +279 0.3982036086089022 -0.08934488018433293 0 +280 0.2334530688228932 -0.1487875933535163 0 +281 0.03833888028686189 -0.461661688952213 0 +282 0.08124446091972032 -0.461661688952213 0 +283 0.4667458162296569 -0.07487084279427469 0 +284 0.4667458162296569 -0.03196526216165198 0 +285 0.10615143885331 -0.2156721387693371 0 +286 0.1079944780877845 -0.2557405764475785 0 +287 0.2814805526170912 -0.1115748789267273 0 +288 0.2426327262267733 -0.1111312847667042 0 +289 0.1783717506996775 -0.03732049864138372 0 +290 0.1683236559834375 -0.07482049864151 0 +291 0.3236773694692406 -0.09514371082408776 0 +292 0.03833888028686189 -0.4266616889522997 0 +293 0.4317458162295301 -0.03196526216165198 0 +294 0.2872195770897927 -0.03776409280140682 0 +295 0.07155367593422471 -0.1654257217259456 0 +296 0.03405367593432158 -0.1754738164420568 0 +297 0.1975638439954749 -0.1122973058695796 0 +298 0.06389969853146835 -0.319643599297001 0 +299 0.1071804445986354 -0.312625811446931 0 +300 0.09928671279251149 -0.3511849025033358 0 +301 0.1096226097167012 -0.3837452462788459 0 +302 0.06634186364953411 -0.3907630341289159 0 +303 0.1448995568794845 -0.3888420668158148 0 +304 0.1119547077365072 -0.428420198441395 0 +305 0.02800298336267222 -0.3941013451767896 0 +306 0.3964215807926591 -0.06377234641077351 0 +307 0.3946757645628752 -0.03180708424912152 0 +308 0.3246757645627995 -0.03180708424912152 0 +309 0.3218953416529975 -0.06957117705052834 0 +310 0.03589671516879613 -0.2855422541204607 0 +311 0.02800298336267222 -0.3241013451768655 0 +312 0.02800298336267222 -0.3591013451768871 0 +313 0.3596757645627918 -0.03180708424912152 0 +314 0.09529699369832934 -0.1819274176908341 0 +315 0.3611335569422474 -0.08918670227180248 0 +316 0.3094181993753699 -0.310083668429299 0 +317 -0.1224866355280155 0.1629072024975547 0 +318 -0.3808849436885997 0.210277224031109 0 +319 -0.206743501399355 0.07464099728276744 0 +320 -0.3593515291260043 0.06361416849824304 0 +321 -0.2373889375053712 0.4000946023341276 0 +322 -0.05600596672534444 0.3582026903534058 0 +323 -0.3654446467373352 0.3654437046554016 0 +324 -0.07667776057372377 0.4233233779044261 0 +325 -0.4334916324593139 0.06393052432330396 0 +326 -0.07179343033759225 0.2810845082405963 0 +327 -0.06810735186864317 0.2009476328841135 0 +328 -0.1441955258379768 0.2303966446545607 0 +329 -0.2844391541799908 0.07552818560281363 0 +330 -0.1883841865915948 0.1499536144563917 0 +331 -0.2533917520134046 0.2547236322031965 0 +332 -0.2785219510541917 0.1476215722506409 0 +333 -0.1425674588596785 0.3441671146532657 0 +334 -0.3629155847584906 0.1147592360453619 0 +335 -0.1472316548992905 0.4335170189783639 0 +336 -0.4354584321812809 0.1336982203911391 0 +337 -0.1899781981825249 0.3721308584936966 0 +338 -0.1979796054365416 0.2994453734282311 0 +339 -0.2453903447593879 0.3274091172686621 0 +340 -0.1554354110598052 0.1564304084769732 0 +341 -0.1662898562147858 0.1901751295554762 0 +342 -0.1333410806829962 0.1966519235760577 0 +343 -0.1261952230477678 0.1189536012489036 0 +344 -0.09874331776391088 0.1464055065326662 0 +345 -0.2208879693024997 0.2023386233297941 0 +346 -0.1987936389256907 0.2425601384288786 0 +347 -0.1591439985795574 0.1124768072283221 0 +348 -0.2833906089244816 0.4500473011670638 0 +349 -0.3014167921213532 0.3827691534947646 0 +350 -0.3474184635404636 0.4327218523277008 0 +351 -0.4327223233686676 0.3474179924989554 0 +352 -0.3731647952129674 0.2878604643432553 0 +353 -0.4404424718442999 0.2698347521868091 0 +354 -0.3171383478510021 0.2325004281171527 0 +355 -0.2659568515337981 0.2011726022269187 0 +356 -0.3297034473713957 0.178949398140875 0 +357 -0.3207187679063411 0.1311904041480014 0 +358 -0.3719002642235452 0.1625182300382355 0 +359 -0.4327223233686676 0.4327218523277008 0 +360 -0.1704723055956265 0.466758509489182 0 +361 -0.1923102962023309 0.4168058106562458 0 +362 -0.2155509468986668 0.4500473011670638 0 +363 -0.4404424718442999 0.2019950901608922 0 +364 -0.4081716879349403 0.1719877222111241 0 +365 -0.4677292160906404 0.1637055883409073 0 +366 -0.03405367593432158 0.2104738164421327 0 +367 -0.06995039110311771 0.2410160705623549 0 +368 -0.03589671516879613 0.2505422541203741 0 +369 -0.1433814923488277 0.2872818796539132 0 +370 -0.4677292160906404 0.1097546908281923 0 +371 -0.1165214080825037 0.466758509489182 0 +372 -0.2522195770899168 0.03776409280140682 0 +373 -0.2455913277896729 0.07508459144279053 0 +374 -0.213371750699599 0.03732049864138372 0 +375 -0.4344750323202974 0.09881437235722154 0 +376 -0.3991870084698858 0.1242287282182505 0 +377 -0.3982036086089022 0.08934488018433293 0 +378 -0.2334530688228932 0.1487875933535163 0 +379 -0.03833888028686189 0.461661688952213 0 +380 -0.08124446091972032 0.461661688952213 0 +381 -0.4667458162296569 0.07487084279427469 0 +382 -0.4667458162296569 0.03196526216165198 0 +383 -0.10615143885331 0.2156721387693371 0 +384 -0.1079944780877845 0.2557405764475785 0 +385 -0.2814805526170913 0.1115748789267273 0 +386 -0.2426327262267734 0.1111312847667042 0 +387 -0.1783717506996775 0.03732049864138372 0 +388 -0.1683236559834375 0.07482049864151 0 +389 -0.3236773694692406 0.09514371082408776 0 +390 -0.03833888028686189 0.4266616889522997 0 +391 -0.4317458162295301 0.03196526216165198 0 +392 -0.2872195770897927 0.03776409280140682 0 +393 -0.07155367593422471 0.1654257217259456 0 +394 -0.03405367593432158 0.1754738164420568 0 +395 -0.1975638439954749 0.1122973058695796 0 +396 -0.06389969853146835 0.319643599297001 0 +397 -0.1071804445986354 0.312625811446931 0 +398 -0.09928671279251149 0.3511849025033358 0 +399 -0.1096226097167012 0.3837452462788459 0 +400 -0.06634186364953411 0.3907630341289159 0 +401 -0.1448995568794845 0.3888420668158148 0 +402 -0.1119547077365072 0.428420198441395 0 +403 -0.02800298336267222 0.3941013451767896 0 +404 -0.3964215807926591 0.06377234641077351 0 +405 -0.3946757645628753 0.03180708424912152 0 +406 -0.3246757645627995 0.03180708424912152 0 +407 -0.3218953416529975 0.06957117705052834 0 +408 -0.03589671516879613 0.2855422541204607 0 +409 -0.02800298336267222 0.3241013451768655 0 +410 -0.02800298336267222 0.3591013451768871 0 +411 -0.3596757645627918 0.03180708424912152 0 +412 -0.09529699369832934 0.1819274176908341 0 +413 -0.3611335569422475 0.08918670227180248 0 +414 -0.3094181993753699 0.310083668429299 0 +415 0.1224866355280155 0.1629072024975547 0 +416 0.3808849436885997 0.210277224031109 0 +417 0.206743501399355 0.07464099728276744 0 +418 0.3593515291260043 0.06361416849824304 0 +419 0.2373889375053712 0.4000946023341276 0 +420 0.05600596672534444 0.3582026903534058 0 +421 0.3654446467373352 0.3654437046554016 0 +422 0.07667776057372377 0.4233233779044261 0 +423 0.4334916324593139 0.06393052432330396 0 +424 0.07179343033759224 0.2810845082405963 0 +425 0.06810735186864313 0.2009476328841135 0 +426 0.1441955258379768 0.2303966446545607 0 +427 0.2844391541799908 0.07552818560281363 0 +428 0.1883841865915948 0.1499536144563917 0 +429 0.2533917520134046 0.2547236322031965 0 +430 0.2785219510541916 0.1476215722506409 0 +431 0.1425674588596785 0.3441671146532657 0 +432 0.3629155847584906 0.1147592360453619 0 +433 0.1472316548992905 0.4335170189783639 0 +434 0.4354584321812809 0.1336982203911391 0 +435 0.1899781981825249 0.3721308584936966 0 +436 0.1979796054365416 0.2994453734282311 0 +437 0.2453903447593879 0.3274091172686621 0 +438 0.1554354110598052 0.1564304084769732 0 +439 0.1662898562147858 0.1901751295554762 0 +440 0.1333410806829962 0.1966519235760577 0 +441 0.1261952230477678 0.1189536012489036 0 +442 0.09874331776391088 0.1464055065326662 0 +443 0.2208879693024997 0.2023386233297941 0 +444 0.1987936389256907 0.2425601384288786 0 +445 0.1591439985795574 0.1124768072283221 0 +446 0.2833906089244816 0.4500473011670638 0 +447 0.3014167921213532 0.3827691534947646 0 +448 0.3474184635404636 0.4327218523277008 0 +449 0.4327223233686676 0.3474179924989554 0 +450 0.3731647952129674 0.2878604643432553 0 +451 0.4404424718442999 0.2698347521868091 0 +452 0.3171383478510021 0.2325004281171527 0 +453 0.2659568515337981 0.2011726022269187 0 +454 0.3297034473713957 0.178949398140875 0 +455 0.3207187679063411 0.1311904041480014 0 +456 0.3719002642235452 0.1625182300382355 0 +457 0.4327223233686676 0.4327218523277008 0 +458 0.1704723055956265 0.466758509489182 0 +459 0.1923102962023309 0.4168058106562458 0 +460 0.2155509468986668 0.4500473011670638 0 +461 0.4404424718442999 0.2019950901608922 0 +462 0.4081716879349403 0.1719877222111241 0 +463 0.4677292160906404 0.1637055883409073 0 +464 0.03405367593432156 0.2104738164421327 0 +465 0.06995039110311768 0.2410160705623549 0 +466 0.03589671516879612 0.2505422541203741 0 +467 0.1433814923488277 0.2872818796539132 0 +468 0.4677292160906404 0.1097546908281923 0 +469 0.1165214080825037 0.466758509489182 0 +470 0.2522195770899168 0.03776409280140682 0 +471 0.2455913277896729 0.07508459144279053 0 +472 0.213371750699599 0.03732049864138372 0 +473 0.4344750323202974 0.09881437235722154 0 +474 0.3991870084698858 0.1242287282182505 0 +475 0.3982036086089022 0.08934488018433294 0 +476 0.2334530688228932 0.1487875933535163 0 +477 0.03833888028686189 0.461661688952213 0 +478 0.08124446091972032 0.461661688952213 0 +479 0.4667458162296569 0.07487084279427469 0 +480 0.4667458162296569 0.03196526216165198 0 +481 0.10615143885331 0.2156721387693371 0 +482 0.1079944780877845 0.2557405764475785 0 +483 0.2814805526170912 0.1115748789267273 0 +484 0.2426327262267733 0.1111312847667042 0 +485 0.1783717506996775 0.03732049864138372 0 +486 0.1683236559834375 0.07482049864151 0 +487 0.3236773694692406 0.09514371082408778 0 +488 0.03833888028686189 0.4266616889522997 0 +489 0.4317458162295301 0.03196526216165198 0 +490 0.2872195770897927 0.03776409280140682 0 +491 0.07155367593422468 0.1654257217259456 0 +492 0.03405367593432156 0.1754738164420567 0 +493 0.1975638439954749 0.1122973058695796 0 +494 0.06389969853146835 0.319643599297001 0 +495 0.1071804445986354 0.312625811446931 0 +496 0.09928671279251149 0.3511849025033358 0 +497 0.1096226097167012 0.3837452462788459 0 +498 0.06634186364953411 0.3907630341289159 0 +499 0.1448995568794845 0.3888420668158148 0 +500 0.1119547077365072 0.428420198441395 0 +501 0.02800298336267222 0.3941013451767896 0 +502 0.3964215807926591 0.06377234641077351 0 +503 0.3946757645628752 0.03180708424912152 0 +504 0.3246757645627995 0.03180708424912152 0 +505 0.3218953416529975 0.06957117705052834 0 +506 0.03589671516879612 0.2855422541204607 0 +507 0.02800298336267222 0.3241013451768655 0 +508 0.02800298336267222 0.3591013451768871 0 +509 0.3596757645627918 0.03180708424912152 0 +510 0.09529699369832932 0.1819274176908341 0 +511 0.3611335569422474 0.08918670227180248 0 +512 0.3094181993753699 0.310083668429299 0 +$EndNodes +$Elements +266 +1 8 2 4 2 2 22 25 +2 8 2 4 2 22 23 26 +3 8 2 4 2 23 24 27 +4 8 2 4 2 24 3 28 +5 8 2 1 3 3 29 32 +6 8 2 1 3 29 30 33 +7 8 2 1 3 30 31 34 +8 8 2 1 3 31 4 35 +9 8 2 2 9 6 50 53 +10 8 2 2 9 50 51 54 +11 8 2 2 9 51 52 55 +12 8 2 2 9 52 7 56 +13 8 2 1 10 7 57 60 +14 8 2 1 10 57 58 61 +15 8 2 1 10 58 59 62 +16 8 2 1 10 59 4 63 +17 8 2 4 15 2 78 81 +18 8 2 4 15 78 79 82 +19 8 2 4 15 79 80 83 +20 8 2 4 15 80 9 84 +21 8 2 3 16 9 85 88 +22 8 2 3 16 85 86 89 +23 8 2 3 16 86 87 90 +24 8 2 3 16 87 10 91 +25 8 2 2 21 6 106 109 +26 8 2 2 21 106 107 110 +27 8 2 2 21 107 108 111 +28 8 2 2 21 108 12 112 +29 8 2 3 22 12 113 116 +30 8 2 3 22 113 114 117 +31 8 2 3 22 114 115 118 +32 8 2 3 22 115 10 119 +33 9 2 11 7 129 139 141 144 145 146 +34 9 2 11 7 30 133 142 147 148 149 +35 9 2 11 7 125 136 138 150 151 152 +36 9 2 11 7 46 125 138 153 152 154 +37 9 2 11 7 136 139 138 155 156 151 +38 9 2 11 7 24 131 129 157 158 159 +39 9 2 11 7 29 126 131 160 161 162 +40 9 2 11 7 30 31 133 34 163 147 +41 9 2 11 7 45 125 46 164 153 48 +42 9 2 11 7 30 142 126 149 165 166 +43 9 2 11 7 126 140 139 167 168 169 +44 9 2 11 7 127 137 142 170 171 172 +45 9 2 11 7 137 140 142 173 174 171 +46 9 2 11 7 3 131 24 175 157 28 +47 9 2 11 7 3 29 131 32 162 175 +48 9 2 11 7 23 129 143 176 177 178 +49 9 2 11 7 23 24 129 27 159 176 +50 9 2 11 7 13 134 135 179 180 181 +51 9 2 11 7 29 30 126 33 166 160 +52 9 2 11 7 38 137 127 182 170 183 +53 9 2 11 7 136 141 139 184 145 155 +54 9 2 11 7 22 23 143 26 178 185 +55 9 2 11 7 126 142 140 165 174 167 +56 9 2 11 7 2 22 132 25 186 187 +57 9 2 11 7 4 133 31 188 163 35 +58 9 2 11 7 134 136 135 189 190 180 +59 9 2 11 7 138 139 140 156 168 191 +60 9 2 11 7 2 132 16 187 192 21 +61 9 2 11 7 5 46 128 49 193 194 +62 9 2 11 7 4 36 133 40 195 188 +63 9 2 11 7 1 135 45 196 197 47 +64 9 2 11 7 130 141 134 198 199 200 +65 9 2 11 7 130 143 141 201 202 198 +66 9 2 11 7 16 132 130 192 203 204 +67 9 2 11 7 36 127 133 205 206 195 +68 9 2 11 7 128 138 137 207 208 209 +69 9 2 11 7 137 138 140 208 191 173 +70 9 2 11 7 134 141 136 199 184 189 +71 9 2 11 7 46 138 128 154 207 193 +72 9 2 11 7 13 14 134 18 210 179 +73 9 2 11 7 5 128 39 194 211 44 +74 9 2 11 7 1 13 135 17 181 196 +75 9 2 11 7 38 39 137 43 212 182 +76 9 2 11 7 14 15 130 19 213 214 +77 9 2 11 7 15 16 130 20 204 213 +78 9 2 11 7 37 38 127 42 183 215 +79 9 2 11 7 36 37 127 41 215 205 +80 9 2 11 7 130 132 143 203 216 201 +81 9 2 11 7 125 135 136 217 190 150 +82 9 2 11 7 129 141 143 146 202 177 +83 9 2 11 7 39 128 137 211 209 212 +84 9 2 11 7 14 130 134 214 200 210 +85 9 2 11 7 22 143 132 185 216 186 +86 9 2 11 7 45 135 125 197 217 164 +87 9 2 11 7 127 142 133 172 148 206 +88 9 2 11 7 126 139 131 169 218 161 +89 9 2 11 7 129 131 139 158 218 144 +90 9 2 11 8 223 235 233 239 240 241 +91 9 2 11 8 219 232 230 242 243 244 +92 9 2 11 8 64 65 219 67 245 246 +93 9 2 11 8 230 232 233 243 247 248 +94 9 2 11 8 65 232 219 249 242 245 +95 9 2 11 8 57 223 225 250 251 252 +96 9 2 11 8 52 225 220 253 254 255 +97 9 2 11 8 220 233 234 256 257 258 +98 9 2 11 8 220 234 236 258 259 260 +99 9 2 11 8 7 225 52 261 253 56 +100 9 2 11 8 7 57 225 60 252 261 +101 9 2 11 8 58 237 223 262 263 264 +102 9 2 11 8 57 58 223 61 264 250 +103 9 2 11 8 51 220 238 265 266 267 +104 9 2 11 8 51 52 220 55 255 265 +105 9 2 11 8 39 229 228 268 269 270 +106 9 2 11 8 230 233 235 248 240 271 +107 9 2 11 8 50 51 238 54 267 272 +108 9 2 11 8 58 59 237 62 273 262 +109 9 2 11 8 69 231 221 274 275 276 +110 9 2 11 8 227 238 236 277 278 279 +111 9 2 11 8 232 234 233 280 257 247 +112 9 2 11 8 4 226 59 281 282 63 +113 9 2 11 8 6 50 227 53 283 284 +114 9 2 11 8 228 229 230 269 285 286 +115 9 2 11 8 221 231 234 275 287 288 +116 9 2 11 8 8 221 65 289 290 68 +117 9 2 11 8 231 236 234 291 259 287 +118 9 2 11 8 4 36 226 40 292 281 +119 9 2 11 8 6 227 72 284 293 77 +120 9 2 11 8 69 70 231 74 294 274 +121 9 2 11 8 5 64 229 66 295 296 +122 9 2 11 8 221 234 232 288 280 297 +123 9 2 11 8 220 236 238 260 278 266 +124 9 2 11 8 224 228 235 298 299 300 +125 9 2 11 8 224 235 226 300 301 302 +126 9 2 11 8 226 235 237 301 303 304 +127 9 2 11 8 36 224 226 305 302 292 +128 9 2 11 8 72 227 222 293 306 307 +129 9 2 11 8 70 222 231 308 309 294 +130 9 2 11 8 8 69 221 73 276 289 +131 9 2 11 8 228 230 235 286 271 299 +132 9 2 11 8 38 39 228 43 270 310 +133 9 2 11 8 65 221 232 290 297 249 +134 9 2 11 8 5 229 39 296 268 44 +135 9 2 11 8 37 38 224 42 311 312 +136 9 2 11 8 36 37 224 41 312 305 +137 9 2 11 8 70 71 222 75 313 308 +138 9 2 11 8 71 72 222 76 307 313 +139 9 2 11 8 219 230 229 244 285 314 +140 9 2 11 8 223 237 235 263 303 239 +141 9 2 11 8 38 228 224 310 298 311 +142 9 2 11 8 222 236 231 315 291 309 +143 9 2 11 8 50 238 227 272 277 283 +144 9 2 11 8 59 226 237 282 304 273 +145 9 2 11 8 64 219 229 246 314 295 +146 9 2 11 8 222 227 236 306 279 315 +147 9 2 11 8 220 225 233 254 316 256 +148 9 2 11 8 223 233 225 241 316 251 +149 9 2 11 14 321 333 331 337 338 339 +150 9 2 11 14 317 330 328 340 341 342 +151 9 2 11 14 101 102 317 104 343 344 +152 9 2 11 14 328 330 331 341 345 346 +153 9 2 11 14 102 330 317 347 340 343 +154 9 2 11 14 85 321 323 348 349 350 +155 9 2 11 14 80 323 318 351 352 353 +156 9 2 11 14 318 331 332 354 355 356 +157 9 2 11 14 318 332 334 356 357 358 +158 9 2 11 14 9 323 80 359 351 84 +159 9 2 11 14 9 85 323 88 350 359 +160 9 2 11 14 86 335 321 360 361 362 +161 9 2 11 14 85 86 321 89 362 348 +162 9 2 11 14 79 318 336 363 364 365 +163 9 2 11 14 79 80 318 83 353 363 +164 9 2 11 14 95 327 326 366 367 368 +165 9 2 11 14 328 331 333 346 338 369 +166 9 2 11 14 78 79 336 82 365 370 +167 9 2 11 14 86 87 335 90 371 360 +168 9 2 11 14 13 329 319 372 373 374 +169 9 2 11 14 325 336 334 375 376 377 +170 9 2 11 14 330 332 331 378 355 345 +171 9 2 11 14 10 324 87 379 380 91 +172 9 2 11 14 2 78 325 81 381 382 +173 9 2 11 14 326 327 328 367 383 384 +174 9 2 11 14 319 329 332 373 385 386 +175 9 2 11 14 1 319 102 387 388 105 +176 9 2 11 14 329 334 332 389 357 385 +177 9 2 11 14 10 92 324 96 390 379 +178 9 2 11 14 2 325 16 382 391 21 +179 9 2 11 14 13 14 329 18 392 372 +180 9 2 11 14 11 101 327 103 393 394 +181 9 2 11 14 319 332 330 386 378 395 +182 9 2 11 14 318 334 336 358 376 364 +183 9 2 11 14 322 326 333 396 397 398 +184 9 2 11 14 322 333 324 398 399 400 +185 9 2 11 14 324 333 335 399 401 402 +186 9 2 11 14 92 322 324 403 400 390 +187 9 2 11 14 16 325 320 391 404 405 +188 9 2 11 14 14 320 329 406 407 392 +189 9 2 11 14 1 13 319 17 374 387 +190 9 2 11 14 326 328 333 384 369 397 +191 9 2 11 14 94 95 326 99 368 408 +192 9 2 11 14 102 319 330 388 395 347 +193 9 2 11 14 11 327 95 394 366 100 +194 9 2 11 14 93 94 322 98 409 410 +195 9 2 11 14 92 93 322 97 410 403 +196 9 2 11 14 14 15 320 19 411 406 +197 9 2 11 14 15 16 320 20 405 411 +198 9 2 11 14 317 328 327 342 383 412 +199 9 2 11 14 321 335 333 361 401 337 +200 9 2 11 14 94 326 322 408 396 409 +201 9 2 11 14 320 334 329 413 389 407 +202 9 2 11 14 78 336 325 370 375 381 +203 9 2 11 14 87 324 335 380 402 371 +204 9 2 11 14 101 317 327 344 412 393 +205 9 2 11 14 320 325 334 404 377 413 +206 9 2 11 14 318 323 331 352 414 354 +207 9 2 11 14 321 331 323 339 414 349 +208 9 2 11 20 419 431 429 435 436 437 +209 9 2 11 20 415 428 426 438 439 440 +210 9 2 11 20 120 121 415 123 441 442 +211 9 2 11 20 426 428 429 439 443 444 +212 9 2 11 20 121 428 415 445 438 441 +213 9 2 11 20 113 419 421 446 447 448 +214 9 2 11 20 108 421 416 449 450 451 +215 9 2 11 20 416 429 430 452 453 454 +216 9 2 11 20 416 430 432 454 455 456 +217 9 2 11 20 12 421 108 457 449 112 +218 9 2 11 20 12 113 421 116 448 457 +219 9 2 11 20 114 433 419 458 459 460 +220 9 2 11 20 113 114 419 117 460 446 +221 9 2 11 20 107 416 434 461 462 463 +222 9 2 11 20 107 108 416 111 451 461 +223 9 2 11 20 95 425 424 464 465 466 +224 9 2 11 20 426 429 431 444 436 467 +225 9 2 11 20 106 107 434 110 463 468 +226 9 2 11 20 114 115 433 118 469 458 +227 9 2 11 20 69 427 417 470 471 472 +228 9 2 11 20 423 434 432 473 474 475 +229 9 2 11 20 428 430 429 476 453 443 +230 9 2 11 20 10 422 115 477 478 119 +231 9 2 11 20 6 106 423 109 479 480 +232 9 2 11 20 424 425 426 465 481 482 +233 9 2 11 20 417 427 430 471 483 484 +234 9 2 11 20 8 417 121 485 486 124 +235 9 2 11 20 427 432 430 487 455 483 +236 9 2 11 20 10 92 422 96 488 477 +237 9 2 11 20 6 423 72 480 489 77 +238 9 2 11 20 69 70 427 74 490 470 +239 9 2 11 20 11 120 425 122 491 492 +240 9 2 11 20 417 430 428 484 476 493 +241 9 2 11 20 416 432 434 456 474 462 +242 9 2 11 20 420 424 431 494 495 496 +243 9 2 11 20 420 431 422 496 497 498 +244 9 2 11 20 422 431 433 497 499 500 +245 9 2 11 20 92 420 422 501 498 488 +246 9 2 11 20 72 423 418 489 502 503 +247 9 2 11 20 70 418 427 504 505 490 +248 9 2 11 20 8 69 417 73 472 485 +249 9 2 11 20 424 426 431 482 467 495 +250 9 2 11 20 94 95 424 99 466 506 +251 9 2 11 20 121 417 428 486 493 445 +252 9 2 11 20 11 425 95 492 464 100 +253 9 2 11 20 93 94 420 98 507 508 +254 9 2 11 20 92 93 420 97 508 501 +255 9 2 11 20 70 71 418 75 509 504 +256 9 2 11 20 71 72 418 76 503 509 +257 9 2 11 20 415 426 425 440 481 510 +258 9 2 11 20 419 433 431 459 499 435 +259 9 2 11 20 94 424 420 506 494 507 +260 9 2 11 20 418 432 427 511 487 505 +261 9 2 11 20 106 434 423 468 473 479 +262 9 2 11 20 115 422 433 478 500 469 +263 9 2 11 20 120 415 425 442 510 491 +264 9 2 11 20 418 423 432 502 475 511 +265 9 2 11 20 416 421 429 450 512 452 +266 9 2 11 20 419 429 421 437 512 447 +$EndElements diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_shiftedBC/model.geo b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_shiftedBC/model.geo new file mode 100644 index 0000000000000000000000000000000000000000..53aaf58a7c3e5bb390202cddd619a49372114450 --- /dev/null +++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_shiftedBC/model.geo @@ -0,0 +1,47 @@ + +mm=1.0; +L=1.*mm; +H = 1*mm; +sl1=0.5*L; +Point(1)={0,0,0,sl1}; +Point(2)={L,0,0,sl1}; +Point(3)={L,H,0,sl1}; +Point(4)={0,H,0,sl1}; +Point(5)={2*L,0,0,sl1}; +Point(6)={2*L,H,0,sl1}; +Line(1)={1,2}; +Line(2)={2,3}; +Line(3)={3,4}; +Line(4)={4,1}; +Line(5)={2,5}; +Line(6)={5,6}; +Line(7)={6,3}; + +l[0]=newreg; +Line Loop(l[0])={1,2,3,4}; +Plane Surface(11)={l[0]}; + +l[1]=newreg; +Line Loop(l[1])={5,6,7,-2}; +Plane Surface(12)={l[1]}; + +Physical Surface(11)={11}; +Physical Point(1)={1}; +Physical Point(2)={2}; +Physical Point(3)={5}; +Physical Point(4)={6}; + +Transfinite Line {4, 2,6} = 2 Using Progression 1; +Transfinite Line {3, 1,5,7} = 2 Using Progression 1; +Transfinite Surface {11, 12}; +Recombine Surface {11,12}; + +Physical Surface(12) = {12}; +Physical Line(1) = {1, 5}; +Physical Line(2) = {6}; +Physical Line(3) = {7,3}; +Physical Line(4) = {4}; +//+ +Translate {0.3, 0, 0} { + Point{3}; +} diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_shiftedBC/model.msh b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_shiftedBC/model.msh new file mode 100644 index 0000000000000000000000000000000000000000..aba0ca64c6428748d97a1abbb98a659e4cd28836 --- /dev/null +++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_shiftedBC/model.msh @@ -0,0 +1,27 @@ +$MeshFormat +2.2 0 8 +$EndMeshFormat +$Nodes +6 +1 0 0 0 +2 1 0 0 +3 1.3 1 0 +4 0 1 0 +5 2 0 0 +6 2 1 0 +$EndNodes +$Elements +12 +1 15 2 1 1 1 +2 15 2 2 2 2 +3 15 2 3 5 5 +4 15 2 4 6 6 +5 1 2 1 1 1 2 +6 1 2 3 3 3 4 +7 1 2 4 4 4 1 +8 1 2 1 5 2 5 +9 1 2 2 6 5 6 +10 1 2 3 7 6 3 +11 3 2 11 11 1 2 3 4 +12 3 2 12 12 2 5 6 3 +$EndElements diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_shiftedBC/model.py b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_shiftedBC/model.py new file mode 100644 index 0000000000000000000000000000000000000000..88b0c000f402c1c1fc0d1d6b1adc112949a99c14 --- /dev/null +++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_shiftedBC/model.py @@ -0,0 +1,209 @@ +#coding-Utf-8-*- +from gmshpy import * +from dG3Dpy import* + +#script to launch PBC problem with a python script + +#DEFINE MICRO PROBLEM + +# micro-material law +lawnum1 = 11 # unique number of law + + +rho = 7850e-9 +young = 28.9e3 +nu = 0.3 +sy0 = 99. +h = young/20. + +harden = LinearExponentialJ2IsotropicHardening(1, sy0, h, 0., 10.) +cl = IsotropicCLengthLaw(1, 1e-2) +damlaw = SimpleSaturateDamageLaw(1, 50.,1.,0.,1.) +law1 = NonLocalDamageJ2HyperDG3DMaterialLaw(lawnum1,rho,young,nu,harden,cl,damlaw) + + +micromeshfile="micro.msh" # name of mesh file +#micromeshfile="square.msh" # name of mesh file + +# creation of part Domain +nfield = 11 # number of the field (physical number of entity) +myfield1 = nonLocalDamageDG3DDomain(1000,nfield,0,lawnum1,0,1e3,2,1) + +microBC = nonLinearPeriodicBC(1000,2) +microBC.setOrder(1) +microBC.setBCPhysical(1,4,3,2) +# periodiodic BC +method = 1 # Periodic mesh = 0 Langrange interpolation = 1 Cubic spline interpolation =2 +degree = 5 +addvertex = False +microBC.setPeriodicBCOptions(method, degree,addvertex) +microBC.setShiftedBC(True) # shifted BC at interface only + +# DEFINE MACROPROBLEM +matnum1 = 1; +macromat1 = dG3DMultiscaleMaterialLaw(matnum1, 1000) +macromat1.loadModel(micromeshfile); +macromat1.addDomain(myfield1) +macromat1.addMaterialLaw(law1); +macromat1.setPeriodicity(1.,0,0,"x") +macromat1.setPeriodicity(0,1.,0,"y") +macromat1.setPeriodicity(0,0,1.,"z") +macromat1.addMicroBC(microBC) + +macromat1.setNumStep(3) +macromat1.setTolerance(1e-6,1e-10) +macromat1.setSystemType(1) +macromat1.Solver(2) +#for i in range(0,1): +macromat1.setViewAllMicroProblems(True,0) + +macromat1.setBlockDamageAfterFailureOnset(True) + +macromat1.Scheme(1) +macromat1.setSameStateCriterion(1e-16) +macromat1.stressAveragingFlag(True) # set stress averaging ON- 0 , OFF-1 +macromat1.setStressAveragingMethod(0) +macromat1.tangentAveragingFlag(True) # set tangent averaging ON -0, OFF -1 +macromat1.setTangentAveragingMethod(2,1e-6); + +macromat1.internalPointBuildView("Green-Lagrange_xx",IPField.STRAIN_XX); +macromat1.internalPointBuildView("Green-Lagrange_yy",IPField.STRAIN_YY); +macromat1.internalPointBuildView("Green-Lagrange_xy",IPField.STRAIN_XY); +macromat1.internalPointBuildView("Green-Lagrange_zz",IPField.STRAIN_ZZ); +macromat1.internalPointBuildView("Green-Lagrange_yz",IPField.STRAIN_YZ); +macromat1.internalPointBuildView("Green-Lagrange_xz",IPField.STRAIN_XZ); +macromat1.internalPointBuildView("sig_xx",IPField.SIG_XX); +macromat1.internalPointBuildView("sig_yy",IPField.SIG_YY); +macromat1.internalPointBuildView("sig_xy",IPField.SIG_XY); +macromat1.internalPointBuildView("sig_xz",IPField.SIG_XZ); +macromat1.internalPointBuildView("sig_zz",IPField.SIG_ZZ); +macromat1.internalPointBuildView("sig_yz",IPField.SIG_YZ); +macromat1.internalPointBuildView("sig_VM",IPField.SVM); + +macromat1.internalPointBuildView("F_xx",IPField.F_XX); +macromat1.internalPointBuildView("F_yy",IPField.F_YY); +macromat1.internalPointBuildView("F_xy",IPField.F_XY); +macromat1.internalPointBuildView("F_yx",IPField.F_YX); + +macromat1.internalPointBuildView("P_xx",IPField.P_XX); +macromat1.internalPointBuildView("P_yy",IPField.P_YY); +macromat1.internalPointBuildView("P_xy",IPField.P_XY); +macromat1.internalPointBuildView("P_yx",IPField.P_YX); + +macromat1.internalPointBuildView("Equivalent plastic strain",IPField.PLASTICSTRAIN); +macromat1.internalPointBuildView("Damage",IPField.DAMAGE); + +macromat1.dirichletBC("Face",11,2,0.) + + +lcohNum = 13 +lawCoh = dG3DMultiscaleCohesiveLaw(lcohNum,0.7) +lawCoh.setCharacteristicLength(1.) +lawCoh.setLostSolutionUniquenssTolerance(0.) +#lawCoh.setRotationOfRVEFollowingInterfaceLocalBasis(True) + +macromeshfile="model.msh" # name of mesh file + +# solver +sol = 2 # Gmm=0 (default) Taucs=1 PETsc=2 +soltype =1 # StaticLinear=0 (default) StaticNonLinear=1 +nstep = 100 # number of step (used only if soltype=1) +ftime =1. # Final time (used only if soltype=1) +tol=1.e-5 # 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 macro part Domain + +dim =2 +beta1 = 50; +fullDG = False; + +averageStrainBased = True + +# non DG domain +nfield1 = 11 +macrodomain1 = dG3DDomain(10,nfield1,0,matnum1,fullDG,dim) +macrodomain1.stabilityParameters(beta1) +macrodomain1.setDistributedOtherRanks(True) +macrodomain1.distributeOnRootRank(False) + +nfield2 = 12 +macrodomain2 = dG3DDomain(11,nfield2,0,matnum1,fullDG,dim) +macrodomain2.stabilityParameters(beta1) +macrodomain2.setDistributedOtherRanks(True) +macrodomain2.distributeOnRootRank(False) + +# interface domain +beta1 = 100; +interdomain1 = interDomainBetween3D(12,macrodomain1,macrodomain2,lcohNum,matnum1) +interdomain1.stabilityParameters(beta1) +interdomain1.averageStrainBased(averageStrainBased) +interdomain1.setDistributedOtherRanks(True) +interdomain1.distributeOnRootRank(False) + +# creation of Solver +mysolver = nonLinearMechSolver(1000) +mysolver.loadModel(macromeshfile) +mysolver.addDomain(macrodomain1) +mysolver.addDomain(macrodomain2) +mysolver.addDomain(interdomain1) +mysolver.addMaterialLaw(macromat1) + +mysolver.addMaterialLaw(lawCoh) +mysolver.setMultiscaleFlag(True) +mysolver.Scheme(soltype) +mysolver.Solver(sol) +mysolver.snlData(nstep,ftime,tol) +mysolver.options("-ksp_type preonly -pc_type lu -pc_factor_shift_type NONZERO -pc_factor_mat_solver_package petsc") + + +# boundary condition +mysolver.displacementBC("Face",11,2,0.0) +mysolver.displacementBC("Face",12,2,0.0) + +mysolver.displacementBC("Face",11,1,0.0) +mysolver.displacementBC("Face",12,1,0.0) + + +mysolver.displacementBC("Edge",1,1,0.0) +mysolver.displacementBC("Edge",2,0,0.02) +mysolver.displacementBC("Edge",4,0,0.0) + + +# archivage +mysolver.internalPointBuildView("Green-Lagrange_xx",IPField.STRAIN_XX, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_yy",IPField.STRAIN_YY, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_zz",IPField.STRAIN_ZZ, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_xy",IPField.STRAIN_XY, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_yz",IPField.STRAIN_YZ, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_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("Green-Lagrange equivalent strain",IPField.GL_EQUIVALENT_STRAIN, 1, 1); +mysolver.internalPointBuildView("Equivalent plastic strain",IPField.PLASTICSTRAIN, 1, 1); +mysolver.internalPointBuildView("Damage",IPField.DAMAGE,1,1); + +mysolver.archivingForceOnPhysicalGroup("Edge",4,0) + +mysolver.archivingInterfaceElementIP(11,12,IPField.DISP_JUMP_X,4,0,1) +mysolver.archivingInterfaceElementIP(11,12,IPField.DISP_JUMP_Y,4,0,1) + +mysolver.archivingInterfaceElementIP(11,12,IPField.COHESIVE_JUMP_X,4,0,1) +mysolver.archivingInterfaceElementIP(11,12,IPField.COHESIVE_JUMP_Y,4,0,1) + +mysolver.archivingInterfaceElementIP(11,12,IPField.INCOMPATIBLE_STRAIN_X,4,0,1) +mysolver.archivingInterfaceElementIP(11,12,IPField.INCOMPATIBLE_STRAIN_Y,4,0,1) + + +# solve +mysolver.solve() + +check = TestCheck() +check.equal(-2.226306e+01,mysolver.getArchivedForceOnPhysicalGroup("Edge", 4, 0),1.e-4) + diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_mixedMode/model.py b/dG3D/benchmarks/multiscaleCohesiveTest2D_mixedMode/model.py index d14fe05c0b4848cd1fe4dde4d64049c3ced32222..f0c9bb508531c950eb19bfbe11e84741cd33b674 100644 --- a/dG3D/benchmarks/multiscaleCohesiveTest2D_mixedMode/model.py +++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_mixedMode/model.py @@ -31,7 +31,7 @@ myfield1 = nonLocalDamageDG3DDomain(1000,nfield,0,lawnum1,0,1e3,2,1) microBC = nonLinearPeriodicBC(1000,2) microBC.setOrder(1) -microBC.setBCPhysical(1,2,3,4) +microBC.setBCPhysical(1,4,3,2) # periodiodic BC method = 0 # Periodic mesh = 0 Langrange interpolation = 1 Cubic spline interpolation =2 degree = 5 @@ -99,7 +99,6 @@ macromat1.dirichletBC("Face",11,2,0.) lcohNum = 13 lawCoh = TwoFieldMultiscaleCohesive3DLaw(lcohNum,0.7) lawCoh.setCharacteristicLength(1.) -lawCoh.setExtractCohesiveLawFromMicroDamage(True) lawCoh.setLostSolutionUniquenssTolerance(0.05) macromeshfile="model.msh" # name of mesh file @@ -167,8 +166,8 @@ mysolver.displacementBC("Face",12,2,0.0) #mysolver.displacementBC("Face",11,1,0.0) #mysolver.displacementBC("Face",12,1,0.0) -mysolver.periodicBC("Edge",1,3,0) -mysolver.periodicBC("Edge",1,3,1) +mysolver.periodicBC("Edge",1,3,1,4,0) +mysolver.periodicBC("Edge",1,3,1,4,1) #mysolver.displacementBC("Edge",1,1,0.0) #mysolver.displacementBC("Edge",3,1,0.01) @@ -202,5 +201,5 @@ mysolver.archivingForceOnPhysicalGroup("Edge",4,0) mysolver.solve() check = TestCheck() -check.equal(-2.565563e+01,mysolver.getArchivedForceOnPhysicalGroup("Edge", 4, 0),1.e-3) +check.equal(-2.565628e+01,mysolver.getArchivedForceOnPhysicalGroup("Edge", 4, 0),1.e-3) diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_tangentByPert/model.py b/dG3D/benchmarks/multiscaleCohesiveTest2D_tangentByPert/model.py index 7a41fcd10f56d5bf0f3b5c65b9889b433fc2ae50..f334e5d25f598a8a94be3c3526eb6b97cf80ffc6 100644 --- a/dG3D/benchmarks/multiscaleCohesiveTest2D_tangentByPert/model.py +++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_tangentByPert/model.py @@ -31,7 +31,7 @@ myfield1 = nonLocalDamageDG3DDomain(1000,nfield,0,lawnum1,0,1e3,2,1) microBC = nonLinearPeriodicBC(1000,2) microBC.setOrder(1) -microBC.setBCPhysical(1,2,3,4) +microBC.setBCPhysical(1,4,3,2) # periodiodic BC method = 0 # Periodic mesh = 0 Langrange interpolation = 1 Cubic spline interpolation =2 degree = 5 @@ -98,7 +98,6 @@ macromat1.dirichletBC("Face",11,2,0.) lcohNum = 13 lawCoh = TwoFieldMultiscaleCohesive3DLaw(lcohNum,0.7) lawCoh.setCharacteristicLength(1.) -lawCoh.setExtractCohesiveLawFromMicroDamage(True) lawCoh.setLostSolutionUniquenssTolerance(0.9) macromeshfile="model.msh" # name of mesh file diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_unloading/model.py b/dG3D/benchmarks/multiscaleCohesiveTest2D_unloading/model.py index 24a58dfade722417dbf648ef0471ec3e19bcbb87..c5a9e4c9451f82b63658f3ab775cc2c57713de57 100644 --- a/dG3D/benchmarks/multiscaleCohesiveTest2D_unloading/model.py +++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_unloading/model.py @@ -31,7 +31,7 @@ myfield1 = nonLocalDamageDG3DDomain(1000,nfield,0,lawnum1,0,1e3,2,1) microBC = nonLinearPeriodicBC(1000,2) microBC.setOrder(1) -microBC.setBCPhysical(1,2,3,4) +microBC.setBCPhysical(1,4,3,2) # periodiodic BC method = 0 # Periodic mesh = 0 Langrange interpolation = 1 Cubic spline interpolation =2 degree = 5 @@ -99,7 +99,6 @@ macromat1.dirichletBC("Face",11,2,0.) lcohNum = 13 lawCoh = TwoFieldMultiscaleCohesive3DLaw(lcohNum,0.7) lawCoh.setCharacteristicLength(1.) -lawCoh.setExtractCohesiveLawFromMicroDamage(True) lawCoh.setLostSolutionUniquenssTolerance(0.9) lawCoh.setLocationForStressExtraction(0) diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_unloadingElastic/model.py b/dG3D/benchmarks/multiscaleCohesiveTest2D_unloadingElastic/model.py index 12158929d6f62f0245a3c036539ad42713cc6e0b..7be901a9eab9100dc18e8062ac03f07eb7958f68 100644 --- a/dG3D/benchmarks/multiscaleCohesiveTest2D_unloadingElastic/model.py +++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_unloadingElastic/model.py @@ -34,7 +34,7 @@ myfield1.nonLocalStabilityParameters(1e2,True) # periodiodic BC microBC = nonLinearPeriodicBC(1000,2) microBC.setOrder(1) -microBC.setBCPhysical(1,2,3,4) +microBC.setBCPhysical(1,4,3,2) # periodiodic BC method = 0 # Periodic mesh = 0 Langrange interpolation = 1 Cubic spline interpolation =2 degree = 5 @@ -102,7 +102,6 @@ macromat1.dirichletBC("Face",11,2,0.) lcohNum = 13 lawCoh = TwoFieldMultiscaleCohesive3DLaw(lcohNum,0.7) lawCoh.setCharacteristicLength(1.) -lawCoh.setExtractCohesiveLawFromMicroDamage(True) lawCoh.setLostSolutionUniquenssTolerance(0.95) macromeshfile="model.msh" # name of mesh file diff --git a/dG3D/benchmarks/multiscaleEnforceCrackPath/model.py b/dG3D/benchmarks/multiscaleEnforceCrackPath/model.py index 873ff6c3da9f0dc6e86fd065620f8fb67523a1b2..a6ba395b3dd4f1b7f7a21ce9f6d187a166ba80a8 100644 --- a/dG3D/benchmarks/multiscaleEnforceCrackPath/model.py +++ b/dG3D/benchmarks/multiscaleEnforceCrackPath/model.py @@ -30,7 +30,7 @@ myfield2 = nonLocalDamageDG3DDomain(10,12,0,12,0,EqRatio,2,1) microBC = nonLinearPeriodicBC(1000,2) microBC.setOrder(1) -microBC.setBCPhysical(1,2,3,4) +microBC.setBCPhysical(1,4,3,2) # periodiodic BC method = 0 # Periodic mesh = 0 Langrange interpolation = 1 Cubic spline interpolation =2 degree = 5 diff --git a/dG3D/benchmarks/multiscaleEnhanceStrain/model.py b/dG3D/benchmarks/multiscaleEnhanceStrain/model.py index 7cc8176a7177e50eaa45d0c24f51d96433775170..45f1903316f53e77aa7de33c4e2004a389a64d16 100644 --- a/dG3D/benchmarks/multiscaleEnhanceStrain/model.py +++ b/dG3D/benchmarks/multiscaleEnhanceStrain/model.py @@ -37,7 +37,7 @@ myfield1 = nonLocalDamageDG3DDomain(1000,nfield,0,lawnum1,0,1e3,2,1) microBC = nonLinearPeriodicBC(1000,2) microBC.setOrder(1) -microBC.setBCPhysical(1,2,3,4) +microBC.setBCPhysical(1,4,3,2) # periodiodic BC method = 0 # Periodic mesh = 0 Langrange interpolation = 1 Cubic spline interpolation =2 degree = 5 @@ -69,6 +69,7 @@ macromat1.Solver(2) macromat1.setViewAllMicroProblems(True,0) macromat1.setLostSolutionUniquenssTolerance(0.) +macromat1.setCharacteristicLength(1,0.7) macromat1.Scheme(1) macromat1.setSameStateCriterion(1e-16) @@ -146,6 +147,7 @@ mysolver.displacementBC("Edge",1,1,0.0) mysolver.displacementBC("Edge",2,0,0.04) mysolver.displacementBC("Edge",4,0,0.0) +mysolver.options("-ksp_type preonly -pc_type lu -pc_factor_mat_solver_package petsc -pc_factor_shift_type NONZERO") # archivage mysolver.internalPointBuildView("Green-Lagrange_xx",IPField.STRAIN_XX, 1, 1); @@ -183,5 +185,5 @@ mysolver.archivingForceOnPhysicalGroup("Edge",4,0) mysolver.solve() check = TestCheck() -check.equal(-8.943046e+00,mysolver.getArchivedForceOnPhysicalGroup("Edge", 4, 0),1.e-4) +check.equal(-3.988271e+01,mysolver.getArchivedForceOnPhysicalGroup("Edge", 4, 0),1.e-4) diff --git a/dG3D/benchmarks/nonLinearMixedBC_2D/CMakeLists.txt b/dG3D/benchmarks/nonLinearMixedBC_2D/CMakeLists.txt index 689506adade2a1900accc0c3a4e3ea99cb915545..80f072bb65ce022a9c558683c7d80db4a603143f 100644 --- a/dG3D/benchmarks/nonLinearMixedBC_2D/CMakeLists.txt +++ b/dG3D/benchmarks/nonLinearMixedBC_2D/CMakeLists.txt @@ -3,7 +3,6 @@ set(PYFILE idealHole_mixBC.py) set(FILES2DELETE - idealHole.msh E_0_GP_0_out.txt E_0_GP_0_disp.msh E_0_GP_0_stress.msh diff --git a/dG3D/benchmarks/nonLinearMixedBC_2D/idealHole.msh b/dG3D/benchmarks/nonLinearMixedBC_2D/idealHole.msh deleted file mode 100644 index c0af9112317192d97826ea8c5c1f5290694e70f5..0000000000000000000000000000000000000000 --- a/dG3D/benchmarks/nonLinearMixedBC_2D/idealHole.msh +++ /dev/null @@ -1,1910 +0,0 @@ -$MeshFormat -3 0 8 -$EndMeshFormat -$Entities -9 8 1 0 -1 1 1 -2 1 2 -3 1 3 -4 1 4 -5 0 -6 0 -7 0 -8 0 -9 0 -1 2 1 2 1 1 -2 2 2 3 1 2 -3 2 3 4 1 3 -4 2 4 1 1 4 -5 2 5 6 0 -6 2 6 7 0 -7 2 7 8 0 -8 2 8 5 0 -11 8 1 2 3 4 8 7 6 5 1 11 -$EndEntities -$Nodes -1244 -1 -0.5 -0.5 0 0 -2 0.5 -0.5 0 0 -3 0.5 0.5 0 0 -4 -0.5 0.5 0 0 -5 -0.3 0 0 0 -6 0 0.3 0 0 -7 0.3 0 0 0 -8 0 -0.3 0 0 -10 -0.4333333333335185 -0.5 0 0 -11 -0.3666666666670372 -0.5 0 0 -12 -0.3000000000005556 -0.5 0 0 -13 -0.233333333334074 -0.5 0 0 -14 -0.1666666666675924 -0.5 0 0 -15 -0.1000000000011109 -0.5 0 0 -16 -0.0333333333346294 -0.5 0 0 -17 0.03333333333203714 -0.5 0 0 -18 0.09999999999888864 -0.5 0 0 -19 0.1666666666657406 -0.5 0 0 -20 0.2333333333325924 -0.5 0 0 -21 0.2999999999994443 -0.5 0 0 -22 0.3666666666662962 -0.5 0 0 -23 0.4333333333331481 -0.5 0 0 -338 -0.4666666666667362 -0.5 0 0 -339 -0.4000000000002779 -0.5 0 0 -340 -0.3333333333337964 -0.5 0 0 -341 -0.2666666666673148 -0.5 0 0 -342 -0.2000000000008332 -0.5 0 0 -343 -0.1333333333343517 -0.5 0 0 -344 -0.06666666666787019 -0.5 0 0 -345 -1.388611448049915e-12 -0.5 0 0 -346 0.06666666666546295 -0.5 0 0 -347 0.1333333333323146 -0.5 0 0 -348 0.1999999999991665 -0.5 0 0 -349 0.2666666666660183 -0.5 0 0 -350 0.3333333333328703 -0.5 0 0 -351 0.3999999999997221 -0.5 0 0 -352 0.466666666666574 -0.5 0 0 -24 0.5 -0.4333333333335185 0 0 -25 0.5 -0.3666666666670372 0 0 -26 0.5 -0.3000000000005556 0 0 -27 0.5 -0.233333333334074 0 0 -28 0.5 -0.1666666666675924 0 0 -29 0.5 -0.1000000000011109 0 0 -30 0.5 -0.0333333333346294 0 0 -31 0.5 0.03333333333203714 0 0 -32 0.5 0.09999999999888864 0 0 -33 0.5 0.1666666666657406 0 0 -34 0.5 0.2333333333325924 0 0 -35 0.5 0.2999999999994443 0 0 -36 0.5 0.3666666666662962 0 0 -37 0.5 0.4333333333331481 0 0 -353 0.5 -0.4666666666667362 0 0 -354 0.5 -0.4000000000002779 0 0 -355 0.5 -0.3333333333337964 0 0 -356 0.5 -0.2666666666673148 0 0 -357 0.5 -0.2000000000008332 0 0 -358 0.5 -0.1333333333343517 0 0 -359 0.5 -0.06666666666787019 0 0 -360 0.5 -1.388611448049915e-12 0 0 -361 0.5 0.06666666666546295 0 0 -362 0.5 0.1333333333323146 0 0 -363 0.5 0.1999999999991665 0 0 -364 0.5 0.2666666666660183 0 0 -365 0.5 0.3333333333328703 0 0 -366 0.5 0.3999999999997221 0 0 -367 0.5 0.466666666666574 0 0 -38 0.4333333333335185 0.5 0 0 -39 0.3666666666670372 0.5 0 0 -40 0.3000000000005556 0.5 0 0 -41 0.233333333334074 0.5 0 0 -42 0.1666666666675924 0.5 0 0 -43 0.1000000000011109 0.5 0 0 -44 0.0333333333346294 0.5 0 0 -45 -0.03333333333203714 0.5 0 0 -46 -0.09999999999888864 0.5 0 0 -47 -0.1666666666657406 0.5 0 0 -48 -0.2333333333325924 0.5 0 0 -49 -0.2999999999994443 0.5 0 0 -50 -0.3666666666662962 0.5 0 0 -51 -0.4333333333331481 0.5 0 0 -368 0.4666666666667362 0.5 0 0 -369 0.4000000000002779 0.5 0 0 -370 0.3333333333337964 0.5 0 0 -371 0.2666666666673148 0.5 0 0 -372 0.2000000000008332 0.5 0 0 -373 0.1333333333343517 0.5 0 0 -374 0.06666666666787019 0.5 0 0 -375 1.388611448049915e-12 0.5 0 0 -376 -0.06666666666546295 0.5 0 0 -377 -0.1333333333323146 0.5 0 0 -378 -0.1999999999991665 0.5 0 0 -379 -0.2666666666660183 0.5 0 0 -380 -0.3333333333328703 0.5 0 0 -381 -0.3999999999997221 0.5 0 0 -382 -0.466666666666574 0.5 0 0 -52 -0.5 0.4333333333335185 0 0 -53 -0.5 0.3666666666670372 0 0 -54 -0.5 0.3000000000005556 0 0 -55 -0.5 0.233333333334074 0 0 -56 -0.5 0.1666666666675924 0 0 -57 -0.5 0.1000000000011109 0 0 -58 -0.5 0.0333333333346294 0 0 -59 -0.5 -0.03333333333203714 0 0 -60 -0.5 -0.09999999999888864 0 0 -61 -0.5 -0.1666666666657406 0 0 -62 -0.5 -0.2333333333325924 0 0 -63 -0.5 -0.2999999999994443 0 0 -64 -0.5 -0.3666666666662962 0 0 -65 -0.5 -0.4333333333331481 0 0 -383 -0.5 0.4666666666667362 0 0 -384 -0.5 0.4000000000002779 0 0 -385 -0.5 0.3333333333337964 0 0 -386 -0.5 0.2666666666673148 0 0 -387 -0.5 0.2000000000008332 0 0 -388 -0.5 0.1333333333343517 0 0 -389 -0.5 0.06666666666787019 0 0 -390 -0.5 1.388611448049915e-12 0 0 -391 -0.5 -0.06666666666546295 0 0 -392 -0.5 -0.1333333333323146 0 0 -393 -0.5 -0.1999999999991665 0 0 -394 -0.5 -0.2666666666660183 0 0 -395 -0.5 -0.3333333333328703 0 0 -396 -0.5 -0.3999999999997221 0 0 -397 -0.5 -0.466666666666574 0 0 -66 -0.2963065021785618 0.04693033951193976 0 0 -67 -0.2853169548886216 0.09270509831225152 0 0 -68 -0.2673019572566858 0.1361971499215198 0 0 -69 -0.2427050983127755 0.1763355756873411 0 0 -70 -0.2121320343563539 0.2121320343555746 0 0 -71 -0.1763355756880876 0.2427050983122331 0 0 -72 -0.1361971499221597 0.2673019572563597 0 0 -73 -0.09270509831268438 0.285316954888481 0 0 -74 -0.04693033951214172 0.2963065021785298 0 0 -398 -0.2990752001199439 0.02353772871828358 0 0 -399 -0.2917109761193448 0.07003360915659761 0 0 -400 -0.277163859753509 0.11480502970923 0 0 -401 -0.2557920493064547 0.1567495694144141 0 0 -402 -0.2281217896803501 0.194834414498656 0 0 -403 -0.194834414499431 0.2281217896796882 0 0 -404 -0.1567495694151313 0.2557920493060153 0 0 -405 -0.1148050297097722 0.2771638597532844 0 0 -406 -0.07003360915691879 0.2917109761192677 0 0 -407 -0.02353772871838557 0.2990752001199358 0 0 -75 0.04693033951193831 0.2963065021785621 0 0 -76 0.09270509831225777 0.2853169548886197 0 0 -77 0.1361971499215386 0.2673019572566762 0 0 -78 0.1763355756873479 0.2427050983127706 0 0 -79 0.2121320343555504 0.2121320343563781 0 0 -80 0.2427050983122078 0.1763355756881225 0 0 -81 0.2673019572563631 0.1361971499221531 0 0 -82 0.2853169548884814 0.09270509831268338 0 0 -83 0.2963065021785298 0.04693033951214185 0 0 -408 0.02353772871828261 0.299075200119944 0 0 -409 0.07003360915660113 0.2917109761193439 0 0 -410 0.1148050297092418 0.2771638597535042 0 0 -411 0.1567495694144169 0.2557920493064531 0 0 -412 0.1948344144986518 0.2281217896803538 0 0 -413 0.2281217896796723 0.1948344144994497 0 0 -414 0.25579204930602 0.1567495694151236 0 0 -415 0.2771638597532806 0.1148050297097817 0 0 -416 0.2917109761192712 0.07003360915690404 0 0 -417 0.2990752001199352 0.02353772871839455 0 0 -84 0.2963065021785621 -0.04693033951193831 0 0 -85 0.2853169548886197 -0.09270509831225777 0 0 -86 0.2673019572566762 -0.1361971499215386 0 0 -87 0.2427050983127706 -0.1763355756873479 0 0 -88 0.2121320343563781 -0.2121320343555504 0 0 -89 0.1763355756881225 -0.2427050983122078 0 0 -90 0.1361971499221531 -0.2673019572563631 0 0 -91 0.09270509831268338 -0.2853169548884814 0 0 -92 0.04693033951214185 -0.2963065021785298 0 0 -418 0.299075200119944 -0.02353772871828261 0 0 -419 0.2917109761193439 -0.07003360915660113 0 0 -420 0.2771638597535042 -0.1148050297092418 0 0 -421 0.2557920493064531 -0.1567495694144169 0 0 -422 0.2281217896803538 -0.1948344144986518 0 0 -423 0.1948344144994497 -0.2281217896796723 0 0 -424 0.1567495694151236 -0.25579204930602 0 0 -425 0.1148050297097817 -0.2771638597532806 0 0 -426 0.07003360915690404 -0.2917109761192712 0 0 -427 0.02353772871839455 -0.2990752001199352 0 0 -93 -0.04693033951193976 -0.2963065021785618 0 0 -94 -0.09270509831225152 -0.2853169548886216 0 0 -95 -0.1361971499215198 -0.2673019572566858 0 0 -96 -0.1763355756873411 -0.2427050983127755 0 0 -97 -0.2121320343555746 -0.2121320343563539 0 0 -98 -0.2427050983122331 -0.1763355756880876 0 0 -99 -0.2673019572563597 -0.1361971499221597 0 0 -100 -0.285316954888481 -0.09270509831268438 0 0 -101 -0.2963065021785298 -0.04693033951214172 0 0 -428 -0.02353772871828358 -0.2990752001199439 0 0 -429 -0.07003360915659761 -0.2917109761193448 0 0 -430 -0.11480502970923 -0.277163859753509 0 0 -431 -0.1567495694144141 -0.2557920493064547 0 0 -432 -0.194834414498656 -0.2281217896803501 0 0 -433 -0.2281217896796882 -0.194834414499431 0 0 -434 -0.2557920493060153 -0.1567495694151313 0 0 -435 -0.2771638597532844 -0.1148050297097722 0 0 -436 -0.2917109761192677 -0.07003360915691879 0 0 -437 -0.2990752001199358 -0.02353772871838557 0 0 -102 0.2976128756863607 0.3438233958265596 0 0 -103 0.3438233958265599 -0.2976128756863605 0 0 -104 -0.3438233958265542 0.2976128756863772 0 0 -105 -0.2976128756863773 -0.3438233958265542 0 0 -106 -0.3658199316021812 -0.2357183067822589 0 0 -107 -0.2357183067822588 0.3658199316021811 0 0 -108 0.2357183067822882 -0.3658199316021781 0 0 -109 0.3658199316021781 0.235718306782288 0 0 -110 -0.3869893628278939 0.1593082504507001 0 0 -111 -0.1593082504507002 -0.3869893628278938 0 0 -112 0.1593082504507105 0.3869893628278935 0 0 -113 0.3869893628278936 -0.1593082504507103 0 0 -114 0.09260554770520583 -0.4050229820193118 0 0 -115 0.4050229820193117 0.09260554770520572 0 0 -116 -0.09260554770520212 0.4050229820193072 0 0 -117 -0.4050229820193072 -0.09260554770520246 0 0 -118 0.03274250429275821 0.4061698672533651 0 0 -119 0.4061698672533651 -0.03274250429275841 0 0 -120 -0.406169867253365 0.03274250429275905 0 0 -121 -0.03274250429275914 -0.406169867253365 0 0 -122 0.3193413284160062 -0.3944650720776799 0 0 -123 0.39446507207768 0.319341328416006 0 0 -124 -0.3193413284159798 0.3944650720776839 0 0 -125 -0.3944650720776841 -0.31934132841598 0 0 -126 0.2472286174155229 -0.2853673567695257 0 0 -127 0.2853673567695257 0.2472286174155228 0 0 -128 -0.2853673567695424 -0.2472286174154936 0 0 -129 -0.2472286174154935 0.2853673567695423 0 0 -130 0.3185917792774567 -0.2136535511359512 0 0 -131 0.2136535511359514 0.3185917792774567 0 0 -132 -0.213653551135953 -0.3185917792774673 0 0 -133 -0.3185917792774673 0.2136535511359528 0 0 -134 0.351416271885539 0.4082299730693547 0 0 -135 0.4082299730693548 -0.351416271885539 0 0 -136 -0.4082299730693374 0.3514162718855596 0 0 -137 -0.3514162718855597 -0.4082299730693375 0 0 -138 -0.4130504522170933 0.2403157457767974 0 0 -139 -0.2403157457767976 -0.4130504522170934 0 0 -140 0.2403157457767989 0.413050452217104 0 0 -141 0.4130504522171042 -0.2403157457767984 0 0 -142 -0.1521594365015742 0.3423514592071319 0 0 -143 -0.342351459207132 -0.1521594365015745 0 0 -144 0.1521594365015861 -0.3423514592071376 0 0 -145 0.3423514592071374 0.152159436501586 0 0 -146 0.1671041200147039 -0.4179513459738288 0 0 -147 0.4179513459738285 0.1671041200147037 0 0 -148 -0.1671041200146819 0.417951345973791 0 0 -149 -0.4179513459737911 -0.1671041200146822 0 0 -150 -0.08499329528049787 -0.3540225532920613 0 0 -151 -0.3540225532920613 0.08499329528049787 0 0 -152 0.0849932952805013 0.3540225532920622 0 0 -153 0.3540225532920622 -0.0849932952805013 0 0 -154 -0.0285655580411626 0.3629598288735253 0 0 -155 0.3629598288735255 0.02856555804116265 0 0 -156 -0.3629598288735258 -0.02856555804116251 0 0 -157 0.02856555804116255 -0.3629598288735258 0 0 -158 -0.09854262346762482 -0.4312116810030627 0 0 -159 -0.4312116810030627 0.09854262346762471 0 0 -160 0.4312116810030634 -0.09854262346762385 0 0 -161 0.09854262346762385 0.4312116810030634 0 0 -162 0.2863941728550313 -0.3337925263882989 0 0 -163 0.333792526388299 0.2863941728550311 0 0 -164 -0.2863941728550068 0.3337925263883137 0 0 -165 -0.3337925263883139 -0.2863941728550068 0 0 -166 0.4341063111766396 0.262251156333017 0 0 -167 0.2622511563330173 -0.4341063111766396 0 0 -168 -0.2622511563329954 0.4341063111766404 0 0 -169 -0.4341063111766404 -0.2622511563329954 0 0 -170 -0.3285797405736567 0.1271985513199089 0 0 -171 -0.1271985513199089 -0.3285797405736567 0 0 -172 0.1271985513199187 0.3285797405736535 0 0 -173 0.3285797405736535 -0.1271985513199187 0 0 -174 0.4382621631365854 0.03293511283444112 0 0 -175 0.03293511283444132 -0.4382621631365857 0 0 -176 -0.03293511283444148 0.4382621631365855 0 0 -177 -0.4382621631365857 -0.03293511283444176 0 0 -178 0.4511746832191377 0.4008117690436821 0 0 -179 0.4008117690436822 -0.4511746832191379 0 0 -180 -0.4008117690436742 0.4511746832191524 0 0 -181 -0.4511746832191524 -0.4008117690436743 0 0 -182 0.1847341130578008 -0.2919275361989445 0 0 -183 0.2919275361989445 0.1847341130578007 0 0 -184 -0.1847341130577764 0.2919275361989517 0 0 -185 -0.2919275361989517 -0.1847341130577765 0 0 -186 0.2605518249706062 -0.2271045764517622 0 0 -187 0.2271045764517622 0.2605518249706061 0 0 -188 -0.2605518249705924 0.2271045764517749 0 0 -189 -0.227104576451775 -0.2605518249705925 0 0 -190 0.08216618960374746 -0.3407239368113333 0 0 -191 0.3407239368113331 0.08216618960374741 0 0 -192 -0.08216618960374694 0.3407239368113317 0 0 -193 -0.3407239368113317 -0.08216618960374697 0 0 -194 0.02715906882733193 0.3450886889649151 0 0 -195 0.3450886889649151 -0.02715906882733193 0 0 -196 -0.02715906882733281 -0.3450886889649146 0 0 -197 -0.3450886889649147 0.02715906882733281 0 0 -198 -0.2006222855842369 -0.4411604369627216 0 0 -199 -0.4411604369627216 0.2006222855842368 0 0 -200 0.2006222855842401 0.441160436962723 0 0 -201 0.4411604369627231 -0.2006222855842399 0 0 -202 -0.4313177261924054 0.2984436908951634 0 0 -203 -0.2984436908951636 -0.4313177261924054 0 0 -204 0.4313177261924121 -0.2984436908951518 0 0 -205 0.2984436908951519 0.431317726192412 0 0 -206 0.2985640856234482 -0.2689496666993785 0 0 -207 0.2689496666993785 0.2985640856234481 0 0 -208 -0.2689496666994063 -0.2985640856234297 0 0 -209 -0.2985640856234297 0.2689496666994061 0 0 -210 -0.1763926459347944 -0.2921251006128341 0 0 -211 -0.2921251006128342 0.1763926459347943 0 0 -212 0.1763926459348017 0.2921251006128286 0 0 -213 0.2921251006128286 -0.1763926459348016 0 0 -214 -0.1168486455222268 0.4453146575376071 0 0 -215 -0.4453146575376072 -0.1168486455222271 0 0 -216 0.1168486455222277 -0.4453146575376072 0 0 -217 0.4453146575376073 0.1168486455222278 0 0 -218 0.3992328269702413 0.4414452957423528 0 0 -219 0.4414452957423529 -0.3992328269702414 0 0 -220 -0.4414452957423448 0.3992328269702546 0 0 -221 -0.3992328269702546 -0.4414452957423448 0 0 -222 0.2127001936694901 0.3735111599834766 0 0 -223 0.3735111599834767 -0.2127001936694898 0 0 -224 -0.2127001936694798 -0.3735111599834826 0 0 -225 -0.3735111599834827 0.2127001936694795 0 0 -226 0.3536365243034468 -0.3493868496222119 0 0 -227 0.349386849622212 0.3536365243034468 0 0 -228 -0.3536365243034386 0.3493868496222288 0 0 -229 -0.3493868496222289 -0.3536365243034388 0 0 -230 -0.4491447100744376 0.01411158003312582 0 0 -231 0.4491447100744378 -0.0141115800331266 0 0 -232 0.0141115800331259 0.4491447100744378 0 0 -233 -0.01411158003312633 -0.4491447100744376 0 0 -234 0.2518473204175981 0.216196433097686 0 0 -235 0.2161964330976861 -0.2518473204175981 0 0 -236 -0.2518473204176154 -0.2161964330976608 0 0 -237 -0.2161964330976608 0.2518473204176153 0 0 -238 0.3349521015712314 -0.4495111961210611 0 0 -239 0.4495111961210611 0.3349521015712313 0 0 -240 -0.3349521015712228 0.4495111961210635 0 0 -241 -0.4495111961210636 -0.3349521015712228 0 0 -242 -0.2097585829029079 0.451275154547815 0 0 -243 -0.451275154547815 -0.209758582902908 0 0 -244 0.451275154547812 0.2097585829029444 0 0 -245 0.2097585829029447 -0.4512751545478119 0 0 -246 -0.3055243688724512 -0.1295923974795884 0 0 -247 -0.1295923974795883 0.3055243688724512 0 0 -248 0.1295923974795942 -0.305524368872452 0 0 -249 0.3055243688724518 0.1295923974795941 0 0 -250 0.268370396066007 -0.3847394215802594 0 0 -251 0.3847394215802595 0.2683703960660067 0 0 -252 -0.268370396065984 0.3847394215802622 0 0 -253 -0.3847394215802623 -0.268370396065984 0 0 -254 -0.1772256790845458 -0.340454802198597 0 0 -255 -0.3404548021985971 0.1772256790845456 0 0 -256 0.1772256790845546 0.3404548021985933 0 0 -257 0.3404548021985934 -0.1772256790845544 0 0 -258 -0.3436816764651542 0.2530312319765282 0 0 -259 -0.2530312319765284 -0.3436816764651542 0 0 -260 0.2530312319765179 0.3436816764651526 0 0 -261 0.3436816764651529 -0.2530312319765177 0 0 -262 -0.4497857874410114 0.1387005658852932 0 0 -263 -0.1387005658852933 -0.4497857874410113 0 0 -264 0.449785787441012 -0.1387005658852944 0 0 -265 0.1387005658852947 0.4497857874410119 0 0 -266 0.385362219884707 -0.3142243060120655 0 0 -267 0.3142243060120656 0.3853622198847066 0 0 -268 -0.385362219884704 0.3142243060120813 0 0 -269 -0.3142243060120814 -0.385362219884704 0 0 -270 -0.4564699538406921 0.06152753573091185 0 0 -271 -0.06152753573091208 -0.4564699538406923 0 0 -272 0.4564699538406928 -0.06152753573091118 0 0 -273 0.06152753573091077 0.4564699538406926 0 0 -274 0.3263037667334781 0.2212075419835406 0 0 -275 0.2212075419835408 -0.326303766733478 0 0 -276 -0.2212075419835016 0.3263037667334912 0 0 -277 -0.3263037667334912 -0.2212075419835017 0 0 -278 0.1349298665238687 -0.3861753611926261 0 0 -279 0.1869355524200216 -0.3744134770093779 0 0 -280 0.386175361192626 0.1349298665238687 0 0 -281 0.3744134770093779 0.1869355524200215 0 0 -282 -0.1349298665238549 0.3861753611926105 0 0 -283 -0.1869355524199963 0.3744134770093717 0 0 -284 -0.3861753611926105 -0.1349298665238551 0 0 -285 -0.3744134770093717 -0.1869355524199965 0 0 -286 0.1135979267251047 0.3907528924949697 0 0 -287 0.3907528924949698 -0.1135979267251046 0 0 -288 -0.1135979267251008 -0.39075289249497 0 0 -289 -0.39075289249497 0.1135979267251007 0 0 -290 0.456198599000824 -0.343151891283705 0 0 -291 0.3431518912837049 0.4561985990008239 0 0 -292 -0.4561985990008176 0.3431518912837141 0 0 -293 -0.3431518912837141 -0.4561985990008176 0 0 -294 -0.2570474677826419 -0.4579299359148114 0 0 -295 -0.4579299359148115 0.2570474677826418 0 0 -296 0.4579299359148162 -0.2570474677826353 0 0 -297 0.2570474677826354 0.4579299359148162 0 0 -298 0.4553618635342114 0.455361863534089 0 0 -299 0.4553618635340894 -0.4553618635342119 0 0 -300 -0.4553618635342376 -0.4553618635341151 0 0 -301 -0.4553618635341152 0.4553618635342376 0 0 -302 -0.318273609027202 0.07641073310298986 0 0 -303 -0.07641073310298986 -0.318273609027202 0 0 -304 0.07641073310299251 0.3182736090272009 0 0 -305 0.3182736090272009 -0.07641073310299251 0 0 -306 0.326308404911571 0.02568102841779958 0 0 -307 -0.02568102841779951 0.3263084049115709 0 0 -308 0.02568102841779948 -0.326308404911571 0 0 -309 -0.3263084049115711 -0.02568102841779944 0 0 -310 0.4542955572480689 0.07224131456710739 0 0 -311 0.07224131456710754 -0.4542955572480691 0 0 -312 -0.07224131456710686 0.4542955572480688 0 0 -313 -0.4542955572480688 -0.07224131456710738 0 0 -314 -0.07284427394657993 -0.3939282298321343 0 0 -315 -0.3939282298321343 0.07284427394657983 0 0 -316 0.07284427394657889 0.3939282298321337 0 0 -317 0.3939282298321337 -0.07284427394657889 0 0 -318 -0.404717606981677 -0.2216896857531375 0 0 -319 -0.2216896857531374 0.4047176069816768 0 0 -320 0.4047176069816826 0.2216896857531635 0 0 -321 0.2216896857531637 -0.4047176069816826 0 0 -322 0.008904462313015143 -0.3997666310557169 0 0 -323 -0.3997666310557169 -0.008904462313015215 0 0 -324 0.3997666310557162 0.008904462313015511 0 0 -325 -0.008904462313015764 0.3997666310557164 0 0 -326 0.3839179616148227 -0.2722398726914085 0 0 -327 0.2722398726914086 0.3839179616148221 0 0 -328 -0.2722398726914255 -0.3839179616148369 0 0 -329 -0.3839179616148371 0.2722398726914254 0 0 -330 0.374563678309362 -0.3969152678293756 0 0 -331 0.3969152678293756 0.3745636783093619 0 0 -332 -0.3745636783093398 0.3969152678293885 0 0 -333 -0.3969152678293885 -0.37456367830934 0 0 -334 0.3944457125295155 0.05390584111545343 0 0 -335 0.05390584111545379 -0.3944457125295159 0 0 -336 -0.05390584111545403 0.3944457125295153 0 0 -337 -0.3944457125295154 -0.05390584111545441 0 0 -438 0.1171628130526668 -0.3415376980092354 0 0 -439 0.1085480280638081 -0.3634496490019797 0 0 -440 0.1435446515127274 -0.3642634101998818 0 0 -441 0.3415376980092353 0.1171628130526667 0 0 -442 0.3634496490019795 0.108548028063808 0 0 -443 0.3642634101998817 0.1435446515127273 0 0 -444 -0.3415376980092318 -0.1171628130526607 0 0 -445 -0.3634496490019711 -0.1085480280638011 0 0 -446 -0.3642634101998713 -0.1435446515127148 0 0 -447 -0.1171628130526606 0.3415376980092318 0 0 -448 -0.1085480280638009 0.3634496490019711 0 0 -449 -0.1435446515127145 0.3642634101998712 0 0 -450 -0.4183875751344526 0.1490044081679966 0 0 -451 -0.4202693399679907 0.1261492463051969 0 0 -452 -0.3888711276614319 0.1364530885879004 0 0 -453 -0.1490044081679967 -0.4183875751344526 0 0 -454 -0.1261492463051971 -0.4202693399679907 0 0 -455 -0.1364530885879005 -0.3888711276614319 0 0 -456 0.4183875751344528 -0.1490044081680024 0 0 -457 0.4202693399679909 -0.1261492463051995 0 0 -458 0.3888711276614317 -0.1364530885879074 0 0 -459 0.1490044081680026 0.4183875751344527 0 0 -460 0.1261492463051997 0.4202693399679908 0 0 -461 0.1364530885879076 0.3888711276614316 0 0 -462 0.3343276129703078 0.1866834892425633 0 0 -463 0.3091156514662112 0.2029708275206707 0 0 -464 0.317139497703041 0.1684467747796933 0 0 -465 0.1866834892425634 -0.3343276129703078 0 0 -466 0.2029708275206707 -0.3091156514662112 0 0 -467 0.1684467747796934 -0.3171394977030411 0 0 -468 -0.1866834892425379 0.3343276129703115 0 0 -469 -0.202970827520639 0.3091156514662214 0 0 -470 -0.1684467747796753 0.3171394977030418 0 0 -471 -0.3343276129703116 -0.1866834892425381 0 0 -472 -0.3091156514662214 -0.2029708275206391 0 0 -473 -0.3171394977030418 -0.1684467747796755 0 0 -474 0.1408759169905902 -0.3239379140397948 0 0 -475 0.1058792935416708 -0.3231241528418927 0 0 -476 0.3239379140397947 0.14087591699059 0 0 -477 0.3231241528418924 0.1058792935416708 0 0 -478 -0.3239379140397916 -0.1408759169905814 0 0 -479 -0.3231241528418914 -0.1058792935416677 0 0 -480 -0.1408759169905812 0.3239379140397916 0 0 -481 -0.1058792935416676 0.3231241528418914 0 0 -482 -0.1060702750963628 -0.4109822867490164 0 0 -483 -0.1186215946764591 -0.440498734222037 0 0 -484 -0.4109822867490163 0.1060702750963627 0 0 -485 -0.440498734222037 0.1186215946764589 0 0 -486 0.4109822867490166 -0.1060702750963642 0 0 -487 0.4404987342220377 -0.1186215946764591 0 0 -488 0.1060702750963643 0.4109822867490165 0 0 -489 0.1186215946764593 0.4404987342220377 0 0 -490 0.3583824681082577 0.1695474944608037 0 0 -491 0.350358621871428 0.2040715472017811 0 0 -492 0.1695474944608039 -0.3583824681082577 0 0 -493 0.2040715472017812 -0.350358621871428 0 0 -494 -0.1695474944607853 0.3583824681082518 0 0 -495 -0.2040715472017489 0.3503586218714314 0 0 -496 -0.3583824681082518 -0.1695474944607855 0 0 -497 -0.3503586218714314 -0.2040715472017491 0 0 -498 0.3095799415789123 0.266811395135277 0 0 -499 0.3013710965438388 0.2924791292392396 0 0 -500 0.2771585117344521 0.2728963515194854 0 0 -501 0.2668113951352771 -0.3095799415789123 0 0 -502 0.2924791292392397 -0.3013710965438388 0 0 -503 0.2728963515194855 -0.2771585117344522 0 0 -504 -0.2668113951352502 0.309579941578928 0 0 -505 -0.2924791292392183 0.30137109654386 0 0 -506 -0.2728963515194616 0.2771585117344742 0 0 -507 -0.3095799415789281 -0.2668113951352502 0 0 -508 -0.3013710965438601 -0.2924791292392183 0 0 -509 -0.2771585117344744 -0.2728963515194617 0 0 -510 -0.1668853933402113 0.4589756729868955 0 0 -511 -0.1419763827684544 0.4316330017556991 0 0 -512 -0.1417576560939837 0.4726573287688036 0 0 -513 -0.4589756729868956 -0.1668853933402114 0 0 -514 -0.4316330017556991 -0.1419763827684546 0 0 -515 -0.4726573287688036 -0.1417576560939839 0 0 -516 0.4589756729869142 0.1668853933402221 0 0 -517 0.4316330017557179 0.1419763827684657 0 0 -518 0.4726573287688036 0.1417576560939842 0 0 -519 0.1668853933402222 -0.4589756729869144 0 0 -520 0.1419763827684658 -0.431633001755718 0 0 -521 0.1417576560939841 -0.4726573287688036 0 0 -522 0.1604656314899769 -0.2796147467276539 0 0 -523 0.1805348443729616 -0.2673163172555761 0 0 -524 0.2796147467276538 0.1604656314899769 0 0 -525 0.2673163172555761 0.1805348443729616 0 0 -526 -0.2796147467276557 -0.1604656314899681 0 0 -527 -0.2673163172555924 -0.180534844372932 0 0 -528 -0.160465631489968 0.2796147467276557 0 0 -529 -0.180534844372932 0.2673163172555924 0 0 -530 0.1328947737008737 -0.2864131630644076 0 0 -531 0.1571632552686975 -0.2987259525356982 0 0 -532 0.2864131630644074 0.1328947737008736 0 0 -533 0.2987259525356981 0.1571632552686974 0 0 -534 -0.2864131630644055 -0.132894773700874 0 0 -535 -0.2987259525357014 -0.1571632552686824 0 0 -536 -0.132894773700874 0.2864131630644055 0 0 -537 -0.1571632552686824 0.2987259525357014 0 0 -538 -0.2610562398186328 0.3498062289952474 0 0 -539 -0.2538008574192542 0.3300481465609024 0 0 -540 -0.2284629243828802 0.3460618491678361 0 0 -541 -0.3498062289952475 -0.2610562398186329 0 0 -542 -0.3300481465609025 -0.2538008574192543 0 0 -543 -0.3460618491678362 -0.2284629243828803 0 0 -544 0.2610562398186597 -0.3498062289952385 0 0 -545 0.253800857419286 -0.3300481465608884 0 0 -546 0.2284629243829145 -0.346061849167828 0 0 -547 0.3498062289952386 0.2610562398186596 0 0 -548 0.3300481465608885 0.2538008574192859 0 0 -549 0.3460618491678281 0.2284629243829143 0 0 -550 0.3955991716059688 0.1137677071145372 0 0 -551 0.3728734594153224 0.08738586865447656 0 0 -552 0.1137677071145373 -0.3955991716059689 0 0 -553 0.08738586865447664 -0.3728734594153226 0 0 -554 -0.3955991716059589 -0.1137677071145288 0 0 -555 -0.3728734594153195 -0.08738586865447472 0 0 -556 -0.1137677071145285 0.3955991716059588 0 0 -557 -0.08738586865447454 0.3728734594153195 0 0 -558 0.2342180796995318 -0.3058355617515018 0 0 -559 0.3058355617515018 0.2342180796995317 0 0 -560 -0.2342180796994975 0.3058355617515167 0 0 -561 -0.3058355617515168 -0.2342180796994977 0 0 -562 0.4140748998953083 -0.1799652680174751 0 0 -563 0.4454731122018675 -0.1696614257347672 0 0 -564 0.1799652680174753 0.4140748998953083 0 0 -565 0.1696614257347674 0.4454731122018675 0 0 -566 -0.4140748998953077 0.1799652680174684 0 0 -567 -0.4454731122018665 0.169661425734765 0 0 -568 -0.1799652680174685 -0.4140748998953077 0 0 -569 -0.1696614257347651 -0.4454731122018665 0 0 -570 0.2832812711928696 0.3211937407250038 0 0 -571 0.3157027010373298 0.3151087843407954 0 0 -572 0.3211937407250041 -0.2832812711928695 0 0 -573 0.3151087843407956 -0.3157027010373297 0 0 -574 -0.2832812711928918 -0.321193740724992 0 0 -575 -0.3157027010373455 -0.3151087843407805 0 0 -576 -0.321193740724992 0.2832812711928916 0 0 -577 -0.3151087843407805 0.3157027010373454 0 0 -578 -0.2811255781662199 0.4670531555883202 0 0 -579 -0.2477922448327939 0.4670531555883202 0 0 -580 -0.4670531555883202 -0.2811255781662199 0 0 -581 -0.4670531555883202 -0.2477922448327939 0 0 -582 0.4670531555883198 0.2811255781662306 0 0 -583 0.4670531555883198 0.2477922448328047 0 0 -584 0.2811255781662307 -0.4670531555883198 0 0 -585 0.2477922448328048 -0.4670531555883198 0 0 -586 -0.4170725511884111 0.4755873416095762 0 0 -587 -0.3837392178549852 0.4755873416095762 0 0 -588 -0.4755873416095762 -0.4170725511884112 0 0 -589 -0.4755873416095762 -0.3837392178549853 0 0 -590 0.4755873416095688 0.4170725511884151 0 0 -591 0.4755873416095688 0.3837392178549892 0 0 -592 0.4170725511884151 -0.4755873416095689 0 0 -593 0.3837392178549892 -0.4755873416095689 0 0 -594 -0.1882126247843242 0.4756375772739075 0 0 -595 -0.1884313514587949 0.434613250260803 0 0 -596 -0.4756375772739075 -0.1882126247843243 0 0 -597 -0.4346132502608031 -0.1884313514587951 0 0 -598 0.475637577273906 0.1882126247843425 0 0 -599 0.4346132502608203 0.1884313514588241 0 0 -600 0.1882126247843427 -0.475637577273906 0 0 -601 0.1884313514588243 -0.4346132502608204 0 0 -602 -0.1316978506207143 -0.2979408489151713 0 0 -603 -0.1099518248160802 -0.3069483477311392 0 0 -604 -0.2979408489151713 0.1316978506207143 0 0 -605 -0.3069483477311392 0.1099518248160802 0 0 -606 0.1316978506207286 0.2979408489151649 0 0 -607 0.1099518248160882 0.3069483477311366 0 0 -608 0.2979408489151649 -0.1316978506207286 0 0 -609 0.3069483477311366 -0.1099518248160882 0 0 -610 -0.4747555980605318 -0.3174760507853335 0 0 -611 -0.441808753648852 -0.2986016289521091 0 0 -612 -0.3174760507853335 0.4747555980605317 0 0 -613 -0.2986016289521091 0.441808753648852 0 0 -614 0.4747555980605305 0.3174760507853378 0 0 -615 0.4418087536488503 0.2986016289521242 0 0 -616 0.3174760507853378 -0.4747555980605305 0 0 -617 0.2986016289521243 -0.4418087536488503 0 0 -618 -0.4142856916271622 -0.2907962423744877 0 0 -619 -0.4219881340993739 -0.3271467149936014 0 0 -620 -0.2907962423744876 0.4142856916271622 0 0 -621 -0.3271467149936013 0.4219881340993737 0 0 -622 0.4142856916271598 0.2907962423745115 0 0 -623 0.4219881340993705 0.3271467149936187 0 0 -624 0.2907962423745117 -0.4142856916271598 0 0 -625 0.3271467149936188 -0.4219881340993705 0 0 -626 0.1860042220601003 0.3802502614056851 0 0 -627 0.2066612396268651 0.4073357984730998 0 0 -628 0.3802502614056852 -0.1860042220601001 0 0 -629 0.4073357984730999 -0.2066612396268649 0 0 -630 -0.18600422206009 -0.3802502614056882 0 0 -631 -0.2066612396268583 -0.4073357984731021 0 0 -632 -0.3802502614056883 0.1860042220600898 0 0 -633 -0.4073357984731021 0.2066612396268582 0 0 -634 -0.2169778094591555 -0.4705802184813608 0 0 -635 -0.2288348766834394 -0.4495451864387665 0 0 -636 -0.2451904005583579 -0.4789649679574057 0 0 -637 -0.4705802184813608 0.2169778094591554 0 0 -638 -0.4495451864387665 0.2288348766834393 0 0 -639 -0.4789649679574057 0.2451904005583579 0 0 -640 0.4705802184813616 -0.216977809459157 0 0 -641 0.4495451864387696 -0.2288348766834376 0 0 -642 0.4789649679574081 -0.2451904005583546 0 0 -643 0.2169778094591571 0.4705802184813615 0 0 -644 0.2288348766834378 0.4495451864387696 0 0 -645 0.2451904005583547 0.4789649679574081 0 0 -646 0.2538902211930645 -0.256235966610644 0 0 -647 0.2383741290341462 -0.2394759484346802 0 0 -648 0.2317125252566045 -0.2686073385935619 0 0 -649 0.256235966610644 0.2538902211930645 0 0 -650 0.2394759484346802 0.2383741290341461 0 0 -651 0.2686073385935619 0.2317125252566044 0 0 -652 -0.2562359666106587 -0.2538902211930431 0 0 -653 -0.2394759484346952 -0.2383741290341267 0 0 -654 -0.2686073385935789 -0.2317125252565772 0 0 -655 -0.253890221193043 0.2562359666106586 0 0 -656 -0.2383741290341266 0.2394759484346951 0 0 -657 -0.2317125252565772 0.2686073385935788 0 0 -658 0.3997343472744136 0.07325569441032959 0 0 -659 0.4243706348887922 0.06307357784128041 0 0 -660 0.4296592696336903 0.08242343113615655 0 0 -661 0.07325569441032981 -0.3997343472744139 0 0 -662 0.06307357784128066 -0.4243706348887926 0 0 -663 0.08242343113615669 -0.4296592696336905 0 0 -664 -0.07325569441032807 0.3997343472744113 0 0 -665 -0.06307357784128045 0.424370634888792 0 0 -666 -0.0824234311361545 0.429659269633688 0 0 -667 -0.3997343472744113 -0.07325569441032843 0 0 -668 -0.4243706348887921 -0.0630735778412809 0 0 -669 -0.429659269633688 -0.08242343113615491 0 0 -670 0.2480271215755704 0.2795579552970271 0 0 -671 0.2795579552970272 -0.2480271215755704 0 0 -672 -0.2480271215755907 -0.2795579552970111 0 0 -673 -0.2795579552970111 0.2480271215755905 0 0 -674 0.2196183054036563 0.2363419296634922 0 0 -675 0.2017200760695551 0.2516284616416883 0 0 -676 0.2363419296634922 -0.2196183054036563 0 0 -677 0.2516284616416884 -0.2017200760695551 0 0 -678 -0.2196183054036748 -0.2363419296634732 0 0 -679 -0.2017200760695581 -0.251628461641684 0 0 -680 -0.2363419296634732 0.2196183054036747 0 0 -681 -0.251628461641684 0.201720076069558 0 0 -682 0.06454826455794466 -0.3185152194949316 0 0 -683 0.08743564395821542 -0.3130204458499073 0 0 -684 0.3185152194949314 0.06454826455794463 0 0 -685 0.3130204458499072 0.0874356439582154 0 0 -686 -0.06454826455794432 0.3185152194949308 0 0 -687 -0.08743564395821565 0.3130204458499063 0 0 -688 -0.3185152194949308 -0.06454826455794435 0 0 -689 -0.3130204458499064 -0.08743564395821568 0 0 -690 -0.07891878461353891 -0.3739753915620978 0 0 -691 -0.05000167138695637 -0.3695084593985244 0 0 -692 -0.05607618205391535 -0.349555621128488 0 0 -693 -0.3739753915620978 0.07891878461353885 0 0 -694 -0.3695084593985245 0.05000167138695633 0 0 -695 -0.349555621128488 0.05607618205391535 0 0 -696 0.0789187846135401 0.373975391562098 0 0 -697 0.05000167138695541 0.3695084593985244 0 0 -698 0.05607618205391662 0.3495556211284886 0 0 -699 0.373975391562098 -0.0789187846135401 0 0 -700 0.3695084593985244 -0.05000167138695541 0 0 -701 0.3495556211284886 -0.05607618205391662 0 0 -702 -0.27971352893476 0.156294897928157 0 0 -703 -0.3103524205932455 0.1517955986273516 0 0 -704 -0.1562948979281571 -0.27971352893476 0 0 -705 -0.1517955986273516 -0.3103524205932454 0 0 -706 0.1562948979281701 0.2797135289347524 0 0 -707 0.1517955986273602 0.3103524205932411 0 0 -708 0.2797135289347524 -0.1562948979281701 0 0 -709 0.3103524205932411 -0.1517955986273601 0 0 -710 0.3752796765912188 0.2520443514241474 0 0 -711 0.3592659739842792 0.2773822844605189 0 0 -712 0.2520443514241476 -0.3752796765912187 0 0 -713 0.2773822844605192 -0.3592659739842792 0 0 -714 -0.2520443514241214 0.3752796765912216 0 0 -715 -0.2773822844604954 0.3592659739842879 0 0 -716 -0.3752796765912217 -0.2520443514241214 0 0 -717 -0.3592659739842881 -0.2773822844604954 0 0 -718 0.2204690156805195 0.4271054445899135 0 0 -719 0.2265079697231445 0.3932808061002903 0 0 -720 0.4271054445899136 -0.2204690156805192 0 0 -721 0.3932808061002905 -0.2265079697231441 0 0 -722 -0.2204690156805172 -0.4271054445899075 0 0 -723 -0.2265079697231387 -0.393280806100288 0 0 -724 -0.4271054445899074 0.2204690156805171 0 0 -725 -0.393280806100288 0.2265079697231385 0 0 -726 -0.4705802184813608 0.1836444761259146 0 0 -727 -0.1836444761259147 -0.4705802184813608 0 0 -728 0.4705802184813616 -0.1836444761259162 0 0 -729 0.1836444761259163 0.4705802184813615 0 0 -730 0.0007032446069148678 -0.3540242589192202 0 0 -731 -0.009127303257158836 -0.3724276600103157 0 0 -732 0.01873501017708885 -0.3813632299646214 0 0 -733 0.3540242589192203 0.000703244606915357 0 0 -734 0.3724276600103157 -0.009127303257158211 0 0 -735 0.3813632299646209 0.01873501017708908 0 0 -736 -0.3540242589192203 -0.0007032446069148469 0 0 -737 -0.3724276600103158 0.009127303257158801 0 0 -738 -0.3813632299646214 -0.01873501017708886 0 0 -739 -0.0007032446069153327 0.3540242589192202 0 0 -740 0.009127303257158083 0.3724276600103157 0 0 -741 -0.01873501017708918 0.3813632299646209 0 0 -742 0.3200153485792391 -0.3415896880052554 0 0 -743 0.3487299600650033 -0.3234998626542862 0 0 -744 0.3415896880052555 0.320015348579239 0 0 -745 0.3234998626542863 0.3487299600650032 0 0 -746 -0.3415896880052714 -0.3200153485792228 0 0 -747 -0.3234998626543031 -0.3487299600649965 0 0 -748 -0.3200153485792227 0.3415896880052712 0 0 -749 -0.3487299600649965 0.323499862654303 0 0 -750 0.1018046422114556 0.3234266748004272 0 0 -751 0.08455791570762514 0.3017952819579103 0 0 -752 0.3234266748004272 -0.1018046422114556 0 0 -753 0.3017952819579103 -0.08455791570762514 0 0 -754 -0.3234266748004294 0.1018046422114494 0 0 -755 -0.3017952819579118 0.0845579157076207 0 0 -756 -0.1018046422114494 -0.3234266748004293 0 0 -757 -0.0845579157076207 -0.3017952819579118 0 0 -758 -0.4443475984336316 0.4776809317671188 0 0 -759 -0.4280868162888947 0.4532682733766951 0 0 -760 -0.4776809317671188 -0.4443475984336316 0 0 -761 -0.453268273376695 -0.4280868162888947 0 0 -762 0.4443475984336187 -0.4776809317671059 0 0 -763 0.4280868162888858 -0.4532682733766749 0 0 -764 0.4776809317671057 0.4443475984336185 0 0 -765 0.4532682733766746 0.4280868162888856 0 0 -766 -0.220379063793864 -0.2895718021240299 0 0 -767 -0.2413016089176797 -0.3085779324504485 0 0 -768 -0.2895718021240299 0.2203790637938638 0 0 -769 -0.3085779324504485 0.2413016089176795 0 0 -770 0.2895718021240314 -0.2203790637938567 0 0 -771 0.3085779324504525 -0.2413016089176649 0 0 -772 0.2203790637938569 0.2895718021240314 0 0 -773 0.2413016089176649 0.3085779324504524 0 0 -774 -0.2763384627917133 0.2017486111932846 0 0 -775 -0.2674150994628048 0.1763641108110677 0 0 -776 -0.2017486111932847 -0.2763384627917134 0 0 -777 -0.1763641108110677 -0.2674150994628048 0 0 -778 0.2763384627917174 -0.2017486111932819 0 0 -779 0.2674150994627996 -0.1763641108110748 0 0 -780 0.201748611193282 0.2763384627917174 0 0 -781 0.1763641108110748 0.2674150994627996 0 0 -782 -0.3596663165343134 0.1203982390225048 0 0 -783 -0.3577845517007753 0.1432534008853045 0 0 -784 -0.1203982390225049 -0.3596663165343134 0 0 -785 -0.1432534008853046 -0.3577845517007753 0 0 -786 0.1203982390225117 0.3596663165343116 0 0 -787 0.1432534008853146 0.3577845517007735 0 0 -788 0.3596663165343116 -0.1203982390225116 0 0 -789 0.3577845517007736 -0.1432534008853145 0 0 -790 -0.4354901940659524 0.2486816067797196 0 0 -791 -0.2486816067797197 -0.4354901940659524 0 0 -792 0.4354901940659602 -0.2486816067797168 0 0 -793 0.2486816067797172 0.4354901940659601 0 0 -794 -0.05279338911966953 -0.4000490485427496 0 0 -795 -0.06718590483874601 -0.4251990918364132 0 0 -796 -0.04713502001183561 -0.4313199105470287 0 0 -797 -0.4000490485427496 0.05279338911966944 0 0 -798 -0.4251990918364131 0.06718590483874584 0 0 -799 -0.4313199105470286 0.04713502001183545 0 0 -800 0.4000490485427494 -0.05279338911966865 0 0 -801 0.4251990918364132 -0.06718590483874504 0 0 -802 0.431319910547029 -0.0471350200118348 0 0 -803 0.05279338911966855 0.4000490485427494 0 0 -804 0.06718590483874483 0.4251990918364131 0 0 -805 0.04713502001183449 0.4313199105470288 0 0 -806 -0.4080044870258423 0.3980740473998216 0 0 -807 -0.4248376344058411 0.3753245494279072 0 0 -808 -0.3913968256893386 0.3741657698574741 0 0 -809 -0.3980740473998216 -0.4080044870258424 0 0 -810 -0.3753245494279072 -0.4248376344058412 0 0 -811 -0.3741657698574741 -0.3913968256893388 0 0 -812 0.3980740473998085 0.4080044870258573 0 0 -813 0.3753245494278902 0.4248376344058538 0 0 -814 0.3741657698574573 0.3913968256893583 0 0 -815 0.4080044870258575 -0.3980740473998085 0 0 -816 0.4248376344058539 -0.3753245494278902 0 0 -817 0.3913968256893584 -0.3741657698574573 0 0 -818 -0.3413011469328591 0.1060959233002034 0 0 -819 -0.3723877228935156 0.09929561100279929 0 0 -820 -0.1060959233002034 -0.341301146932859 0 0 -821 -0.09929561100279935 -0.3723877228935156 0 0 -822 0.10609592330021 0.3413011469328578 0 0 -823 0.09929561100280299 0.372387722893516 0 0 -824 0.3413011469328578 -0.10609592330021 0 0 -825 0.372387722893516 -0.09929561100280293 0 0 -826 -0.02995078656004597 -0.3756292781091398 0 0 -827 -0.3756292781091398 0.02995078656004593 0 0 -828 0.02995078656004507 0.3756292781091401 0 0 -829 0.37562927810914 -0.02995078656004517 0 0 -830 -0.05258821370077417 0.4462788601923272 0 0 -831 -0.04342047697494776 0.4163539378330504 0 0 -832 -0.4462788601923272 -0.05258821370077457 0 0 -833 -0.4163539378330505 -0.04342047697494809 0 0 -834 0.4462788601923272 0.05258821370077425 0 0 -835 0.4163539378330505 0.04342047697494728 0 0 -836 0.05258821370077443 -0.4462788601923274 0 0 -837 0.04342047697494755 -0.4163539378330509 0 0 -838 0.2319896773865743 0.2141642337270321 0 0 -839 0.2141642337270321 -0.2319896773865743 0 0 -840 -0.231989677386595 -0.2141642337270074 0 0 -841 -0.2141642337270074 0.2319896773865949 0 0 -842 0.03704470416963512 0.3206975955717386 0 0 -843 0.01357953441366597 0.3225443444824576 0 0 -844 0.3206975955717386 -0.03704470416963512 0 0 -845 0.3225443444824576 -0.01357953441366597 0 0 -846 -0.3206975955717383 0.03704470416963629 0 0 -847 -0.3225443444824573 0.01357953441366641 0 0 -848 -0.03704470416963628 -0.3206975955717382 0 0 -849 -0.01357953441366641 -0.3225443444824573 0 0 -850 -0.4211285323930095 0.4252037550947035 0 0 -851 -0.387687723676507 0.4240449755242705 0 0 -852 -0.4252037550947035 -0.4211285323930096 0 0 -853 -0.4240449755242705 -0.3876877236765072 0 0 -854 0.4252037550946896 0.4211285323930174 0 0 -855 0.4240449755242567 0.387687723676522 0 0 -856 0.4211285323930176 -0.4252037550946897 0 0 -857 0.3876877236765221 -0.4240449755242567 0 0 -858 0.371925960849946 0.3364889263597264 0 0 -859 0.3641287992329895 0.3028677506355186 0 0 -860 0.3364889263597265 -0.3719259608499459 0 0 -861 0.3028677506355187 -0.3641287992329894 0 0 -862 -0.3364889263597092 0.3719259608499563 0 0 -863 -0.3028677506354933 0.3641287992329988 0 0 -864 -0.3719259608499565 -0.3364889263597094 0 0 -865 -0.364128799232999 -0.3028677506354934 0 0 -866 0.2004652730777434 -0.2718874283082713 0 0 -867 0.1962660043929043 -0.247276209364903 0 0 -868 0.2718874283082713 0.2004652730777434 0 0 -869 0.247276209364903 0.1962660043929043 0 0 -870 -0.2004652730777186 0.2718874283082835 0 0 -871 -0.1962660043928742 0.2472762093649242 0 0 -872 -0.2718874283082836 -0.2004652730777187 0 0 -873 -0.2472762093649242 -0.1962660043928742 0 0 -874 -0.1111487478961363 0.2954206618804661 0 0 -875 -0.2954206618804661 -0.1111487478961364 0 0 -876 0.1111487478961388 -0.2954206618804667 0 0 -877 0.2954206618804666 0.1111487478961387 0 0 -878 -0.011919020989872 -0.4029682491545409 0 0 -879 -0.402968249154541 0.01191902098987192 0 0 -880 0.01191902098987122 0.4029682491545408 0 0 -881 0.4029682491545407 -0.01191902098987145 0 0 -882 0.3113074535450504 0.03630568396497071 0 0 -883 0.333516170861452 0.05392360901077349 0 0 -884 0.03630568396497066 -0.3113074535450504 0 0 -885 0.05392360901077347 -0.3335161708614521 0 0 -886 -0.03630568396497062 0.3113074535450503 0 0 -887 -0.05392360901077323 0.3335161708614512 0 0 -888 -0.3113074535450505 -0.03630568396497058 0 0 -889 -0.3335161708614514 -0.0539236090107732 0 0 -890 0.4691310815682927 0.03313422308323913 0 0 -891 0.4437034366055116 0.009411766400657263 0 0 -892 0.474572355037219 0.009610876649455273 0 0 -893 0.03313422308323923 -0.4691310815682929 0 0 -894 0.009411766400657499 -0.4437034366055116 0 0 -895 0.009610876649455405 -0.4745723550372188 0 0 -896 -0.03313422308323931 0.4691310815682928 0 0 -897 -0.009411766400657794 0.4437034366055116 0 0 -898 -0.009610876649455622 0.4745723550372189 0 0 -899 -0.4691310815682929 -0.03313422308323945 0 0 -900 -0.4437034366055116 -0.009411766400657971 0 0 -901 -0.4745723550372188 -0.00961087664945566 0 0 -902 0.370116704305778 0.2113269296011547 0 0 -903 0.2113269296011549 -0.370116704305778 0 0 -904 -0.2113269296011276 0.3701167043057764 0 0 -905 -0.3701167043057764 -0.2113269296011277 0 0 -906 0.4498051073928381 0.0945449800446676 0 0 -907 0.4251688197784595 0.1047270966137168 0 0 -908 0.0945449800446676 -0.4498051073928382 0 0 -909 0.1047270966137167 -0.4251688197784595 0 0 -910 -0.09454498004466684 0.449805107392838 0 0 -911 -0.1047270966137145 0.4251688197784572 0 0 -912 -0.449805107392838 -0.09454498004466726 0 0 -913 -0.4251688197784572 -0.1047270966137148 0 0 -914 0.3896022468289697 0.2938558622410063 0 0 -915 0.4094228663784495 0.2653107761995118 0 0 -916 0.2938558622410066 -0.3896022468289697 0 0 -917 0.2653107761995122 -0.4094228663784495 0 0 -918 -0.3896022468289732 -0.2938558622409819 0 0 -919 -0.4094228663784514 -0.2653107761994897 0 0 -920 -0.2938558622409819 0.389602246828973 0 0 -921 -0.2653107761994897 0.4094228663784513 0 0 -922 -0.1084243227605577 0.4726573287688036 0 0 -923 0.1084243227605582 -0.4726573287688036 0 0 -924 -0.4726573287688036 -0.1084243227605579 0 0 -925 0.4726573287688036 0.1084243227605582 0 0 -926 0.08070201419174691 0.3361480811596316 0 0 -927 0.3361480811596316 -0.08070201419174691 0 0 -928 -0.08070201419174386 -0.3361480811596317 0 0 -929 -0.3361480811596317 0.08070201419174386 0 0 -930 0.3787027707015205 0.04123569957830804 0 0 -931 0.3675848246704243 0.06803601535960042 0 0 -932 0.3518418828424292 0.05536587382245503 0 0 -933 0.04123569957830817 -0.3787027707015209 0 0 -934 0.06803601535960062 -0.3675848246704246 0 0 -935 0.055365873822455 -0.3518418828424296 0 0 -936 -0.04123569957830831 0.3787027707015203 0 0 -937 -0.06803601535960049 0.3675848246704235 0 0 -938 -0.05536587382245477 0.3518418828424285 0 0 -939 -0.3787027707015206 -0.04123569957830846 0 0 -940 -0.3675848246704235 -0.06803601535960069 0 0 -941 -0.3518418828424288 -0.05536587382245474 0 0 -942 0.3446341168925482 0.02712329322948111 0 0 -943 0.02712329322948102 -0.3446341168925484 0 0 -944 -0.02712329322948105 0.3446341168925481 0 0 -945 -0.3446341168925485 -0.02712329322948097 0 0 -946 -0.05178490096516133 -0.3316811489960583 0 0 -947 -0.3316811489960583 0.05178490096516133 0 0 -948 0.05178490096516222 0.3316811489960579 0 0 -949 0.3316811489960579 -0.05178490096516222 0 0 -950 -0.0007390202047666619 -0.3356985469382429 0 0 -951 0.335698546938243 -0.0007390202047661797 0 0 -952 0.0007390202047662144 0.335698546938243 0 0 -953 -0.3356985469382429 0.0007390202047666897 0 0 -954 0.06167053630746541 0.3072900556028815 0 0 -955 0.3072900556028815 -0.06167053630746541 0 0 -956 -0.3072900556028819 0.06167053630746481 0 0 -957 -0.06167053630746481 -0.3072900556028819 0 0 -958 0.3131542024557855 0.01284051420889979 0 0 -959 -0.01284051420889975 0.3131542024557855 0 0 -960 -0.3131542024557855 -0.01284051420889972 0 0 -961 0.01284051420889974 -0.3131542024557855 0 0 -962 -0.3053584399451508 0.1950230985353736 0 0 -963 -0.1950230985353737 -0.3053584399451507 0 0 -964 0.3053584399451427 -0.1950230985353764 0 0 -965 0.1950230985353766 0.3053584399451427 0 0 -966 -0.4656058405015313 0.09927131173436782 0 0 -967 -0.4748928937205057 0.119350282943202 0 0 -968 -0.09927131173436787 -0.4656058405015314 0 0 -969 -0.1193502829432021 -0.4748928937205057 0 0 -970 0.4656058405015317 -0.09927131173436739 0 0 -971 0.474892893720506 -0.1193502829432027 0 0 -972 0.09927131173436739 0.4656058405015317 0 0 -973 0.1193502829432028 0.4748928937205059 0 0 -974 -0.478234976920346 0.08076376786601139 0 0 -975 -0.4438408174218774 0.08003507959926828 0 0 -976 -0.0807637678660115 -0.4782349769203461 0 0 -977 -0.08003507959926845 -0.4438408174218775 0 0 -978 0.08076376786601085 0.4782349769203463 0 0 -979 0.08003507959926731 0.443840817421878 0 0 -980 0.4782349769203464 -0.08076376786601105 0 0 -981 0.4438408174218781 -0.08003507959926752 0 0 -982 -0.0378195578820192 -0.452807331957565 0 0 -983 -0.02342704216294274 -0.4276572886639013 0 0 -984 0.4528073319575653 -0.03781955788201889 0 0 -985 0.4276572886639015 -0.0234270421629425 0 0 -986 -0.4528073319575648 0.03781955788201884 0 0 -987 -0.4276572886639013 0.02342704216294244 0 0 -988 0.03781955788201834 0.4528073319575652 0 0 -989 0.02342704216294205 0.4276572886639015 0 0 -990 0.2159813652366618 -0.2886474464842351 0 0 -991 0.2886474464842351 0.2159813652366618 0 0 -992 -0.215981365236635 0.288647446484247 0 0 -993 -0.2886474464842471 -0.2159813652366351 0 0 -994 0.4503429396700994 0.3678819353074567 0 0 -995 0.4747555980605305 0.3508093841187638 0 0 -996 0.3678819353074568 -0.4503429396700995 0 0 -997 0.3508093841187638 -0.4747555980605305 0 0 -998 -0.3678819353074485 0.450342939670108 0 0 -999 -0.3508093841187595 0.4747555980605317 0 0 -1000 -0.450342939670108 -0.3678819353074486 0 0 -1001 -0.4747555980605318 -0.3508093841187595 0 0 -1002 -0.334517271386127 0.1522121152022273 0 0 -1003 -0.3637220825132455 0.1682669647676229 0 0 -1004 -0.1522121152022274 -0.3345172713861269 0 0 -1005 -0.168266964767623 -0.3637220825132454 0 0 -1006 0.1522121152022367 0.3345172713861234 0 0 -1007 0.1682669647676326 0.3637220825132434 0 0 -1008 0.3345172713861235 -0.1522121152022365 0 0 -1009 0.3637220825132436 -0.1682669647676324 0 0 -1010 -0.321122881044292 0.2609904493379671 0 0 -1011 -0.3311367278713108 0.2333423915562405 0 0 -1012 -0.2609904493379673 -0.3211228810442919 0 0 -1013 -0.2333423915562407 -0.3311367278713108 0 0 -1014 0.3211228810443005 -0.2609904493379481 0 0 -1015 0.3311367278713048 -0.2333423915562345 0 0 -1016 0.2609904493379482 0.3211228810443003 0 0 -1017 0.2333423915562347 0.3311367278713047 0 0 -1018 0.236004869617981 -0.4426907328622258 0 0 -1019 0.2215459581177686 -0.475637577273906 0 0 -1020 0.4426907328622258 0.2360048696179807 0 0 -1021 0.475637577273906 0.2215459581177684 0 0 -1022 -0.2360048696179516 0.4426907328622277 0 0 -1023 -0.2215459581177501 0.4756375772739075 0 0 -1024 -0.4426907328622277 -0.2360048696179518 0 0 -1025 -0.4756375772739075 -0.2215459581177502 0 0 -1026 0.3547578899402967 -0.4232132319752183 0 0 -1027 0.3469525033626841 -0.3956901699535277 0 0 -1028 0.4232132319752183 0.3547578899402966 0 0 -1029 0.3956901699535278 0.346952503362684 0 0 -1030 -0.4232132319752261 -0.3547578899402813 0 0 -1031 -0.3956901699535363 -0.3469525033626599 0 0 -1032 -0.3547578899402813 0.423213231975226 0 0 -1033 -0.3469525033626598 0.3956901699535362 0 0 -1034 -0.02372245668387787 -0.4745723550372188 0 0 -1035 0.474572355037219 -0.023722456683878 0 0 -1036 -0.4745723550372188 0.02372245668387761 0 0 -1037 0.02372245668387765 0.4745723550372189 0 0 -1038 0.316289951405711 -0.176809162509678 0 0 -1039 0.1768091625096782 0.3162899514057109 0 0 -1040 -0.3162899514057157 0.17680916250967 0 0 -1041 -0.1768091625096701 -0.3162899514057156 0 0 -1042 -0.3829497468186459 -0.4707226478711724 0 0 -1043 -0.4162830801518865 -0.4707226478711724 0 0 -1044 -0.4707226478711724 0.3829497468186459 0 0 -1045 -0.4707226478711724 0.4162830801518866 0 0 -1046 0.4707226478711765 -0.3829497468186393 0 0 -1047 0.4707226478711765 -0.41628308015188 0 0 -1048 0.3829497468186392 0.4707226478711763 0 0 -1049 0.4162830801518799 0.4707226478711763 0 0 -1050 -0.1258892560230409 0.4157450093651088 0 0 -1051 -0.4157450093651088 -0.1258892560230411 0 0 -1052 0.4157450093651166 0.1258892560230482 0 0 -1053 0.1258892560230482 -0.4157450093651166 0 0 -1054 -0.08569344870710238 -0.4125699554175985 0 0 -1055 -0.4125699554175984 0.08569344870710227 0 0 -1056 0.4125699554175986 -0.08569344870710137 0 0 -1057 0.08569344870710137 0.4125699554175986 0 0 -1058 -0.2287039962676981 0.3852687692919289 0 0 -1059 -0.2450300409095607 0.3947285142809695 0 0 -1060 -0.3852687692919291 -0.2287039962676982 0 0 -1061 -0.3947285142809697 -0.2450300409095607 0 0 -1062 0.2287039962677259 -0.3852687692919303 0 0 -1063 0.2450300409095854 -0.394728514280971 0 0 -1064 0.3852687692919303 0.2287039962677258 0 0 -1065 0.394728514280971 0.2450300409095851 0 0 -1066 -0.1510169932692684 0.4020633535832008 0 0 -1067 -0.4020633535832008 -0.1510169932692687 0 0 -1068 0.4020633535832272 0.1510169932692862 0 0 -1069 0.1510169932692863 -0.4020633535832274 0 0 -1070 -0.3585964182243185 0.2328657128230038 0 0 -1071 -0.3637998190399957 0.2626355523339767 0 0 -1072 -0.3787145607991599 0.2424700331804524 0 0 -1073 -0.2328657128230041 -0.3585964182243184 0 0 -1074 -0.262635552333977 -0.3637998190399955 0 0 -1075 -0.2424700331804526 -0.3787145607991598 0 0 -1076 0.3585964182243148 -0.2328657128230038 0 0 -1077 0.3637998190399878 -0.2626355523339631 0 0 -1078 0.3787145607991497 -0.2424700331804492 0 0 -1079 0.232865712823004 0.3585964182243145 0 0 -1080 0.2626355523339633 0.3637998190399873 0 0 -1081 0.2424700331804494 0.3787145607991493 0 0 -1082 -0.2419704210430664 0.4194119590791586 0 0 -1083 -0.4194119590791587 -0.2419704210430665 0 0 -1084 0.2419704210430905 -0.4194119590791611 0 0 -1085 0.4194119590791611 0.2419704210430902 0 0 -1086 0.4771477786240345 0.05278732394957227 0 0 -1087 0.05278732394957234 -0.4771477786240346 0 0 -1088 -0.052787323949572 0.4771477786240344 0 0 -1089 -0.4771477786240344 -0.05278732394957226 0 0 -1090 -0.3984842069159652 0.2562778092341114 0 0 -1091 -0.2562778092341115 -0.3984842069159651 0 0 -1092 0.3984842069159635 -0.2562778092341035 0 0 -1093 0.2562778092341038 0.398484206915963 0 0 -1094 -0.44840357963823 0.4272973452522462 0 0 -1095 -0.4272973452522461 -0.44840357963823 0 0 -1096 0.4484035796382212 -0.4272973452522266 0 0 -1097 0.4272973452522264 0.4484035796382209 0 0 -1098 0.2853417817932803 0.407617843903617 0 0 -1099 0.2693797183359754 0.422184089204758 0 0 -1100 0.4076178439036174 -0.2853417817932801 0 0 -1101 0.4221840892047581 -0.2693797183359751 0 0 -1102 -0.4076178439036213 0.2853417817932944 0 0 -1103 -0.4221840892047494 0.2693797183359804 0 0 -1104 -0.2853417817932945 -0.4076178439036212 0 0 -1105 -0.2693797183359806 -0.4221840892047494 0 0 -1106 -0.2992218454478596 -0.4656588630962027 0 0 -1107 -0.3207977910894388 -0.4437581625966115 0 0 -1108 -0.3215759456421349 -0.4780992995004088 0 0 -1109 -0.4656588630962027 0.2992218454478595 0 0 -1110 -0.4437581625966115 0.3207977910894387 0 0 -1111 -0.4780992995004088 0.3215759456421349 0 0 -1112 0.4656588630962061 -0.2992218454478537 0 0 -1113 0.443758162596618 -0.3207977910894284 0 0 -1114 0.478099299500412 -0.3215759456421303 0 0 -1115 0.2992218454478537 0.465658863096206 0 0 -1116 0.3207977910894284 0.4437581625966179 0 0 -1117 0.3215759456421303 0.478099299500412 0 0 -1118 -0.3549092789753757 -0.4780992995004088 0 0 -1119 -0.3711923591269843 -0.4488219473715812 0 0 -1120 -0.4780992995004088 0.3549092789753756 0 0 -1121 -0.4488219473715812 0.3711923591269843 0 0 -1122 0.478099299500412 -0.3549092789753711 0 0 -1123 0.4488219473715884 -0.3711923591269732 0 0 -1124 0.3549092789753711 0.478099299500412 0 0 -1125 0.3711923591269731 0.4488219473715883 0 0 -1126 -0.3437525361458542 0.2753220538314527 0 0 -1127 -0.2753220538314528 -0.3437525361458542 0 0 -1128 0.3437525361458564 -0.2753220538314392 0 0 -1129 0.2753220538314393 0.3437525361458561 0 0 -1130 0.4776809317671057 0.4776809317670445 0 0 -1131 0.4776809317670447 -0.4776809317671059 0 0 -1132 -0.4776809317671188 -0.4776809317670576 0 0 -1133 -0.4776809317670576 0.4776809317671188 0 0 -1134 0.444347598433865 0.4776809317670445 0 0 -1135 0.4776809317670447 -0.4443475984338652 0 0 -1136 -0.4443475984338781 -0.4776809317670576 0 0 -1137 -0.4776809317670576 0.4443475984338781 0 0 -1138 0.3295232907380251 -0.1954396151102528 0 0 -1139 0.195439615110253 0.329523290738025 0 0 -1140 -0.3295232907380322 0.1954396151102492 0 0 -1141 -0.1954396151102494 -0.3295232907380322 0 0 -1142 -0.2785237338915987 -0.4789649679574057 0 0 -1143 -0.4789649679574057 0.2785237338915987 0 0 -1144 0.4789649679574081 -0.2785237338915955 0 0 -1145 0.2785237338915955 0.4789649679574081 0 0 -1146 -0.2777455793389028 -0.4446238310536084 0 0 -1147 -0.4446238310536085 0.2777455793389026 0 0 -1148 0.4446238310536141 -0.2777455793388935 0 0 -1149 0.2777455793388937 0.4446238310536141 0 0 -1150 -0.1526836162764429 -0.4748928937205057 0 0 -1151 -0.4748928937205057 0.1526836162764428 0 0 -1152 0.1526836162764436 0.4748928937205059 0 0 -1153 0.474892893720506 -0.1526836162764434 0 0 -1154 -0.4197738496308714 0.3249299813903616 0 0 -1155 -0.4083399730385547 0.3063339984536224 0 0 -1156 -0.3967960964770207 0.3328202889488205 0 0 -1157 -0.3249299813903617 -0.4197738496308715 0 0 -1158 -0.3063339984536225 -0.4083399730385547 0 0 -1159 -0.3328202889488205 -0.3967960964770207 0 0 -1160 0.3249299813903455 0.4197738496308834 0 0 -1161 0.3063339984536088 0.4083399730385593 0 0 -1162 0.3328202889488023 0.3967960964770306 0 0 -1163 0.4197738496308835 -0.3249299813903454 0 0 -1164 0.4083399730385595 -0.3063339984536086 0 0 -1165 0.3967960964770309 -0.3328202889488023 0 0 -1166 -0.478234976920346 0.04743043453277063 0 0 -1167 -0.04743043453277074 -0.4782349769203461 0 0 -1168 0.04743043453277009 0.4782349769203463 0 0 -1169 0.4782349769203464 -0.04743043453277029 0 0 -1170 -0.3472840815846369 -0.4322142860350776 0 0 -1171 -0.4322142860350775 0.3472840815846369 0 0 -1172 0.4322142860350894 -0.347284081584622 0 0 -1173 0.347284081584622 0.4322142860350893 0 0 -1174 0.4771477786240345 0.08612065728299802 0 0 -1175 0.08612065728299809 -0.4771477786240346 0 0 -1176 -0.4771477786240344 -0.086120657282998 0 0 -1177 -0.08612065728299775 0.4771477786240344 0 0 -1178 0.424455670565077 -0.002603558860055541 0 0 -1179 0.002603558860055066 0.4244556705650771 0 0 -1180 -0.002603558860055593 -0.4244556705650772 0 0 -1181 -0.4244556705650773 0.002603558860055304 0 0 -1182 0.3460514696304667 -0.2131768724027205 0 0 -1183 0.3569829810910351 -0.1949629363770221 0 0 -1184 0.2131768724027208 0.3460514696304666 0 0 -1185 0.1949629363770223 0.3569829810910349 0 0 -1186 -0.3460514696304751 0.2131768724027162 0 0 -1187 -0.3569829810910399 0.1949629363770126 0 0 -1188 -0.2131768724027164 -0.346051469630475 0 0 -1189 -0.1949629363770128 -0.3569829810910398 0 0 -1190 0.4190143970961508 0.02091978757372832 0 0 -1191 -0.02091978757372862 0.419014397096151 0 0 -1192 0.02091978757372823 -0.4190143970961513 0 0 -1193 -0.4190143970961513 -0.02091978757372849 0 0 -1194 0.3694993720940769 -0.3318055778171387 0 0 -1195 0.3645928078556334 -0.305918590849213 0 0 -1196 0.3318055778171388 0.3694993720940767 0 0 -1197 0.3059185908492131 0.3645928078556331 0 0 -1198 -0.3694993720940713 0.331805577817155 0 0 -1199 -0.3645928078556291 0.3059185908492292 0 0 -1200 -0.3318055778171551 -0.3694993720940714 0 0 -1201 -0.3059185908492293 -0.3645928078556291 0 0 -1202 0.2932320893517371 0.3846400907497644 0 0 -1203 0.3846400907497649 -0.293232089351737 0 0 -1204 -0.2932320893517534 -0.3846400907497705 0 0 -1205 -0.3846400907497706 0.2932320893517534 0 0 -1206 0.3809332486864008 -0.3504015607538755 0 0 -1207 0.3504015607538755 0.3809332486864008 0 0 -1208 -0.380933248686388 0.3504015607538942 0 0 -1209 -0.3504015607538943 -0.3809332486863881 0 0 -1210 -0.2157241343280226 0.4279963807647459 0 0 -1211 -0.427996380764746 -0.2157241343280227 0 0 -1212 0.2157241343280542 -0.4279963807647472 0 0 -1213 0.4279963807647473 0.215724134328054 0 0 -1214 0.3641001013064044 -0.3731510587257937 0 0 -1215 0.3731510587257938 0.3641001013064044 0 0 -1216 -0.3641001013063892 0.3731510587258087 0 0 -1217 -0.3731510587258087 -0.3641001013063894 0 0 -1218 0.1609327094719452 -0.380294419101002 0 0 -1219 0.3802944191010019 0.160932709471945 0 0 -1220 -0.1609327094719256 0.380294419100991 0 0 -1221 -0.3802944191009911 -0.1609327094719258 0 0 -1222 -0.1943969028839097 0.4113344764777339 0 0 -1223 -0.411334476477734 -0.1943969028839098 0 0 -1224 0.4113344764777556 0.1943969028839336 0 0 -1225 0.1943969028839338 -0.4113344764777557 0 0 -1226 0.09322110033584177 0.3923405611635517 0 0 -1227 0.3923405611635518 -0.09322110033584172 0 0 -1228 -0.3923405611635521 0.09322110033584027 0 0 -1229 -0.09322110033584038 -0.3923405611635521 0 0 -1230 0.3638706787206913 -0.2849263741888845 0 0 -1231 0.2849263741888847 0.3638706787206908 0 0 -1232 -0.3638706787206957 0.2849263741889013 0 0 -1233 -0.2849263741889014 -0.3638706787206956 0 0 -1234 0.1770198362173627 -0.3961824114916034 0 0 -1235 0.3961824114916032 0.1770198362173626 0 0 -1236 -0.3961824114915814 -0.1770198362173394 0 0 -1237 -0.1770198362173391 0.3961824114915813 0 0 -1238 0.03140515171423447 -0.3971061717926164 0 0 -1239 -0.3971061717926161 -0.03140515171423482 0 0 -1240 0.3971061717926159 0.03140515171423447 0 0 -1241 -0.0314051517142349 0.3971061717926159 0 0 -1242 -0.2043126190865668 0.3895655419955242 0 0 -1243 -0.3895655419955243 -0.204312619086567 0 0 -1244 0.3895655419955303 0.2043126190865925 0 0 -1245 0.2043126190865927 -0.3895655419955303 0 0 -$EndNodes -$Elements -636 -7030 9 11 6 144 190 278 438 439 440 -7031 9 11 6 145 191 280 441 442 443 -7032 9 11 6 143 193 284 444 445 446 -7033 9 11 6 142 192 282 447 448 449 -7034 9 11 6 110 262 289 450 451 452 -7035 9 11 6 111 263 288 453 454 455 -7036 9 11 6 113 264 287 456 457 458 -7037 9 11 6 112 265 286 459 460 461 -7038 9 11 6 145 274 183 462 463 464 -7039 9 11 6 144 275 182 465 466 467 -7040 9 11 6 142 276 184 468 469 470 -7041 9 11 6 143 277 185 471 472 473 -7042 9 11 6 144 248 190 474 475 438 -7043 9 11 6 145 249 191 476 477 441 -7044 9 11 6 143 246 193 478 479 444 -7045 9 11 6 142 247 192 480 481 447 -7046 9 11 6 158 288 263 482 454 483 -7047 9 11 6 159 289 262 484 451 485 -7048 9 11 6 160 287 264 486 457 487 -7049 9 11 6 161 286 265 488 460 489 -7050 9 11 6 145 281 274 490 491 462 -7051 9 11 6 144 279 275 492 493 465 -7052 9 11 6 142 283 276 494 495 468 -7053 9 11 6 143 285 277 496 497 471 -7054 9 11 6 127 163 207 498 499 500 -7055 9 11 6 126 162 206 501 502 503 -7056 9 11 6 129 164 209 504 505 506 -7057 9 11 6 128 165 208 507 508 509 -7058 9 11 6 47 148 214 510 511 512 -7059 9 11 6 61 149 215 513 514 515 -7060 9 11 6 33 147 217 516 517 518 -7061 9 11 6 19 146 216 519 520 521 -7062 9 11 6 89 90 182 424 522 523 -7063 9 11 6 80 81 183 414 524 525 -7064 9 11 6 98 99 185 434 526 527 -7065 9 11 6 71 72 184 404 528 529 -7066 9 11 6 90 248 182 530 531 522 -7067 9 11 6 81 249 183 532 533 524 -7068 9 11 6 99 246 185 534 535 526 -7069 9 11 6 72 247 184 536 537 528 -7070 9 11 6 107 164 276 538 539 540 -7071 9 11 6 106 165 277 541 542 543 -7072 9 11 6 108 162 275 544 545 546 -7073 9 11 6 109 163 274 547 548 549 -7074 9 11 6 115 280 191 550 442 551 -7075 9 11 6 114 278 190 552 439 553 -7076 9 11 6 117 284 193 554 445 555 -7077 9 11 6 116 282 192 556 448 557 -7078 9 11 6 126 275 162 558 545 501 -7079 9 11 6 127 274 163 559 548 498 -7080 9 11 6 129 276 164 560 539 504 -7081 9 11 6 128 277 165 561 542 507 -7082 9 11 6 113 201 264 562 563 456 -7083 9 11 6 112 200 265 564 565 459 -7084 9 11 6 110 199 262 566 567 450 -7085 9 11 6 111 198 263 568 569 453 -7086 9 11 6 102 207 163 570 499 571 -7087 9 11 6 103 206 162 572 502 573 -7088 9 11 6 105 208 165 574 508 575 -7089 9 11 6 104 209 164 576 505 577 -7090 9 11 6 48 49 168 379 578 579 -7091 9 11 6 62 63 169 394 580 581 -7092 9 11 6 34 35 166 364 582 583 -7093 9 11 6 20 21 167 349 584 585 -7094 9 11 6 50 51 180 381 586 587 -7095 9 11 6 64 65 181 396 588 589 -7096 9 11 6 36 37 178 366 590 591 -7097 9 11 6 22 23 179 351 592 593 -7098 9 11 6 47 242 148 594 595 510 -7099 9 11 6 61 243 149 596 597 513 -7100 9 11 6 33 244 147 598 599 516 -7101 9 11 6 19 245 146 600 601 519 -7102 9 11 6 94 95 171 430 602 603 -7103 9 11 6 67 68 170 400 604 605 -7104 9 11 6 76 77 172 410 606 607 -7105 9 11 6 85 86 173 420 608 609 -7106 9 11 6 63 241 169 610 611 580 -7107 9 11 6 49 240 168 612 613 578 -7108 9 11 6 35 239 166 614 615 582 -7109 9 11 6 21 238 167 616 617 584 -7110 9 11 6 125 169 241 618 611 619 -7111 9 11 6 124 168 240 620 613 621 -7112 9 11 6 123 166 239 622 615 623 -7113 9 11 6 122 167 238 624 617 625 -7114 9 11 6 112 222 200 626 627 564 -7115 9 11 6 113 223 201 628 629 562 -7116 9 11 6 111 224 198 630 631 568 -7117 9 11 6 110 225 199 632 633 566 -7118 9 11 6 13 198 294 634 635 636 -7119 9 11 6 55 199 295 637 638 639 -7120 9 11 6 27 201 296 640 641 642 -7121 9 11 6 41 200 297 643 644 645 -7122 9 11 6 126 186 235 646 647 648 -7123 9 11 6 127 187 234 649 650 651 -7124 9 11 6 128 189 236 652 653 654 -7125 9 11 6 129 188 237 655 656 657 -7126 9 11 6 115 334 310 658 659 660 -7127 9 11 6 114 335 311 661 662 663 -7128 9 11 6 116 336 312 664 665 666 -7129 9 11 6 117 337 313 667 668 669 -7130 9 11 6 127 207 187 500 670 649 -7131 9 11 6 126 206 186 503 671 646 -7132 9 11 6 128 208 189 509 672 652 -7133 9 11 6 129 209 188 506 673 655 -7134 9 11 6 78 79 187 412 674 675 -7135 9 11 6 87 88 186 422 676 677 -7136 9 11 6 96 97 189 432 678 679 -7137 9 11 6 69 70 188 402 680 681 -7138 9 11 6 91 92 190 426 682 683 -7139 9 11 6 82 83 191 416 684 685 -7140 9 11 6 73 74 192 406 686 687 -7141 9 11 6 100 101 193 436 688 689 -7142 9 11 6 150 314 196 690 691 692 -7143 9 11 6 151 315 197 693 694 695 -7144 9 11 6 152 316 194 696 697 698 -7145 9 11 6 153 317 195 699 700 701 -7146 9 11 6 68 211 170 702 703 604 -7147 9 11 6 95 210 171 704 705 602 -7148 9 11 6 77 212 172 706 707 606 -7149 9 11 6 86 213 173 708 709 608 -7150 9 11 6 109 251 163 710 711 547 -7151 9 11 6 108 250 162 712 713 544 -7152 9 11 6 107 252 164 714 715 538 -7153 9 11 6 106 253 165 716 717 541 -7154 9 11 6 140 200 222 718 627 719 -7155 9 11 6 141 201 223 720 629 721 -7156 9 11 6 139 198 224 722 631 723 -7157 9 11 6 138 199 225 724 633 725 -7158 9 11 6 55 56 199 387 726 637 -7159 9 11 6 13 14 198 342 727 634 -7160 9 11 6 27 28 201 357 728 640 -7161 9 11 6 41 42 200 372 729 643 -7162 9 11 6 157 196 322 730 731 732 -7163 9 11 6 155 195 324 733 734 735 -7164 9 11 6 156 197 323 736 737 738 -7165 9 11 6 154 194 325 739 740 741 -7166 9 11 6 103 162 226 573 742 743 -7167 9 11 6 102 163 227 571 744 745 -7168 9 11 6 105 165 229 575 746 747 -7169 9 11 6 104 164 228 577 748 749 -7170 9 11 6 144 182 248 467 531 474 -7171 9 11 6 145 183 249 464 533 476 -7172 9 11 6 143 185 246 473 535 478 -7173 9 11 6 142 184 247 470 537 480 -7174 9 11 6 76 172 304 607 750 751 -7175 9 11 6 85 173 305 609 752 753 -7176 9 11 6 67 170 302 605 754 755 -7177 9 11 6 94 171 303 603 756 757 -7178 9 11 6 51 301 180 758 759 586 -7179 9 11 6 65 300 181 760 761 588 -7180 9 11 6 23 299 179 762 763 592 -7181 9 11 6 37 298 178 764 765 590 -7182 9 11 6 132 189 208 766 672 767 -7183 9 11 6 133 188 209 768 673 769 -7184 9 11 6 130 186 206 770 671 771 -7185 9 11 6 131 187 207 772 670 773 -7186 9 11 6 69 188 211 681 774 775 -7187 9 11 6 96 189 210 679 776 777 -7188 9 11 6 87 186 213 677 778 779 -7189 9 11 6 78 187 212 675 780 781 -7190 9 11 6 110 289 170 452 782 783 -7191 9 11 6 111 288 171 455 784 785 -7192 9 11 6 112 286 172 461 786 787 -7193 9 11 6 113 287 173 458 788 789 -7194 9 11 6 138 295 199 790 638 724 -7195 9 11 6 139 294 198 791 635 722 -7196 9 11 6 141 296 201 792 641 720 -7197 9 11 6 140 297 200 793 644 718 -7198 9 11 6 121 314 271 794 795 796 -7199 9 11 6 120 315 270 797 798 799 -7200 9 11 6 119 317 272 800 801 802 -7201 9 11 6 118 316 273 803 804 805 -7202 9 11 6 332 220 136 806 807 808 -7203 9 11 6 333 221 137 809 810 811 -7204 9 11 6 331 218 134 812 813 814 -7205 9 11 6 330 219 135 815 816 817 -7206 9 11 6 151 170 289 818 782 819 -7207 9 11 6 150 171 288 820 784 821 -7208 9 11 6 152 172 286 822 786 823 -7209 9 11 6 153 173 287 824 788 825 -7210 9 11 6 121 196 314 826 691 794 -7211 9 11 6 120 197 315 827 694 797 -7212 9 11 6 118 194 316 828 697 803 -7213 9 11 6 119 195 317 829 700 800 -7214 9 11 6 176 312 336 830 665 831 -7215 9 11 6 177 313 337 832 668 833 -7216 9 11 6 174 310 334 834 659 835 -7217 9 11 6 175 311 335 836 662 837 -7218 9 11 6 79 234 187 838 650 674 -7219 9 11 6 88 235 186 839 647 676 -7220 9 11 6 97 236 189 840 653 678 -7221 9 11 6 70 237 188 841 656 680 -7222 9 11 6 6 75 194 408 842 843 -7223 9 11 6 7 84 195 418 844 845 -7224 9 11 6 5 66 197 398 846 847 -7225 9 11 6 8 93 196 428 848 849 -7226 9 11 6 180 220 332 850 806 851 -7227 9 11 6 181 221 333 852 809 853 -7228 9 11 6 178 218 331 854 812 855 -7229 9 11 6 179 219 330 856 815 857 -7230 9 11 6 123 227 163 858 744 859 -7231 9 11 6 122 226 162 860 742 861 -7232 9 11 6 124 228 164 862 748 863 -7233 9 11 6 125 229 165 864 746 865 -7234 9 11 6 89 182 235 523 866 867 -7235 9 11 6 80 183 234 525 868 869 -7236 9 11 6 71 184 237 529 870 871 -7237 9 11 6 98 185 236 527 872 873 -7238 9 11 6 73 192 247 687 481 874 -7239 9 11 6 100 193 246 689 479 875 -7240 9 11 6 91 190 248 683 475 876 -7241 9 11 6 82 191 249 685 477 877 -7242 9 11 6 121 322 196 878 731 826 -7243 9 11 6 120 323 197 879 737 827 -7244 9 11 6 118 325 194 880 740 828 -7245 9 11 6 119 324 195 881 734 829 -7246 9 11 6 83 306 191 882 883 684 -7247 9 11 6 92 308 190 884 885 682 -7248 9 11 6 74 307 192 886 887 686 -7249 9 11 6 101 309 193 888 889 688 -7250 9 11 6 31 174 231 890 891 892 -7251 9 11 6 17 175 233 893 894 895 -7252 9 11 6 45 176 232 896 897 898 -7253 9 11 6 59 177 230 899 900 901 -7254 9 11 6 109 274 281 549 491 902 -7255 9 11 6 108 275 279 546 493 903 -7256 9 11 6 107 276 283 540 495 904 -7257 9 11 6 106 277 285 543 497 905 -7258 9 11 6 115 310 217 660 906 907 -7259 9 11 6 114 311 216 663 908 909 -7260 9 11 6 116 312 214 666 910 911 -7261 9 11 6 117 313 215 669 912 913 -7262 9 11 6 123 251 166 914 915 622 -7263 9 11 6 122 250 167 916 917 624 -7264 9 11 6 125 253 169 918 919 618 -7265 9 11 6 124 252 168 920 921 620 -7266 9 11 6 46 47 214 377 512 922 -7267 9 11 6 18 19 216 347 521 923 -7268 9 11 6 60 61 215 392 515 924 -7269 9 11 6 32 33 217 362 518 925 -7270 9 11 6 152 304 172 926 750 822 -7271 9 11 6 153 305 173 927 752 824 -7272 9 11 6 150 303 171 928 756 820 -7273 9 11 6 151 302 170 929 754 818 -7274 9 11 6 155 334 191 930 931 932 -7275 9 11 6 157 335 190 933 934 935 -7276 9 11 6 154 336 192 936 937 938 -7277 9 11 6 156 337 193 939 940 941 -7278 9 11 6 155 191 306 932 883 942 -7279 9 11 6 157 190 308 935 885 943 -7280 9 11 6 154 192 307 938 887 944 -7281 9 11 6 156 193 309 941 889 945 -7282 9 11 6 150 196 303 692 946 928 -7283 9 11 6 151 197 302 695 947 929 -7284 9 11 6 152 194 304 698 948 926 -7285 9 11 6 153 195 305 701 949 927 -7286 9 11 6 157 308 196 943 950 730 -7287 9 11 6 155 306 195 942 951 733 -7288 9 11 6 154 307 194 944 952 739 -7289 9 11 6 156 309 197 945 953 736 -7290 9 11 6 75 304 194 954 948 842 -7291 9 11 6 84 305 195 955 949 844 -7292 9 11 6 66 302 197 956 947 846 -7293 9 11 6 93 303 196 957 946 848 -7294 9 11 6 7 195 306 845 951 958 -7295 9 11 6 6 194 307 843 952 959 -7296 9 11 6 5 197 309 847 953 960 -7297 9 11 6 8 196 308 849 950 961 -7298 9 11 6 133 211 188 962 774 768 -7299 9 11 6 132 210 189 963 776 766 -7300 9 11 6 130 213 186 964 778 770 -7301 9 11 6 131 212 187 965 780 772 -7302 9 11 6 57 159 262 966 485 967 -7303 9 11 6 15 158 263 968 483 969 -7304 9 11 6 29 160 264 970 487 971 -7305 9 11 6 43 161 265 972 489 973 -7306 9 11 6 57 270 159 974 975 966 -7307 9 11 6 15 271 158 976 977 968 -7308 9 11 6 43 273 161 978 979 972 -7309 9 11 6 29 272 160 980 981 970 -7310 9 11 6 121 271 233 796 982 983 -7311 9 11 6 119 272 231 802 984 985 -7312 9 11 6 120 270 230 799 986 987 -7313 9 11 6 118 273 232 805 988 989 -7314 9 11 6 126 235 182 648 866 990 -7315 9 11 6 127 234 183 651 868 991 -7316 9 11 6 129 237 184 657 870 992 -7317 9 11 6 128 236 185 654 872 993 -7318 9 11 6 36 178 239 591 994 995 -7319 9 11 6 22 179 238 593 996 997 -7320 9 11 6 50 180 240 587 998 999 -7321 9 11 6 64 181 241 589 1000 1001 -7322 9 11 6 122 162 250 861 713 916 -7323 9 11 6 123 163 251 859 711 914 -7324 9 11 6 125 165 253 865 717 918 -7325 9 11 6 124 164 252 863 715 920 -7326 9 11 6 110 170 255 783 1002 1003 -7327 9 11 6 111 171 254 785 1004 1005 -7328 9 11 6 112 172 256 787 1006 1007 -7329 9 11 6 113 173 257 789 1008 1009 -7330 9 11 6 133 209 258 769 1010 1011 -7331 9 11 6 132 208 259 767 1012 1013 -7332 9 11 6 130 206 261 771 1014 1015 -7333 9 11 6 131 207 260 773 1016 1017 -7334 9 11 6 20 167 245 585 1018 1019 -7335 9 11 6 34 166 244 583 1020 1021 -7336 9 11 6 48 168 242 579 1022 1023 -7337 9 11 6 62 169 243 581 1024 1025 -7338 9 11 6 122 238 330 625 1026 1027 -7339 9 11 6 123 239 331 623 1028 1029 -7340 9 11 6 125 241 333 619 1030 1031 -7341 9 11 6 124 240 332 621 1032 1033 -7342 9 11 6 16 17 233 345 895 1034 -7343 9 11 6 30 31 231 360 892 1035 -7344 9 11 6 58 59 230 390 901 1036 -7345 9 11 6 44 45 232 375 898 1037 -7346 9 11 6 115 191 334 551 931 658 -7347 9 11 6 114 190 335 553 934 661 -7348 9 11 6 116 192 336 557 937 664 -7349 9 11 6 117 193 337 555 940 667 -7350 9 11 6 178 331 239 855 1028 994 -7351 9 11 6 179 330 238 857 1026 996 -7352 9 11 6 180 332 240 851 1032 998 -7353 9 11 6 181 333 241 853 1030 1000 -7354 9 11 6 173 213 257 709 1038 1008 -7355 9 11 6 172 212 256 707 1039 1006 -7356 9 11 6 170 211 255 703 1040 1002 -7357 9 11 6 171 210 254 705 1041 1004 -7358 9 11 6 10 11 221 339 1042 1043 -7359 9 11 6 52 53 220 384 1044 1045 -7360 9 11 6 24 25 219 354 1046 1047 -7361 9 11 6 38 39 218 369 1048 1049 -7362 9 11 6 116 214 282 911 1050 556 -7363 9 11 6 117 215 284 913 1051 554 -7364 9 11 6 115 217 280 907 1052 550 -7365 9 11 6 114 216 278 909 1053 552 -7366 9 11 6 68 69 211 401 775 702 -7367 9 11 6 95 96 210 431 777 704 -7368 9 11 6 77 78 212 411 781 706 -7369 9 11 6 86 87 213 421 779 708 -7370 9 11 6 158 271 314 977 795 1054 -7371 9 11 6 159 270 315 975 798 1055 -7372 9 11 6 160 272 317 981 801 1056 -7373 9 11 6 161 273 316 979 804 1057 -7374 9 11 6 107 319 252 1058 1059 714 -7375 9 11 6 106 318 253 1060 1061 716 -7376 9 11 6 108 321 250 1062 1063 712 -7377 9 11 6 109 320 251 1064 1065 710 -7378 9 11 6 148 282 214 1066 1050 511 -7379 9 11 6 149 284 215 1067 1051 514 -7380 9 11 6 147 280 217 1068 1052 517 -7381 9 11 6 146 278 216 1069 1053 520 -7382 9 11 6 225 258 329 1070 1071 1072 -7383 9 11 6 224 259 328 1073 1074 1075 -7384 9 11 6 223 261 326 1076 1077 1078 -7385 9 11 6 222 260 327 1079 1080 1081 -7386 9 11 6 19 20 245 348 1019 600 -7387 9 11 6 33 34 244 363 1021 598 -7388 9 11 6 47 48 242 378 1023 594 -7389 9 11 6 61 62 243 393 1025 596 -7390 9 11 6 168 252 319 921 1059 1082 -7391 9 11 6 169 253 318 919 1061 1083 -7392 9 11 6 167 250 321 917 1063 1084 -7393 9 11 6 166 251 320 915 1065 1085 -7394 9 11 6 31 310 174 1086 834 890 -7395 9 11 6 17 311 175 1087 836 893 -7396 9 11 6 45 312 176 1088 830 896 -7397 9 11 6 59 313 177 1089 832 899 -7398 9 11 6 138 225 329 725 1072 1090 -7399 9 11 6 139 224 328 723 1075 1091 -7400 9 11 6 141 223 326 721 1078 1092 -7401 9 11 6 140 222 327 719 1081 1093 -7402 9 11 6 127 183 274 991 463 559 -7403 9 11 6 126 182 275 990 466 558 -7404 9 11 6 129 184 276 992 469 560 -7405 9 11 6 128 185 277 993 472 561 -7406 9 11 6 180 301 220 759 1094 850 -7407 9 11 6 181 300 221 761 1095 852 -7408 9 11 6 179 299 219 763 1096 856 -7409 9 11 6 178 298 218 765 1097 854 -7410 9 11 6 140 327 205 1093 1098 1099 -7411 9 11 6 141 326 204 1092 1100 1101 -7412 9 11 6 138 329 202 1090 1102 1103 -7413 9 11 6 139 328 203 1091 1104 1105 -7414 9 11 6 88 89 235 423 867 839 -7415 9 11 6 79 80 234 413 869 838 -7416 9 11 6 97 98 236 433 873 840 -7417 9 11 6 70 71 237 403 871 841 -7418 9 11 6 12 203 293 1106 1107 1108 -7419 9 11 6 54 202 292 1109 1110 1111 -7420 9 11 6 26 204 290 1112 1113 1114 -7421 9 11 6 40 205 291 1115 1116 1117 -7422 9 11 6 11 293 221 1118 1119 1042 -7423 9 11 6 53 292 220 1120 1121 1044 -7424 9 11 6 25 290 219 1122 1123 1046 -7425 9 11 6 39 291 218 1124 1125 1048 -7426 9 11 6 11 12 293 340 1108 1118 -7427 9 11 6 53 54 292 385 1111 1120 -7428 9 11 6 39 40 291 370 1117 1124 -7429 9 11 6 25 26 290 355 1114 1122 -7430 9 11 6 21 22 238 350 997 616 -7431 9 11 6 35 36 239 365 995 614 -7432 9 11 6 49 50 240 380 999 612 -7433 9 11 6 63 64 241 395 1001 610 -7434 9 11 6 104 258 209 1126 1010 576 -7435 9 11 6 105 259 208 1127 1012 574 -7436 9 11 6 103 261 206 1128 1014 572 -7437 9 11 6 102 260 207 1129 1016 570 -7438 9 11 6 3 298 37 1130 764 367 -7439 9 11 6 2 299 23 1131 762 352 -7440 9 11 6 1 300 65 1132 760 397 -7441 9 11 6 4 301 51 1133 758 382 -7442 9 11 6 3 38 298 368 1134 1130 -7443 9 11 6 2 24 299 353 1135 1131 -7444 9 11 6 1 10 300 338 1136 1132 -7445 9 11 6 4 52 301 383 1137 1133 -7446 9 11 6 130 257 213 1138 1038 964 -7447 9 11 6 131 256 212 1139 1039 965 -7448 9 11 6 133 255 211 1140 1040 962 -7449 9 11 6 132 254 210 1141 1041 963 -7450 9 11 6 99 100 246 435 875 534 -7451 9 11 6 72 73 247 405 874 536 -7452 9 11 6 90 91 248 425 876 530 -7453 9 11 6 81 82 249 415 877 532 -7454 9 11 6 12 13 294 341 636 1142 -7455 9 11 6 54 55 295 386 639 1143 -7456 9 11 6 26 27 296 356 642 1144 -7457 9 11 6 40 41 297 371 645 1145 -7458 9 11 6 12 294 203 1142 1146 1106 -7459 9 11 6 54 295 202 1143 1147 1109 -7460 9 11 6 26 296 204 1144 1148 1112 -7461 9 11 6 40 297 205 1145 1149 1115 -7462 9 11 6 14 15 263 343 969 1150 -7463 9 11 6 56 57 262 388 967 1151 -7464 9 11 6 42 43 265 373 973 1152 -7465 9 11 6 28 29 264 358 971 1153 -7466 9 11 6 136 202 268 1154 1155 1156 -7467 9 11 6 137 203 269 1157 1158 1159 -7468 9 11 6 134 205 267 1160 1161 1162 -7469 9 11 6 135 204 266 1163 1164 1165 -7470 9 11 6 57 58 270 389 1166 974 -7471 9 11 6 15 16 271 344 1167 976 -7472 9 11 6 43 44 273 374 1168 978 -7473 9 11 6 29 30 272 359 1169 980 -7474 9 11 6 137 221 293 810 1119 1170 -7475 9 11 6 136 220 292 807 1121 1171 -7476 9 11 6 135 219 290 816 1123 1172 -7477 9 11 6 134 218 291 813 1125 1173 -7478 9 11 6 31 32 310 361 1174 1086 -7479 9 11 6 17 18 311 346 1175 1087 -7480 9 11 6 59 60 313 391 1176 1089 -7481 9 11 6 45 46 312 376 1177 1088 -7482 9 11 6 138 202 295 1103 1147 790 -7483 9 11 6 139 203 294 1105 1146 791 -7484 9 11 6 140 205 297 1099 1149 793 -7485 9 11 6 141 204 296 1101 1148 792 -7486 9 11 6 137 293 203 1170 1107 1157 -7487 9 11 6 136 292 202 1171 1110 1154 -7488 9 11 6 135 290 204 1172 1113 1163 -7489 9 11 6 134 291 205 1173 1116 1160 -7490 9 11 6 119 231 324 985 1178 881 -7491 9 11 6 118 232 325 989 1179 880 -7492 9 11 6 121 233 322 983 1180 878 -7493 9 11 6 120 230 323 987 1181 879 -7494 9 11 6 14 263 198 1150 569 727 -7495 9 11 6 56 262 199 1151 567 726 -7496 9 11 6 42 265 200 1152 565 729 -7497 9 11 6 28 264 201 1153 563 728 -7498 9 11 6 75 76 304 409 751 954 -7499 9 11 6 84 85 305 419 753 955 -7500 9 11 6 66 67 302 399 755 956 -7501 9 11 6 93 94 303 429 757 957 -7502 9 11 6 7 306 83 958 882 417 -7503 9 11 6 6 307 74 959 886 407 -7504 9 11 6 8 308 92 961 884 427 -7505 9 11 6 5 309 101 960 888 437 -7506 9 11 6 130 223 257 1182 1183 1138 -7507 9 11 6 131 222 256 1184 1185 1139 -7508 9 11 6 133 225 255 1186 1187 1140 -7509 9 11 6 132 224 254 1188 1189 1141 -7510 9 11 6 130 261 223 1015 1076 1182 -7511 9 11 6 131 260 222 1017 1079 1184 -7512 9 11 6 132 259 224 1013 1073 1188 -7513 9 11 6 133 258 225 1011 1070 1186 -7514 9 11 6 174 324 231 1190 1178 891 -7515 9 11 6 176 325 232 1191 1179 897 -7516 9 11 6 175 322 233 1192 1180 894 -7517 9 11 6 177 323 230 1193 1181 900 -7518 9 11 6 103 226 266 743 1194 1195 -7519 9 11 6 102 227 267 745 1196 1197 -7520 9 11 6 104 228 268 749 1198 1199 -7521 9 11 6 105 229 269 747 1200 1201 -7522 9 11 6 111 254 224 1005 1189 630 -7523 9 11 6 110 255 225 1003 1187 632 -7524 9 11 6 112 256 222 1007 1185 626 -7525 9 11 6 113 257 223 1009 1183 628 -7526 9 11 6 205 327 267 1098 1202 1161 -7527 9 11 6 204 326 266 1100 1203 1164 -7528 9 11 6 203 328 269 1104 1204 1158 -7529 9 11 6 202 329 268 1102 1205 1155 -7530 9 11 6 135 266 226 1165 1194 1206 -7531 9 11 6 134 267 227 1162 1196 1207 -7532 9 11 6 136 268 228 1156 1198 1208 -7533 9 11 6 137 269 229 1159 1200 1209 -7534 9 11 6 168 319 242 1082 1210 1022 -7535 9 11 6 169 318 243 1083 1211 1024 -7536 9 11 6 167 321 245 1084 1212 1018 -7537 9 11 6 166 320 244 1085 1213 1020 -7538 9 11 6 38 218 298 1049 1097 1134 -7539 9 11 6 24 219 299 1047 1096 1135 -7540 9 11 6 52 220 301 1045 1094 1137 -7541 9 11 6 10 221 300 1043 1095 1136 -7542 9 11 6 135 226 330 1206 1214 817 -7543 9 11 6 134 227 331 1207 1215 814 -7544 9 11 6 136 228 332 1208 1216 808 -7545 9 11 6 137 229 333 1209 1217 811 -7546 9 11 6 58 230 270 1036 986 1166 -7547 9 11 6 16 233 271 1034 982 1167 -7548 9 11 6 44 232 273 1037 988 1168 -7549 9 11 6 30 231 272 1035 984 1169 -7550 9 11 6 32 217 310 925 906 1174 -7551 9 11 6 18 216 311 923 908 1175 -7552 9 11 6 46 214 312 922 910 1177 -7553 9 11 6 60 215 313 924 912 1176 -7554 9 11 6 123 331 227 1029 1215 858 -7555 9 11 6 122 330 226 1027 1214 860 -7556 9 11 6 124 332 228 1033 1216 862 -7557 9 11 6 125 333 229 1031 1217 864 -7558 9 11 6 144 278 279 440 1218 492 -7559 9 11 6 145 280 281 443 1219 490 -7560 9 11 6 142 282 283 449 1220 494 -7561 9 11 6 143 284 285 446 1221 496 -7562 9 11 6 148 242 319 595 1210 1222 -7563 9 11 6 149 243 318 597 1211 1223 -7564 9 11 6 147 244 320 599 1213 1224 -7565 9 11 6 146 245 321 601 1212 1225 -7566 9 11 6 152 286 316 823 1226 696 -7567 9 11 6 153 287 317 825 1227 699 -7568 9 11 6 151 289 315 819 1228 693 -7569 9 11 6 150 288 314 821 1229 690 -7570 9 11 6 103 266 326 1195 1203 1230 -7571 9 11 6 102 267 327 1197 1202 1231 -7572 9 11 6 104 268 329 1199 1205 1232 -7573 9 11 6 105 269 328 1201 1204 1233 -7574 9 11 6 103 326 261 1230 1077 1128 -7575 9 11 6 102 327 260 1231 1080 1129 -7576 9 11 6 104 329 258 1232 1071 1126 -7577 9 11 6 105 328 259 1233 1074 1127 -7578 9 11 6 146 279 278 1234 1218 1069 -7579 9 11 6 147 281 280 1235 1219 1068 -7580 9 11 6 149 285 284 1236 1221 1067 -7581 9 11 6 148 283 282 1237 1220 1066 -7582 9 11 6 157 322 335 732 1238 933 -7583 9 11 6 156 323 337 738 1239 939 -7584 9 11 6 155 324 334 735 1240 930 -7585 9 11 6 154 325 336 741 1241 936 -7586 9 11 6 107 283 319 904 1242 1058 -7587 9 11 6 106 285 318 905 1243 1060 -7588 9 11 6 109 281 320 902 1244 1064 -7589 9 11 6 108 279 321 903 1245 1062 -7590 9 11 6 146 321 279 1225 1245 1234 -7591 9 11 6 147 320 281 1224 1244 1235 -7592 9 11 6 148 319 283 1222 1242 1237 -7593 9 11 6 149 318 285 1223 1243 1236 -7594 9 11 6 160 317 287 1056 1227 486 -7595 9 11 6 161 316 286 1057 1226 488 -7596 9 11 6 158 314 288 1054 1229 482 -7597 9 11 6 159 315 289 1055 1228 484 -7598 9 11 6 177 337 323 833 1239 1193 -7599 9 11 6 175 335 322 837 1238 1192 -7600 9 11 6 174 334 324 835 1240 1190 -7601 9 11 6 176 336 325 831 1241 1191 -6930 8 1 3 1 10 338 -6931 8 1 3 10 11 339 -6932 8 1 3 11 12 340 -6933 8 1 3 12 13 341 -6934 8 1 3 13 14 342 -6935 8 1 3 14 15 343 -6936 8 1 3 15 16 344 -6937 8 1 3 16 17 345 -6938 8 1 3 17 18 346 -6939 8 1 3 18 19 347 -6940 8 1 3 19 20 348 -6941 8 1 3 20 21 349 -6942 8 1 3 21 22 350 -6943 8 1 3 22 23 351 -6944 8 1 3 23 2 352 -6945 8 2 3 2 24 353 -6946 8 2 3 24 25 354 -6947 8 2 3 25 26 355 -6948 8 2 3 26 27 356 -6949 8 2 3 27 28 357 -6950 8 2 3 28 29 358 -6951 8 2 3 29 30 359 -6952 8 2 3 30 31 360 -6953 8 2 3 31 32 361 -6954 8 2 3 32 33 362 -6955 8 2 3 33 34 363 -6956 8 2 3 34 35 364 -6957 8 2 3 35 36 365 -6958 8 2 3 36 37 366 -6959 8 2 3 37 3 367 -6960 8 3 3 3 38 368 -6961 8 3 3 38 39 369 -6962 8 3 3 39 40 370 -6963 8 3 3 40 41 371 -6964 8 3 3 41 42 372 -6965 8 3 3 42 43 373 -6966 8 3 3 43 44 374 -6967 8 3 3 44 45 375 -6968 8 3 3 45 46 376 -6969 8 3 3 46 47 377 -6970 8 3 3 47 48 378 -6971 8 3 3 48 49 379 -6972 8 3 3 49 50 380 -6973 8 3 3 50 51 381 -6974 8 3 3 51 4 382 -6975 8 4 3 4 52 383 -6976 8 4 3 52 53 384 -6977 8 4 3 53 54 385 -6978 8 4 3 54 55 386 -6979 8 4 3 55 56 387 -6980 8 4 3 56 57 388 -6981 8 4 3 57 58 389 -6982 8 4 3 58 59 390 -6983 8 4 3 59 60 391 -6984 8 4 3 60 61 392 -6985 8 4 3 61 62 393 -6986 8 4 3 62 63 394 -6987 8 4 3 63 64 395 -6988 8 4 3 64 65 396 -6989 8 4 3 65 1 397 -1 15 1 1 1 -2 15 2 1 2 -3 15 3 1 3 -4 15 4 1 4 -$EndElements diff --git a/dG3D/benchmarks/nonLinearMixedBC_2D_DirectionFollowing/CMakeLists.txt b/dG3D/benchmarks/nonLinearMixedBC_2D_DirectionFollowing/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..689506adade2a1900accc0c3a4e3ea99cb915545 --- /dev/null +++ b/dG3D/benchmarks/nonLinearMixedBC_2D_DirectionFollowing/CMakeLists.txt @@ -0,0 +1,13 @@ +# test file + +set(PYFILE idealHole_mixBC.py) + +set(FILES2DELETE + idealHole.msh + E_0_GP_0_out.txt + E_0_GP_0_disp.msh + E_0_GP_0_stress.msh + E_0_GP_0*.csv +) + +add_cm3python_test(${PYFILE} "${FILES2DELETE}") diff --git a/dG3D/benchmarks/nonLinearMixedBC_2D_DirectionFollowing/idealHole.geo b/dG3D/benchmarks/nonLinearMixedBC_2D_DirectionFollowing/idealHole.geo new file mode 100644 index 0000000000000000000000000000000000000000..ea71db5a835b3024cd654f73ec07b12a82b2fbb2 --- /dev/null +++ b/dG3D/benchmarks/nonLinearMixedBC_2D_DirectionFollowing/idealHole.geo @@ -0,0 +1,61 @@ + +mm=1.0; +n=1; +L=1; +sl1=0.07*L/n; +Point(1)={0,0,0,sl1}; +Point(2)={L,0,0,sl1}; +Point(3)={L,L,0,sl1}; +Point(4)={0,L,0,sl1}; +Line(1)={1,2}; +Line(2)={2,3}; +Line(3)={3,4}; +Line(4)={4,1}; +x0=0.5*L/n; y0=0.5*L/n; r=0.3*L/n; +num=0; +moyen=0; +surf=0; +For i In {0:n-1} + For j In {0:n-1} + x=x0*(2*i+1); + y=y0*(2*j+1); + sl2=0.7*sl1; + moyen=moyen+r; + surf=surf+Pi*r*r; + + 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}; + +// Transfinite Line {c3, c2, c4, c1} = 4 Using Progression 1; + num+=1; + l[num]=newreg; Line Loop(l[num]) = {c1,c2,c3,c4}; + EndFor +EndFor +l[0]=newreg; +Line Loop(l[0])={1,2,3,4}; +Plane Surface(11)={l[]}; +Physical Line(1)={1}; +Physical Line(2)={2}; +Physical Line(3)={3}; +Physical Line(4)={4}; +Physical Surface(11)={11}; +Physical Point(1)={1}; +Physical Point(2)={2}; +Physical Point(3)={3}; +Physical Point(4)={4}; +//Transfinite Line {3, 2, 4, 1} = 5*n Using Progression 1; +//Transfinite Surface{11}; +//Recombine Surface{11}; + +Translate {-L/2, -L/2, 0} { + Surface{11}; +} + diff --git a/dG3D/benchmarks/nonLinearMixedBC_2D_DirectionFollowing/idealHole_mixBC.py b/dG3D/benchmarks/nonLinearMixedBC_2D_DirectionFollowing/idealHole_mixBC.py new file mode 100644 index 0000000000000000000000000000000000000000..31233836f0331c62f661563a95f1bff370ae170e --- /dev/null +++ b/dG3D/benchmarks/nonLinearMixedBC_2D_DirectionFollowing/idealHole_mixBC.py @@ -0,0 +1,118 @@ +#coding-Utf-8-*- + +from gmshpy import * +from dG3Dpy import* +from math import* + +#script to launch PBC problem with a python script + +# material law +lawnum = 11 # unique number of law + + +E = 70E3 +nu = 0.3 +K = E/3./(1.-2.*nu) # Bulk mudulus +mu =E/2./(1.+nu) # Shear mudulus +rho = 2.7 # Bulk mass +sy0 = 507.e100 +h = 200 + +# creation of material law + +law1 = dG3DLinearElasticMaterialLaw(lawnum,rho,E,nu) + +# geometry +geofile="idealHole.geo" # name of mesh file +meshfile="idealHole.msh" # name of mesh file + + +# creation of part Domain +nfield = 11 # number of the field (physical number of entity) +dim =2 +myfield1 = dG3DDomain(10,nfield,0,lawnum,0,dim) + + +# solver +sol = 2 # Gmm=0 (default) Taucs=1 PETsc=2 +soltype =1 # StaticLinear=0 (default) StaticNonLinear=1 +nstep = 1 # 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) +system = 3 # Displacement elimination =0 Multiplier elimination = 1 Displacement+ multiplier = 2 +control = 0 # load control = 0 arc length control euler = 12 +# creation of Solver +mysolver = nonLinearMechSolver(1000) +mysolver.createModel(geofile,meshfile,2,2) +#mysolver.loadModel(meshfile) +mysolver.addDomain(myfield1) +mysolver.addMaterialLaw(law1) +mysolver.Scheme(soltype) +mysolver.Solver(sol) +mysolver.snlData(nstep,ftime,tol) +mysolver.setSystemType(system) +mysolver.setControlType(control) +mysolver.stiffnessModification(bool(1)) +mysolver.iterativeProcedure(bool(1)) +mysolver.setMessageView(bool(1)) + +#rve - periodicity +mysolver.setPeriodicity(0.5,0,0,"x") +mysolver.setPeriodicity(0,0.5,0,"y") +mysolver.setPeriodicity(0,0,1.,"z") + +#boundary condition +microBC = nonLinearOrthogonalMixedBCDirectionFollowing(10,2) +microBC.setOrder(1) +microBC.setBCPhysical(1,4,3,2) + +cs = 0.5 +sn = sqrt(1.-cs*cs) + +microBC.setSUBCDirection(cs,sn,0.) +microBC.setKUBCDirection(-sn,cs,0.) + +# Deformation gradient +microBC.setDeformationGradient(1.01,0.0,0.0,0,1.0,0,0,0,1.) + +mysolver.addMicroBC(microBC) + +#stress averaging flag and averaging method 0- VOLUME, 1- SURFACE +mysolver.stressAveragingFlag(bool(1)) # set stress averaging ON- 0 , OFF-1 +mysolver.setStressAveragingMethod(0) # 0 -volume 1- surface +#tangent averaging flag +mysolver.tangentAveragingFlag(bool(1)) # set tangent averaging ON -0, OFF -1 +mysolver.setTangentAveragingMethod(2,1e-6) # 0- perturbation 1- condensation + +# other BC +mysolver.displacementBC("Face",11,2,0.) + + +# build view +mysolver.internalPointBuildView("Green-Lagrange_xx",IPField.STRAIN_XX, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_yy",IPField.STRAIN_YY, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_zz",IPField.STRAIN_ZZ, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_xy",IPField.STRAIN_XY, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_yz",IPField.STRAIN_YZ, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_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("Green-Lagrange equivalent strain",IPField.GL_EQUIVALENT_STRAIN, 1, 1); +mysolver.internalPointBuildView("Equivalent plastic strain",IPField.PLASTICSTRAIN, 1, 1); + +# solve +mysolver.solve() + +# test check +check = TestCheck() +check.equal(1.692019e+03,mysolver.getHomogenizedStress(0,0),1.e-5) +check.equal(1.692019e+05,mysolver.getHomogenizedTangent(0,0,0,0),1.e-5) + + + diff --git a/dG3D/benchmarks/nonLocalLemaitreChabocheCube/CMakeLists.txt b/dG3D/benchmarks/nonLocalLemaitreChabocheCube/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..0ffbe58c0ac10e82490645d46e86b723386b2590 --- /dev/null +++ b/dG3D/benchmarks/nonLocalLemaitreChabocheCube/CMakeLists.txt @@ -0,0 +1,12 @@ +# test file + +set(PYFILE cubeNonLocalJ2Hyper.py) + +set(FILES2DELETE + cube.msh + *.csv + disp* + stress* +) + +add_cm3python_mpi_test(3 ${PYFILE} "${FILES2DELETE}") diff --git a/dG3D/benchmarks/nonLocalLemaitreChabocheCube/cube.geo b/dG3D/benchmarks/nonLocalLemaitreChabocheCube/cube.geo new file mode 100644 index 0000000000000000000000000000000000000000..300f7cbeb0184703fa9715ed1d7d1fa202cf5019 --- /dev/null +++ b/dG3D/benchmarks/nonLocalLemaitreChabocheCube/cube.geo @@ -0,0 +1,105 @@ +// Test case a SCB with a vertical load at its free extremity +// Size + +//definition of unit +mm = 1e-03; + +// volum fraction + +f=0.45; + +// characteristic size for fibe +R=0.05*mm; // fiber radius +ly = 2.0*R*Sqrt(Pi/(2.0*Sqrt(3.0)*f)); //distance between fiber +lx = ly*Sqrt(3.0)/2.0; + + +x=4*ly; +y=4*lx; +z=0.5*mm; + +// Characteristic length +Lc1=R/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/nonLocalLemaitreChabocheCube/cubeNonLocalJ2Hyper.py b/dG3D/benchmarks/nonLocalLemaitreChabocheCube/cubeNonLocalJ2Hyper.py new file mode 100644 index 0000000000000000000000000000000000000000..eee502d5684c804bc25ce1985c8c52fe110be2b2 --- /dev/null +++ b/dG3D/benchmarks/nonLocalLemaitreChabocheCube/cubeNonLocalJ2Hyper.py @@ -0,0 +1,102 @@ +#coding-Utf-8-*- +from gmshpy import * +from dG3Dpy import* + +#script to launch beam problem with a python script + +# material law +lawnum = 1 # unique number of law +rho = 7850 +young = 2.89e9 +nu = 0.3 +sy0 = 35e6 +h = 73e6 +hexp = 60 + + +# 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 = 100 # 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) +fullDg = True #O = CG, 1 = DG +space1 = 0 # function space (Lagrange=0) +beta1 = 10. + +#lemaitre chaboche +alpha = 2.0e6 +n = 0.5 +p0 = 0.00 +pc = 10 + +# compute solution and BC (given directly to the solver +# creation of law +#law1 = J2LinearDG3DMaterialLaw(lawnum,rho,young,nu,sy0,h) +harden = ExponentialJ2IsotropicHardening(1,sy0, h, hexp) +#cl = AnisotropicCLengthLaw(1, 8.45e-11, 8.45e-11, 2e-6, 0, 90, 0) +cl = IsotropicCLengthLaw(1, 2e-6) +damlaw = LemaitreChabocheDamageLaw(1, p0, pc, n, alpha) +law1 = NonLocalDamageJ2HyperDG3DMaterialLaw(lawnum,rho,young,nu,harden,cl,damlaw) + +# creation of ElasticField +nfield = 10 # number of the field (physical number of surface) +#myfield1 = dG3DDomain(1000,nfield,space1,lawnum,fullDg) +myfield1 = nonLocalDamageDG3DDomain(1000,nfield,space1,lawnum,fullDg,1.e6) + +#myfield1.matrixByPerturbation(1,1,1,1e-8) +myfield1.stabilityParameters(beta1) +myfield1.nonLocalStabilityParameters(beta1,fullDg) +# creation of Solver +mysolver = nonLinearMechSolver(1000) +mysolver.createModel(geofile,meshfile,3,2) +mysolver.addDomain(myfield1) +mysolver.addMaterialLaw(law1) +mysolver.Scheme(soltype) +mysolver.Solver(sol) +mysolver.snlData(nstep,ftime,tol) +mysolver.stepBetweenArchiving(nstepArch) +# BC +#shearing +#mysolver.displacementBC("Face",1234,0,0.) +#mysolver.displacementBC("Face",1234,1,0.) +#mysolver.displacementBC("Face",1234,2,0.) +#mysolver.displacementBC("Face",5678,1,0.00) +#mysolver.displacementBC("Face",5678,0,0.00001) +#mysolver.forceBC("Face",2376,2,100000000) +#mysolver.forceBC("Face",4158,2,-100000000) +#mysolver.forceBC("Face",5678,0,100000000) +#tension along z +mysolver.displacementBC("Face",1234,2,0.) +mysolver.displacementBC("Face",5678,2,0.0002) +mysolver.displacementBC("Face",2376,0,0.) +mysolver.displacementBC("Face",1265,1,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.archivingForceOnPhysicalGroup("Face", 1234, 2) +mysolver.archivingForceOnPhysicalGroup("Face", 5678, 2) +mysolver.internalPointBuildView("damage",IPField.DAMAGE,1,1) +mysolver.archivingNodeIP(1, IPField.PLASTICSTRAIN,1); +mysolver.archivingIPOnPhysicalGroup("Volume",10, IPField.PLASTICSTRAIN,IPField.MIN_VALUE); +mysolver.archivingIPOnPhysicalGroup("Volume",10, IPField.PLASTICSTRAIN,IPField.MAX_VALUE); +mysolver.archivingIPOnPhysicalGroup("Volume",10, IPField.PLASTICSTRAIN,IPField.MEAN_VALUE); + + +mysolver.solve() + +check = TestCheck() +check.equal(-1.651738e+01,mysolver.getArchivedForceOnPhysicalGroup("Face", 1234, 2),1.e-5) + diff --git a/dG3D/benchmarks/pathFollowing_cohesive/model.py b/dG3D/benchmarks/pathFollowing_cohesive/model.py index 597c80bff32a5c22f22af45776585cdff365d414..46d9bbb67fbe4c049ea03a7bca588074a10cc14a 100644 --- a/dG3D/benchmarks/pathFollowing_cohesive/model.py +++ b/dG3D/benchmarks/pathFollowing_cohesive/model.py @@ -115,4 +115,4 @@ mysolver.archivingForceOnPhysicalGroup('Face',1,1) mysolver.solve() check = TestCheck() -check.equal(-1.195570e+03,mysolver.getArchivedForceOnPhysicalGroup("Face", 1, 1),1.e-4) +check.equal(-1.227989e+03,mysolver.getArchivedForceOnPhysicalGroup("Face", 1, 1),1.e-2) diff --git a/dG3D/benchmarks/shiftedPBC_2D/CMakeLists.txt b/dG3D/benchmarks/shiftedPBC_2D/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..80f072bb65ce022a9c558683c7d80db4a603143f --- /dev/null +++ b/dG3D/benchmarks/shiftedPBC_2D/CMakeLists.txt @@ -0,0 +1,12 @@ +# test file + +set(PYFILE idealHole_mixBC.py) + +set(FILES2DELETE + E_0_GP_0_out.txt + E_0_GP_0_disp.msh + E_0_GP_0_stress.msh + E_0_GP_0*.csv +) + +add_cm3python_test(${PYFILE} "${FILES2DELETE}") diff --git a/dG3D/benchmarks/shiftedPBC_2D/idealHole.geo b/dG3D/benchmarks/shiftedPBC_2D/idealHole.geo new file mode 100644 index 0000000000000000000000000000000000000000..ea71db5a835b3024cd654f73ec07b12a82b2fbb2 --- /dev/null +++ b/dG3D/benchmarks/shiftedPBC_2D/idealHole.geo @@ -0,0 +1,61 @@ + +mm=1.0; +n=1; +L=1; +sl1=0.07*L/n; +Point(1)={0,0,0,sl1}; +Point(2)={L,0,0,sl1}; +Point(3)={L,L,0,sl1}; +Point(4)={0,L,0,sl1}; +Line(1)={1,2}; +Line(2)={2,3}; +Line(3)={3,4}; +Line(4)={4,1}; +x0=0.5*L/n; y0=0.5*L/n; r=0.3*L/n; +num=0; +moyen=0; +surf=0; +For i In {0:n-1} + For j In {0:n-1} + x=x0*(2*i+1); + y=y0*(2*j+1); + sl2=0.7*sl1; + moyen=moyen+r; + surf=surf+Pi*r*r; + + 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}; + +// Transfinite Line {c3, c2, c4, c1} = 4 Using Progression 1; + num+=1; + l[num]=newreg; Line Loop(l[num]) = {c1,c2,c3,c4}; + EndFor +EndFor +l[0]=newreg; +Line Loop(l[0])={1,2,3,4}; +Plane Surface(11)={l[]}; +Physical Line(1)={1}; +Physical Line(2)={2}; +Physical Line(3)={3}; +Physical Line(4)={4}; +Physical Surface(11)={11}; +Physical Point(1)={1}; +Physical Point(2)={2}; +Physical Point(3)={3}; +Physical Point(4)={4}; +//Transfinite Line {3, 2, 4, 1} = 5*n Using Progression 1; +//Transfinite Surface{11}; +//Recombine Surface{11}; + +Translate {-L/2, -L/2, 0} { + Surface{11}; +} + diff --git a/dG3D/benchmarks/shiftedPBC_2D/idealHole_mixBC.py b/dG3D/benchmarks/shiftedPBC_2D/idealHole_mixBC.py new file mode 100644 index 0000000000000000000000000000000000000000..8fe297bf0d5fb7be0e197146e49fe66afcdfe5bd --- /dev/null +++ b/dG3D/benchmarks/shiftedPBC_2D/idealHole_mixBC.py @@ -0,0 +1,123 @@ +#coding-Utf-8-*- + +from gmshpy import * +from dG3Dpy import* +from math import* + +#script to launch PBC problem with a python script + +# material law +lawnum = 11 # unique number of law + + +E = 70E3 +nu = 0.3 +K = E/3./(1.-2.*nu) # Bulk mudulus +mu =E/2./(1.+nu) # Shear mudulus +rho = 2.7 # Bulk mass +sy0 = 507.e100 +h = 200 + +# creation of material law + +law1 = dG3DLinearElasticMaterialLaw(lawnum,rho,E,nu) + +# geometry +geofile="idealHole.geo" # name of mesh file +meshfile="idealHole.msh" # name of mesh file + + +# creation of part Domain +nfield = 11 # number of the field (physical number of entity) +dim =2 +myfield1 = dG3DDomain(10,nfield,0,lawnum,0,dim) + + +# solver +sol = 2 # Gmm=0 (default) Taucs=1 PETsc=2 +soltype =1 # StaticLinear=0 (default) StaticNonLinear=1 +nstep = 1 # 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) +system = 1 # Displacement elimination =0 Multiplier elimination = 1 Displacement+ multiplier = 2 +control = 0 # load control = 0 arc length control euler = 12 +# creation of Solver +mysolver = nonLinearMechSolver(1000) +mysolver.createModel(geofile,meshfile,2,2) +#mysolver.loadModel(meshfile) +mysolver.addDomain(myfield1) +mysolver.addMaterialLaw(law1) +mysolver.Scheme(soltype) +mysolver.Solver(sol) +mysolver.snlData(nstep,ftime,tol) +mysolver.setSystemType(system) +mysolver.setControlType(control) +mysolver.stiffnessModification(bool(1)) +mysolver.iterativeProcedure(bool(1)) +mysolver.setMessageView(bool(1)) + +#rve - periodicity +mysolver.setPeriodicity(1.,0,0,"x") +mysolver.setPeriodicity(0,1.,0,"y") +mysolver.setPeriodicity(0,0,1.,"z") + +#boundary condition +microBC = nonLinearShiftedPeriodicBC(10,2) +microBC.setOrder(1) +microBC.setBCPhysical(1,4,3,2) + +method =1 # Periodic mesh = 0, Langrange interpolation = 1, Cubic spline interpolation =2, FE linear= 3, FE Quad = 4 +degree = 9 # Order used for polynomial interpolation +addvertex = 0 # Polynomial interpolation by mesh vertex = 0, Polynomial interpolation by virtual vertex +microBC.setPeriodicBCOptions(method, degree,bool(addvertex)) +theta = 0.8*pi +cs = cos(theta) +sn = sin(theta) +microBC.setShiftPBCNormal(sn,-cs,0) + +# Deformation gradient +microBC.setDeformationGradient(1.01,0.0,0.0,0,1.0,0,0,0,1.) + +mysolver.addMicroBC(microBC) + +#stress averaging flag and averaging method 0- VOLUME, 1- SURFACE +mysolver.stressAveragingFlag(bool(1)) # set stress averaging ON- 0 , OFF-1 +mysolver.setStressAveragingMethod(0) # 0 -volume 1- surface +#tangent averaging flag +mysolver.tangentAveragingFlag(bool(1)) # set tangent averaging ON -0, OFF -1 +mysolver.setTangentAveragingMethod(2,1e-6) # 0- perturbation 1- condensation + +# other BC +mysolver.displacementBC("Face",11,2,0.) + + +# build view +mysolver.internalPointBuildView("Green-Lagrange_xx",IPField.STRAIN_XX, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_yy",IPField.STRAIN_YY, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_zz",IPField.STRAIN_ZZ, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_xy",IPField.STRAIN_XY, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_yz",IPField.STRAIN_YZ, 1, 1); +mysolver.internalPointBuildView("Green-Lagrange_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("Green-Lagrange equivalent strain",IPField.GL_EQUIVALENT_STRAIN, 1, 1); +mysolver.internalPointBuildView("Equivalent plastic strain",IPField.PLASTICSTRAIN, 1, 1); + +mysolver.OneUnknownBuildView("dispX",0,1); +mysolver.OneUnknownBuildView("dispY",1,1); +# solve +mysolver.solve() + +# test check +check = TestCheck() +check.equal(4.188761e+02,mysolver.getHomogenizedStress(0,0),1.e-5) +check.equal(4.188761e+04,mysolver.getHomogenizedTangent(0,0,0,0),1.e-5) + + + diff --git a/dG3D/benchmarks/smpT22/CMakeLists.txt b/dG3D/benchmarks/smpT22/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..0467dd68cafcd6d70ffc74955662359e2d2175ec --- /dev/null +++ b/dG3D/benchmarks/smpT22/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/smpT22/SMP.py b/dG3D/benchmarks/smpT22/SMP.py new file mode 100644 index 0000000000000000000000000000000000000000..6ee679592e47d2d89674fe2b055cccf1e6125225 --- /dev/null +++ b/dG3D/benchmarks/smpT22/SMP.py @@ -0,0 +1,190 @@ +#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) + + +# 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,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(-3.914853e+01,mysolver.getArchivedForceOnPhysicalGroup("Face", 1234, 2),1.e-5) + diff --git a/dG3D/benchmarks/smpT22/cube.geo b/dG3D/benchmarks/smpT22/cube.geo new file mode 100644 index 0000000000000000000000000000000000000000..0dbaad1fcfd2bed978ed031e84a0bff5b2fe240c --- /dev/null +++ b/dG3D/benchmarks/smpT22/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/CMakeLists.txt b/dG3D/benchmarks/smpT58/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..0467dd68cafcd6d70ffc74955662359e2d2175ec --- /dev/null +++ b/dG3D/benchmarks/smpT58/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/smpT58/SMP.py b/dG3D/benchmarks/smpT58/SMP.py new file mode 100644 index 0000000000000000000000000000000000000000..e3e48cfc8926c6cf4f2f64ddecdc36cbdfdda2f8 --- /dev/null +++ b/dG3D/benchmarks/smpT58/SMP.py @@ -0,0 +1,190 @@ +#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 =3000# 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) + + +# 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,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 +cyclicFunctionDisp=cycleFunctionTime(0., 0, 2.*ftime/3., -0.000613, ftime , -0.000613/2.);#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(6.768589e-01,mysolver.getArchivedForceOnPhysicalGroup("Face", 1234, 2),1.e-5) + diff --git a/dG3D/benchmarks/smpT58/cube.geo b/dG3D/benchmarks/smpT58/cube.geo new file mode 100644 index 0000000000000000000000000000000000000000..0dbaad1fcfd2bed978ed031e84a0bff5b2fe240c --- /dev/null +++ b/dG3D/benchmarks/smpT58/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/thermoMecPBCInSystemCondensationElim/thermoMecPolycrystalCondensation.py b/dG3D/benchmarks/thermoMecPBCInSystemCondensationElim/thermoMecPolycrystalCondensation.py index 8098bc05428d786c4d67647da44a3cdc881bb0aa..0cdc38c258b41393dacdf7668cc92ee720bcaec1 100644 --- a/dG3D/benchmarks/thermoMecPBCInSystemCondensationElim/thermoMecPolycrystalCondensation.py +++ b/dG3D/benchmarks/thermoMecPBCInSystemCondensationElim/thermoMecPolycrystalCondensation.py @@ -161,7 +161,7 @@ mysolver.solve() # solve BVP check = TestCheck() check.equal(2.534832e+02,mysolver.getArchivedNodalValue(6,3,mysolver.displacement),1.e-4) -check.equal(-6.959403e-05,mysolver.getArchivedNodalValue(8,0,mysolver.displacement),1.e-3) +check.equal(-6.972034e-05,mysolver.getArchivedNodalValue(8,0,mysolver.displacement),1.e-2) check.equal(7.472013e-04,mysolver.getArchivedNodalValue(8,1,mysolver.displacement),1.e-3) check.equal(5.877430e-03,mysolver.getArchivedNodalValue(8,2,mysolver.displacement),1.e-4) check.equal(2.659639e+02,mysolver.getArchivedNodalValue(8,3,mysolver.displacement),1.e-4) diff --git a/dG3D/src/FractureCohesiveDG3DMaterialLaw.h b/dG3D/src/FractureCohesiveDG3DMaterialLaw.h index 3901ad0757ef7798e5d16378d8a0c7ca69c7f48d..8622c940c5c75eb4d3232b0727bbd659064659b0 100644 --- a/dG3D/src/FractureCohesiveDG3DMaterialLaw.h +++ b/dG3D/src/FractureCohesiveDG3DMaterialLaw.h @@ -60,7 +60,7 @@ class FractureByCohesive3DLaw : public dG3DMaterialLaw, public fractureBy2Laws< virtual double scaleFactor() const{return _mbulk->scaleFactor();}; virtual materialLaw* clone() const{ return new FractureByCohesive3DLaw(*this);}; - virtual void setSolver(nonLinearMechSolver* sv){ + virtual void setSolver(const nonLinearMechSolver* sv){ dG3DMaterialLaw::setSolver(sv); if (_mbulk != NULL){ _mbulk->setSolver(sv); diff --git a/dG3D/src/dG3DMultiscaleIPVariable.cpp b/dG3D/src/dG3DMultiscaleIPVariable.cpp index 52603513760842a6ab4f805b85cd2fde4c3f3a19..99e94701cfc0054c3bebb482b8b83e973faf0019 100644 --- a/dG3D/src/dG3DMultiscaleIPVariable.cpp +++ b/dG3D/src/dG3DMultiscaleIPVariable.cpp @@ -37,7 +37,7 @@ int dG3DMultiscaleIPVariable::getMicroNumberElementDataSendToMacroProblem() cons // we send P, L , failureDamage, broken // elastic energy + plastic energy+irreversible energy+DirreversibleEnergyDF // damageIsBlocked - return 9+81+4+1+9+1; + return 9+81+4+1+9+1; }; // get macroscopic kinematic data to send to microscopic problem @@ -47,7 +47,7 @@ void dG3DMultiscaleIPVariable::getMacroDataSendToMicroProblem(double* val) const const SVector3& refNorm = this->getConstRefToReferenceOutwardNormal(); const SVector3& curNorm = this->getConstRefToCurrentOutwardNormal(); const SVector3& fjump = this->getConstRefToIncompatibleStrainVector(); - + int row = 0; for (int index=row; index < row+9; index ++){ int i,j; @@ -55,42 +55,42 @@ void dG3DMultiscaleIPVariable::getMacroDataSendToMicroProblem(double* val) const val[index] = F(i,j); } row+= 9; - + for (int index=row; index < row+3; index++){ int i; Tensor13::getIntsFromIndex(index-row,i); val[index] = ujump(i); } row+= 3; - + for (int index=row; index < row+3; index++){ int i; Tensor13::getIntsFromIndex(index-row,i); val[index] = refNorm(i); } row+= 3; - + for (int index=row; index < row+3; index++){ int i; Tensor13::getIntsFromIndex(index-row,i); val[index] = curNorm(i); } row+= 3; - + for (int index=row; index < row+3; index++){ int i; Tensor13::getIntsFromIndex(index-row,i); val[index] = fjump(i); } row+= 3; - + }; // get computed data obtaind by microscopic analysis to send to macroscopic analysis void dG3DMultiscaleIPVariable::getMicroDataToMacroProblem(double* val) const{ const STensor3& P = this->getConstRefToFirstPiolaKirchhoffStress(); const STensor43& L = this->getConstRefToTangentModuli(); const STensor3& dirrEnergdF = this->getConstRefToDIrreversibleEnergyDDeformationGradient(); - + int row = 0; for (int index=row; index< row+9; index++){ int i,j; @@ -98,14 +98,14 @@ void dG3DMultiscaleIPVariable::getMicroDataToMacroProblem(double* val) const{ val[index] = P(i,j); } row+= 9; - + for (int index=row; index< row+81; index++){ int i,j,k,l; Tensor43::getIntsFromIndex(index-row,i,j,k,l); val[index] = L(i,j,k,l); } row+= 81; - + val[row] = this->getFailureDamage(); row += 1; // @@ -113,17 +113,17 @@ void dG3DMultiscaleIPVariable::getMicroDataToMacroProblem(double* val) const{ if (_solverBroken) solverIsBroken = 1.; val[row] = solverIsBroken; row += 1; - // + // val[row] = this->defoEnergy(); row += 1; - + val[row] = this->plasticEnergy(); row += 1; - + val[row] = this->irreversibleEnergy(); row+=1; - - + + for (int index=row; index<row+9; index++){ int i, j; Tensor23::getIntsFromIndex(index-row,i,j); @@ -137,7 +137,7 @@ void dG3DMultiscaleIPVariable::getMicroDataToMacroProblem(double* val) const{ else val[row] = -1; row +=1; - + }; // set the received data from microscopic analysis to microscopic analysis void dG3DMultiscaleIPVariable::setReceivedMacroDataToMicroProblem(const double* val){ @@ -146,7 +146,7 @@ void dG3DMultiscaleIPVariable::setReceivedMacroDataToMicroProblem(const double* SVector3& refNorm = this->getRefToReferenceOutwardNormal(); SVector3& curNorm = this->getRefToCurrentOutwardNormal(); SVector3& fjump = this->getRefToIncompatibleStrainVector(); - + int row = 0; for (int index=row; index < row+9; index ++){ int i,j; @@ -154,28 +154,28 @@ void dG3DMultiscaleIPVariable::setReceivedMacroDataToMicroProblem(const double* F(i,j) = val[index]; } row+= 9; - + for (int index=row; index < row+3; index++){ int i; Tensor13::getIntsFromIndex(index-row,i); ujump(i) = val[index]; } row+= 3; - + for (int index=row; index < row+3; index++){ int i; Tensor13::getIntsFromIndex(index-row,i); refNorm(i) = val[index]; } row+= 3; - + for (int index=row; index < row+3; index++){ int i; Tensor13::getIntsFromIndex(index-row,i); curNorm(i) = val[index]; } row+= 3; - + for (int index=row; index < row+3; index++){ int i; Tensor13::getIntsFromIndex(index-row,i); @@ -188,7 +188,7 @@ void dG3DMultiscaleIPVariable::setReceivedMicroDataToMacroProblem(const double* STensor3& P = this->getRefToFirstPiolaKirchhoffStress(); STensor43& L = this->getRefToTangentModuli(); STensor3& dirrEnergdF = this->getRefToDIrreversibleEnergyDDeformationGradient(); - + int row = 0; for (int index=row; index< row+9; index++){ int i,j; @@ -196,17 +196,17 @@ void dG3DMultiscaleIPVariable::setReceivedMicroDataToMacroProblem(const double* P(i,j) = val[index]; } row+= 9; - + for (int index=row; index< row+81; index++){ int i,j,k,l; Tensor43::getIntsFromIndex(index-row,i,j,k,l); L(i,j,k,l) = val[index]; } row+= 81; - + _failureDamage = val[row]; row += 1; - + if (val[row] > 0) { _solverBroken = true; } @@ -214,16 +214,16 @@ void dG3DMultiscaleIPVariable::setReceivedMicroDataToMacroProblem(const double* _solverBroken = false; } row += 1; - + _elasticEnergy = val[row]; row += 1; - + _plasticEnergy = val[row]; row += 1; - + _irreversibleEnergy = val[row]; row += 1; - + for (int index=row; index<row+9; index++){ int i,j; Tensor23::getIntsFromIndex(index-row,i,j); @@ -249,7 +249,7 @@ void MultiscaleFractureCohesive3DIPVariable::nobroken(){ this->getSolver()->getHomogenizationState(IPStateBase::current)->getBrokenFlag() = false; } }; - + void BulkFollowedCohesive3DIPVariable::restart(){ @@ -267,11 +267,18 @@ void BulkFollowedCohesive3DIPVariable::restart(){ restartManager::restart(_dFinterfacedF); restartManager::restart(_dFinterfacedJump); restartManager::restart(_dFinterfacedInStrain); - + restartManager::restart(_irreversibleEnergy); restartManager::restart(_DirreversibleEnergyDjump); restartManager::restart(_DirreversibleEnergyDInStrain); restartManager::restart(_DirreversibleEnergyDF); + + restartManager::restart(_cohesiveTangent); // cohesive tangent + restartManager::restart(_cohesiveBiTangent); // cohesive bitangent + // - Basis in reference config + restartManager::restart(_cohesiveRefNormal); // cohesive normal in reference config + restartManager::restart(_cohesiveRefTangent); // cohesive tangent + restartManager::restart(_cohesiveRefBiTangent); // cohesive bitangent }; void BulkFollowedCohesive3DIPVariable::initializeFracture(const SVector3 &ujump_, @@ -300,7 +307,7 @@ void BulkFollowedCohesive3DIPVariable::initializeFracture(const SVector3 &ujump_ _ujump0 = ipdg->getConstRefToJump(); _cohesiveJump *= 0.; _isTension = ift; - + _irreversibleEnergy = 0.; }; @@ -310,7 +317,9 @@ void BulkFollowedCohesive3DIPVariable::initializeFracture(const SVector3 &ujump_ // using in multiscale analysis with MPI int MultiscaleCohesive3DIPVariable::getMacroNumberElementDataSendToMicroProblem() const { // send Fb0, Fb, ujump0, incompatibleStrain0,to in order to construct the deformationGradient at interface - return 9+9+3+3; + // reference basis + // current basis + return 9+9+3+3+3*6; }; int MultiscaleCohesive3DIPVariable::getMicroNumberElementDataSendToMacroProblem() const { // // send interfaceForce, dInterfaceForceDJump, dInterfaceForceDF, dInterfaceForceDInStrain @@ -323,7 +332,14 @@ void MultiscaleCohesive3DIPVariable::getMacroDataSendToMicroProblem(double* val) const STensor3& Fb = this->getBulkDeformationGradient(); const SVector3& ujump0 = this->getConstRefToDGJump(); const SVector3& inStrain0 = this->getConstRefToIncompatibleStrainAtFailureOnset(); - + const SVector3& n = this->getConstRefToCohesiveNormal(); + const SVector3& t = this->getConstRefToCohesiveTangent(); + const SVector3& b = this->getConstRefToCohesiveBiTangent(); + + const SVector3& refN = this->getConstRefToCohesiveReferenceNormal(); + const SVector3& refT = this->getConstRefToCohesiveReferenceTangent(); + const SVector3& refB = this->getConstRefToCohesiveReferenceBiTangent(); + int row = 0; for (int idex=row; idex<row+9; idex++){ int i,j; @@ -331,25 +347,67 @@ void MultiscaleCohesive3DIPVariable::getMacroDataSendToMicroProblem(double* val) val[idex] = Fb0(i,j); } row+= 9; - + for (int idex=row; idex<row+9; idex++){ int i,j; Tensor23::getIntsFromIndex(idex-row,i,j); val[idex] = Fb(i,j); } row+=9; - + for (int idex=row; idex<row+3; idex++){ int i; Tensor13::getIntsFromIndex(idex-row,i); val[idex] = ujump0(i); } row+= 3; - + for (int idex=row; idex<row+3; idex++){ int i; Tensor13::getIntsFromIndex(idex-row,i); val[idex] = inStrain0(i); + } + row+=3; + + for (int idex=row; idex<row+3; idex++){ + int i; + Tensor13::getIntsFromIndex(idex-row,i); + val[idex] = n(i); + } + row+=3; + + for (int idex=row; idex<row+3; idex++){ + int i; + Tensor13::getIntsFromIndex(idex-row,i); + val[idex] = t(i); + } + row+=3; + + for (int idex=row; idex<row+3; idex++){ + int i; + Tensor13::getIntsFromIndex(idex-row,i); + val[idex] = b(i); + } + row+=3; + + for (int idex=row; idex<row+3; idex++){ + int i; + Tensor13::getIntsFromIndex(idex-row,i); + val[idex] = refN(i); + } + row+=3; + + for (int idex=row; idex<row+3; idex++){ + int i; + Tensor13::getIntsFromIndex(idex-row,i); + val[idex] = refT(i); + } + row+=3; + + for (int idex=row; idex<row+3; idex++){ + int i; + Tensor13::getIntsFromIndex(idex-row,i); + val[idex] = refB(i); } row+=3; }; @@ -358,17 +416,17 @@ void MultiscaleCohesive3DIPVariable::getMicroDataToMacroProblem(double* val) con const STensor3& dTdJump = this->getConstRefToDInterfaceForceDjump(); const STensor33& dTdF = this->getConstRefToDInterfaceForceDDeformationGradient(); const STensor3& dTdInStrain = this->getConstRefToDInterfaceForceDIncompatibleStrainVector(); - + const SVector3& cjump = this->getConstRefToCohesiveJump(); const STensor3& dcjumpdJump = this->getConstRefToDCohesiveJumpDJump(); const STensor33& dcjumpdF = this->getConstRefToDCohesiveJumpDDeformationGradient(); const STensor3& dcjumpdInstrain = this->getConstRefToDCohesiveJumpDIncompatibleStrainVector(); - + const double& irrEnerg = this->irreversibleEnergy(); const SVector3& DirrEnergDjump = this->getConstRefToDIrreversibleEnergyDJump(); const SVector3& DirrEnergDInstrain = this->getConstRefToDIrreversibleEnergyDIncompatibleStrainVector(); const STensor3& DirrEnergDF = this->getConstRefToDIrreversibleEnergyDDeformationGradient(); - + int row = 0; for (int idex=row; idex < row+3; idex++){ int i; @@ -397,14 +455,14 @@ void MultiscaleCohesive3DIPVariable::getMicroDataToMacroProblem(double* val) con val[idex] = dTdInStrain(i,j); } row+=9; - + for (int idex = row; idex<row+3; idex++){ int i; Tensor13::getIntsFromIndex(idex-row,i); val[idex] = cjump(i); } row+= 3; - + for (int idex = row; idex <row+9; idex ++){ int type = idex-row; int i,j; @@ -420,7 +478,7 @@ void MultiscaleCohesive3DIPVariable::getMicroDataToMacroProblem(double* val) con val[idex] = dcjumpdF(i,j,k); }; row+= 27; - + for (int idex = row; idex <row+9; idex ++){ int type = idex-row; int i,j; @@ -433,15 +491,15 @@ void MultiscaleCohesive3DIPVariable::getMicroDataToMacroProblem(double* val) con if (_isDeleted) isD = 1.; val[row] = isD; row += 1; - + double isT = -1; if (_isTension) isT = 1.; val[row] = isT; row += 1; - + val[row] = irrEnerg; row += 1; - + for (int index = row; index < row+3; index++){ int type = index-row; int i; @@ -449,7 +507,7 @@ void MultiscaleCohesive3DIPVariable::getMicroDataToMacroProblem(double* val) con val[index] = DirrEnergDjump(i); } row+= 3; - + for (int index = row; index < row+3; index++){ int type = index-row; int i; @@ -457,7 +515,7 @@ void MultiscaleCohesive3DIPVariable::getMicroDataToMacroProblem(double* val) con val[index] = DirrEnergDInstrain(i); } row += 3; - + for (int index = row; index < row+9; index ++){ int type = index - row; int i,j; @@ -465,13 +523,21 @@ void MultiscaleCohesive3DIPVariable::getMicroDataToMacroProblem(double* val) con val[index] = DirrEnergDF(i,j); } row+= 9; - + }; void MultiscaleCohesive3DIPVariable::setReceivedMacroDataToMicroProblem(const double* val){ STensor3& Fb0 = this->getRefToBulkDeformationGradientAtFailureOnset(); SVector3& ujump0 = this->getRefToDGJump(); SVector3& inStrain0 = this->getRefToIncompatibleStrainAtFailureOnset(); - + + SVector3& n = this->getRefToCohesiveNormal(); + SVector3& t = this->getRefToCohesiveTangent(); + SVector3& b = this->getRefToCohesiveBiTangent(); + + SVector3& refN = this->getRefToCohesiveReferenceNormal(); + SVector3& refT = this->getRefToCohesiveReferenceTangent(); + SVector3& refB = this->getRefToCohesiveReferenceBiTangent(); + int row = 0; for (int idex=row; idex<row+9; idex++){ int i,j; @@ -479,7 +545,7 @@ void MultiscaleCohesive3DIPVariable::setReceivedMacroDataToMicroProblem(const do Fb0(i,j) = val[idex]; } row+= 9; - + STensor3 Fb(0.); for (int idex=row; idex<row+9; idex++){ int i,j; @@ -488,14 +554,14 @@ void MultiscaleCohesive3DIPVariable::setReceivedMacroDataToMicroProblem(const do } this->setBulkDeformationGradient(Fb); row+=9; - + for (int idex=row; idex<row+3; idex++){ int i; Tensor13::getIntsFromIndex(idex-row,i); ujump0(i) = val[idex]; } row+= 3; - + for (int idex=row; idex<row+3; idex++){ int i; Tensor13::getIntsFromIndex(idex-row,i); @@ -503,18 +569,61 @@ void MultiscaleCohesive3DIPVariable::setReceivedMacroDataToMicroProblem(const do } row+=3; + + for (int idex=row; idex<row+3; idex++){ + int i; + Tensor13::getIntsFromIndex(idex-row,i); + n(i) = val[idex]; + } + row+=3; + + for (int idex=row; idex<row+3; idex++){ + int i; + Tensor13::getIntsFromIndex(idex-row,i); + t(i) = val[idex]; + } + row+=3; + + for (int idex=row; idex<row+3; idex++){ + int i; + Tensor13::getIntsFromIndex(idex-row,i); + b(i) = val[idex]; + } + row+=3; + + for (int idex=row; idex<row+3; idex++){ + int i; + Tensor13::getIntsFromIndex(idex-row,i); + refN(i) = val[idex]; + } + row+=3; + + for (int idex=row; idex<row+3; idex++){ + int i; + Tensor13::getIntsFromIndex(idex-row,i); + refT(i) = val[idex]; + } + row+=3; + + for (int idex=row; idex<row+3; idex++){ + int i; + Tensor13::getIntsFromIndex(idex-row,i); + refB(i) = val[idex]; + } + row+=3; + }; void MultiscaleCohesive3DIPVariable::setReceivedMicroDataToMacroProblem(const double* val){ SVector3& T = this->getRefToInterfaceForce(); STensor3& dTdJump = this->getRefToDInterfaceForceDjump(); STensor33& dTdF = this->getRefToDInterfaceForceDDeformationGradient(); STensor3& dTdInStrain = this->getRefToDInterfaceForceDIncompatibleStrainVector(); - + SVector3& cjump = this->getRefToCohesiveJump(); STensor3& dcjumpdJump = this->getRefToDCohesiveJumpDJump(); STensor33& dcjumpdF = this->getRefToDCohesiveJumpDDeformationGradient(); STensor3& dcjumpdInstrain = this->getRefToDCohesiveJumpDIncompatibleStrainVector(); - + double& irrEnerg = this->getRefToIrreversibleEnergy(); SVector3& DirrEnergDjump = this->getRefToDIrreversibleEnergyDJump(); SVector3& DirrEnergDInstrain = this->getRefToDIrreversibleEnergyDIncompatibleStrainVector(); @@ -548,14 +657,14 @@ void MultiscaleCohesive3DIPVariable::setReceivedMicroDataToMacroProblem(const do dTdInStrain(i,j) = val[idex]; } row+=9; - + for (int idex = row; idex<row+3; idex++){ int i; Tensor13::getIntsFromIndex(idex-row,i); cjump(i) = val[idex]; } row+= 3; - + for (int idex = row; idex <row+9; idex ++){ int type = idex-row; int i,j; @@ -571,7 +680,7 @@ void MultiscaleCohesive3DIPVariable::setReceivedMicroDataToMacroProblem(const do dcjumpdF(i,j,k) = val[idex]; }; row+= 27; - + for (int idex = row; idex <row+9; idex ++){ int type = idex-row; int i,j; @@ -579,19 +688,19 @@ void MultiscaleCohesive3DIPVariable::setReceivedMicroDataToMacroProblem(const do dcjumpdInstrain(i,j) = val[idex]; }; row += 9; - + // convert bool to double and send +1--> true -1 --> false if (val[row] > 0) _isDeleted = true; else _isDeleted = false; row += 1; - + if (val[row] > 0) _isTension = true; else _isTension = false; row += 1; - + irrEnerg = val[row]; row += 1; - + for (int index = row; index < row+3; index++){ int type = index-row; int i; @@ -599,7 +708,7 @@ void MultiscaleCohesive3DIPVariable::setReceivedMicroDataToMacroProblem(const do DirrEnergDjump(i) = val[index]; } row+= 3; - + for (int index = row; index < row+3; index++){ int type = index-row; int i; @@ -607,7 +716,7 @@ void MultiscaleCohesive3DIPVariable::setReceivedMicroDataToMacroProblem(const do DirrEnergDInstrain(i) = val[index]; } row += 3; - + for (int index = row; index < row+9; index ++){ int type = index - row; int i,j; diff --git a/dG3D/src/dG3DMultiscaleIPVariable.h b/dG3D/src/dG3DMultiscaleIPVariable.h index 37172e491cd640fda8e122904f7359e08fc9d26f..b554616546dd56c9792f4a0170f58e6bd736b584 100644 --- a/dG3D/src/dG3DMultiscaleIPVariable.h +++ b/dG3D/src/dG3DMultiscaleIPVariable.h @@ -48,24 +48,24 @@ class dG3DMultiscaleIPVariable : public dG3DIPVariable{ virtual bool damageIsBlocked() const { return _damageBlocked;}; virtual void blockDamage(const bool bl); - + virtual bool solverIsBroken() const {return _solverBroken;}; virtual bool& getRefToSolverBrokenFlag() {return _solverBroken;}; - + virtual double getFailureDamage() const {return _failureDamage;}; virtual double& getRefToFailureDamage(){return _failureDamage;}; - + virtual double defoEnergy() const { return _elasticEnergy;}; virtual double& getRefToDefoEnergy() { return _elasticEnergy;}; - + virtual double plasticEnergy() const { return _plasticEnergy;}; - virtual double& getRefToPlasticEnergy() { return _plasticEnergy;}; - + virtual double& getRefToPlasticEnergy() { return _plasticEnergy;}; + virtual double irreversibleEnergy() const { return _irreversibleEnergy;}; virtual double& getRefToIrreversibleEnergy() { return _irreversibleEnergy;}; - + virtual const STensor3& getConstRefToDIrreversibleEnergyDDeformationGradient() const { return _DirreversibleEnergyDF;}; - + virtual STensor3& getRefToDIrreversibleEnergyDDeformationGradient() { return _DirreversibleEnergyDF;}; virtual double get(const int comp) const; @@ -81,8 +81,8 @@ class dG3DMultiscaleIPVariable : public dG3DIPVariable{ restartManager::restart(_irreversibleEnergy); restartManager::restart(_DirreversibleEnergyDF); }; - - + + #if defined(HAVE_MPI) virtual int getMacroNumberElementDataSendToMicroProblem() const; @@ -102,7 +102,7 @@ class dG3DMultiscaleIPVariable : public dG3DIPVariable{ class MultiscaleFractureCohesive3DIPVariable : public FractureCohesive3DIPVariable{ protected: - + public: MultiscaleFractureCohesive3DIPVariable(const double facSigmac=1.):FractureCohesive3DIPVariable(facSigmac){ }; @@ -111,13 +111,13 @@ class MultiscaleFractureCohesive3DIPVariable : public FractureCohesive3DIPVariab FractureCohesive3DIPVariable::operator=(source); const MultiscaleFractureCohesive3DIPVariable* psrc = dynamic_cast<const MultiscaleFractureCohesive3DIPVariable*>(&source); if (psrc!=NULL){ - - + + } return *this; }; virtual ~MultiscaleFractureCohesive3DIPVariable(){} - + virtual void broken(); virtual void nobroken(); @@ -143,27 +143,39 @@ class BulkFollowedCohesive3DIPVariable : public Cohesive3DIPVariable{ STensor43 _dFinterfacedF; STensor33 _dFinterfacedJump; STensor33 _dFinterfacedInStrain; - + double _irreversibleEnergy; SVector3 _DirreversibleEnergyDjump; SVector3 _DirreversibleEnergyDInStrain; STensor3 _DirreversibleEnergyDF; + SVector3 _cohesiveTangent; // cohesive tangent + SVector3 _cohesiveBiTangent; // cohesive bitangent + // - Basis in reference config + SVector3 _cohesiveRefNormal; // cohesive normal in reference config + SVector3 _cohesiveRefTangent; // cohesive tangent + SVector3 _cohesiveRefBiTangent; // cohesive bitangent + + public: BulkFollowedCohesive3DIPVariable(): Cohesive3DIPVariable(), _isTension(true), _isDeleted(false),_DcohesiveJumpDF(0.),_DcohesiveJumpDJump(0.), _DcohesiveJumpDInStrain(0.), _Fb0(1.),_Fb(1.), _dFinterfacedF(0.), _dFinterfacedJump(0.),_incompatibleStrain0(0.),_dFinterfacedInStrain(0.), _irreversibleEnergy(0.),_DirreversibleEnergyDjump(0.),_DirreversibleEnergyDInStrain(0.), - _DirreversibleEnergyDF(0.){}; + _DirreversibleEnergyDF(0.), _cohesiveTangent(0.), _cohesiveBiTangent(0.), + _cohesiveRefNormal(0.),_cohesiveRefTangent(0.),_cohesiveRefBiTangent(0.){}; BulkFollowedCohesive3DIPVariable(const BulkFollowedCohesive3DIPVariable& src): Cohesive3DIPVariable(src), _isDeleted(src._isDeleted), _isTension(src._isTension), _DcohesiveJumpDF(src._DcohesiveJumpDF),_incompatibleStrain0(src._incompatibleStrain0), _DcohesiveJumpDJump(src._DcohesiveJumpDJump), _DcohesiveJumpDInStrain(src._DcohesiveJumpDInStrain), - _Fb0(src._Fb0),_Fb(src._Fb), + _Fb0(src._Fb0),_Fb(src._Fb), _dFinterfacedF(src._dFinterfacedF),_dFinterfacedJump(src._dFinterfacedJump), _dFinterfacedInStrain(src._dFinterfacedInStrain), _irreversibleEnergy(src._irreversibleEnergy),_DirreversibleEnergyDjump(src._DirreversibleEnergyDjump), _DirreversibleEnergyDInStrain(src._DirreversibleEnergyDInStrain), - _DirreversibleEnergyDF(src._DirreversibleEnergyDF){}; + _DirreversibleEnergyDF(src._DirreversibleEnergyDF), + _cohesiveTangent(src._cohesiveTangent), _cohesiveBiTangent(src._cohesiveBiTangent), + _cohesiveRefNormal(src._cohesiveRefNormal),_cohesiveRefTangent(src._cohesiveRefTangent), + _cohesiveRefBiTangent(src._cohesiveRefBiTangent){}; virtual BulkFollowedCohesive3DIPVariable& operator =(const IPVariable& src){ Cohesive3DIPVariable::operator=(src); const BulkFollowedCohesive3DIPVariable* psrc = dynamic_cast<const BulkFollowedCohesive3DIPVariable*>(&src); @@ -179,11 +191,18 @@ class BulkFollowedCohesive3DIPVariable : public Cohesive3DIPVariable{ _dFinterfacedF = psrc->_dFinterfacedF; _dFinterfacedJump = psrc->_dFinterfacedJump; _dFinterfacedInStrain = psrc->_dFinterfacedInStrain; - + _irreversibleEnergy = psrc->_irreversibleEnergy; _DirreversibleEnergyDjump = psrc->_DirreversibleEnergyDjump; _DirreversibleEnergyDInStrain = psrc->_DirreversibleEnergyDInStrain; _DirreversibleEnergyDF = psrc->_DirreversibleEnergyDF; + + _cohesiveTangent = psrc->_cohesiveTangent; // cohesive tangent + _cohesiveBiTangent = psrc->_cohesiveBiTangent; // cohesive bitangent + // - Basis in reference config + _cohesiveRefNormal = psrc->_cohesiveRefNormal; // cohesive normal in reference config + _cohesiveRefTangent = psrc->_cohesiveRefTangent; // cohesive tangent + _cohesiveRefBiTangent = psrc->_cohesiveRefBiTangent; // cohesive bitangent } return *this; }; @@ -200,23 +219,23 @@ class BulkFollowedCohesive3DIPVariable : public Cohesive3DIPVariable{ /* for current local at cohesive surface basis*/ // cohesive tangent - virtual const SVector3& getConstRefToCohesiveTangent() const {}; - virtual SVector3& getRefToCohesiveTangent() {}; + virtual const SVector3& getConstRefToCohesiveTangent() const {return _cohesiveTangent;}; + virtual SVector3& getRefToCohesiveTangent() {return _cohesiveTangent;}; - virtual const SVector3& getConstRefToCohesiveBiTangent() const {}; - virtual SVector3& getRefToCohesiveBiTangent() {}; + virtual const SVector3& getConstRefToCohesiveBiTangent() const {return _cohesiveBiTangent;}; + virtual SVector3& getRefToCohesiveBiTangent() {return _cohesiveBiTangent;}; /*for reference local basis at cohesive surface*/ - virtual const SVector3& getConstRefToCohesiveReferenceNormal() const {}; - virtual SVector3& getRefToCohesiveReferenceNormal() {}; + virtual const SVector3& getConstRefToCohesiveReferenceNormal() const {return _cohesiveRefNormal;}; + virtual SVector3& getRefToCohesiveReferenceNormal() {return _cohesiveRefNormal;}; // cohesive tangent - virtual const SVector3& getConstRefToCohesiveReferenceTangent() const {}; - virtual SVector3& getRefToCohesiveReferenceTangent() {}; + virtual const SVector3& getConstRefToCohesiveReferenceTangent() const {return _cohesiveRefTangent;}; + virtual SVector3& getRefToCohesiveReferenceTangent() {return _cohesiveRefTangent;}; - virtual const SVector3& getConstRefToCohesiveReferenceBiTangent() const {}; - virtual SVector3& getRefToCohesiveReferenceBiTangent() {}; + virtual const SVector3& getConstRefToCohesiveReferenceBiTangent() const {return _cohesiveRefBiTangent;}; + virtual SVector3& getRefToCohesiveReferenceBiTangent() {return _cohesiveRefBiTangent;}; - virtual bool useLocalBasis() const {return false;}; + virtual bool useLocalBasis() const {return true;}; // deletion criterion virtual bool isDeleted() const {return _isDeleted;}; @@ -244,16 +263,16 @@ class BulkFollowedCohesive3DIPVariable : public Cohesive3DIPVariable{ virtual const STensor33& getConstRefToDInterfaceDeformationGradientDIncompatibleStrainVector() const {return _dFinterfacedInStrain;};; virtual STensor33& getRefToDInterfaceDeformationGradientDIncompatibleStrainVector() {return _dFinterfacedInStrain;}; - + virtual double irreversibleEnergy() const {return _irreversibleEnergy;}; virtual double& getRefToIrreversibleEnergy() {return _irreversibleEnergy;}; - + virtual SVector3& getRefToDIrreversibleEnergyDJump() {return _DirreversibleEnergyDjump;}; virtual const SVector3& getConstRefToDIrreversibleEnergyDJump() const {return _DirreversibleEnergyDjump;}; - + virtual const SVector3& getConstRefToDIrreversibleEnergyDIncompatibleStrainVector() const {return _DirreversibleEnergyDInStrain;}; virtual SVector3& getRefToDIrreversibleEnergyDIncompatibleStrainVector() {return _DirreversibleEnergyDInStrain;}; - + virtual const STensor3& getConstRefToDIrreversibleEnergyDDeformationGradient() const {return _DirreversibleEnergyDF;}; virtual STensor3& getRefToDIrreversibleEnergyDDeformationGradient() {return _DirreversibleEnergyDF;}; @@ -311,7 +330,7 @@ class MultiscaleCohesive3DIPVariable : public BulkFollowedCohesive3DIPVariable{ class MultiscaleThermoMechanicsDG3DIPVariable : public ThermoMechanicsDG3DIPVariableBase{ protected: - + public: MultiscaleThermoMechanicsDG3DIPVariable(const bool oninter): ThermoMechanicsDG3DIPVariableBase(oninter){}; MultiscaleThermoMechanicsDG3DIPVariable(const MultiscaleThermoMechanicsDG3DIPVariable& src): @@ -321,16 +340,16 @@ class MultiscaleThermoMechanicsDG3DIPVariable : public ThermoMechanicsDG3DIPVari return *this; }; virtual ~MultiscaleThermoMechanicsDG3DIPVariable(){}; - + virtual double defoEnergy() const; virtual double getInternalEnergyExtraDofDiffusion() const; virtual double plasticEnergy() const; - + virtual IPVariable* clone() const {return new MultiscaleThermoMechanicsDG3DIPVariable(*this);}; virtual void restart(){ MultiscaleThermoMechanicsDG3DIPVariable::restart(); } - + #if defined(HAVE_MPI) // using in multiscale analysis with MPI // get number of values to set the kinematics of microscopic problem diff --git a/dG3D/src/dG3DMultiscaleMaterialLaw.cpp b/dG3D/src/dG3DMultiscaleMaterialLaw.cpp index 0bea7ebb8a9a4f15e8be26dddc616c24e0e2e88d..7dd86d9f7509c1cf10a44f415077b1f3c793349d 100644 --- a/dG3D/src/dG3DMultiscaleMaterialLaw.cpp +++ b/dG3D/src/dG3DMultiscaleMaterialLaw.cpp @@ -17,7 +17,7 @@ void dG3DMultiscaleMaterialLaw::fillElasticStiffness(double & rho, STensor43& L) solver->setExtractCohesiveLawFromMicroDamage(false); solver->setExtractIrreversibleEnergyFlag(false); solver->initMicroSolver(); - + L = solver->getHomogenizationState(IPStateBase::current)->getHomogenizedTangentOperator_F_F(); rho = solver->getHomogenizedDensity(); delete solver; @@ -30,7 +30,7 @@ dG3DMultiscaleMaterialLaw::dG3DMultiscaleMaterialLaw(const int lnum, const int t void dG3DMultiscaleMaterialLaw::initLaws(const std::map<int,materialLaw*> &maplaw){ if (!_initialized){ this->fillElasticStiffness(_rho,elasticStiffness); - + if (_blockDamageAfterFailureOnset and (_lostSolutionUniquenssTolerance<=0.)){ _lostSolutionUniquenssTolerance = 1e10; for (std::map<int,materialLaw*>::const_iterator it = maplaw.begin(); it != maplaw.end(); it++){ @@ -40,9 +40,9 @@ void dG3DMultiscaleMaterialLaw::initLaws(const std::map<int,materialLaw*> &mapla _lostSolutionUniquenssTolerance = cohLaw->getLostSolutionUniquenssTolerance(); } } - } + } printf("tolerance of lost of ellipticity at bulk ip %f \n",_lostSolutionUniquenssTolerance); - + } _initialized = true; } @@ -63,10 +63,17 @@ 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 (isSolve){ int el = ele->getNum(); nonLinearMechSolver* solver = this->createMicroSolver(el,gpt); + if (_blockDamageAfterFailureOnset){ + solver->setLostSolutionUniquenssTolerance(_lostSolutionUniquenssTolerance); + solver->setCheckFailureOnset(true); + } + else{ + solver->setCheckFailureOnset(false); + } solver->initMicroSolver(); ips->setSolver(solver); } @@ -82,7 +89,7 @@ void dG3DMultiscaleMaterialLaw::createIPVariable(IPVariable* &ipv,const MElement void dG3DMultiscaleMaterialLaw::stress(IPVariable* ipv, const IPVariable* ipvprev, const bool stiff, const bool checkfrac){ dG3DMultiscaleIPVariable* mipv = NULL; const dG3DMultiscaleIPVariable* mipvprev = NULL; - + FractureCohesive3DIPVariable* ipvFrac = dynamic_cast<FractureCohesive3DIPVariable*>(ipv); if (ipvFrac != NULL){ mipv = dynamic_cast<dG3DMultiscaleIPVariable*>(ipvFrac->getIPvBulk()); @@ -93,13 +100,13 @@ void dG3DMultiscaleMaterialLaw::stress(IPVariable* ipv, const IPVariable* ipvpre mipv = dynamic_cast<dG3DMultiscaleIPVariable*>(ipv); mipvprev = dynamic_cast<const dG3DMultiscaleIPVariable*>(ipvprev); } - + nonLinearMechSolver* solver = mipv->getSolver(); // set kinematics input const STensor3& F = mipv->getConstRefToDeformationGradient(); - + solver->getMicroBC()->setDeformationGradient(F); - + if (mipv->isInterface()){ SVector3 refN = mipv->getConstRefToReferenceOutwardNormal(); refN.normalize(); @@ -114,24 +121,25 @@ void dG3DMultiscaleMaterialLaw::stress(IPVariable* ipv, const IPVariable* ipvpre mipv->getRefToDefoEnergy() = solver->getHomogenizationState(IPStateBase::current)->getDeformationEnergy(); mipv->getRefToPlasticEnergy() = solver->getHomogenizationState(IPStateBase::current)->getPlasticEnergy(); mipv->getRefToIrreversibleEnergy() = solver->getHomogenizationState(IPStateBase::current)->getIrreversibleEnergy(); - mipv->getRefToFailureDamage() = solver->getHomogenizationState(IPStateBase::current)->getActiveDamage(); + mipv->getRefToFailureDamage() = solver->getHomogenizationState(IPStateBase::current)->getActiveDamage(); - // check cohesive insertion - if (mipv->isInterface() and solver->getDamageToCohesiveJumpFlag()){ - solver->checkFailureOnset_withNormalVector(); - } - else if (_blockDamageAfterFailureOnset and (!mipvprev->damageIsBlocked())){ - solver->setLostSolutionUniquenssTolerance(_lostSolutionUniquenssTolerance); - solver->checkFailureOnset_withoutNormalVector(); - if (solver->getHomogenizationState(IPStateBase::current)->getBrokenFlag()){ - mipv->blockDamage(true); - } - else{ - mipv->blockDamage(false); - } + if (solver->checkFailureOnset()){ + if (mipv->isInterface()){ + solver->checkFailureOnset_withNormalVector(); + } + else if (!mipvprev->damageIsBlocked()){ + solver->checkFailureOnset_withoutNormalVector(); + if (solver->getHomogenizationState(IPStateBase::current)->getBrokenFlag()){ + mipv->blockDamage(true); + } + else{ + mipv->blockDamage(false); + } + } } - mipv->getRefToSolverBrokenFlag() = solver->getHomogenizationState(IPStateBase::current)->getBrokenFlag(); + mipv->getRefToSolverBrokenFlag() = solver->getHomogenizationState(IPStateBase::current)->getBrokenFlag(); + if (stiff){ mipv->getRefToTangentModuli() = solver->getHomogenizationState(IPStateBase::current)->getHomogenizedTangentOperator_F_F(); mipv->getRefToDIrreversibleEnergyDDeformationGradient() = solver->getHomogenizationState(IPStateBase::current)->getHomogenizedTangentOperator_IrreversibleEnergy_F(); @@ -159,6 +167,7 @@ void dG3DMultiscaleMaterialLaw::initialIPVariable(IPVariable* ipv, bool stiff){ }; }; + MultiscaleFractureByCohesive3DLaw::MultiscaleFractureByCohesive3DLaw(const int num,const int nbulk, const int ncoh): FractureByCohesive3DLaw(num,nbulk,ncoh),numericalMaterialBase(),_nummat(NULL){}; MultiscaleFractureByCohesive3DLaw::MultiscaleFractureByCohesive3DLaw(const MultiscaleFractureByCohesive3DLaw& src): @@ -220,29 +229,108 @@ void MultiscaleFractureByCohesive3DLaw::createIPState(const bool isSolve, IPStat if(ips != NULL) delete ips; ips = new IP3State(state_,ipvi,ipv1,ipv2); - + if (isSolve){ // if bulk law is a multiscale law int el = ele->getNum(); nonLinearMechSolver* solver = this->createMicroSolver(el,gpt); - const GeneralBulkFollwedCohesive3DLaw* interfaceLaw = dynamic_cast<const GeneralBulkFollwedCohesive3DLaw*>(_mfrac); + const GeneralMultiscaleBulkFollwedCohesive3DLaw* interfaceLaw = dynamic_cast<const GeneralMultiscaleBulkFollwedCohesive3DLaw*>(_mfrac); if (interfaceLaw != NULL){ + solver->setLostSolutionUniquenssTolerance(interfaceLaw->getLostSolutionUniquenssTolerance()); + if (interfaceLaw->getLocationForStressExtraction()>=0){ + solver->setLocationForStressExtraction(interfaceLaw->getLocationForStressExtraction()); + } + solver->setCheckFailureOnset(true); // set check failure onset + if (interfaceLaw->isDamageToCohesiveJump()){ printf("rank %d : extract cohesive law at element %d ip %d \n",Msg::GetCommRank(),el,gpt); solver->setExtractCohesiveLawFromMicroDamage(true); - solver->setLostSolutionUniquenssTolerance(interfaceLaw->getLostSolutionUniquenssTolerance()); - if (interfaceLaw->getLocationForStressExtraction()>=0){ - solver->setLocationForStressExtraction(interfaceLaw->getLocationForStressExtraction()); - } } else{ solver->setExtractCohesiveLawFromMicroDamage(false); } + + SVector3 n, t, b; + // get macrosolver + const nonLinearMechSolver* macroSolver = _mbulk->getSolver(); + if (macroSolver== NULL){ + Msg::Fatal("macro solver has not set yet"); + } + + macroSolver->getLocalBasis(ele,gpt,n,t,b); + + if (interfaceLaw->getRotationOfRVEFollowingInterfaceLocalBasis() and !solver->GModelIsRotated()){ + solver->rotateModel(n,t,b); + } + + 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]); + nonLinearOrthogonalMixedBCDirectionFollowing* mixedBC = static_cast<nonLinearOrthogonalMixedBCDirectionFollowing*>(mbc); + mixedBC->clearDirs(); + if (mbc->getDim() == 2){ + mixedBC->setKUBCDirection(t); + mixedBC->setSUBCDirection(n); + } + else if (mbc->getDim() == 3){ + mixedBC->setKUBCDirection(t); + mixedBC->setSUBCDirection(n); + mixedBC->setKUBCDirection(b); + } + } + else if (mbc->getType() == nonLinearMicroBC::PBC){ + nonLinearPeriodicBC* pbc = static_cast<nonLinearPeriodicBC*>(mbc); + if (mbc->getDim() == 2){ + if (pbc->isShifted()){ + pbc->setShiftPBCNormal(n); + } + } + else{ + Msg::Fatal("shifted BC is not defined for 3D problem"); + } + } + + if (interfaceLaw->isSwitchedToFailureBC()){ + printf("set microBC for failure\n"); + solver->setSwitchMicroBCFlag(true); + solver->addMicroBCForFailure(interfaceLaw->getMicroBCFailure()); + + nonLinearMicroBC* failureBC = solver->getMicroBCFailure(); + if (failureBC->getType() == nonLinearMicroBC::OrthogonalDirectionalMixedBC){ + printf("set OrthogonalDirectionalMixedBC %d n = %f %f %f t= %f %f %f",Msg::GetCommRank(),n[0],n[1],n[2],t[0],t[1],t[2]); + nonLinearOrthogonalMixedBCDirectionFollowing* failuremixedBC = static_cast<nonLinearOrthogonalMixedBCDirectionFollowing*>(mbc); + failuremixedBC->clearDirs(); + if (failureBC->getDim() == 2){ + failuremixedBC->setKUBCDirection(t); + failuremixedBC->setSUBCDirection(n); + } + else if (failureBC->getDim() == 3){ + failuremixedBC->setKUBCDirection(t); + failuremixedBC->setSUBCDirection(n); + failuremixedBC->setKUBCDirection(b); + } + } + else if (failureBC->getType() == nonLinearMicroBC::PBC){ + 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]); + nonLinearPeriodicBC* failurepbc = static_cast<nonLinearPeriodicBC*>(failureBC); + if (failureBC->getDim() == 2){ + if (failurepbc->isShifted()){ + failurepbc->setShiftPBCNormal(n); + } + } + else{ + Msg::Fatal("shifted BC is not defined for 3D problem"); + } + } + + } + } + solver->initMicroSolver(); ips->setSolver(solver); } - + } else{ _nummat->createIPState(isSolve,ips,state_,ele,nbFF_,GP,gpt); @@ -262,20 +350,20 @@ void MultiscaleFractureByCohesive3DLaw::initialBroken(IPStateBase *ips) const solver->getHomogenizationState(IPStateBase::previous)->getBrokenFlag() = true; solver->getHomogenizationState(IPStateBase::current)->getBrokenFlag() = true; } - } +void MultiscaleFractureByCohesive3DLaw::stress(IPVariable*ipv, const IPVariable*ipvprev, const bool stiff, const bool checkfrac){ + + FractureByCohesive3DLaw::stress(ipv,ipvprev,stiff,checkfrac); +}; + GeneralBulkFollwedCohesive3DLaw::GeneralBulkFollwedCohesive3DLaw(const int num, const bool init):Cohesive3DLaw(num,init), - _L(0.),_damageToCohesiveJump(false), _stressExtractLocation(-1),_lostSolutionUniquenssTolerance(0.){}; + _L(0.),_lostSolutionUniquenssTolerance(0.){}; GeneralBulkFollwedCohesive3DLaw::GeneralBulkFollwedCohesive3DLaw(const GeneralBulkFollwedCohesive3DLaw& src): - Cohesive3DLaw(src),_L(src._L), _damageToCohesiveJump(src._damageToCohesiveJump),_stressExtractLocation(src._stressExtractLocation), + Cohesive3DLaw(src),_L(src._L), _lostSolutionUniquenssTolerance(src._lostSolutionUniquenssTolerance){} -void GeneralBulkFollwedCohesive3DLaw::setExtractCohesiveLawFromMicroDamage(const bool flag){ - _damageToCohesiveJump = flag; -}; - void GeneralBulkFollwedCohesive3DLaw::setLostSolutionUniquenssTolerance(const double tol){ _lostSolutionUniquenssTolerance = tol; }; @@ -296,9 +384,35 @@ void GeneralBulkFollwedCohesive3DLaw::createIPVariable(IPVariable* &ipv,const ME ipv = new BulkFollowedCohesive3DIPVariable(); } -GeneralMultiscaleBulkFollwedCohesive3DLaw::GeneralMultiscaleBulkFollwedCohesive3DLaw(const int num, const bool init):GeneralBulkFollwedCohesive3DLaw(num,init){}; +GeneralMultiscaleBulkFollwedCohesive3DLaw::GeneralMultiscaleBulkFollwedCohesive3DLaw(const int num, const bool init): + GeneralBulkFollwedCohesive3DLaw(num,init), +_stressExtractLocation(-1),_voidPartInLocalizationBand(0.),_rotateRVEFollowingInterfaceNormal(false), +_microBCFailure(NULL) +{}; GeneralMultiscaleBulkFollwedCohesive3DLaw::GeneralMultiscaleBulkFollwedCohesive3DLaw(const GeneralMultiscaleBulkFollwedCohesive3DLaw& src): - GeneralBulkFollwedCohesive3DLaw(src){} + GeneralBulkFollwedCohesive3DLaw(src), + _stressExtractLocation(src._stressExtractLocation), + _voidPartInLocalizationBand(src._voidPartInLocalizationBand), + _rotateRVEFollowingInterfaceNormal(src._rotateRVEFollowingInterfaceNormal){ + _microBCFailure = NULL; + if (src._microBCFailure != NULL){ + _microBCFailure = src._microBCFailure->clone(); + } +} + +void GeneralMultiscaleBulkFollwedCohesive3DLaw::addMicroBCFailure(const nonLinearMicroBC* mbc){ + if (_microBCFailure) delete _microBCFailure; + _microBCFailure = mbc->clone(); +}; + +bool GeneralMultiscaleBulkFollwedCohesive3DLaw::isSwitchedToFailureBC() const{ + if (_microBCFailure == NULL) return false; + else return true; +}; + +GeneralMultiscaleBulkFollwedCohesive3DLaw::~GeneralMultiscaleBulkFollwedCohesive3DLaw(){ + if (_microBCFailure != NULL) delete _microBCFailure; +}; void GeneralMultiscaleBulkFollwedCohesive3DLaw::createIPState(IPStateBase* &ips,const bool* state_, const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const @@ -317,7 +431,8 @@ void GeneralMultiscaleBulkFollwedCohesive3DLaw::createIPVariable(IPVariable* &ip dG3DMultiscaleCohesiveLaw::dG3DMultiscaleCohesiveLaw(const int num, const double surfaceRatio): - GeneralMultiscaleBulkFollwedCohesive3DLaw(num,true),_surfaceReductionRatio(surfaceRatio){}; + GeneralMultiscaleBulkFollwedCohesive3DLaw(num,true),_surfaceReductionRatio(surfaceRatio) + {}; dG3DMultiscaleCohesiveLaw::dG3DMultiscaleCohesiveLaw(const dG3DMultiscaleCohesiveLaw& src): GeneralMultiscaleBulkFollwedCohesive3DLaw(src),_surfaceReductionRatio(src._surfaceReductionRatio){} @@ -348,10 +463,10 @@ void dG3DMultiscaleCohesiveLaw::checkCohesiveInsertion(IPStateBase* ipsm, IPStat fPlusCur->broken(); return; } - + bool solverIsBrokenMinus = static_cast<const dG3DMultiscaleIPVariable*>(fMinusCur->getIPvBulk())->solverIsBroken(); bool solverIsBrokenPlus = static_cast<const dG3DMultiscaleIPVariable*>(fPlusCur->getIPvBulk())->solverIsBroken(); - + if (solverIsBrokenMinus or solverIsBrokenPlus){ printf("rank %d: cohesive element is inserted \n",Msg::GetCommRank()); fMinusCur->broken(); @@ -399,40 +514,37 @@ void dG3DMultiscaleCohesiveLaw::transferInterfaceDataToBulk(IPVariable* ipv, con else { Msg::Fatal("solver is not available MultiscaleDGCohesive3DLaw::transferInterfaceDataToBulk"); } - + const homogenizedData* homoData = solver->getHomogenizationState(IPStateBase::current); const homogenizedData* homoDataPrev = solver->getHomogenizationState(IPStateBase::previous); - + SVector3 refN = fipv->getConstRefToReferenceOutwardNormal(); refN.normalize(); - - + + const STensor3& Fb0 = fipvprev->getBulkDeformationGradient(); const STensor3& Fb = fipv->getBulkDeformationGradient(); - + const SVector3& ujump = fipv->getConstRefToJump(); const SVector3& ujump0 = fipvprev->getConstRefToJump(); + + + //double beta = (homoData->getActiveDamageVolume() + _voidPartInLocalizationBand)/(_surfaceReductionRatio*solver->getRVEVolume()); + //double lM = homoData->getAverageLocalizationBandWidth(); + double GammaM = solver->getHomogenizedCrackFace(); + double V0 = solver->getRVEVolume(); + double fact = GammaM/V0; - - double beta = homoData->getActiveDamageVolume()/(_surfaceReductionRatio*solver->getRVEVolume()); - double lM = homoData->getAverageLocalizationBandWidth(); - + STensor3& F = fipv->getRefToDeformationGradient(); F = fipvprev->getConstRefToDeformationGradient(); - - SVector3 dFbN(0.); - for (int i=0; i<3; i++){ - for (int j=0; j<3; j++){ - dFbN(i) += (Fb(i,j) - Fb0(i,j))*refN(j); - } - } - + for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ - F(i,j) += Fb(i,j) - Fb0(i,j)-beta*dFbN(i)*refN(j) + (beta/lM)*(ujump(i) - ujump0(i))*refN(j); + F(i,j) += Fb(i,j) - Fb0(i,j) + fact*(ujump(i) - ujump0(i))*refN(j); } } - + if (stiff){ STensor43& dFinterfacedF = fipv->getRefToDInterfaceDeformationGradientDDeformationGradient(); STensor33& dFinterfacedJump = fipv->getRefToDInterfaceDeformationGradientDJump(); @@ -443,9 +555,9 @@ void dG3DMultiscaleCohesiveLaw::transferInterfaceDataToBulk(IPVariable* ipv, con for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ for (int k=0; k<3; k++){ - dFinterfacedJump(i,j,k) += I(i,k)*refN(j)*(beta/lM); + dFinterfacedJump(i,j,k) += I(i,k)*refN(j)*fact; for (int l=0; l<3; l++){ - dFinterfacedF(i,j,k,l) += I(i,k)*I(j,l) - beta*I(i,k)*refN(j)*refN(l); + dFinterfacedF(i,j,k,l) += I(i,k)*I(j,l); // - beta*I(i,k)*refN(j)*refN(l); } } @@ -455,6 +567,7 @@ void dG3DMultiscaleCohesiveLaw::transferInterfaceDataToBulk(IPVariable* ipv, con solver->setLocalizationNormal(refN); solver->setRVELengthInNormalDirection(_L,_surfaceReductionRatio); + solver->setVoidPartInLocalizationBand(_voidPartInLocalizationBand); } }; @@ -474,11 +587,11 @@ void dG3DMultiscaleCohesiveLaw::stress(IPVariable* ipv, const IPVariable* ipvpre nonLinearMechSolver* solver = mipv->getSolver(); const homogenizedData* homoData = solver->getHomogenizationState(IPStateBase::current); const homogenizedData* homoDataPrev = solver->getHomogenizationState(IPStateBase::previous); - + SVector3 refN = fipv->getConstRefToReferenceOutwardNormal(); refN.normalize(); - + const STensor3& P = fipv->getConstRefToFirstPiolaKirchhoffStress(); SVector3& T = fipv->getRefToInterfaceForce(); T *= 0.; @@ -490,31 +603,31 @@ void dG3DMultiscaleCohesiveLaw::stress(IPVariable* ipv, const IPVariable* ipvpre SVector3& cjump = fipv->getRefToCohesiveJump(); cjump = homoData->getHomogenizedCohesiveJump(); - + double normalPart = dot(cjump,refN); - + if (!cohmipvprev->ifTension()){ for (int i=0; i<3; i++) cjump(i) -= normalPart*refN(i); } - + if (normalPart < 0){ cohmipv->setTensionFlag(false); } else{ cohmipv->setTensionFlag(true); } - + const double& lprev = homoDataPrev->getAverageLocalizationBandWidth(); - + double& irr = fipv->getRefToIrreversibleEnergy(); irr = homoData->getIrreversibleEnergy()*lprev; if (stiff){ - + const STensor43& dFinterfacedF = fipv->getConstRefToDInterfaceDeformationGradientDDeformationGradient(); const STensor33& dFinterfacedJump = fipv->getConstRefToDInterfaceDeformationGradientDJump(); - + const STensor43& dPdFinf = homoData->getHomogenizedTangentOperator_F_F(); STensor33& dTdF = fipv->getRefToDInterfaceForceDDeformationGradient(); STensor3& dTdjump = fipv->getRefToDInterfaceForceDjump(); @@ -537,12 +650,12 @@ void dG3DMultiscaleCohesiveLaw::stress(IPVariable* ipv, const IPVariable* ipvpre } } } - + const STensor33& dcjumpdFinf = homoData->getHomogenizedTangentOperator_CohesiveJump_F(); STensor33& dcjumpDF = fipv->getRefToDCohesiveJumpDDeformationGradient(); STensor3& dcjumpDJump = fipv->getRefToDCohesiveJumpDJump(); - + STensor33 dcjumpdFinfNew(dcjumpdFinf); if (!cohmipvprev->ifTension()){ STensor3 INN(1.); @@ -551,8 +664,8 @@ void dG3DMultiscaleCohesiveLaw::stress(IPVariable* ipv, const IPVariable* ipvpre INN(i,j) -= refN(i)*refN(j); } } - - + + for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ for (int k=0; k<3; k++){ @@ -563,12 +676,12 @@ void dG3DMultiscaleCohesiveLaw::stress(IPVariable* ipv, const IPVariable* ipvpre } } } - + dcjumpDF *= 0.; dcjumpDJump*= 0.; - - + + for (int i=0; i<3; i++){ for (int p=0; p<3; p++){ for (int q=0; q<3; q++){ @@ -581,17 +694,17 @@ void dG3DMultiscaleCohesiveLaw::stress(IPVariable* ipv, const IPVariable* ipvpre } } } - + if (homoData->getIrreversibleEnergyExtractionFlag()){ - + STensor3& dirrEnergDF = fipv->getRefToDIrreversibleEnergyDDeformationGradient(); SVector3& dirrEnergDJump = fipv->getRefToDIrreversibleEnergyDJump(); - + dirrEnergDF *=0.; dirrEnergDJump*=0.; - + 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++){ @@ -600,7 +713,7 @@ void dG3DMultiscaleCohesiveLaw::stress(IPVariable* ipv, const IPVariable* ipvpre dirrEnergDF(k,l) += dirrEnergdFinf(i,j)*dFinterfacedF(i,j,k,l); } } - + } } } @@ -635,21 +748,20 @@ void TwoFieldMultiscaleCohesive3DLaw::transferInterfaceDataToBulk(IPVariable* ip else { Msg::Fatal("solver is not available MultiscaleDGCohesive3DLaw::transferInterfaceDataToBulk"); } - + const homogenizedData* homoData = solver->getHomogenizationState(IPStateBase::current); const homogenizedData* homoDataPrev = solver->getHomogenizationState(IPStateBase::previous); - + SVector3 refN = fipv->getConstRefToReferenceOutwardNormal(); refN.normalize(); - - -#if 0 + + const SVector3& iJump0 = cohIpvprev->getConstRefToIncompatibleStrainAtFailureOnset(); const SVector3& iJump = fipv->getConstRefToIncompatibleStrainVector(); - + STensor3& F = fipv->getRefToDeformationGradient(); F = fipv->getBulkDeformationGradient(); - + for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ F(i,j) += (iJump(i) - iJump0(i))*refN(j); @@ -676,65 +788,7 @@ void TwoFieldMultiscaleCohesive3DLaw::transferInterfaceDataToBulk(IPVariable* ip } } } -#else - - const SVector3& iJump0 = fipvprev->getConstRefToIncompatibleStrainVector(); - const SVector3& iJump = fipv->getConstRefToIncompatibleStrainVector(); - - const STensor3& Fb0 = fipvprev->getBulkDeformationGradient(); - const STensor3& Fb = fipv->getBulkDeformationGradient(); - - const SVector3& ujump = fipv->getConstRefToJump(); - const SVector3& ujump0 = fipvprev->getConstRefToJump(); - - - double beta = homoData->getActiveDamageVolume()/solver->getRVEVolume(); - double lM = homoData->getAverageLocalizationBandWidth(); - - SVector3 dFbN(0.); - for (int i=0; i<3; i++){ - for (int j=0; j<3; j++){ - dFbN(i) += (Fb(i,j) - Fb0(i,j))*refN(j); - } - } - - STensor3& F = fipv->getRefToDeformationGradient(); - F = fipvprev->getConstRefToDeformationGradient(); - - for (int i=0; i<3; i++){ - for (int j=0; j<3; j++){ - F(i,j) += Fb(i,j) - Fb0(i,j)-beta*dFbN(i)*refN(j)+ beta*(ujump(i)-ujump0(i))*refN(j)/lM + (iJump(i) - iJump0(i))*refN(j); - //F(i,j) += (1.-beta)*(Fb(i,j) - Fb0(i,j)) + (iJump(i) - iJump0(i))*refN(j); - } - } - - if (stiff){ - STensor43& dFinterfacedF = fipv->getRefToDInterfaceDeformationGradientDDeformationGradient(); - STensor33& dFinterfacedJump = fipv->getRefToDInterfaceDeformationGradientDJump(); - STensor33& dFinterfacedInstrain = fipv->getRefToDInterfaceDeformationGradientDIncompatibleStrainVector(); - dFinterfacedF *= 0.; - dFinterfacedJump *= 0.; - dFinterfacedInstrain *= 0.; - static STensor3 I(1.); - for (int i=0; i<3; i++){ - for (int j=0; j<3; j++){ - for (int k=0; k<3; k++){ - dFinterfacedInstrain(i,j,k) += I(i,k)*refN(j); - dFinterfacedJump(i,j,k) += I(i,k)*refN(j)*(beta/lM); - for (int l=0; l<3; l++){ - //dFinterfacedF(i,j,k,l) += (1-beta)*I(i,k)*I(j,l); - dFinterfacedF(i,j,k,l) += I(i,k)*I(j,l) - beta*I(i,k)*refN(j)*refN(l); - } - } - - } - } - } - -#endif //1 - - solver->setLocalizationNormal(refN); solver->setRVELengthInNormalDirection(_L,_surfaceReductionRatio); @@ -767,11 +821,11 @@ void TwoFieldMultiscaleCohesive3DLaw::stress(IPVariable* ipv, const IPVariable* nonLinearMechSolver* solver = mipv->getSolver(); const homogenizedData* homoData = solver->getHomogenizationState(IPStateBase::current); const homogenizedData* homoDataPrev = solver->getHomogenizationState(IPStateBase::previous); - + SVector3 refN = fipv->getConstRefToReferenceOutwardNormal(); refN.normalize(); - + const STensor3& P = fipv->getConstRefToFirstPiolaKirchhoffStress(); SVector3& T = fipv->getRefToInterfaceForce(); T *= 0.; @@ -783,32 +837,32 @@ void TwoFieldMultiscaleCohesive3DLaw::stress(IPVariable* ipv, const IPVariable* SVector3& cjump = fipv->getRefToCohesiveJump(); cjump = homoData->getHomogenizedCohesiveJump(); - + double normalPart = dot(cjump,refN); - + if (!cohmipvprev->ifTension()){ for (int i=0; i<3; i++) cjump(i) -= normalPart*refN(i); } - + if (normalPart < 0){ cohmipv->setTensionFlag(false); } else{ cohmipv->setTensionFlag(true); } - + const double& lprev = homoDataPrev->getAverageLocalizationBandWidth(); - + double& irr = fipv->getRefToIrreversibleEnergy(); irr = homoData->getIrreversibleEnergy()*lprev; if (stiff){ - + const STensor43& dFinterfacedF = fipv->getConstRefToDInterfaceDeformationGradientDDeformationGradient(); const STensor33& dFinterfacedJump = fipv->getConstRefToDInterfaceDeformationGradientDJump(); const STensor33& dFinterfacedInStrain = fipv->getConstRefToDInterfaceDeformationGradientDIncompatibleStrainVector(); - + const STensor43& dPdFinf = homoData->getHomogenizedTangentOperator_F_F(); STensor33& dTdF = fipv->getRefToDInterfaceForceDDeformationGradient(); STensor3& dTdjump = fipv->getRefToDInterfaceForceDjump(); @@ -834,13 +888,13 @@ void TwoFieldMultiscaleCohesive3DLaw::stress(IPVariable* ipv, const IPVariable* } } } - + const STensor33& dcjumpdFinf = homoData->getHomogenizedTangentOperator_CohesiveJump_F(); STensor33& dcjumpDF = fipv->getRefToDCohesiveJumpDDeformationGradient(); STensor3& dcjumpDJump = fipv->getRefToDCohesiveJumpDJump(); STensor3& dcjumpDinStrain = fipv->getRefToDCohesiveJumpDIncompatibleStrainVector(); - + STensor33 dcjumpdFinfNew(dcjumpdFinf); if (!cohmipvprev->ifTension()){ STensor3 INN(1.); @@ -849,8 +903,8 @@ void TwoFieldMultiscaleCohesive3DLaw::stress(IPVariable* ipv, const IPVariable* INN(i,j) -= refN(i)*refN(j); } } - - + + for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ for (int k=0; k<3; k++){ @@ -861,13 +915,13 @@ void TwoFieldMultiscaleCohesive3DLaw::stress(IPVariable* ipv, const IPVariable* } } } - + dcjumpDF *= 0.; dcjumpDJump*= 0.; dcjumpDinStrain *= 0.; - - + + for (int i=0; i<3; i++){ for (int p=0; p<3; p++){ for (int q=0; q<3; q++){ @@ -881,19 +935,19 @@ void TwoFieldMultiscaleCohesive3DLaw::stress(IPVariable* ipv, const IPVariable* } } } - + if (homoData->getIrreversibleEnergyExtractionFlag()){ - + STensor3& dirrEnergDF = fipv->getRefToDIrreversibleEnergyDDeformationGradient(); SVector3& dirrEnergDJump = fipv->getRefToDIrreversibleEnergyDJump(); SVector3& dirrEnergDinStrain = fipv->getRefToDIrreversibleEnergyDIncompatibleStrainVector(); - + dirrEnergDF *=0.; dirrEnergDJump*=0.; dirrEnergDinStrain *= 0.; - + const STensor3& dirrEnergdFinf = homoData->getHomogenizedTangentOperator_IrreversibleEnergy_F(); - + for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ dirrEnergDinStrain(i) += dirrEnergdFinf(i,j)*refN(j)*lprev; @@ -922,10 +976,10 @@ void TwoFieldMultiscaleCohesive3DLaw::checkCohesiveInsertion(IPStateBase* ipsm, fPlusCur->broken(); return; } - + bool solverIsBrokenMinus = static_cast<const dG3DMultiscaleIPVariable*>(fMinusCur->getIPvBulk())->solverIsBroken(); bool solverIsBrokenPlus = static_cast<const dG3DMultiscaleIPVariable*>(fPlusCur->getIPvBulk())->solverIsBroken(); - + if (solverIsBrokenMinus or solverIsBrokenPlus){ printf("rank %d: cohesive element is inserted \n",Msg::GetCommRank()); fMinusCur->broken(); @@ -1180,21 +1234,21 @@ MultiscaleThermoMechanicsDG3DMaterialLaw::MultiscaleThermoMechanicsDG3DMaterialL MultiscaleThermoMechanicsDG3DMaterialLaw::MultiscaleThermoMechanicsDG3DMaterialLaw(const MultiscaleThermoMechanicsDG3DMaterialLaw& src): dG3DMaterialLaw(src),numericalMaterial(src),linearK(src.linearK),Stiff_alphaDilatation(src.Stiff_alphaDilatation){}; - - + + void MultiscaleThermoMechanicsDG3DMaterialLaw::fillElasticStiffness(double& rho, STensor43& L, STensor3& Klinear, STensor3& alphaDilatation){ printf("get elastic properties\n"); - + this->assignMeshId(0,0); nonLinearMechSolver* solver = this->createMicroSolver(0,0); solver->tangentAveragingFlag(true); solver->initMicroSolver(); - + rho = solver->getHomogenizedDensity(); L = solver->getHomogenizationState(IPStateBase::current)->getHomogenizedTangentOperator_F_F(); Klinear = solver->getHomogenizationState(IPStateBase::current)->getHomogenizedTangentOperator_gradT_gradT(0,0); alphaDilatation = solver->getHomogenizationState(IPStateBase::current)->getHomogenizedTangentOperator_F_T(0); - + delete solver; }; @@ -1211,7 +1265,7 @@ void MultiscaleThermoMechanicsDG3DMaterialLaw::createIPState(IPStateBase* &ips,c void MultiscaleThermoMechanicsDG3DMaterialLaw::createIPState(const bool isSolve, IPStateBase* &ips,const bool* state, const MElement *ele, const int nbFF, const IntPt *GP, const int gpt) const{ - + bool oninter = true; const MInterfaceElement* iele = dynamic_cast<const MInterfaceElement*>(ele); if (iele == NULL) oninter = false; @@ -1221,7 +1275,7 @@ void MultiscaleThermoMechanicsDG3DMaterialLaw::createIPState(const bool isSolve, IPVariable* ipv2 = new MultiscaleThermoMechanicsDG3DIPVariable(oninter); if(ips != NULL) delete ips; ips = new IP3State(state,ipvi,ipv1,ipv2); - + if (isSolve){ int el = ele->getNum(); nonLinearMechSolver* solver = this->createMicroSolver(el,gpt); @@ -1255,7 +1309,7 @@ void MultiscaleThermoMechanicsDG3DMaterialLaw::stress(IPVariable* ipv, const IPV // solve microscopic problem double time =solver->microSolve(); - + const homogenizedData* homoData = solver->getHomogenizationState(IPStateBase::current); // get stress @@ -1263,7 +1317,7 @@ void MultiscaleThermoMechanicsDG3DMaterialLaw::stress(IPVariable* ipv, const IPV mipv->getRefToFlux() = homoData->getHomogenizedConstitutiveExtraDofFlux(0); mipv->getRefToMechanicalSource() = homoData->getHomogenizedConstitutiveExtraDofMechanicalSource(0); mipv->getRefToExtraDofFieldCapacityPerUnitField() = homoData->getHomogenizedConstitutiveExtraDofFieldCapacityPerUnitField(0); - + double&w = mipv->getRefToFieldSource(); // thermal source is compute from previous step to avoid derivatives double Cpprev = mipvprev->getConstRefToExtraDofFieldCapacityPerUnitField(); @@ -1312,7 +1366,7 @@ void MultiscaleThermoMechanicsDG3DMaterialLaw::initialIPVariable(IPVariable* ipv dGipv->setRefToElasticTangentModuli(elasticStiffness); dGipv->setRefTolinearK(this->linearK); dGipv->setRefToStiff_alphaDilatation(this->Stiff_alphaDilatation); - + dGipv->getRefToTangentModuli() = elasticStiffness; dGipv->getRefTodFluxdGradField() = linearK; dGipv->getRefTodPdField() = Stiff_alphaDilatation; diff --git a/dG3D/src/dG3DMultiscaleMaterialLaw.h b/dG3D/src/dG3DMultiscaleMaterialLaw.h index 53ee28b251fa2fb9c9998657554dc6e1ae18e7fb..92c3474ad7bf83801b45706a6d0b4faa66d36796 100644 --- a/dG3D/src/dG3DMultiscaleMaterialLaw.h +++ b/dG3D/src/dG3DMultiscaleMaterialLaw.h @@ -21,7 +21,7 @@ class dG3DMultiscaleMaterialLaw : public dG3DMaterialLaw, public numericalMateri protected: virtual void fillElasticStiffness(double & rho, STensor43& L); #endif // SWIG - + public: dG3DMultiscaleMaterialLaw(const int lnum, const int tag); @@ -59,7 +59,7 @@ class dG3DMultiscaleMaterialLaw : public dG3DMaterialLaw, public numericalMateri virtual void setElasticStiffness(IPVariable* ipv) const; virtual bool isNumeric() const{return true;} virtual void initialIPVariable(IPVariable* ipv, bool stiff); - + virtual materialLaw* clone() const {return new dG3DMultiscaleMaterialLaw(*this);}; #endif // SWIG }; @@ -69,12 +69,11 @@ class MultiscaleFractureByCohesive3DLaw : public FractureByCohesive3DLaw, #ifndef SWIG protected: numericalMaterialBase* _nummat; // point to numerical mat of bulk law - #endif // SWIG public: MultiscaleFractureByCohesive3DLaw(const int num,const int nbulk, const int ncoh); - + #ifndef SWIG MultiscaleFractureByCohesive3DLaw(const MultiscaleFractureByCohesive3DLaw& src); virtual ~MultiscaleFractureByCohesive3DLaw(){} @@ -119,6 +118,8 @@ class MultiscaleFractureByCohesive3DLaw : public FractureByCohesive3DLaw, }; #endif //HAVE_MPI virtual materialLaw* clone() const {return new MultiscaleFractureByCohesive3DLaw(*this);}; + + virtual void stress(IPVariable*ipv, const IPVariable*ipvprev, const bool stiff=true, const bool checkfrac=true); #endif // SWIG }; @@ -126,10 +127,8 @@ class MultiscaleFractureByCohesive3DLaw : public FractureByCohesive3DLaw, class GeneralBulkFollwedCohesive3DLaw : public Cohesive3DLaw{ protected: double _L; // RVE length perpendicular to the localization band - bool _damageToCohesiveJump; // can be modifed during creating microscopic solver-->avoid problems with readonly function double _lostSolutionUniquenssTolerance; - int _stressExtractLocation; - + public: #ifndef SWIG GeneralBulkFollwedCohesive3DLaw(const int num, const bool init = true); @@ -145,24 +144,28 @@ class GeneralBulkFollwedCohesive3DLaw : public Cohesive3DLaw{ 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; - bool isDamageToCohesiveJump() const {return _damageToCohesiveJump;}; double getLostSolutionUniquenssTolerance() const {return _lostSolutionUniquenssTolerance;}; - int getLocationForStressExtraction() const {return _stressExtractLocation;}; #endif // SWIG - + void setCharacteristicLength(const double L) {_L= L;} - void setExtractCohesiveLawFromMicroDamage(const bool flag); void setLostSolutionUniquenssTolerance(const double tol); - void setLocationForStressExtraction(const int loc){_stressExtractLocation = loc;}; + }; class GeneralMultiscaleBulkFollwedCohesive3DLaw : public GeneralBulkFollwedCohesive3DLaw{ + protected: + int _stressExtractLocation; + double _voidPartInLocalizationBand; + bool _rotateRVEFollowingInterfaceNormal; // true if performing rotation of RVE following local basis + + nonLinearMicroBC* _microBCFailure; + public: #ifndef SWIG GeneralMultiscaleBulkFollwedCohesive3DLaw(const int num, const bool init = true); GeneralMultiscaleBulkFollwedCohesive3DLaw(const GeneralMultiscaleBulkFollwedCohesive3DLaw& src); - virtual ~GeneralMultiscaleBulkFollwedCohesive3DLaw(){} + 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; @@ -172,7 +175,19 @@ class GeneralMultiscaleBulkFollwedCohesive3DLaw : public GeneralBulkFollwedCohes 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 materialLaw* clone() const = 0; + virtual bool isDamageToCohesiveJump() const = 0; + + int getLocationForStressExtraction() const {return _stressExtractLocation;}; + bool getRotationOfRVEFollowingInterfaceLocalBasis() const {return _rotateRVEFollowingInterfaceNormal;}; + + nonLinearMicroBC* getMicroBCFailure() {return _microBCFailure;} + const nonLinearMicroBC* getMicroBCFailure() const {return _microBCFailure;} + bool isSwitchedToFailureBC() const; #endif // SWIG + void addMicroBCFailure(const nonLinearMicroBC* mbc); + void setLocationForStressExtraction(const int loc){_stressExtractLocation = loc;}; + void setVoidPartInLocalizationBand(const double vp){_voidPartInLocalizationBand = vp;}; + void setRotationOfRVEFollowingInterfaceLocalBasis(const bool fl) {_rotateRVEFollowingInterfaceNormal = fl;}; }; class dG3DMultiscaleCohesiveLaw : public GeneralMultiscaleBulkFollwedCohesive3DLaw { @@ -188,6 +203,7 @@ class dG3DMultiscaleCohesiveLaw : public GeneralMultiscaleBulkFollwedCohesive3DL 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 materialLaw* clone() const {return new dG3DMultiscaleCohesiveLaw(*this);}; + virtual bool isDamageToCohesiveJump() const {return false;} #endif // SWIG }; @@ -205,6 +221,7 @@ class TwoFieldMultiscaleCohesive3DLaw : public GeneralMultiscaleBulkFollwedCohes 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 materialLaw* clone() const {return new TwoFieldMultiscaleCohesive3DLaw(*this);}; + virtual bool isDamageToCohesiveJump() const {return true;} #endif // SWIG }; @@ -222,6 +239,7 @@ class TwoFieldMultiscaleAdhesive3DLaw : public GeneralMultiscaleBulkFollwedCohes 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 materialLaw* clone() const {return new TwoFieldMultiscaleAdhesive3DLaw(*this);}; + virtual bool isDamageToCohesiveJump() const {return false;} #endif // SWIG }; @@ -235,13 +253,13 @@ class MultiscaleThermoMechanicsDG3DMaterialLaw : public dG3DMaterialLaw, public Msg::Fatal("MultiscaleThermoMechanicsDG3DMaterialLaw::fillElasticStiffness should not be used"); }; virtual void fillElasticStiffness(double& rho, STensor43& L, STensor3& Klinear, STensor3& alphaDilatation); - + #endif //SWIG - - + + public: MultiscaleThermoMechanicsDG3DMaterialLaw(const int num, const int tag); - + #ifndef SWIG MultiscaleThermoMechanicsDG3DMaterialLaw(const MultiscaleThermoMechanicsDG3DMaterialLaw& src); virtual ~MultiscaleThermoMechanicsDG3DMaterialLaw(){} diff --git a/dG3D/src/embeddedLocalizationBand.cpp b/dG3D/src/embeddedLocalizationBand.cpp index 0c4bd6d6e93f9d7318b473e4605b1d3018e72001..d56bef42d36929afd9979e42372fa9d8dc25c561 100644 --- a/dG3D/src/embeddedLocalizationBand.cpp +++ b/dG3D/src/embeddedLocalizationBand.cpp @@ -83,20 +83,17 @@ double embeddedFiniteBand(MElement* ele, IntPt& GP, const SVector3& normal, cons beta = GP.weight*Q.distance(R)*bandwidth/ele->getVolume(); /* - Msg::Info(" ele = %d t = %e compute betaE = %e Q[0] = %e Q[1] = %e Q[2] = %e R[0] = %e R[1] = %e R[2] = %e, distance = %e",ele->getNum(), t,beta,Q[0],Q[1],Q[2],R[0],R[1],R[2],Q.distance(R)); - - if (ele->getNum() == 8){ - nAC.print("nAC"); - dir.print("dir"); - normal.print("normal"); - print(A->point(),"A"); - print(B->point(),"B"); - print(C->point(),"C"); - print(pt,"P"); - print(Q,"Q"); - print(R,"R"); - } - */ + printf("rank %d element = %d GP.weight %e bandwidth %e beta = %e volume %e \n",Msg::GetCommRank(),ele->getNum(),GP.weight,bandwidth,beta,ele->getVolume()); + nAC.print("nAC"); + dir.print("dir"); + normal.print("normal"); + print(A->point(),"A"); + print(B->point(),"B"); + print(C->point(),"C"); + print(pt,"P"); + print(Q,"Q"); + print(R,"R"); + */ } else{ Msg::Fatal("element type %d has not been implemented"); diff --git a/dgshell/src/dgNonLinearShellIPVariable.cpp b/dgshell/src/dgNonLinearShellIPVariable.cpp index 588d7199391d60282bcf300d5f22bc7c7b9a271b..fd61bded7ef5082e333ac5aaab5c8555989ec1f0 100644 --- a/dgshell/src/dgNonLinearShellIPVariable.cpp +++ b/dgshell/src/dgNonLinearShellIPVariable.cpp @@ -309,20 +309,16 @@ J2linearShellIPv::J2linearShellIPv(const double h0,const short int nsimp, const bool oninter) : IPVariableNonLinearShell(h0,nsimp,oninter), _F(nsimp), _tau(nsimp), _j2ipv(nsimp,IPJ2linear(_j2law.getJ2IsotropicHardening())){} -J2linearShellIPv::J2linearShellIPv(const J2linearShellIPv &source) : IPVariableNonLinearShell(source) +J2linearShellIPv::J2linearShellIPv(const J2linearShellIPv &source) : IPVariableNonLinearShell(source), +_j2ipv(source._j2ipv),_F(source._F),_tau(source._tau) { - for(int i=0;i<_nsimp;i++){ - _j2ipv[i].operator = (source._j2ipv[i]); - _F[i] = source._F[i]; - _tau[i] = source._tau[i]; - } } J2linearShellIPv& J2linearShellIPv::operator=(const IPVariable &source) { IPVariableNonLinearShell::operator=(source); const J2linearShellIPv* src = static_cast<const J2linearShellIPv*>(&source); for(int i=0;i<_nsimp;i++){ - _j2ipv[i].operator = (src->_j2ipv[i]); + _j2ipv[i].operator= (*dynamic_cast<const IPVariable*>(&src->_j2ipv[i])); _F[i] = src->_F[i]; _tau[i] = src->_tau[i]; } diff --git a/dgshell/src/dgNonLinearShellIPVariable.h b/dgshell/src/dgNonLinearShellIPVariable.h index fdf6b9741decab3957b6defe15928d97a5659e08..30af4c904b07f5d72d9091432eaf8119ecea094d 100644 --- a/dgshell/src/dgNonLinearShellIPVariable.h +++ b/dgshell/src/dgNonLinearShellIPVariable.h @@ -30,6 +30,7 @@ class IPVariableNonLinearShell : public IPVariableShell IPVariableNonLinearShell(const double h0,const short int nsimp,const bool oninter=false); IPVariableNonLinearShell(const IPVariableNonLinearShell &source); IPVariableNonLinearShell &operator=(const IPVariable &source); + virtual ~IPVariableNonLinearShell(){} /* pure virtual functions */ virtual void setB(const std::vector<TensorialTraits<double>::GradType> &Grads, const std::vector<TensorialTraits<double>::HessType> &Hess)=0; @@ -113,6 +114,7 @@ class J2linearShellIPv : public IPVariableNonLinearShell // or store data in a d const bool oninter=false); J2linearShellIPv(const J2linearShellIPv &source); J2linearShellIPv& operator=(const IPVariable &source); + virtual ~J2linearShellIPv(){} virtual void setB(const std::vector<TensorialTraits<double>::GradType> &Grads, const std::vector<TensorialTraits<double>::HessType> &Hess); virtual void strain(const fullVector<double> &disp,const int npoint=-1,const shellLocalBasisBulk* lbinit=NULL); diff --git a/dgshell/src/shellIPVariable.h b/dgshell/src/shellIPVariable.h index 9e3a7fbc533fdabfa47802945a3be672da30481c..4fe248f21e595c70dfe2ce94d792525e31a0432f 100644 --- a/dgshell/src/shellIPVariable.h +++ b/dgshell/src/shellIPVariable.h @@ -25,6 +25,9 @@ struct tab6{ double a[6]; public : tab6(){for(int i=0;i<6;i++) a[i]=0.;} + tab6(const tab6& src){ + for(int i=0;i<6;i++) a[i]=src.a[i]; + } ~tab6(){}; tab6& operator= (tab6 source) {for(int i=0;i<6;i++) a[i]=source[i];} double& operator[](const int i){return a[i];}