diff --git a/NonLinearSolver/internalPoints/ipAnisotropicPlasticity.h b/NonLinearSolver/internalPoints/ipAnisotropicPlasticity.h new file mode 100644 index 0000000000000000000000000000000000000000..be8ee5acad399a47ed431a42aac725b3b365d7ed --- /dev/null +++ b/NonLinearSolver/internalPoints/ipAnisotropicPlasticity.h @@ -0,0 +1,36 @@ +// +// C++ Interface: ipd data +// +// Description: ip data for plastic anisotropy +// +// Author: <V.D. Nguyen>, (C) 2023 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#ifndef IPANISOTROPICPLASTICITY_H_ +#define IPANISOTROPICPLASTICITY_H_ + +#include "ipJ2linear.h" + +class IPAnisotropicPlasticity : public IPJ2linear +{ + public: + IPAnisotropicPlasticity(): IPJ2linear(){}; + IPAnisotropicPlasticity(const J2IsotropicHardening *j2IH): IPJ2linear(j2IH){}; + IPAnisotropicPlasticity(const IPAnisotropicPlasticity &source): IPJ2linear(source){}; + virtual IPAnisotropicPlasticity& operator=(const IPVariable &source) + { + IPJ2linear::operator =(source); + return *this; + } + virtual ~IPAnisotropicPlasticity() + { + + } + virtual IPVariable* clone() const {return new IPAnisotropicPlasticity(*this);}; +}; + + +#endif //IPANISOTROPICPLASTICITY_H_ \ No newline at end of file diff --git a/NonLinearSolver/materialLaw/CMakeLists.txt b/NonLinearSolver/materialLaw/CMakeLists.txt index d7735fd86b97cab255055e99786ff7e878405bc8..b7f88e9719f32d64b63afefb8b53e84016492561 100644 --- a/NonLinearSolver/materialLaw/CMakeLists.txt +++ b/NonLinearSolver/materialLaw/CMakeLists.txt @@ -106,6 +106,7 @@ set(SRC mlawNonLinearTVP.cpp mullinsEffect.cpp mlawHyperelasticWithPotential.cpp + mlawAnisotropicPlasticity.cpp # src/op_eshelby.cpp # Headers without cpp change this ?? ID.h diff --git a/NonLinearSolver/materialLaw/mlaw.h b/NonLinearSolver/materialLaw/mlaw.h index 7e69287869783cb50447f86b446f0f213e733673..9bafeb7b273811fd71aaeea2a136f16a88af5162 100644 --- a/NonLinearSolver/materialLaw/mlaw.h +++ b/NonLinearSolver/materialLaw/mlaw.h @@ -24,7 +24,7 @@ class materialLaw{ enum matname{linearElasticPlaneStress,linearElasticPlaneStressWithDamage, linearElasticOrthotropicPlaneStress, - cohesiveLaw, fracture, nonLinearShell, j2linear, viscoelastic, EOS, transverseIsotropic, transverseIsoCurvature, transverseIsoUserDirection, + cohesiveLaw, fracture, nonLinearShell, J2, viscoelastic, EOS, transverseIsotropic, transverseIsoCurvature, transverseIsoUserDirection, transverseIsoYarnB, Anisotropic, AnisotropicStoch, nonLocalDamage, vumat, UMATInterface, crystalPlasticity, gursonUMAT, numeric, secondOrderElastic, j2smallstrain, porousPlasticDamagelaw, nonLocalDamageGurson, nonLocalDamageThomason, nonLocalDamageGursonThomason, @@ -35,7 +35,7 @@ class materialLaw{ ThermalConducter,AnIsotropicTherMech, localDamageJ2Hyper,linearElastic,nonLocalDamageGursonThermoMechanics, localDamageJ2SmallStrain,nonLocalDamageJ2SmallStrain,cluster,tfa,ANN, DMN, torchANN, NonlocalDamageTorchANN, LinearElecMagTherMech, LinearElecMagInductor, hyperviscoelastic, GenericThermoMechanics, ElecMagGenericThermoMechanics, ElecMagInductor, - nonlineartvm,nonlinearTVE,nonlinearTVP,vevpmfh, VEVPUMAT}; + nonlineartvm,nonlinearTVE,nonlinearTVP,vevpmfh, VEVPUMAT, Hill48}; protected : diff --git a/NonLinearSolver/materialLaw/mlawAnisotropicPlasticity.cpp b/NonLinearSolver/materialLaw/mlawAnisotropicPlasticity.cpp new file mode 100644 index 0000000000000000000000000000000000000000..5be0bbce061d2a4c57985d67061544e9f6cddcfe --- /dev/null +++ b/NonLinearSolver/materialLaw/mlawAnisotropicPlasticity.cpp @@ -0,0 +1,1182 @@ +// +// C++ Interface: material law +// +// Description: material law for plastic anisotropy +// +// Author: <V.D. Nguyen>, (C) 2023 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "mlawAnisotropicPlasticity.h" +#include "nonLinearMechSolver.h" + +mlawAnisotropicPlasticity::mlawAnisotropicPlasticity(const int num,const double E,const double nu, const double rho,const J2IsotropicHardening &j2IH, + const double tol, const bool pert, const double eps) : materialLaw(num,true), _E(E), _nu(nu), _rho(rho), + _lambda((E*nu)/(1.+nu)/(1.-2.*nu)), + _mu(0.5*E/(1.+nu)),_K(E/3./(1.-2.*nu)), _K3(3.*_K), _mu3(3.*_mu), + _mu2(2.*_mu), _tol(tol), _maxite(1000),_perturbationfactor(eps),_tangentByPerturbation(pert),_order(1), + _stressFormulation(CORO_KIRCHHOFF) +{ + _j2IH=j2IH.clone(); + + STensorOperation::zero(_Cel); + _Cel(0,0,0,0) = _lambda + _mu2; + _Cel(1,1,0,0) = _lambda; + _Cel(2,2,0,0) = _lambda; + _Cel(0,0,1,1) = _lambda; + _Cel(1,1,1,1) = _lambda + _mu2; + _Cel(2,2,1,1) = _lambda; + _Cel(0,0,2,2) = _lambda; + _Cel(1,1,2,2) = _lambda; + _Cel(2,2,2,2) = _lambda + _mu2; + + _Cel(1,0,1,0) = _mu; + _Cel(2,0,2,0) = _mu; + _Cel(0,1,0,1) = _mu; + _Cel(2,1,2,1) = _mu; + _Cel(0,2,0,2) = _mu; + _Cel(1,2,1,2) = _mu; + + _Cel(0,1,1,0) = _mu; + _Cel(0,2,2,0) = _mu; + _Cel(1,0,0,1) = _mu; + _Cel(1,2,2,1) = _mu; + _Cel(2,0,0,2) = _mu; + _Cel(2,1,1,2) = _mu; + + STensor3 I(1.); + for (int i=0; i<3; i++){ + for (int j=0; j<3; j++){ + for (int k=0; k<3; k++){ + for (int l=0; l<3; l++){ + _I4(i,j,k,l) = 0.5*(I(i,k)*I(j,l)+I(i,l)*I(j,k)); + _I4dev(i,j,k,l) = 0.5*(I(i,k)*I(j,l)+I(i,l)*I(j,k)) - I(i,j)*I(k,l)/3.; + } + } + } + } +} +mlawAnisotropicPlasticity::mlawAnisotropicPlasticity(const mlawAnisotropicPlasticity &source) : materialLaw(source),_E(source._E), _nu(source._nu), _rho(source._rho), + _lambda(source._lambda), + _mu(source._mu), _K(source._K),_K3(source._K3), _mu3(source._mu3), + _mu2(source._mu2), _tol(source._tol), _maxite(source._maxite), + _perturbationfactor(source._perturbationfactor), + _tangentByPerturbation(source._tangentByPerturbation),_order(source._order), + _Cel(source._Cel), + _stressFormulation(source._stressFormulation), + _I4(source._I4), _I4dev(source._I4dev) +{ + _j2IH = NULL; + if(source._j2IH != NULL) + { + _j2IH=source._j2IH->clone(); + } +} + +mlawAnisotropicPlasticity& mlawAnisotropicPlasticity::operator=(const materialLaw &source) +{ + materialLaw::operator=(source); + const mlawAnisotropicPlasticity* src =static_cast<const mlawAnisotropicPlasticity*>(&source); + if(src != NULL) + { + _E = src->_E; + _nu = src->_nu; + _rho = src->_rho; + _lambda = src->_lambda; + _mu = src->_mu; + _K = src->_K; + _K3 = src->_K3; + _mu3 = src->_mu3; + _mu2 = src->_mu2; + _tol = src->_tol; + _maxite = src->_maxite; + _perturbationfactor = src->_perturbationfactor; + _tangentByPerturbation = src->_tangentByPerturbation; + _Cel = src->_Cel; + _stressFormulation = src->_stressFormulation; + _I4 = src->_I4; + _I4dev = src->_I4dev; + if(_j2IH != NULL) delete _j2IH; + if(src->_j2IH != NULL) + { + _j2IH=src->_j2IH->clone(); + } + + } + return *this; +} + +mlawAnisotropicPlasticity::~mlawAnisotropicPlasticity() +{ + if(_j2IH!=NULL) {delete _j2IH; _j2IH = NULL;}; +} + + + +void mlawAnisotropicPlasticity::setStressFormulation(int s) +{ + _stressFormulation = (stressFormulation)s; + if (_stressFormulation == CORO_CAUCHY) + { + Msg::Info("The corotational cauchy stress is used"); + } + else if (_stressFormulation == CORO_KIRCHHOFF) + { + Msg::Info("The corotational Kirchoff stress is used"); + } + else + { + Msg::Error("The formulation %d is not implemented, using corotational Kirchoff instead"); + _stressFormulation = CORO_KIRCHHOFF; + } +} + +void mlawAnisotropicPlasticity::createIPState(IPStateBase* &ips,bool hasBodyForce,const bool* state_,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const +{ + //bool inter=true; + //const MInterfaceElement *iele = static_cast<const MInterfaceElement*>(ele); + //if(iele==NULL) inter=false; + IPVariable* ipvi = new IPAnisotropicPlasticity(_j2IH); + IPVariable* ipv1 = new IPAnisotropicPlasticity(_j2IH); + IPVariable* ipv2 = new IPAnisotropicPlasticity(_j2IH); + if(ips != NULL) delete ips; + ips = new IP3State(state_,ipvi,ipv1,ipv2); +} + +double mlawAnisotropicPlasticity::soundSpeed() const +{ + double factornu = (1.-_nu)/((1.+_nu)*(1.-2.*_nu)); + return sqrt(_E*factornu/_rho); +} + + + +double mlawAnisotropicPlasticity::deformationEnergy(const STensor3 &C) const +{ + STensor3 logCdev; + bool ok=STensorOperation::logSTensor3(C,_order,logCdev,NULL); + double trace = logCdev.trace(); + + double lnJ = 0.5*trace; + logCdev(0,0)-=trace/3.; + logCdev(1,1)-=trace/3.; + logCdev(2,2)-=trace/3.; + + double Psy = _K*0.5*lnJ*lnJ+_mu*0.25*dot(logCdev,logCdev); + return Psy;; +} + + + +void mlawAnisotropicPlasticity::computeResidual(const STensor3& DeltaEp, std::vector<double>& DeltaPlasticMult, const double DeltaHatP, // unknown value + const STensor3& sig, const double R, + const IPAnisotropicPlasticity* q0, const IPAnisotropicPlasticity* q1, + std::vector<double>& res0, STensor3& res1, double& res2, + bool stiff, + const STensor43& DsigDDeltaEp, const double H, + std::vector<STensor3>& Dres0DDeltaEp, STensor43& Dres1DDeltaEp, STensor3& Dres2DDeltaEp, + std::vector<double>& Dres0DDeltaPlasticMult, std::vector<STensor3>& Dres1DDeltaPlasticMult, std::vector<double>& Dres2DDeltaPlasticMult, + std::vector<double>& Dres0DDeltaHatP, STensor3& Dres1DDeltaHatP, double& Dres2DDeltaHatP) const +{ + int numberYield = getNumOfYieldSurfaces(); + double R0 = _j2IH->getYield0(); + static std::vector<STensor3> DyieldDsig(numberYield,STensor3(0.)) ; + static std::vector<double> DyieldDR(numberYield, 0); + yieldFunction(res0,sig,R,q0,q1,stiff,&DyieldDsig,&DyieldDR); + + static std::vector<STensor3> Np(numberYield,STensor3(0.)); + static std::vector<STensor43> DNpDsig(numberYield,STensor43(0.)); + static std::vector<STensor3> DNpDR(numberYield, STensor3(0.)); + getYieldNormal(Np,sig,R,q0,q1,stiff,&DNpDsig,&DNpDR); + + // plastic energy balance + res1 = DeltaEp; + for (int i=0; i< numberYield; i++) + { + res1.daxpy(Np[i],-DeltaPlasticMult[i]); + } + // + res2 = (STensorOperation::doubledot(sig,DeltaEp) - R*DeltaHatP)/R0; + // + if (stiff) + { + // res0 + for (int i=0; i< numberYield; i++) + { + STensorOperation::multSTensor3STensor43(DyieldDsig[i],DsigDDeltaEp,Dres0DDeltaEp[i]); + Dres0DDeltaPlasticMult[i] = 0.; + Dres0DDeltaHatP[i] = DyieldDR[i]*H; + } + // res1 + Dres1DDeltaEp = _I4; + STensorOperation::zero(Dres1DDeltaHatP); + for (int i=0; i< numberYield; i++) + { + STensorOperation::multSTensor43Add(DNpDsig[i],DsigDDeltaEp,-DeltaPlasticMult[i],Dres1DDeltaEp); + Dres1DDeltaPlasticMult[i] = Np[i]; + Dres1DDeltaPlasticMult[i] *= (-1.); + Dres1DDeltaHatP.daxpy(DNpDR[i],-DeltaPlasticMult[i]*H); + } + + // res2 + STensorOperation::scale(sig,1./R0,Dres2DDeltaEp); + STensorOperation::multSTensor3STensor43Add(DeltaEp,DsigDDeltaEp,1./R0,Dres2DDeltaEp); + for (int i=0; i< numberYield; i++) + { + Dres2DDeltaPlasticMult[i] = 0.; + } + Dres2DDeltaHatP = -(R+H*DeltaHatP)/R0; + } +}; + +void mlawAnisotropicPlasticity::computeDResidual(const STensor3& DeltaEp, const std::vector<double>& DeltaPlasticMult, const double DeltaHatP, // unknown value + const STensor3& sig, const double R, const IPAnisotropicPlasticity* q0, const IPAnisotropicPlasticity* q1, + const STensor43& DsigDEepr, const double H, + std::vector<STensor3>& Dres0DEepr, STensor43& Dres1DEepr, STensor3& Dres2DEepr) const +{ + int numberYield = getNumOfYieldSurfaces(); + double R0 = _j2IH->getYield0(); + + static std::vector<double> yf(numberYield,0.); + static std::vector<STensor3> DyieldDsig(numberYield,STensor3(0.)) ; + static std::vector<double> DyieldDR(numberYield, 0); + yieldFunction(yf,sig,R,q0,q1,true,&DyieldDsig,&DyieldDR); + for (int i=0; i< numberYield; i++) + { + STensorOperation::multSTensor3STensor43(DyieldDsig[i],DsigDEepr,Dres0DEepr[i]); + } + + static std::vector<STensor3> Np(numberYield,STensor3(0.)); + static std::vector<STensor43> DNpDsig(numberYield,STensor43(0.)); + static std::vector<STensor3> DNpDR(numberYield, STensor3(0.)); + getYieldNormal(Np,sig,R,q0,q1,true,&DNpDsig,&DNpDR); + STensorOperation::zero(Dres1DEepr); + for (int i=0; i< numberYield; i++) + { + STensorOperation::multSTensor43Add(DNpDsig[i],DsigDEepr, -DeltaPlasticMult[i], Dres1DEepr); + } + // plastic energy balance + STensorOperation::multSTensor3STensor43(DeltaEp,DsigDEepr,Dres2DEepr); + Dres2DEepr *= (1./R0); +}; + +void mlawAnisotropicPlasticity::getResAndJacobian(fullVector<double>& res, fullMatrix<double>& J, + const std::vector<double>& res0, const STensor3& res1, const double& res2, + const std::vector<STensor3>& Dres0DDeltaEp, const STensor43& Dres1DDeltaEp, const STensor3& Dres2DDeltaEp, + const std::vector<double>& Dres0DDeltaPlasticMult, const std::vector<STensor3>& Dres1DDeltaPlasticMult, const std::vector<double>& Dres2DDeltaPlasticMult, + const std::vector<double>& Dres0DDeltaHatP, const STensor3& Dres1DDeltaHatP,const double& Dres2DDeltaHatP) const{ + // unknown DeltaEp, DeltaPlasticMult_i, DeltaHatP + // phi_i = 0, + // DeltaEp - sum_i DeltaPlasticMult_i * N_i = 0, + // res2 = 0 + + int numberYield = getNumOfYieldSurfaces(); + if (res.size() != 7+numberYield){ + res.resize(7+numberYield); + J.resize(7+numberYield,7+numberYield); + } + // residual + for (int i=0; i< numberYield; i++) + { + res(i) = res0[i]; + } + res(numberYield) = res1(0,0); + res(numberYield+1) = res1(1,1); + res(numberYield+2) = res1(2,2); + res(numberYield+3) = res1(0,1); + res(numberYield+4) = res1(0,2); + res(numberYield+5) = res1(1,2); + res(numberYield+6) = res2; + + // + J.setAll(0.); + // jacobian for res0 + for (int i=0; i< numberYield; i++) + { + J(i,0) = Dres0DDeltaEp[i](0,0); + J(i,1) = Dres0DDeltaEp[i](1,1); + J(i,2) = Dres0DDeltaEp[i](2,2); + J(i,3) = Dres0DDeltaEp[i](0,1)+Dres0DDeltaEp[i](1,0); + J(i,4) = Dres0DDeltaEp[i](0,2)+Dres0DDeltaEp[i](2,0); + J(i,5) = Dres0DDeltaEp[i](1,2)+Dres0DDeltaEp[i](2,1); + J(i,6+i) = Dres0DDeltaPlasticMult[i]; // no cross term in yield + J(i,6+numberYield) = Dres0DDeltaHatP[i]; + } + + // jacobian for res1 + J(numberYield,0) = Dres1DDeltaEp(0,0,0,0); + J(numberYield,1) = Dres1DDeltaEp(0,0,1,1); + J(numberYield,2) = Dres1DDeltaEp(0,0,2,2); + J(numberYield,3) = Dres1DDeltaEp(0,0,0,1)+Dres1DDeltaEp(0,0,1,0); + J(numberYield,4) = Dres1DDeltaEp(0,0,0,2)+Dres1DDeltaEp(0,0,2,0); + J(numberYield,5) = Dres1DDeltaEp(0,0,1,2)+Dres1DDeltaEp(0,0,2,1); + for (int i=0; i< numberYield; i++) + { + J(numberYield,6+i) = Dres1DDeltaPlasticMult[i](0,0); + } + J(numberYield,6+numberYield) = Dres1DDeltaHatP(0,0); + + J(numberYield+1,0) = Dres1DDeltaEp(1,1,0,0); + J(numberYield+1,1) = Dres1DDeltaEp(1,1,1,1); + J(numberYield+1,2) = Dres1DDeltaEp(1,1,2,2); + J(numberYield+1,3) = Dres1DDeltaEp(1,1,0,1)+Dres1DDeltaEp(1,1,1,0); + J(numberYield+1,4) = Dres1DDeltaEp(1,1,0,2)+Dres1DDeltaEp(1,1,2,0); + J(numberYield+1,5) = Dres1DDeltaEp(1,1,1,2)+Dres1DDeltaEp(1,1,2,1); + for (int i=0; i< numberYield; i++) + { + J(numberYield+1,6+i) = Dres1DDeltaPlasticMult[i](1,1); + } + J(numberYield+1,6+numberYield) = Dres1DDeltaHatP(1,1); + + J(numberYield+2,0) = Dres1DDeltaEp(2,2,0,0); + J(numberYield+2,1) = Dres1DDeltaEp(2,2,1,1); + J(numberYield+2,2) = Dres1DDeltaEp(2,2,2,2); + J(numberYield+2,3) = Dres1DDeltaEp(2,2,0,1)+Dres1DDeltaEp(2,2,1,0); + J(numberYield+2,4) = Dres1DDeltaEp(2,2,0,2)+Dres1DDeltaEp(2,2,2,0); + J(numberYield+2,5) = Dres1DDeltaEp(2,2,1,2)+Dres1DDeltaEp(2,2,2,1); + for (int i=0; i< numberYield; i++) + { + J(numberYield+2,6+i) = Dres1DDeltaPlasticMult[i](2,2); + } + J(numberYield+2,6+numberYield) = Dres1DDeltaHatP(2,2); + + J(numberYield+3,0) = Dres1DDeltaEp(0,1,0,0); + J(numberYield+3,1) = Dres1DDeltaEp(0,1,1,1); + J(numberYield+3,2) = Dres1DDeltaEp(0,1,2,2); + J(numberYield+3,3) = Dres1DDeltaEp(0,1,0,1)+Dres1DDeltaEp(0,1,1,0); + J(numberYield+3,4) = Dres1DDeltaEp(0,1,0,2)+Dres1DDeltaEp(0,1,2,0); + J(numberYield+3,5) = Dres1DDeltaEp(0,1,1,2)+Dres1DDeltaEp(0,1,2,1); + for (int i=0; i< numberYield; i++) + { + J(numberYield+3,6+i) = Dres1DDeltaPlasticMult[i](0,1); + } + J(numberYield+3,6+numberYield) = Dres1DDeltaHatP(0,1); + + J(numberYield+4,0) = Dres1DDeltaEp(0,2,0,0); + J(numberYield+4,1) = Dres1DDeltaEp(0,2,1,1); + J(numberYield+4,2) = Dres1DDeltaEp(0,2,2,2); + J(numberYield+4,3) = Dres1DDeltaEp(0,2,0,1)+Dres1DDeltaEp(0,2,1,0); + J(numberYield+4,4) = Dres1DDeltaEp(0,2,0,2)+Dres1DDeltaEp(0,2,2,0); + J(numberYield+4,5) = Dres1DDeltaEp(0,2,1,2)+Dres1DDeltaEp(0,2,2,1); + for (int i=0; i< numberYield; i++) + { + J(numberYield+4,6+i) = Dres1DDeltaPlasticMult[i](0,2); + } + J(numberYield+4,6+numberYield) = Dres1DDeltaHatP(0,2); + + J(numberYield+5,0) = Dres1DDeltaEp(1,2,0,0); + J(numberYield+5,1) = Dres1DDeltaEp(1,2,1,1); + J(numberYield+5,2) = Dres1DDeltaEp(1,2,2,2); + J(numberYield+5,3) = Dres1DDeltaEp(1,2,0,1)+Dres1DDeltaEp(1,2,1,0); + J(numberYield+5,4) = Dres1DDeltaEp(1,2,0,2)+Dres1DDeltaEp(1,2,2,0); + J(numberYield+5,5) = Dres1DDeltaEp(1,2,1,2)+Dres1DDeltaEp(1,2,2,1); + for (int i=0; i< numberYield; i++) + { + J(numberYield+5,6+i) = Dres1DDeltaPlasticMult[i](1,2); + } + J(numberYield+5,6+numberYield) = Dres1DDeltaHatP(1,2); + + // jacobian for res2 + J(numberYield+6,0) = Dres2DDeltaEp(0,0); + J(numberYield+6,1) = Dres2DDeltaEp(1,1); + J(numberYield+6,2) = Dres2DDeltaEp(2,2); + J(numberYield+6,3) = Dres2DDeltaEp(0,1)+Dres2DDeltaEp(1,0); + J(numberYield+6,4) = Dres2DDeltaEp(0,2)+Dres2DDeltaEp(2,0); + J(numberYield+6,5) = Dres2DDeltaEp(1,2)+Dres2DDeltaEp(2,1); + for (int i=0; i< numberYield; i++) + { + J(numberYield+6,6+i) = Dres2DDeltaPlasticMult[i]; + } + J(numberYield+6,6+numberYield) = Dres2DDeltaHatP; + + //res.print("res"); + //J.print("jacobian"); +}; + +bool mlawAnisotropicPlasticity::withPlastic(const STensor3& F, const STensor3& kcor, const double R, const IPAnisotropicPlasticity* q0, const IPAnisotropicPlasticity* q1) const +{ + int numberYield= getNumOfYieldSurfaces(); + if (numberYield > 1) + { + Msg::Error("multiple yield surface does not implemented in mlawAnisotropicPlasticity"); + } + std::vector<double> yf(numberYield, 0); + if (_stressFormulation == CORO_KIRCHHOFF) + { + yieldFunction(yf, kcor, R, q0, q1); + } + else if (_stressFormulation == CORO_CAUCHY) + { + double J = STensorOperation::determinantSTensor3(F); + static STensor3 sig; + sig = kcor; + sig *= (1./J); + yieldFunction(yf, sig, R, q0, q1); + } + else + { + Msg::Error("stress formuation is not correctly defined in mlawAnisotropicPlasticity!!!"); + return false; + } + return *(std::min_element(yf.begin(), yf.end())) > _tol; +} + + +void mlawAnisotropicPlasticity::constitutive(const STensor3& F0, + const STensor3& Fn, + STensor3 &P, + const IPVariable *q0, + IPVariable *q1, + STensor43 &Tangent, + const bool stiff, + STensor43* elasticTangent, + const bool dTangent, + STensor63* dCalgdeps + ) const +{ + const IPAnisotropicPlasticity* q0Ani= dynamic_cast<const IPAnisotropicPlasticity*>(q0); + IPAnisotropicPlasticity* q1Ani= dynamic_cast<IPAnisotropicPlasticity*>(q1); + static STensor43 dFpdF,dFedF; + static STensor3 dpdF; + bool ok = predictorCorector(F0,Fn,P,q0Ani,q1Ani,Tangent,dFpdF,dFedF,dpdF,stiff); +} + +bool mlawAnisotropicPlasticity::predictorCorector(const STensor3& F0, // initial deformation gradient (input @ time n) + const STensor3& F, // updated deformation gradient (input @ time n+1) + STensor3 &P, // updated 1st Piola-Kirchhoff stress tensor (output) + const IPAnisotropicPlasticity *q0, // array of initial internal variable + IPAnisotropicPlasticity *q, // updated array of internal variable (in ipvcur on output), + STensor43& Tangent, // mechanical tangents (output) + STensor43& dFpdF, // plastic tangent + STensor43& dFedF, + STensor3& dpdF, + const bool stiff + ) const +{ + const STensor3& Fp0 = q0->getConstRefToFp(); + STensor3& Fp = q->getRefToFp(); + + double& eps = q->getRefToEquivalentPlasticStrain(); + const double& eps0 = q0->getConstRefToEquivalentPlasticStrain(); + // elastic predictor + Fp = Fp0; + eps = eps0; + static STensor3 invFp0, Fepr; + STensorOperation::inverseSTensor3(Fp0,invFp0); + STensorOperation::multSTensor3(F,invFp0,Fepr); + + static STensor3 Fpinv, Fe, Ce; + Fpinv = invFp0; + Fe = Fepr; + STensorOperation::multSTensor3FirstTranspose(Fe,Fe,Ce); + // compute strain by logarithmic operator + static STensor43 Lpr; // dlogCepr/dCepr + static STensor63 dLDCe; // ddlogCepr/ddCepr + static STensor3 Eepr; // 0.5*log(Cepr) + if (_order == 1) + { + bool ok=STensorOperation::logSTensor3(Ce,_order,Eepr,&Lpr); + if(!ok) + { + P(0,0) = P(1,1) = P(2,2) = sqrt(-1.); + return false; + } + } + else + { + bool ok=STensorOperation::logSTensor3(Ce,_order,Eepr,&Lpr,&dLDCe); + if(!ok) + { + P(0,0) = P(1,1) = P(2,2) = sqrt(-1.); + return false; + } + } + Eepr *= 0.5; + + static STensor43 L; // dlogCe/dCe + L = Lpr; // equal to dlogCepr/dCepr + + STensor3& Ee = q->getRefToElasticDeformationTensor(); + Ee = Eepr; // current elatic part of total strain + + // compute corotational Kirchhoff stress + double pcorpr = _K*Ee.trace(); + static STensor3 kcorpr, kcor; + kcorpr = Ee.dev(); + kcorpr *= (2.*_mu); + kcorpr(0,0) += pcorpr; + kcorpr(1,1) += pcorpr; + kcorpr(2,2) += pcorpr; + + kcor = kcorpr; + + /* Test plasticity */ + _j2IH->hardening(eps0, q0->getConstRefToIPJ2IsotropicHardening(),eps, q->getRefToIPJ2IsotropicHardening()); + double R0 = _j2IH->getYield0(); + double R = q->getConstRefToIPJ2IsotropicHardening().getR(); + double H = q->getConstRefToIPJ2IsotropicHardening().getDR(); + + int nyield = getNumOfYieldSurfaces(); + static STensor43 DFpDDeltaEp; + static fullVector<double> res(7+nyield), sol(7+nyield); + static fullMatrix<double> Jac(7+nyield,7+nyield); + double detF = 1.; + double detFinv = 1.; + + static STensor3 DeltaEp; + STensorOperation::zero(DeltaEp); + static std::vector<double> DeltaPlasticMult(nyield); + for (int i=0; i< nyield; i++) + { + DeltaPlasticMult[i] = 0.; + } + double DeltaHatP = 0; + + static STensor3 sig; + static STensor43 DsigDDeltaEp; + sig = kcor; + DsigDDeltaEp = _Cel; + DsigDDeltaEp *= (-1.); + if (_stressFormulation == CORO_CAUCHY) + { + // update with deformation Jacobian + detF = STensorOperation::determinantSTensor3(F); + detFinv = 1./detF; + sig *= detFinv; + DsigDDeltaEp *= detFinv; + } + + + if (q->dissipationIsBlocked()) + { + q->getRefToDissipationActive() = false; + } + else + { + // corotational stress + if (withPlastic(F,kcor,R,q0,q)) + { + // plastic occurs + q->getRefToDissipationActive() = true; + // plastic corrector + // unknowns + + + + // static data + static std::vector<double> res0(nyield); + static std::vector<STensor3> Dres0DDeltaEp(nyield); + static std::vector<double> Dres0DDeltaPlasticMult(nyield); + static std::vector<double> Dres0DDeltaHatP(nyield); + + static STensor3 res1; + static STensor43 Dres1DDeltaEp; + static std::vector<STensor3> Dres1DDeltaPlasticMult(nyield); + static STensor3 Dres1DDeltaHatP; + + static double res2; + static STensor3 Dres2DDeltaEp; + static std::vector<double> Dres2DDeltaPlasticMult(nyield); + static double Dres2DDeltaHatP; + + computeResidual(DeltaEp,DeltaPlasticMult,DeltaHatP,sig,R,q0,q, + res0,res1,res2, + true,DsigDDeltaEp,H, + Dres0DDeltaEp,Dres1DDeltaEp,Dres2DDeltaEp, + Dres0DDeltaPlasticMult,Dres1DDeltaPlasticMult,Dres2DDeltaPlasticMult, + Dres0DDeltaHatP, Dres1DDeltaHatP,Dres2DDeltaHatP); + + // compute solution + getResAndJacobian(res,Jac,res0,res1,res2, + Dres0DDeltaEp,Dres1DDeltaEp,Dres2DDeltaEp, + Dres0DDeltaPlasticMult,Dres1DDeltaPlasticMult,Dres2DDeltaPlasticMult, + Dres0DDeltaHatP,Dres1DDeltaHatP,Dres2DDeltaHatP); + //Jac.print("Jac"); + int ite = 0; + double f = res.norm(); + // Start iterations + //Msg::Info("plastic corrector iter=%d f=%e",ite,f); + while(f > _tol or ite <1) + { + + bool ok = Jac.luSolve(res,sol); + + if (!ok) + { + Msg::Error("lu solve does not work in mlawAnisotropicPlasticity::predictorCorector!!!"); + return false; + } + static STensor3 dDeltaEp; + dDeltaEp(0,0) = sol(0); + dDeltaEp(1,1) = sol(1); + dDeltaEp(2,2) = sol(2); + dDeltaEp(0,1) = sol(3); + dDeltaEp(1,0) = sol(3); + dDeltaEp(0,2) = sol(4); + dDeltaEp(2,0) = sol(4); + dDeltaEp(1,2) = sol(5); + dDeltaEp(2,1) = sol(5); + + if (dDeltaEp.norm0() > 10.){ + DeltaEp*=0.1; + } + else{ + DeltaEp -= dDeltaEp; + } + + for (int i=0; i< nyield; i++) + { + if (DeltaPlasticMult[i]-sol(6+i) <0.){ + DeltaPlasticMult[i] *=0.1; + } + else{ + DeltaPlasticMult[i] -= sol(6+i); + } + } + + if (DeltaHatP-sol(6+nyield) < 0.){ + DeltaHatP *= 0.1; + } + else{ + DeltaHatP -= sol(6+nyield); + } + + // update Kcor + // Kcor = Kcorpr - H:DeltaEp + kcor = kcorpr; + STensorOperation::multSTensor43STensor3Add(_Cel,DeltaEp,-1.,kcor); + STensorOperation::scale(kcor,detFinv,sig); + + + eps = eps0 + DeltaHatP; + _j2IH->hardening(eps0, q0->getConstRefToIPJ2IsotropicHardening(),eps, q->getRefToIPJ2IsotropicHardening()); + // update internal variables + R = q->getConstRefToIPJ2IsotropicHardening().getR(); + H = q->getConstRefToIPJ2IsotropicHardening().getDR(); + + computeResidual(DeltaEp,DeltaPlasticMult,DeltaHatP,sig,R,q0,q, + res0,res1,res2, + true,DsigDDeltaEp,H, + Dres0DDeltaEp,Dres1DDeltaEp,Dres2DDeltaEp, + Dres0DDeltaPlasticMult,Dres1DDeltaPlasticMult,Dres2DDeltaPlasticMult, + Dres0DDeltaHatP, Dres1DDeltaHatP,Dres2DDeltaHatP); + + getResAndJacobian(res,Jac,res0,res1,res2, + Dres0DDeltaEp,Dres1DDeltaEp,Dres2DDeltaEp, + Dres0DDeltaPlasticMult,Dres1DDeltaPlasticMult,Dres2DDeltaPlasticMult, + Dres0DDeltaHatP,Dres1DDeltaHatP,Dres2DDeltaHatP); + + f = res.norm(); + //printf("iter = %d error = %e tol = %e \n ",ite,f,_tol); + if (f < _tol) break; + + ite++; + if((ite > _maxite) or STensorOperation::isnan(f)) + { + printf("no convergence for plastic correction with ite = %d maxite = %d norm = %e !!!\n", ite,_maxite,f); + return false; + } + } + + // update plastic deformation + // Plastic increment + static STensor3 dFp; + static STensor43 Dexp; + // dFp = exp(DeltaEp) + STensorOperation::expSTensor3(DeltaEp,_order,dFp, &Dexp); + // Fp1 = dFp * Fp0 + STensorOperation::multSTensor3(dFp,Fp0,Fp); + // + for (int i=0; i<3; i++) + { + for (int j=0; j<3; j++) + { + for (int p=0; p<3; p++) + { + for (int q=0; q<3; q++) + { + DFpDDeltaEp(i,j,p,q) = 0.; + for (int r=0; r<3; r++) + { + DFpDDeltaEp(i,j,p,q) += Dexp(i,r,p,q)*Fp0(r,j); + } + } + } + } + } + + // Fe = F * Fp^-1 + STensorOperation::inverseSTensor3(Fp, Fpinv); + STensorOperation::multSTensor3(F,Fpinv,Fe); + // Ce = Fe^T * Fe + STensorOperation::multSTensor3FirstTranspose(Fe,Fe,Ce); + // Ee = ln(sqrt(Ce)) + if (_order == 1) + { + bool ok=STensorOperation::logSTensor3(Ce,_order,Ee,&L); + if(!ok) + { + P(0,0) = P(1,1) = P(2,2) = sqrt(-1.); + return false; + } + } + else + { + bool ok=STensorOperation::logSTensor3(Ce,_order,Ee,&L,&dLDCe); + if(!ok) + { + P(0,0) = P(1,1) = P(2,2) = sqrt(-1.); + return false; + } + } + Ee *= 0.5; + } + else + { + q->getRefToDissipationActive() = false; + } + } + + // estimation of PK stress + static STensor3 S, FeS; + STensorOperation::multSTensor3STensor43(kcor,L,S); + STensorOperation::multSTensor3(Fe,S,FeS); + STensorOperation::multSTensor3SecondTranspose(FeS,Fpinv,P); + + // elastic energy + q->getRefToElasticEnergy()= this->deformationEnergy(Ce); + // plastic energy + q->getRefToPlasticEnergy() = q0->plasticEnergy(); + q->getRefToPlasticPower() = 0.; + // plastic power (Wp1- Wp0)/dt + if (eps-eps0 > 0.){ + q->getRefToPlasticEnergy() += DeltaHatP*R; + q->getRefToPlasticPower() = DeltaHatP/this->getTimeStep(); + } + + // irreversible energy + if (this->getMacroSolver()->getPathFollowingLocalIncrementType() == pathFollowingManager::DEFO_ENERGY){ + // + q->getRefToIrreversibleEnergy() = q->defoEnergy(); + } + else if ((this->getMacroSolver()->getPathFollowingLocalIncrementType() == pathFollowingManager::PLASTIC_ENERGY) or + (this->getMacroSolver()->getPathFollowingLocalIncrementType() == pathFollowingManager::DISSIPATION_ENERGY)) { + q->getRefToIrreversibleEnergy() = q->plasticEnergy(); + } + else{ + q->getRefToIrreversibleEnergy() = 0.; + } + + if (stiff) + { + + if (_tangentByPerturbation) + { + static STensor3 plusF, plusP, plusFe, plusFpinv; + static STensor43 tmp43; + static IPAnisotropicPlasticity qTmp(*q0); + + for (int k=0; k<3; k++){ + for (int l=0; l<3; l++){ + plusF = F; + plusF(k,l) += _perturbationfactor; + this->constitutive(F0,plusF,plusP,q0,&qTmp,tmp43,false); + STensorOperation::inverseSTensor3(qTmp._j2lepsp,plusFpinv); + STensorOperation::multSTensor3(plusF,plusFpinv,plusFe); + + for (int i=0; i<3; i++){ + for (int j=0; j<3; j++){ + Tangent(i,j,k,l) = (plusP(i,j) - P(i,j))/_perturbationfactor; + dFpdF(i,j,k,l) = (qTmp._j2lepsp(i,j) - q->_j2lepsp(i,j))/_perturbationfactor; + dFedF(i,j,k,l) = (plusFe(i,j) - Fe(i,j))/_perturbationfactor; + } + } + + dpdF(k,l) = (qTmp._j2lepspbarre - eps)/_perturbationfactor; + q->getRefToDIrreversibleEnergyDF()(k,l) = (qTmp.irreversibleEnergy() - q->irreversibleEnergy())/_perturbationfactor; + } + } + + STensor3& dplasticpowerDF = q->getRefToDPlasticPowerDF(); + dplasticpowerDF = dpdF; + dplasticpowerDF *= (R+H*(eps-eps0))/this->getTimeStep(); + } + else + { + static STensor43 DKcorDEepr, DFpDEepr; + DKcorDEepr = _Cel; + STensorOperation::zero(DFpDEepr); + if (q->dissipationIsActive()) + { + /* Compute internal variables derivatives from residual derivatives */ + static std::vector<STensor3> Dres0DEepr(nyield); + static STensor43 Dres1DEepr; + static STensor3 Dres2DEepr; + + // Kcor = Kcorpr - Cel:DeltaEp, + // DkcorDEepr = DKcorprDEepr + // sig = Kcor*invdetF + static STensor43 correctedDsigDEepr; + STensorOperation::scale(_Cel,detFinv,correctedDsigDEepr); + if (_stressFormulation == CORO_CAUCHY) + { + // J = Jepr*Jppr --> ln(J) = tr(Eepr) + ln(ppr) --> DJDEepr = J*I + static STensor3 DdetFDEepr; + STensorOperation::diag(DdetFDEepr,detF); + STensorOperation::prodAdd(kcor,DdetFDEepr,-detFinv*detFinv,correctedDsigDEepr); + } + computeDResidual(DeltaEp,DeltaPlasticMult,DeltaHatP,sig, R,q0,q,correctedDsigDEepr, H, + Dres0DEepr,Dres1DEepr,Dres2DEepr); + + static STensor43 DDeltaEPDEepr; + static STensor3 DDeltaHatPDEepr; + + fullMatrix<double> invJac(8,8); + bool isInverted = Jac.invert(invJac); + if (!isInverted) + { + Msg::Error("Jacobian cannot be inverted"); + return false; + } + for(int i=0; i<3; i++) + { + for(int j=0; j<3; j++) + { + for (int k=0; k< nyield; k++) + { + res(k) = -Dres0DEepr[k](i,j); + } + res(nyield) = -Dres1DEepr(0,0,i,j); + res(nyield+1) = -Dres1DEepr(1,1,i,j); + res(nyield+2) = -Dres1DEepr(2,2,i,j); + res(nyield+3) = -Dres1DEepr(0,1,i,j); + res(nyield+4) = -Dres1DEepr(0,2,i,j); + res(nyield+5) = -Dres1DEepr(1,2,i,j); + res(nyield+6) = -Dres2DEepr(i,j); + invJac.mult(res,sol); + DDeltaEPDEepr(0,0,i,j) = sol(0); + DDeltaEPDEepr(1,1,i,j) = sol(1); + DDeltaEPDEepr(2,2,i,j) = sol(2); + DDeltaEPDEepr(0,1,i,j) = sol(3); + DDeltaEPDEepr(1,0,i,j) = sol(3); + DDeltaEPDEepr(0,2,i,j) = sol(4); + DDeltaEPDEepr(2,0,i,j) = sol(4); + DDeltaEPDEepr(1,2,i,j) = sol(5); + DDeltaEPDEepr(2,1,i,j) = sol(5); + DDeltaHatPDEepr(i,j) = sol(6+nyield); + } + } + + // compute tangents + // kcor = kcorpr - H:DeltaEp + + STensorOperation::multSTensor43Add(_Cel,DDeltaEPDEepr,-1.,DKcorDEepr); + // Fp = exp(DeltaEp)*Fp0 + STensorOperation::multSTensor43(DFpDDeltaEp,DDeltaEPDEepr,DFpDEepr); + + // plastic energy DplasticEnegy = R*DeltaHatP + STensor3& DplasticEnergyDF = q->getRefToDPlasticEnergyDF(); + STensorOperation::scale(DDeltaHatPDEepr,H*DeltaHatP+R,DplasticEnergyDF); + } + + static STensor43 EprToF; + for (int i=0; i<3; i++){ + for (int j=0; j<3; j++){ + for (int k=0; k<3; k++){ + for (int l=0; l<3; l++){ + EprToF(i,j,k,l) = 0.; + for (int p=0; p<3; p++){ + for (int q=0; q<3; q++){ + EprToF(i,j,k,l) += Lpr(i,j,p,q)*Fepr(k,p)*invFp0(l,q); + } + } + } + } + } + } + + tangentComputation(Tangent, q->dissipationIsActive(), F, kcor, S, Fepr, Fp0, Lpr, + Fe, Fp, L, dLDCe, + DKcorDEepr, DFpDEepr, EprToF, Fpinv); + + + //update tangent of plastic energy + static STensor3 DplEnergyDEpr; + DplEnergyDEpr = q->getConstRefToDPlasticEnergyDF(); + STensor3& DplEnergyDF = q->getRefToDPlasticEnergyDF(); + STensorOperation::multSTensor3STensor43(DplEnergyDEpr,EprToF,DplEnergyDF); + + if (this->getMacroSolver()->withPathFollowing()){ + // irreversible energy + if ((this->getMacroSolver()->getPathFollowingLocalIncrementType() == pathFollowingManager::PLASTIC_ENERGY) or + (this->getMacroSolver()->getPathFollowingLocalIncrementType() == pathFollowingManager::DISSIPATION_ENERGY)) { + q->getRefToDIrreversibleEnergyDF() = q->getConstRefToDPlasticEnergyDF(); + } + else{ + Msg::Error("Path following method is only contructed with dissipation based on plastic energy"); + } + }; + } + } + return true; +}; + + +void mlawAnisotropicPlasticity::tangentComputation(STensor43& dStressDF, + const bool plastic, + const STensor3& F, // current F + const STensor3& corKir, // cor Kir + const STensor3& S, // second PK + const STensor3& Fepr, const STensor3& Fppr, // predictor + const STensor43& Lpr, + const STensor3& Fe, const STensor3& Fp, // corrector + const STensor43& L, const STensor63& dL, // corrector value + const STensor43& DcorKirDEepr, + const STensor43& dFpDEepr, + const STensor43& EprToF, const STensor3& Fpinv + ) const{ + // P = Fe. (Kcor:Le) . invFp + // need to compute dFedF, dKcordF, dinvFpdF, dLedF + + static STensor43 DcorKirDF, dFpdF; + STensorOperation::multSTensor43(DcorKirDEepr,EprToF,DcorKirDF); + if (plastic){ + STensorOperation::multSTensor43(dFpDEepr,EprToF,dFpdF); + } + else{ + STensorOperation::zero(dFpdF); + } + + // done DcorKirDF, DFpDF + + static STensor43 DinvFpdF; + STensorOperation::zero(DinvFpdF); + if (plastic){ + for (int i=0; i<3; i++){ + for (int j=0; j<3; j++){ + for (int p=0; p<3; p++){ + for (int q=0; q<3; q++){ + for (int k=0; k<3; k++){ + for (int l=0; l<3; l++){ + DinvFpdF(i,j,k,l) -= Fpinv(i,p)*dFpdF(p,q,k,l)*Fpinv(q,j); + } + } + } + } + } + } + } + + static STensor43 dFedF; + STensorOperation::zero(dFedF); + for (int i=0; i<3; i++){ + for (int j=0; j<3; j++){ + for (int k=0; k<3; k++){ + dFedF(i,j,i,k) += Fpinv(k,j); + if (plastic){ + for (int l=0; l<3; l++){ + for (int p=0; p<3; p++){ + dFedF(i,j,k,l) += F(i,p)*DinvFpdF(p,j,k,l); + } + } + } + } + } + } + static STensor63 DLDF; + STensorOperation::zero(DLDF); + for (int i=0; i<3; i++){ + for (int j=0; j<3; j++){ + for (int k=0; k<3; k++){ + for (int l=0; l<3; l++){ + for (int r=0; r<3; r++){ + for (int s=0; s<3; s++){ + for (int a=0; a<3; a++){ + for (int p=0; p<3; p++){ + for (int q=0; q<3; q++){ + DLDF(i,j,k,l,p,q) += dL(i,j,k,l,r,s)*2.*Fe(a,r)*dFedF(a,s,p,q); + } + } + } + } + } + } + } + } + } + // + + static STensor43 DSDF; // S = corKir:L + STensorOperation::zero(DSDF); + for (int i=0; i<3; i++){ + for (int j=0; j<3; j++){ + for (int r=0; r<3; r++){ + for (int s=0; s<3; s++){ + for (int k=0; k<3; k++){ + for (int l=0; l<3; l++){ + DSDF(i,j,k,l) += DcorKirDF(r,s,k,l)*L(r,s,i,j) + corKir(r,s)*DLDF(r,s,i,j,k,l); + } + } + } + } + } + } + + + // compute mechanical tengent + STensorOperation::zero(dStressDF); + for (int i=0; i<3; i++){ + for (int j=0; j<3; j++){ + for (int k=0; k<3; k++){ + for (int l=0; l<3; l++){ + for (int p=0; p<3; p++){ + for (int q=0; q<3; q++){ + dStressDF(i,j,p,q) += (dFedF(i,k,p,q)*S(k,l)*Fpinv(j,l) + Fe(i,k)*DSDF(k,l,p,q)*Fpinv(j,l)+Fe(i,k)*S(k,l)*DinvFpdF(j,l,p,q)); + } + } + } + } + } + } +} + + +mlawAnisotropicPlasticityJ2::mlawAnisotropicPlasticityJ2(const int num,const double E,const double nu, const double rho,const J2IsotropicHardening &_j2IH,const double tol, + const bool matrixbyPerturbation, const double pert): + mlawAnisotropicPlasticity(num, E, nu, rho, _j2IH, tol, matrixbyPerturbation,pert) +{ +}; +mlawAnisotropicPlasticityJ2::mlawAnisotropicPlasticityJ2(const mlawAnisotropicPlasticityJ2 &source): mlawAnisotropicPlasticity(source){}; +mlawAnisotropicPlasticityJ2& mlawAnisotropicPlasticityJ2::operator=(const materialLaw &source) +{ + mlawAnisotropicPlasticity::operator =(source); + + return *this; +} + +void mlawAnisotropicPlasticityJ2::yieldFunction(std::vector<double>& yf, const STensor3& sig, const double R, const IPAnisotropicPlasticity* q0, const IPAnisotropicPlasticity* q1, + bool diff, std::vector<STensor3>* DFDsig, std::vector<double>* DFDR) const +{ + double R0 = _j2IH->getYield0(); + STensor3 s = sig.dev(); + double sigEq = sqrt(1.5*s.dotprod()); + yf.resize(1); + yf[0] = (sigEq - R)/R0; + if (diff) + { + STensorOperation::scale(s, 1.5/(sigEq*R0), (*DFDsig)[0]); + (*DFDR)[0] = -1./R0; + } +}; +void mlawAnisotropicPlasticityJ2::getYieldNormal(std::vector<STensor3>& Np, const STensor3& sig, const double R, const IPAnisotropicPlasticity* q0, const IPAnisotropicPlasticity* q1, + bool diff, std::vector<STensor43>* DNpDsig, std::vector<STensor3>* DNpDR) const +{ + int numberYield = getNumOfYieldSurfaces(); + double R0 = _j2IH->getYield0(); + STensor3 s = sig.dev(); + STensorOperation::scale(s, 1.5/R, Np[0]); + if (diff) + { + STensorOperation::scale(_I4dev, 1.5/R, (*DNpDsig)[0]); + STensorOperation::scale(s, -1.5/(R*R), (*DNpDR)[0]); + } +}; + +mlawAnisotropicPlasticityHill48::mlawAnisotropicPlasticityHill48(const int num,const double E,const double nu, const double rho,const J2IsotropicHardening &_j2IH, + const double tol, + const bool matrixbyPerturbation, const double pert): + mlawAnisotropicPlasticity(num, E, nu, rho, _j2IH, tol, matrixbyPerturbation,pert) +{ + STensorOperation::zero(_aniM); +}; +mlawAnisotropicPlasticityHill48::mlawAnisotropicPlasticityHill48(const mlawAnisotropicPlasticityHill48 &source): mlawAnisotropicPlasticity(source), _aniM(source._aniM){}; +mlawAnisotropicPlasticityHill48& mlawAnisotropicPlasticityHill48::operator=(const materialLaw &source) +{ + mlawAnisotropicPlasticity::operator =(source); + const mlawAnisotropicPlasticityHill48* psrc = dynamic_cast<const mlawAnisotropicPlasticityHill48*>(&source); + if (psrc != NULL) + { + _aniM = psrc->_aniM; + } + + return *this; +} + +void mlawAnisotropicPlasticityHill48::setYieldParameters(const std::vector<double>& Mvec) +{ + if (Mvec.size() != 6) + { + Msg::Error("Hill48 requires 6 parameters to define yield surface"); + } + STensorOperation::zero(_aniM); + + Msg::Info("-----\nHill parameters"); + for (int i=0; i< Mvec.size(); i++) + { + printf("%.16g ", Mvec[i]); + } + Msg::Info("\n------"); + + // LL, TT, NN, LT, LN, TN + + // [F, G, H, L, M, N] = Mvec + // sigEq**2 = 1.5*(F*s00**2 +G*s11**2+ H*s22**2 + 2L*s01**2 + 2M*s02**2 + 2N*s12**2 ) = 1.5*s:_aniM:s + + _aniM(0,0,0,0) = Mvec[0]; + _aniM(1,1,1,1) = Mvec[1]; + _aniM(2,2,2,2) = Mvec[2]; + + _aniM(1,0,1,0) = Mvec[3]*0.5; + _aniM(0,1,0,1) = Mvec[3]*0.5; + _aniM(0,1,1,0) = Mvec[3]*0.5; + _aniM(1,0,0,1) = Mvec[3]*0.5; + + _aniM(2,0,2,0) = Mvec[4]*0.5; + _aniM(0,2,2,0) = Mvec[4]*0.5; + _aniM(0,2,0,2) = Mvec[4]*0.5; + _aniM(2,0,0,2) = Mvec[4]*0.5; + + + _aniM(2,1,2,1) = Mvec[5]*0.5; + _aniM(1,2,1,2) = Mvec[5]*0.5; + _aniM(1,2,2,1) = Mvec[5]*0.5; + _aniM(2,1,1,2) = Mvec[5]*0.5; +} + +void mlawAnisotropicPlasticityHill48::yieldFunction(std::vector<double>& yf, const STensor3& sig, const double R, const IPAnisotropicPlasticity* q0, const IPAnisotropicPlasticity* q1, + bool diff, std::vector<STensor3>* DFDsig, std::vector<double>* DFDR) const +{ + double R0 = _j2IH->getYield0(); + static STensor3 s, Ms; + s = sig.dev(); + STensorOperation::multSTensor43STensor3(_aniM,s,Ms); + double sigEq = sqrt(1.5*STensorOperation::doubledot(s,Ms)); + yf.resize(1); + yf[0] = (sigEq - R)/R0; + if (diff) + { + STensorOperation::multSTensor3STensor43(Ms,_I4dev, (*DFDsig)[0]); + (*DFDsig)[0] *= (1.5/(sigEq*R0)); + (*DFDR)[0] = -1./R0; + } +}; +void mlawAnisotropicPlasticityHill48::getYieldNormal(std::vector<STensor3>& Np, const STensor3& sig, const double R, const IPAnisotropicPlasticity* q0, const IPAnisotropicPlasticity* q1, + bool diff, std::vector<STensor43>* DNpDsig, std::vector<STensor3>* DNpDR) const +{ + int numberYield = getNumOfYieldSurfaces(); + double R0 = _j2IH->getYield0(); + static STensor3 s, Ms; + s = sig.dev(); + STensorOperation::multSTensor43STensor3(_aniM,s,Ms); + STensorOperation::multSTensor3STensor43(Ms,_I4dev, Np[0]); + Np[0]*= (1.5/R0); + if (diff) + { + static STensor43 tmp; + STensorOperation::multSTensor43(_aniM,_I4dev, tmp); + STensorOperation::multSTensor43(_I4dev,tmp,(*DNpDsig)[0]); + (*DNpDsig)[0]*= (1.5/R0); + STensorOperation::zero((*DNpDR)[0]); + } +}; \ No newline at end of file diff --git a/NonLinearSolver/materialLaw/mlawAnisotropicPlasticity.h b/NonLinearSolver/materialLaw/mlawAnisotropicPlasticity.h new file mode 100644 index 0000000000000000000000000000000000000000..6d7211abace9f085c9d008ea5cc57fd3f5a6eba7 --- /dev/null +++ b/NonLinearSolver/materialLaw/mlawAnisotropicPlasticity.h @@ -0,0 +1,195 @@ +// +// C++ Interface: material law +// +// Description: material law for plastic anisotropy +// +// Author: <V.D. Nguyen>, (C) 2023 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#ifndef MLAWANISOTROPICPLASTICITY_H_ +#define MLAWANISOTROPICPLASTICITY_H_ + +#include "mlaw.h" +#include "STensor3.h" +#include "STensor43.h" +#include "ipAnisotropicPlasticity.h" + + +class mlawAnisotropicPlasticity : public materialLaw +{ + public: + enum stressFormulation{ CORO_CAUCHY = 0, // cauchy stress in yield surface + CORO_KIRCHHOFF = 1 // Kirchhoff stress in yield surface + }; + protected: + J2IsotropicHardening *_j2IH; + // can't be const due to operator= constructor (HOW TO CHANGE THIS ??) + double _rho; // density + double _E; // young modulus + double _nu; // Poisson ratio + double _lambda; // 1st lame parameter + double _mu; // 2nd lame parameter (=G) + double _K; // bulk modulus + double _K3; // 3*bulk modulus + double _mu3; // 3*_mu = 3*G + double _mu2; // 2*_mu = 2*G + double _tol; // tolerance for iterative process + int _maxite; + double _perturbationfactor; // perturbation factor + bool _tangentByPerturbation; // flag for tangent by perturbation + STensor43 _Cel, _I4, _I4dev; // elastic hook tensor + int _order; + stressFormulation _stressFormulation; + + public: + mlawAnisotropicPlasticity(const int num,const double E,const double nu, const double rho,const J2IsotropicHardening &_j2IH,const double tol=1.e-6, + const bool matrixbyPerturbation = false, const double pert = 1e-8); + #ifndef SWIG + mlawAnisotropicPlasticity(const mlawAnisotropicPlasticity &source); + mlawAnisotropicPlasticity& operator=(const materialLaw &source); + + virtual ~mlawAnisotropicPlasticity(); + + virtual bool withEnergyDissipation() const {return true;}; + // function of materialLaw + virtual materialLaw* clone() const =0; + virtual matname getType() const = 0; + virtual void setYieldParameters(const std::vector<double>& params)=0; + virtual void checkInternalState(IPVariable* ipv, const IPVariable* ipvprev) const{}; + virtual void createIPState(IPStateBase* &ips,bool hasBodyForce, const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const; + virtual void initLaws(const std::map<int,materialLaw*> &maplaw){}; // this law is initialized so nothing to do + virtual double soundSpeed() const; // default but you can redefine it for your case + virtual double density()const{return _rho;} + virtual const double bulkModulus() const{return _K;} + virtual const double shearModulus() const{return _mu;} + virtual const double poissonRatio() const{return _nu;} + virtual double scaleFactor() const{return _mu;}; + virtual const J2IsotropicHardening * getJ2IsotropicHardening() const {return _j2IH;} + void setStressFormulation(int s); + virtual void setStrainOrder(const int i) {_order = i; Msg::Info("order %d is used to approximate log and exp operator ",_order);}; + // specific function + public: + virtual void constitutive( + const STensor3& F0, // initial deformation gradient (input @ time n) + const STensor3& Fn, // updated deformation gradient (input @ time n+1) + STensor3 &P, // updated 1st Piola-Kirchhoff stress tensor (output) + // contains the initial values on input + const IPVariable *q0, // array of initial internal variable + IPVariable *q1, // updated array of internal variable (in ipvcur on output), + STensor43 &Tangent, // constitutive tangents (output) + const bool stiff, // if true compute the tangents + STensor43* elasticTangent = NULL, + const bool dTangent =false, + STensor63* dCalgdeps = NULL + ) const; + protected: + virtual int getNumOfYieldSurfaces() const {return 1;} + double deformationEnergy(const STensor3 &C) const ; + virtual bool withPlastic(const STensor3& F, const STensor3& kcor, const double R, const IPAnisotropicPlasticity* q0, const IPAnisotropicPlasticity* q1) const; + virtual void yieldFunction(std::vector<double>& yf, const STensor3& sig, const double R, const IPAnisotropicPlasticity* q0, const IPAnisotropicPlasticity* q1, + bool diff=false, std::vector<STensor3>* DFDsig=NULL, std::vector<double>* DFDR=NULL) const=0; + virtual void getYieldNormal(std::vector<STensor3>& Np, const STensor3& sig, const double R, const IPAnisotropicPlasticity* q0, const IPAnisotropicPlasticity* q1, + bool diff=false, std::vector<STensor43>* DNpDsig=NULL, std::vector<STensor3>* DNpDR=NULL) const=0; + virtual void computeResidual(const STensor3& DeltaEp, std::vector<double>& DeltaPlasticMult, const double DeltaHatP, // unknown value + const STensor3& sig, const double R, + const IPAnisotropicPlasticity* q0, const IPAnisotropicPlasticity* q1, + std::vector<double>& res0, STensor3& res1, double& res2, + bool stiff, + const STensor43& DsigDDeltaEp, const double H, + std::vector<STensor3>& Dres0DDeltaEp, STensor43& Dres1DDeltaEp, STensor3& Dres2DDeltaEp, + std::vector<double>& Dres0DDeltaPlasticMult, std::vector<STensor3>& Dres1DDeltaPlasticMult, std::vector<double>& Dres2DDeltaPlasticMult, + std::vector<double>& Dres0DDeltaHatP, STensor3& Dres1DDeltaHatP, double& Dres2DDeltaHatP) const; + virtual void computeDResidual(const STensor3& DeltaEp, const std::vector<double>& DeltaPlasticMult, const double DeltaHatP, // unknown value + const STensor3& sig, const double R, const IPAnisotropicPlasticity* q0, const IPAnisotropicPlasticity* q1, + const STensor43& DsigDEepr, const double H, + std::vector<STensor3>& Dres0DEepr, STensor43& Dres1DEepr, STensor3& Dres2DEepr) const; + + virtual void getResAndJacobian(fullVector<double>& res, fullMatrix<double>& J, + const std::vector<double>& res0, const STensor3& res1, const double& res2, + const std::vector<STensor3>& Dres0DDeltaEp, const STensor43& Dres1DDeltaEp, const STensor3& Dres2DDeltaEp, + const std::vector<double>& Dres0DDeltaPlasticMult, const std::vector<STensor3>& Dres1DDeltaPlasticMult, const std::vector<double>& Dres2DDeltaPlasticMult, + const std::vector<double>& Dres0DDeltaHatP, const STensor3& Dres1DDeltaHatP,const double& Dres2DDeltaHatP) const; + + virtual void tangentComputation(STensor43& dStressDF, + const bool plastic, + const STensor3& F, // current F + const STensor3& corKir, // cor Kir + const STensor3& S, // second PK + const STensor3& Fepr, const STensor3& Fppr, // predictor + const STensor43& Lpr, + const STensor3& Fe, const STensor3& Fp, // corrector + const STensor43& L, const STensor63& dL, // corrector value + const STensor43& DcorKirDEepr, + const STensor43& dFpDEepr, + const STensor43& EprToF, const STensor3& Fpinv + ) const; + + virtual bool predictorCorector(const STensor3& F0, // initial deformation gradient (input @ time n) + const STensor3& F, // updated deformation gradient (input @ time n+1) + STensor3 &P, // updated 1st Piola-Kirchhoff stress tensor (output) + const IPAnisotropicPlasticity *q0, // array of initial internal variable + IPAnisotropicPlasticity *q, // updated array of internal variable (in ipvcur on output), + + STensor43& Tangent, // mechanical tangents (output) + STensor43& dFpdF, // plastic tangent + STensor43& dFedF, + STensor3& dpdF, + const bool stiff + ) const; + #endif // SWIG +}; + + +class mlawAnisotropicPlasticityJ2 : public mlawAnisotropicPlasticity +{ + // to test the implementation + public: + mlawAnisotropicPlasticityJ2(const int num,const double E,const double nu, const double rho,const J2IsotropicHardening &_j2IH,const double tol=1.e-6, + const bool matrixbyPerturbation = false, const double pert = 1e-8); + #ifndef SWIG + mlawAnisotropicPlasticityJ2(const mlawAnisotropicPlasticityJ2 &source); + mlawAnisotropicPlasticityJ2& operator=(const materialLaw &source); + virtual ~mlawAnisotropicPlasticityJ2(){}; + virtual materialLaw* clone() const {return new mlawAnisotropicPlasticityJ2(*this);}; + // function of materialLaw + virtual matname getType() const {return materialLaw::J2;}; + virtual void setYieldParameters(const std::vector<double>& params){}; + + virtual void yieldFunction(std::vector<double>& yf, const STensor3& sig, const double R, const IPAnisotropicPlasticity* q0, const IPAnisotropicPlasticity* q1, + bool diff=false, std::vector<STensor3>* DFDsig=NULL, std::vector<double>* DFDR=NULL) const; + virtual void getYieldNormal(std::vector<STensor3>& Np, const STensor3& sig, const double R, const IPAnisotropicPlasticity* q0, const IPAnisotropicPlasticity* q1, + bool diff=false, std::vector<STensor43>* DNpDsig=NULL, std::vector<STensor3>* DNpDR=NULL) const; + #endif // SWIG +}; + + + +class mlawAnisotropicPlasticityHill48 : public mlawAnisotropicPlasticity +{ + protected: + STensor43 _aniM; + public: + mlawAnisotropicPlasticityHill48(const int num,const double E,const double nu, const double rho,const J2IsotropicHardening &_j2IH, const double tol=1.e-6, + const bool matrixbyPerturbation = false, const double pert = 1e-8); + #ifndef SWIG + mlawAnisotropicPlasticityHill48(const mlawAnisotropicPlasticityHill48 &source); + mlawAnisotropicPlasticityHill48& operator=(const materialLaw &source); + virtual ~mlawAnisotropicPlasticityHill48(){}; + virtual materialLaw* clone() const {return new mlawAnisotropicPlasticityHill48(*this);}; + // function of materialLaw + virtual matname getType() const {return materialLaw::Hill48;}; + virtual void setYieldParameters(const std::vector<double>& params); + + virtual void yieldFunction(std::vector<double>& yf, const STensor3& sig, const double R, const IPAnisotropicPlasticity* q0, const IPAnisotropicPlasticity* q1, + bool diff=false, std::vector<STensor3>* DFDsig=NULL, std::vector<double>* DFDR=NULL) const; + virtual void getYieldNormal(std::vector<STensor3>& Np, const STensor3& sig, const double R, const IPAnisotropicPlasticity* q0, const IPAnisotropicPlasticity* q1, + bool diff=false, std::vector<STensor43>* DNpDsig=NULL, std::vector<STensor3>* DNpDR=NULL) const; + #endif // SWIG +}; + + + +#endif //MLAWANISOTROPICPLASTICITY_H_ \ No newline at end of file diff --git a/NonLinearSolver/materialLaw/mlawJ2FullyCoupledThermoMechanics.cpp b/NonLinearSolver/materialLaw/mlawJ2FullyCoupledThermoMechanics.cpp index 6ddf3ab644e42b010a8f2889d3d161a9a9cd67b0..d841280a80ff278f0c3788aef56888f0a32a5d64 100644 --- a/NonLinearSolver/materialLaw/mlawJ2FullyCoupledThermoMechanics.cpp +++ b/NonLinearSolver/materialLaw/mlawJ2FullyCoupledThermoMechanics.cpp @@ -481,7 +481,7 @@ void mlawJ2FullyCoupledThermoMechanics::predictorCorector(const STensor3& F0, ite++; if(ite > maxite) { - Msg::Error("No convergence for plastic correction in j2linear !!"); + Msg::Error("No convergence for plastic correction in J2 !!"); break; } } diff --git a/NonLinearSolver/materialLaw/mlawJ2FullyCoupledThermoMechanics.h b/NonLinearSolver/materialLaw/mlawJ2FullyCoupledThermoMechanics.h index a88fca24f2e62ca257acfe87f7e9e885eb514f73..50783c8fe61e05ffea2a11c29887aa2039f9ec3c 100644 --- a/NonLinearSolver/materialLaw/mlawJ2FullyCoupledThermoMechanics.h +++ b/NonLinearSolver/materialLaw/mlawJ2FullyCoupledThermoMechanics.h @@ -132,7 +132,7 @@ class mlawJ2FullyCoupledThermoMechanics : public materialLaw { void setStrainOrder(const int i){_order = i;}; void setTaylorQuineyFactor(const double f){_TaylorQuineyFactor = f;}; - virtual matname getType() const{return materialLaw::j2linear;} + virtual matname getType() const{return materialLaw::J2;} virtual void createIPState(IPStateBase* &ips,bool hasBodyForce, const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const; virtual void initLaws(const std::map<int,materialLaw*> &maplaw){}; virtual double soundSpeed() const; diff --git a/NonLinearSolver/materialLaw/mlawJ2VMSmallStrain.h b/NonLinearSolver/materialLaw/mlawJ2VMSmallStrain.h index e8ee5520238f6fa1d81651dce5702e04e51d47ad..6206958b5ae9a49a2d7c8916ceb011147ae6d177 100644 --- a/NonLinearSolver/materialLaw/mlawJ2VMSmallStrain.h +++ b/NonLinearSolver/materialLaw/mlawJ2VMSmallStrain.h @@ -52,7 +52,7 @@ class mlawJ2VMSmallStrain : public materialLaw { if (_j2IH != NULL) delete _j2IH; _j2IH = isoHard.clone(); } - virtual matname getType() const{return materialLaw::j2linear;} + virtual matname getType() const{return materialLaw::J2;} virtual void createIPState(IPStateBase* &ips, bool hasBodyForce, const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const; virtual void initLaws(const std::map<int,materialLaw*> &maplaw){}; virtual double soundSpeed() const; diff --git a/NonLinearSolver/materialLaw/mlawJ2linear.cpp b/NonLinearSolver/materialLaw/mlawJ2linear.cpp index f865ac2ae6d99b4058d309d392a95030c6cb48a3..d7985600b9df3161bbe66b20f9ed3901c1b51bf0 100644 --- a/NonLinearSolver/materialLaw/mlawJ2linear.cpp +++ b/NonLinearSolver/materialLaw/mlawJ2linear.cpp @@ -516,7 +516,7 @@ void mlawJ2linear::predictorCorector(const STensor3& F0, // initial defo ite++; if(ite > maxite) { - Msg::Error("No convergence for plastic correction in j2linear !! VMcriterion/sy0 = %e",VMcriterion/Sy0); + Msg::Error("No convergence for plastic correction in J2 !! VMcriterion/sy0 = %e",VMcriterion/Sy0); //q->operator =(*dynamic_cast<const IPVariable*>(q0)); P(0,0) = P(1,1) = P(2,2) = sqrt(-1.); return; diff --git a/NonLinearSolver/materialLaw/mlawJ2linear.h b/NonLinearSolver/materialLaw/mlawJ2linear.h index 5af4a6426fb40128f30036e0860d117ec4932242..106157a6fe8d1fbcd77576d331b5bb21ae69c367 100644 --- a/NonLinearSolver/materialLaw/mlawJ2linear.h +++ b/NonLinearSolver/materialLaw/mlawJ2linear.h @@ -64,7 +64,7 @@ class mlawJ2linear : public materialLaw virtual materialLaw* clone() const {return new mlawJ2linear(*this);}; virtual bool withEnergyDissipation() const {return true;}; // function of materialLaw - virtual matname getType() const{return materialLaw::j2linear;} + virtual matname getType() const{return materialLaw::J2;} virtual void createIPState(IPStateBase* &ips,bool hasBodyForce, const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const; virtual void initLaws(const std::map<int,materialLaw*> &maplaw){}; // this law is initialized so nothing to do virtual double soundSpeed() const; // default but you can redefine it for your case diff --git a/dG3D/benchmarks/CMakeLists.txt b/dG3D/benchmarks/CMakeLists.txt index f7e49d67d9d5030f73445511c3a18b8fc3b88264..98e1d9da849c0fae0d88e107cb1db6b923757e05 100644 --- a/dG3D/benchmarks/CMakeLists.txt +++ b/dG3D/benchmarks/CMakeLists.txt @@ -163,6 +163,7 @@ add_subdirectory(mixedmodeDelaminationExpoLaw) add_subdirectory(restartMixedmodeDelaminationExpoLaw) add_subdirectory(hyperViscoElastic) add_subdirectory(powerYieldViscoElastoPlastic) +add_subdirectory(powerYieldViscoElastoPlastic/fortran) add_subdirectory(powerYieldViscoElastoPlasticWithCorrection) add_subdirectory(powerYieldViscoElastic) add_subdirectory(powerYieldViscoElastWithCorrection) @@ -274,3 +275,4 @@ add_subdirectory(honeycomb_compression) add_subdirectory(nonLinearTVE_uniaxial) add_subdirectory(nonLinearTVP_uniaxial) add_subdirectory(nonLinearTVP_cube) +add_subdirectory(unitCell-Hill) diff --git a/dG3D/benchmarks/EM_Cylinder_Unit_Test/cyl_LinearElecMag.py b/dG3D/benchmarks/EM_Cylinder_Unit_Test/cyl_LinearElecMag.py index 1782ebd59435ab6dd6feb7625071df7c11aed732..ea640d3fd2046aab2fdddca60ea23c9785e694ec 100644 --- a/dG3D/benchmarks/EM_Cylinder_Unit_Test/cyl_LinearElecMag.py +++ b/dG3D/benchmarks/EM_Cylinder_Unit_Test/cyl_LinearElecMag.py @@ -235,7 +235,7 @@ mysolver.archivingForceOnPhysicalGroup("Face", 7, 5, 1); mysolver.solve() check = TestCheck() -check.equal(-3.427375e+06,mysolver.getArchivedForceOnPhysicalGroup("Face", SurfIndStart, 3),1.e-3) +check.equal(-6.467735e+07,mysolver.getArchivedForceOnPhysicalGroup("Face", SurfIndStart, 3),1.e-3) check.equal(-3.484509e+06,mysolver.getArchivedForceOnPhysicalGroup("Face", SurfIndStart, 4),1.e-3) check.equal(3.484509e+06,mysolver.getArchivedForceOnPhysicalGroup("Face", SurfIndEnd, 4),1.e-3) check.equal(1.130279e+06,mysolver.getArchivedForceOnPhysicalGroup("Face", 7, 5),1.e-3) diff --git a/dG3D/benchmarks/ElectroGenericThermoMechanics/elecGenericTM.py b/dG3D/benchmarks/ElectroGenericThermoMechanics/elecGenericTM.py index 647a802dc0b90e27d059e8b8f66053f75b5affed..2714bbe15194ae237837108ba32acede8881a313 100644 --- a/dG3D/benchmarks/ElectroGenericThermoMechanics/elecGenericTM.py +++ b/dG3D/benchmarks/ElectroGenericThermoMechanics/elecGenericTM.py @@ -234,6 +234,6 @@ check = TestCheck() check.equal(0.000000e+00,mysolver.getArchivedForceOnPhysicalGroup("Face", SurfSMPStart, 3),1.e-5) check.equal(-1.273694e+09,mysolver.getArchivedForceOnPhysicalGroup("Face", SurfSMPStart, 4),1.e-5) check.equal(1.273694e+09,mysolver.getArchivedForceOnPhysicalGroup("Face", SurfSMPEnd, 4),1.e-5) -check.equal(1.387616e+08,mysolver.getArchivedForceOnPhysicalGroup("Face", 7, 5),1.e-5) +check.equal(1.282224e+08,mysolver.getArchivedForceOnPhysicalGroup("Face", 7, 5),1.e-5) diff --git a/dG3D/benchmarks/GursonThomasonShearTransition/model.py b/dG3D/benchmarks/GursonThomasonShearTransition/model.py index 3587c22ab2de93754a3d4b9a2950530f930478c0..d8e95bd726aa1582081b9c75185dbb504e5f14c4 100755 --- a/dG3D/benchmarks/GursonThomasonShearTransition/model.py +++ b/dG3D/benchmarks/GursonThomasonShearTransition/model.py @@ -194,8 +194,8 @@ mysolver.solve() check = TestCheck() -check.equal(-1.915989e-04,mysolver.getArchivedNodalValue(2,0,mysolver.displacement),1.e-4) -check.equal(1.660548e-04,mysolver.getArchivedNodalValue(3,0,mysolver.displacement),1.e-4) +check.equal(-1.870109e-04,mysolver.getArchivedNodalValue(2,0,mysolver.displacement),1.e-4) +check.equal(1.685898e-04,mysolver.getArchivedNodalValue(3,0,mysolver.displacement),1.e-4) diff --git a/dG3D/benchmarks/HOwithConstantBodyForce/run.py b/dG3D/benchmarks/HOwithConstantBodyForce/run.py index 3e03c4eac58f8bb76fbd42df75144a330ab64cb9..a148dde4ffa06dac9a7747f98145029597a570af 100644 --- a/dG3D/benchmarks/HOwithConstantBodyForce/run.py +++ b/dG3D/benchmarks/HOwithConstantBodyForce/run.py @@ -182,7 +182,7 @@ mysolver.solve() import linecache total_line_number = sum(1 for line in open('E_0_GP_0_stress.csv')) homoStress = linecache.getline('E_0_GP_0_stress.csv',total_line_number) -print(homoStress) +#print(homoStress) val = float(homoStress.split(';')[1]) check = TestCheck() check.equal(-0.014840731,val,1.e-4) diff --git a/dG3D/benchmarks/MFH_Stoch_Ply/Stoch_Sample.py b/dG3D/benchmarks/MFH_Stoch_Ply/Stoch_Sample.py index 0ce70a1c9b8d31fa4a3f967af168f8595e45c32b..788abef54a0ce4335682b871ae194b8cd5fff6b0 100644 --- a/dG3D/benchmarks/MFH_Stoch_Ply/Stoch_Sample.py +++ b/dG3D/benchmarks/MFH_Stoch_Ply/Stoch_Sample.py @@ -91,7 +91,7 @@ mysolver.solve() check = TestCheck() -check.equal(1.432063e-01,mysolver.getArchivedForceOnPhysicalGroup("Face", 101, 0),1.e-5) +check.equal(1.353881e-01,mysolver.getArchivedForceOnPhysicalGroup("Face", 101, 0),1.e-5) try: import linecache @@ -103,9 +103,9 @@ except: import os os._exit(1) else: - check.equal(7.910747e+08,float(linesmax.split(';')[1])) - check.equal(3.835258e+08,float(linesmin.split(';')[1])) - check.equal(5.728414e+08,float(linesmean.split(';')[1])) + check.equal(6.886981e+08,float(linesmax.split(';')[1])) + check.equal(4.029402e+08,float(linesmin.split(';')[1])) + check.equal(5.415527e+08,float(linesmean.split(';')[1])) diff --git a/dG3D/benchmarks/nanoIndentation/ni.py b/dG3D/benchmarks/nanoIndentation/ni.py index 221c298661066079534c45d7a4206d0b485f2903..0c74b577ebaf7468f9268658777326c85cf8bece 100644 --- a/dG3D/benchmarks/nanoIndentation/ni.py +++ b/dG3D/benchmarks/nanoIndentation/ni.py @@ -166,7 +166,7 @@ mysolver.archivingRigidContactForce(22, 2, 1) mysolver.solve() check = TestCheck() -check.equal(-2.820332e-04,mysolver.getArchivedNodalValue(1001,2,mysolver.displacement),1.e-4) +check.equal(-2.711273e-04,mysolver.getArchivedNodalValue(1001,2,mysolver.displacement),1.e-4) diff --git a/dG3D/benchmarks/powerYieldViscoElastoPlastic/fortran/CMakeLists.txt b/dG3D/benchmarks/powerYieldViscoElastoPlastic/fortran/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..3667d9747b7c516dd7833cc4e59989e55b267c01 --- /dev/null +++ b/dG3D/benchmarks/powerYieldViscoElastoPlastic/fortran/CMakeLists.txt @@ -0,0 +1,11 @@ +# test file + +set(PYFILE cylinder.py) + +set(FILES2DELETE + disp*.msh + stress*.msh + *.csv +) + +add_cm3python_test(${PYFILE} "${FILES2DELETE}") diff --git a/dG3D/benchmarks/powerYieldViscoElastoPlastic/fortran/cylinder.py b/dG3D/benchmarks/powerYieldViscoElastoPlastic/fortran/cylinder.py index 9dc9a44b5a73bdcf953909b2a7cdb280e9747902..39157629e456c735a48ef8a581d27f6765491c45 100644 --- a/dG3D/benchmarks/powerYieldViscoElastoPlastic/fortran/cylinder.py +++ b/dG3D/benchmarks/powerYieldViscoElastoPlastic/fortran/cylinder.py @@ -26,10 +26,10 @@ myfield1.stabilityParameters(beta1) # 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) +nstep = 1000 # number of step (used only if soltype=1) ftime =1. # Final time (used only if soltype=1) tol=1.e-8 # relative tolerance for NR scheme (used only if soltype=1) -nstepArch=1 # Number of step between 2 archiving (used only if soltype=1) +nstepArch=10 # Number of step between 2 archiving (used only if soltype=1) @@ -42,6 +42,7 @@ mysolver.addMaterialLaw(law1) mysolver.Scheme(soltype) mysolver.Solver(sol) mysolver.snlData(nstep,ftime,tol) +mysolver.stepBetweenArchiving(nstepArch) mysolver.displacementBC('Face',1,2,0.) mysolver.displacementBC('Face',3,1,0.) @@ -49,7 +50,7 @@ mysolver.displacementBC('Face',4,0,0.) mysolver.displacementBC('Face',1,0,0) mysolver.displacementBC('Face',1,1,0) -mysolver.displacementBC('Face',2,2,1.) +mysolver.displacementBC('Face',2,2,10.) # build view mysolver.internalPointBuildView("Strain_xx",IPField.STRAIN_XX, 1, 1); @@ -80,4 +81,4 @@ mysolver.archivingNodeDisplacement(5,2,1) mysolver.solve() check = TestCheck() -check.equal(-5.246765e+03,mysolver.getArchivedForceOnPhysicalGroup("Face", 1, 2),1.e-3) +check.equal(-1.308062e+04,mysolver.getArchivedForceOnPhysicalGroup("Face", 1, 2),1.e-3) diff --git a/dG3D/benchmarks/switchSystem_quadDispLinNonlocal/notchedBar.py b/dG3D/benchmarks/switchSystem_quadDispLinNonlocal/notchedBar.py index 0e0bead52191b74d4d4a2bdc1da7ec5968800321..21ed20435d07c4c0d88f5e534cd52d7389c32442 100755 --- a/dG3D/benchmarks/switchSystem_quadDispLinNonlocal/notchedBar.py +++ b/dG3D/benchmarks/switchSystem_quadDispLinNonlocal/notchedBar.py @@ -100,7 +100,7 @@ mysolver.archivingNodeDisplacement(73,1,1) mysolver.solve() check = TestCheck() -check.equal(2.519294e-02,mysolver.getEnergy(energeticField.damage),1.e-4) +check.equal(2.519787e-02,mysolver.getEnergy(energeticField.damage),1.e-4) # new time ftime = 1e-5 diff --git a/dG3D/benchmarks/torchLatticeUniaxial/Bounds.dat b/dG3D/benchmarks/torchLatticeUniaxial/Bounds.dat index 8110b99195eedaeae39a0c73df9791c72ef1ddb6..3606ec6257cbf2faeb25d8119c292f05ca4e22d6 100644 Binary files a/dG3D/benchmarks/torchLatticeUniaxial/Bounds.dat and b/dG3D/benchmarks/torchLatticeUniaxial/Bounds.dat differ diff --git a/dG3D/benchmarks/torchLatticeUniaxial/ModelGRU_GS_0f1_50_f2_75_model.pt b/dG3D/benchmarks/torchLatticeUniaxial/ModelGRU_GS_0f1_50_f2_75_model.pt new file mode 100644 index 0000000000000000000000000000000000000000..4faabbdcbb0bdf69323089a2afd9497decc8da69 Binary files /dev/null and b/dG3D/benchmarks/torchLatticeUniaxial/ModelGRU_GS_0f1_50_f2_75_model.pt differ diff --git a/dG3D/benchmarks/torchLatticeUniaxial/macro_cpp.py b/dG3D/benchmarks/torchLatticeUniaxial/macro_cpp.py index 20f68625cef3a0e1fd65c4a52a46dcb22daed904..6c0a030c1e639930c932a953b226d66b6cd3dfc4 100755 --- a/dG3D/benchmarks/torchLatticeUniaxial/macro_cpp.py +++ b/dG3D/benchmarks/torchLatticeUniaxial/macro_cpp.py @@ -11,8 +11,6 @@ from dG3Dpy import* lnum1 = 11 rho = 1e-9 -collect_dir = "/home/mohib/moammmPublic/sveresponses/Cell3/CollectedData" -surrogate_dir = "/home/mohib/moammmPublic/sveresponses/Cell3/RNNSurrogate" with open('Bounds.dat', 'rb') as data: XGmax = pickle.load(data, encoding="latin1") @@ -30,52 +28,54 @@ Radiusstd = (XGmax[1] - XGmin[1]) / 2.0 CellSizemean = (XGmax[2] + XGmin[2]) / 2.0 CellSizestd = (XGmax[2] - XGmin[2]) / 2.0 -TSTEPmean = (XGmax[3] + XGmin[3])/2.0 -TSTEPstd = (XGmax[3] - XGmin[3])/2.0 +TSTEPmean = (XGmax[3] + XGmin[3]) / 2.0 +TSTEPstd = (XGmax[3] - XGmin[3]) / 2.0 -EXXmean = (XGmax[4] + XGmin[4])/2.0 -EXXstd = (XGmax[4] - XGmin[4])/2.0 +EXXmean = (XGmax[4] + XGmin[4]) / 2.0 +EXXstd = (XGmax[4] - XGmin[4]) / 2.0 -EYYmean = (XGmax[5] + XGmin[5])/2.0 -EYYstd = (XGmax[5] - XGmin[5])/2.0 +EYYmean = (XGmax[5] + XGmin[5]) / 2.0 +EYYstd = (XGmax[5] - XGmin[5]) / 2.0 -EZZmean = (XGmax[6] + XGmin[6])/2.0 -EZZstd = (XGmax[6] - XGmin[6])/2.0 +EZZmean = (XGmax[6] + XGmin[6]) / 2.0 +EZZstd = (XGmax[6] - XGmin[6]) / 2.0 -EXYmean = (XGmax[7] + XGmin[7])/2.0 -EXYstd = (XGmax[7] - XGmin[7])/2.0 +EXYmean = (XGmax[7] + XGmin[7]) / 2.0 +EXYstd = (XGmax[7] - XGmin[7]) / 2.0 -EZXmean = (XGmax[8] + XGmin[8])/2.0 -EZXstd = (XGmax[8] - XGmin[8])/2.0 +EZXmean = (XGmax[8] + XGmin[8]) / 2.0 +EZXstd = (XGmax[8] - XGmin[8]) / 2.0 -EYZmean = (XGmax[9] + XGmin[9])/2.0 -EYZstd = (XGmax[9] - XGmin[9])/2.0 +EYZmean = (XGmax[9] + XGmin[9]) / 2.0 +EYZstd = (XGmax[9] - XGmin[9]) / 2.0 # ----- Outputs ----------# -SXXmean = (YSmax[0] + YSmin[0])/2.0 -SXXstd = (YSmax[0] - YSmin[0])/2.0 +SXXmean = (YSmax[0] + YSmin[0]) / 2.0 +SXXstd = (YSmax[0] - YSmin[0]) / 2.0 -SYYmean = (YSmax[1]+YSmin[1])/2.0 -SYYstd = (YSmax[1]-YSmin[1])/2.0 +SYYmean = (YSmax[1]+YSmin[1]) / 2.0 +SYYstd = (YSmax[1]-YSmin[1]) / 2.0 -SZZmean = (YSmax[2]+YSmin[2])/2.0 -SZZstd = (YSmax[2]-YSmin[2])/2.0 +SZZmean = (YSmax[2]+YSmin[2]) / 2.0 +SZZstd = (YSmax[2]-YSmin[2]) / 2.0 -SXYmean = (YSmax[3]+YSmin[3])/2.0 -SXYstd = (YSmax[3]-YSmin[3])/2.0 +SXYmean = (YSmax[3]+YSmin[3]) / 2.0 +SXYstd = (YSmax[3]-YSmin[3]) / 2.0 -SZXmean = (YSmax[4]+YSmin[4])/2.0 -SZXstd = (YSmax[4]-YSmin[4])/2.0 +SZXmean = (YSmax[4]+YSmin[4]) / 2.0 +SZXstd = (YSmax[4]-YSmin[4]) / 2.0 -SYZmean = (YSmax[5]+YSmin[5])/2.0 -SYZstd = (YSmax[5]-YSmin[5])/2.0 +SYZmean = (YSmax[5]+YSmin[5]) / 2.0 +SYZstd = (YSmax[5]-YSmin[5]) / 2.0 # Set total no of inputs param for RNN (6 EGL + 3 Extra: radius, cellsize, time) numberOfInput = 9 -numInternalVars = 400 +numInternalVars = 75 -macromat1 = torchANNBasedDG3DMaterialLaw(lnum1, rho, numberOfInput, numInternalVars, "model.pt", +surrogate = "ModelGRU_GS_0f1_50_f2_75_model.pt" + +macromat1 = torchANNBasedDG3DMaterialLaw(lnum1, rho, numberOfInput, numInternalVars, surrogate, EXXmean, EXXstd, EXYmean, EXYstd, EYYmean, EYYstd, EYZmean, EYZstd, EZZmean, EZZstd, EZXmean, EZXstd, SXXmean, SXXstd, SXYmean, SXYstd, SYYmean, SYYstd, @@ -86,6 +86,8 @@ macromat1 = torchANNBasedDG3DMaterialLaw(lnum1, rho, numberOfInput, numInternalV macromat1.setKinematicInput(1) # Set no of additional inputs macromat1.setNumExtraInput(3) +# Set the location of time in the extra array +macromat1.setTimeArg(2) # Set initial vcalues for extra inputs in order Radius, cellsize, time macromat1.setInitialExtraInput(0.6) @@ -106,8 +108,8 @@ 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-4 # relative tolerance for NR scheme (used only if soltype=1) -nstepArch=1 # Number of step between 2 archiving (used only if soltype=1) +tol=1.e-5 # relative tolerance for NR scheme (used only if soltype=1) +nstepArch=5 # Number of step between 2 archiving (used only if soltype=1) # creation of macro part Domain @@ -137,7 +139,7 @@ mysolver.stepBetweenArchiving(nstepArch) mysolver.displacementBC("Face",551,1,0.0) mysolver.displacementBC("Face",554,0,0.0) mysolver.displacementBC("Face",555,2,0.0) -mysolver.displacementBC("Face",553,1, 10) +mysolver.displacementBC("Face",553,1,-5.0) # archivage diff --git a/dG3D/benchmarks/torchLatticeUniaxial/model.pt b/dG3D/benchmarks/torchLatticeUniaxial/model.pt deleted file mode 100644 index 4d7910c30ad8bf8ca468ba702676110c514a9709..0000000000000000000000000000000000000000 Binary files a/dG3D/benchmarks/torchLatticeUniaxial/model.pt and /dev/null differ diff --git a/dG3D/benchmarks/torchLatticeUniaxial/rubics.geo b/dG3D/benchmarks/torchLatticeUniaxial/rubics.geo index fead3263fdc8f2e097da330ce1e4ce74f0b38fac..4e41dbb7bda583b1cbc88e4102134e45cbbb6644 100644 --- a/dG3D/benchmarks/torchLatticeUniaxial/rubics.geo +++ b/dG3D/benchmarks/torchLatticeUniaxial/rubics.geo @@ -1,8 +1,8 @@ SetFactory('OpenCASCADE'); -lx = 30; -ly = 30; -lz = 30; +lx = 20; +ly = 20; +lz = 20; nx = 1; ny = 1; @@ -35,14 +35,14 @@ Extrude {0, 0, lz/nz} { Surface{100}; Layers{nz}; Recombine; } -Physical Volume(11)={1}; + Transfinite Line{1,3}=nx+1 Using Progression 1; Transfinite Line{2,4}=ny+1 Using Progression 1; Transfinite Surface {100}; Recombine Surface{100}; - +Recombine Volume{1}; Physical Surface(551) = {101}; @@ -52,4 +52,4 @@ Physical Surface(554) = {104}; Physical Surface(555) = {100}; Physical Surface(556) = {105}; - +Physical Volume(11)={1}; diff --git a/dG3D/benchmarks/torchLatticeUniaxial/rubics.msh b/dG3D/benchmarks/torchLatticeUniaxial/rubics.msh index 6180478a6a548808c050c5b56010bc5b605fde6c..72e4ecc1248d99f4821f6a8141d18df68c517ce1 100644 --- a/dG3D/benchmarks/torchLatticeUniaxial/rubics.msh +++ b/dG3D/benchmarks/torchLatticeUniaxial/rubics.msh @@ -4,32 +4,32 @@ $EndMeshFormat $Entities 8 12 6 1 1 0 0 0 0 -2 30 0 0 0 -3 30 30 0 0 -4 0 30 0 0 -5 0 0 30 0 -6 30 0 30 0 -7 30 30 30 0 -8 0 30 30 0 -1 -9.99999993922529e-08 -1e-07 -1e-07 30.0000001 1e-07 1e-07 0 2 1 -2 -2 29.9999999 -9.99999993922529e-08 -1e-07 30.0000001 30.0000001 1e-07 0 2 2 -3 -3 -9.99999993922529e-08 29.9999999 -1e-07 30.0000001 30.0000001 1e-07 0 2 3 -4 -4 -1e-07 -9.99999993922529e-08 -1e-07 1e-07 30.0000001 1e-07 0 2 4 -1 -5 -1e-07 -1e-07 -9.99999993922529e-08 1e-07 1e-07 30.0000001 0 2 1 -5 -6 29.9999999 -1e-07 -9.99999993922529e-08 30.0000001 1e-07 30.0000001 0 2 2 -6 -7 -9.99999993922529e-08 -1e-07 29.9999999 30.0000001 1e-07 30.0000001 0 2 5 -6 -8 29.9999999 29.9999999 -9.99999993922529e-08 30.0000001 30.0000001 30.0000001 0 2 3 -7 -9 29.9999999 -9.99999993922529e-08 29.9999999 30.0000001 30.0000001 30.0000001 0 2 6 -7 -10 -1e-07 29.9999999 -9.99999993922529e-08 1e-07 30.0000001 30.0000001 0 2 4 -8 -11 -9.99999993922529e-08 29.9999999 29.9999999 30.0000001 30.0000001 30.0000001 0 2 7 -8 -12 -1e-07 -9.99999993922529e-08 29.9999999 1e-07 30.0000001 30.0000001 0 2 8 -5 -100 -1.500000100000012 -1.500000100000012 -1e-07 31.50000010000001 31.50000010000001 1e-07 1 555 4 1 2 3 4 -101 -9.99999993922529e-08 -1e-07 -9.99999993922529e-08 30.0000001 1e-07 30.0000001 1 551 4 5 7 -6 -1 -102 29.9999999 -9.99999993922529e-08 -9.99999993922529e-08 30.0000001 30.0000001 30.0000001 1 552 4 6 9 -8 -2 -103 -9.99999993922529e-08 29.9999999 -9.99999993922529e-08 30.0000001 30.0000001 30.0000001 1 553 4 8 11 -10 -3 -104 -1e-07 -9.99999993922529e-08 -9.99999993922529e-08 1e-07 30.0000001 30.0000001 1 554 4 10 12 -5 -4 -105 -1.500000100000012 -1.500000100000012 29.9999999 31.50000010000001 31.50000010000001 30.0000001 1 556 4 7 9 11 12 -1 -1.500000100000012 -1.500000100000012 -9.99999993922529e-08 31.50000010000001 31.50000010000001 30.0000001 1 11 6 -101 -102 -103 -104 -100 105 +2 20 0 0 0 +3 20 20 0 0 +4 0 20 0 0 +5 0 0 20 0 +6 20 0 20 0 +7 20 20 20 0 +8 0 20 20 0 +1 -9.99999993922529e-08 -1e-07 -1e-07 20.0000001 1e-07 1e-07 0 2 1 -2 +2 19.9999999 -9.99999993922529e-08 -1e-07 20.0000001 20.0000001 1e-07 0 2 2 -3 +3 -9.99999993922529e-08 19.9999999 -1e-07 20.0000001 20.0000001 1e-07 0 2 3 -4 +4 -1e-07 -9.99999993922529e-08 -1e-07 1e-07 20.0000001 1e-07 0 2 4 -1 +5 -1e-07 -1e-07 -9.99999993922529e-08 1e-07 1e-07 20.0000001 0 2 1 -5 +6 19.9999999 -1e-07 -9.99999993922529e-08 20.0000001 1e-07 20.0000001 0 2 2 -6 +7 -9.99999993922529e-08 -1e-07 19.9999999 20.0000001 1e-07 20.0000001 0 2 5 -6 +8 19.9999999 19.9999999 -9.99999993922529e-08 20.0000001 20.0000001 20.0000001 0 2 3 -7 +9 19.9999999 -9.99999993922529e-08 19.9999999 20.0000001 20.0000001 20.0000001 0 2 6 -7 +10 -1e-07 19.9999999 -9.99999993922529e-08 1e-07 20.0000001 20.0000001 0 2 4 -8 +11 -9.99999993922529e-08 19.9999999 19.9999999 20.0000001 20.0000001 20.0000001 0 2 7 -8 +12 -1e-07 -9.99999993922529e-08 19.9999999 1e-07 20.0000001 20.0000001 0 2 8 -5 +100 -1.000000100000001 -1.000000100000001 -1e-07 21.0000001 21.0000001 1e-07 1 555 4 1 2 3 4 +101 -9.99999993922529e-08 -1e-07 -9.99999993922529e-08 20.0000001 1e-07 20.0000001 1 551 4 5 7 -6 -1 +102 19.9999999 -9.99999993922529e-08 -9.99999993922529e-08 20.0000001 20.0000001 20.0000001 1 552 4 6 9 -8 -2 +103 -9.99999993922529e-08 19.9999999 -9.99999993922529e-08 20.0000001 20.0000001 20.0000001 1 553 4 8 11 -10 -3 +104 -1e-07 -9.99999993922529e-08 -9.99999993922529e-08 1e-07 20.0000001 20.0000001 1 554 4 10 12 -5 -4 +105 -1.000000100000001 -1.000000100000001 19.9999999 21.0000001 21.0000001 20.0000001 1 556 4 7 9 11 12 +1 -1.000000100000001 -1.000000100000001 -9.99999993922529e-08 21.0000001 21.0000001 20.0000001 1 11 6 -101 -102 -103 -104 -100 105 $EndEntities $Nodes 27 27 1 27 @@ -38,82 +38,82 @@ $Nodes 0 0 0 0 2 0 1 2 -30 0 0 +20 0 0 0 3 0 1 3 -30 30 0 +20 20 0 0 4 0 1 4 -0 30 0 +0 20 0 0 5 0 1 5 -0 0 30 +0 0 20 0 6 0 1 6 -30 0 30 +20 0 20 0 7 0 1 7 -30 30 30 +20 20 20 0 8 0 1 8 -0 30 30 +0 20 20 1 1 0 1 9 -15 0 0 +10 0 0 1 2 0 1 10 -30 15 0 +20 10 0 1 3 0 1 11 -15 30 0 +10 20 0 1 4 0 1 12 -0 15 0 +0 10 0 1 5 0 1 13 -0 0 15 +0 0 10 1 6 0 1 14 -30 0 15 +20 0 10 1 7 0 1 15 -15 0 30 +10 0 20 1 8 0 1 16 -30 30 15 +20 20 10 1 9 0 1 17 -30 15 30 +20 10 20 1 10 0 1 18 -0 30 15 +0 20 10 1 11 0 1 19 -15 30 30 +10 20 20 1 12 0 1 20 -0 15 30 +0 10 20 2 100 0 1 21 -15 15 0 +10 10 0 2 101 0 1 22 -15 0 15 +10 0 10 2 102 0 1 23 -30 15 15 +20 10 10 2 103 0 1 24 -15 30 15 +10 20 10 2 104 0 1 25 -0 15 15 +0 10 10 2 105 0 1 26 -15 15 30 +10 10 20 3 1 0 1 27 -15 15 15 +10 10 10 $EndNodes $Elements 7 7 1 7 diff --git a/dG3D/benchmarks/unitCell-Hill/CMakeLists.txt b/dG3D/benchmarks/unitCell-Hill/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..b1fd65d99c5546150b7e470092138bf6cd9efd3c --- /dev/null +++ b/dG3D/benchmarks/unitCell-Hill/CMakeLists.txt @@ -0,0 +1,11 @@ +# test file + +set(PYFILE model.py) + +set(FILES2DELETE + disp*.msh + *.csv + stress*.msh +) + +add_cm3python_test(${PYFILE} "${FILES2DELETE}") diff --git a/dG3D/benchmarks/unitCell-Hill/comparison.py b/dG3D/benchmarks/unitCell-Hill/comparison.py new file mode 100644 index 0000000000000000000000000000000000000000..b2cb99be211e64c15cc69056d2c747925c515fb5 --- /dev/null +++ b/dG3D/benchmarks/unitCell-Hill/comparison.py @@ -0,0 +1,42 @@ +import os +import pandas as pd +import numpy as np +import matplotlib.pyplot as plt +from extractData import * + +plt.rcParams.update({'font.size': 16}) + + +unit = 1.; +W0 = 1.; +lambda0 = 1.; +f0 = 1e-3; +Chi0 = np.exp((1./3.)*np.log(1.5*f0*lambda0/W0)); + +Lr0 = 1*unit; +Lz0 = lambda0*Lr0; +Rr0 = Chi0*Lr0; +Rz0 = W0*Rr0; + +f0 = 2*Rr0*Rr0*Rz0/(3*Lr0*Lr0*Lz0) +print(f"initial porosity f0 = {f0}") + + +fig, axes = plt.subplots(1,2, figsize=(8,5)) +plt.tight_layout() + +for folder, ltpe in zip(["J2","J2-newImp","Hill-0","Hill-1"],["r-","g.","b:", "k-."]): + sigE, sigH, f, lamb, W, Chi, Er, Ez, Ee, sigZ = extractData(folder,f0,Lr0,Lz0,Rr0,Rz0,T=2) + axes[0].plot(Ee, sigE, ltpe, label=folder) + axes[1].plot(Ee, f, ltpe,label=folder) + +axes[0].set_xlabel(r"$E_{eq}$ [-]") +axes[0].set_ylabel(r"$\Sigma_{eq}$ (MPa)") +axes[1].set_xlabel(r"$E_{eq}$ [-]") +axes[1].set_ylabel(r"f [-]") + +axes[0].legend(loc="lower center",framealpha=0) +axes[1].legend(framealpha=0) + +plt.savefig("comparison.svg",bbox_inches="tight") +plt.show() diff --git a/dG3D/benchmarks/unitCell-Hill/extractData.py b/dG3D/benchmarks/unitCell-Hill/extractData.py new file mode 100644 index 0000000000000000000000000000000000000000..4cf639eed413e38f0a96ca731f7b521a7f019c52 --- /dev/null +++ b/dG3D/benchmarks/unitCell-Hill/extractData.py @@ -0,0 +1,39 @@ + +import os +import pandas as pd +import numpy as np + +def extractData(folder,f0,Lr0,Lz0,Rr0,Rz0,T): + uz = pd.read_csv(os.path.join(folder, "NodalDisplacementPhysical3Num4comp2.csv"), sep=";", header=None) + ur = pd.read_csv(os.path.join(folder, "NodalDisplacementPhysical3Num4comp0.csv"), sep=";", header=None) + fz = pd.read_csv(os.path.join(folder, "force1comp2.csv"), sep=";", header=None) + JV = pd.read_csv(os.path.join(folder, "VolumeIntegral_JACOBIAN.csv"), sep=";", header=None) + Wpl =pd.read_csv(os.path.join(folder, "VolumeIntegral_PLASTIC_ENERGY.csv"), sep=";", header=None) + uRz = pd.read_csv(os.path.join(folder, "NodalDisplacementPhysical5Num6comp2.csv"), sep=";", header=None) + uRr = pd.read_csv(os.path.join(folder, "NodalDisplacementPhysical1Num2comp0.csv"), sep=";", header=None) + + Lz = Lz0+uz.values[:,1]; + Lr = Lr0+ur.values[:,1]; + + Rz = Rz0+uRz.values[:,1]; + Rr = Rr0+uRr.values[:,1]; + + Er = np.log(Lr/Lr0); + Ez = np.log(Lz/Lz0); + Ee = 2.*np.abs(Ez-Er)/3.; + + lamb = Lz/Lr; + W = Rz/Rr; + Chi = Rr/Lr; + + sigZ = -fz.values[:,1]/(np.pi*Lr*Lr); + sigR = (T-1./3.)/(T+2./3.)*sigZ; + + sigE = np.abs(sigZ-sigR); + sigH = (2*sigR+sigZ)/3.; + + V0 = np.pi*Lr0*Lr0*Lz0; + V = np.pi*Lr*Lr*Lz; + + f = (V-JV.values[:,1])/V; + return sigE, sigH, f, lamb, W, Chi, Er, Ez, Ee, sigZ diff --git a/dG3D/benchmarks/unitCell-Hill/model.py b/dG3D/benchmarks/unitCell-Hill/model.py new file mode 100644 index 0000000000000000000000000000000000000000..4669a0f5f7e79ecd313977788881243c20daeebf --- /dev/null +++ b/dG3D/benchmarks/unitCell-Hill/model.py @@ -0,0 +1,137 @@ +#coding-Utf-8-*- +from gmshpy import * +from dG3Dpy import* +from math import* + + +lawnum1 = 11 # unique number of law +rho = 7850 +young = 205.4e3 #MPa +nu = 0.3 +sy0 = 862.4 #MPa +h = 3399. +p1 = 0.012 +n1 = 0.084 +p2 = 0.056 +n2 = 0.058 + +harden = LinearFollowedByMultiplePowerLawJ2IsotropicHardening(lawnum1,sy0,h,p1,n1,p2,n2) +law1 = AnisotropicPlasticityDG3DMaterialLaw(lawnum1,"Hill48",rho,young,nu,harden,1e-8,False,1e-8) +params = vectorDouble(6) +hLL = 1.5 # longitudinal +hTT = 0.8 # transversal +hNN = 1. # thickness +hLT = 0.5 +hLN = 1.1 +hTN = 0.5 +params[0]=hLL +params[1]=hTT +params[2]=hNN +params[3]=hLT +params[4]=hLN +params[5]=hTN +law1.setYieldParameters(params) + + +law1.setStrainOrder(9) + + +# geometry +meshfile="modelW1.msh" # name of mesh file + +# solver +sol = 2 # Gmm=0 (default) Taucs=1 PETsc=2 +soltype = 1 # StaticLinear=0 (default) StaticNonLinear=1 +nstep = 10 # 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) + + + +# creation of ElasticField +myfield1 = axisymmetricDG3DDomain(11,11,0,lawnum1,0,2,0) + +# 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("Face",11,1,0.) +mysolver.sameDisplacementBC("Edge",2,3,0) +mysolver.sameDisplacementBC("Edge",3,3,2) +mysolver.displacementBC("Edge",4,0,0.) +mysolver.displacementBC("Edge",1,2,0.) + +method=0 +mysolver.pathFollowing(True,method) +if method==0: + mysolver.setPathFollowingIncrementAdaptation(True,6,1) + mysolver.setPathFollowingControlType(0) + mysolver.setPathFollowingCorrectionMethod(0) + mysolver.setPathFollowingArcLengthStep(2e-1) + mysolver.setBoundsOfPathFollowingArcLengthSteps(0,2.5); +elif method==1: + mysolver.setPathFollowingIncrementAdaptation(False,5) + mysolver.setPathFollowingLocalSteps(1e-1,1e-2) + mysolver.setPathFollowingLocalIncrementType(1); + mysolver.setPathFollowingSwitchCriterion(0) + +#mysolver.forceBC("Node",3,2,5*1.e3) +#mysolver.forceBC("Node",3,0,1.e3) + +#mysolver.forceBC("Edge",3,2,2.5e3) +#mysolver.forceBC("Edge",2,0,1.e3) +T = 2. +fact = (T-1./3.)/(T+2./3) +mysolver.pressureOnPhysicalGroupBC("Edge",3,-1e3,0.) +mysolver.pressureOnPhysicalGroupBC("Edge",2,-fact*1e3,0.) + + +mysolver.internalPointBuildView("P_xx",IPField.P_XX, 1, 1) +mysolver.internalPointBuildView("P_yy",IPField.P_YY, 1, 1) +mysolver.internalPointBuildView("P_zz",IPField.P_ZZ, 1, 1) +mysolver.internalPointBuildView("P_xz",IPField.P_XZ, 1, 1) +mysolver.internalPointBuildView("P_zx",IPField.P_ZX, 1, 1) + +mysolver.internalPointBuildView("F_xx",IPField.F_XX, 1, 1) +mysolver.internalPointBuildView("F_yy",IPField.F_YY, 1, 1) +mysolver.internalPointBuildView("F_zz",IPField.F_ZZ, 1, 1) +mysolver.internalPointBuildView("F_xz",IPField.F_XZ, 1, 1) +mysolver.internalPointBuildView("F_zx",IPField.F_ZX, 1, 1) + +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("Edge",1, 2) +mysolver.archivingForceOnPhysicalGroup("Edge",4, 0) +mysolver.archivingNodeDisplacement(1,0) +mysolver.archivingNodeDisplacement(5,2) +mysolver.archivingNodeDisplacement(6,0) +mysolver.archivingNodeDisplacement(6,2) +mysolver.archivingNodeDisplacement(3,0) +mysolver.archivingNodeDisplacement(3,2) + +mysolver.archivingVolumeIntegralValue(IPField.JACOBIAN) +mysolver.archivingVolumeIntegralValue(IPField.DEFO_ENERGY) +mysolver.archivingVolumeIntegralValue(IPField.PLASTIC_ENERGY) +mysolver.archivingVolumeIntegralValue(IPField.DAMAGE_ENERGY) + +mysolver.solve() + +check = TestCheck() +check.equal(-7.330003e+03,mysolver.getArchivedForceOnPhysicalGroup("Edge", 1, 2),1e-5) diff --git a/dG3D/benchmarks/unitCell-Hill/modelW1.geo b/dG3D/benchmarks/unitCell-Hill/modelW1.geo new file mode 100644 index 0000000000000000000000000000000000000000..70eff44b1e289f8f84008fe613c78956e920287d --- /dev/null +++ b/dG3D/benchmarks/unitCell-Hill/modelW1.geo @@ -0,0 +1,130 @@ +unit = 1.; +W0 = 1.; +lambda0 = 1.; +f0 = 1e-3; +Chi0 = Exp((1./3.)*Log(1.5*f0*lambda0/W0)); + +Lr0 = 1*unit; +Lz0 = lambda0*Lr0; +Rr0 = Chi0*Lr0; +Rz0 = W0*Rr0; + +f0 = 2*Rr0*Rr0*Rz0/(3*Lr0*Lr0*Lz0); +Printf("initial porosity = %e",f0); + +//Mesh.RecombineAll = 1; + +lsca = 0.07*unit; +Point(1) = {0,0,0,lsca}; +Point(2) = {Rr0,0,0,0.05*lsca}; +Point(3) = {Lr0,0,0,0.3*lsca}; +Point(4) = {Lr0,0,Lz0,lsca}; +Point(5) = {0,0,Lz0,lsca}; +Point(6) = {0,0,Rz0,lsca*0.5}; + +z7 = 2*Rz0; +Point(7) = {0,0,z7,lsca}; + +x8 = 2*Rr0; +Point(8) = {x8,0,0,lsca}; + +z9 = Sqrt(0.5)*Rz0; +x9 = Rr0*Sqrt(1.-z9*z9/Rz0/Rz0); +Point(9) = {x9,0,z9,lsca*0.05}; + +x10 = 2*Rr0-0.4*Rr0; +z10 = z7 - 0.4*Rz0; +Point(10) = {x10,0,z10,lsca*0.05}; + +x11 = 2*Rr0; +Point(11) = {x11,0,Lz0,lsca*0.05}; + +z12 = z7; +Point(12) = {Lr0,0,z12,lsca*0.05}; + + +//+ +Ellipse(1) = {2, 1, 2, 9}; +Ellipse(2) = {9, 1, 6, 6}; + +//+ +Line(3) = {6, 7}; +//+ +Line(4) = {7, 5}; +//+ +Line(5) = {5, 11}; +//+ +Line(6) = {11, 4}; +//+ +Line(7) = {4, 12}; +//+ +Line(8) = {12, 3}; +//+ +Line(9) = {3, 8}; +//+ +Line(10) = {8, 2}; +//+ +Line(11) = {12, 10}; +//+ +Line(12) = {10, 11}; +//+ +Line(13) = {10, 7}; +//+ +Line(14) = {10, 9}; +//+ +Line(15) = {10, 8}; +//+ +Line Loop(1) = {6, 7, 11, 12}; +//+ +Plane Surface(1) = {1}; +//+ +Line Loop(2) = {12, -5, -4, -13}; +//+ +Plane Surface(2) = {2}; +//+ +Line Loop(3) = {3, -13, 14, 2}; +//+ +Plane Surface(3) = {3}; +//+ +Line Loop(4) = {10, 1, -14, 15}; +//+ +Plane Surface(4) = {4}; +//+ +Line Loop(5) = {15, -9, -8, 11}; +//+ +Plane Surface(5) = {5}; +//+ +Physical Surface(11) = {2, 1, 5, 4, 3}; +//+ +Physical Line(1) = {10, 9}; +//+ +Physical Line(2) = {8, 7}; +//+ +Physical Line(3) = {6, 5}; +//+ +Physical Line(4) = {4, 3}; +//+ +Physical Point(1) = {2}; +//+ +Physical Point(2) = {3}; +//+ +Physical Point(3) = {4}; +//+ +Physical Point(4) = {5}; +//+ +Physical Point(5) = {6}; +//+ +Physical Point(6) = {9}; +//+ +Transfinite Line {6, 11, 9} = 20 Using Progression 1; +//+ +Transfinite Line {7, 12, 4} = 11 Using Progression 1; +//+ +Transfinite Line {5, 13, 2} = 11 Using Progression 1.; +//+ +Transfinite Line {-8, -15, 1} = 16 Using Progression 1.08; +//+ +Transfinite Line {-10, -14, 3} = 11 Using Progression 1.04; +//+ +Transfinite Surface {2, 1, 5, 4, 3}; +Recombine Surface{2, 1, 5, 4, 3}; diff --git a/dG3D/benchmarks/unitCell-Hill/modelW1.msh b/dG3D/benchmarks/unitCell-Hill/modelW1.msh new file mode 100644 index 0000000000000000000000000000000000000000..831fae960afa8a6e3422dfcb0a634e7ee91a7fc6 --- /dev/null +++ b/dG3D/benchmarks/unitCell-Hill/modelW1.msh @@ -0,0 +1,7886 @@ +$MeshFormat +4.1 0 8 +$EndMeshFormat +$Entities +12 15 5 0 +1 0 0 0 0 +2 0.1144714242553332 0 0 1 1 +3 1 0 0 1 2 +4 1 0 1 1 3 +5 0 0 1 1 4 +6 0 0 0.1144714242553332 1 5 +7 0 0 0.2289428485106664 0 +8 0.2289428485106664 0 0 0 +9 0.08094352034302833 0 0.08094352034302835 1 6 +10 0.1831542788085331 0 0.1831542788085331 0 +11 0.2289428485106664 0 1 0 +12 1 0 0.2289428485106664 0 +1 0.08094352034302832 0 0 0.1144714242553332 0 0.08094352034302835 0 2 2 -9 +2 0 0 0.08094352034302833 0.08094352034302832 0 0.1144714242553332 0 2 9 -6 +3 0 0 0.1144714242553332 0 0 0.2289428485106664 1 4 2 6 -7 +4 0 0 0.2289428485106664 0 0 1 1 4 2 7 -5 +5 0 0 1 0.2289428485106664 0 1 1 3 2 5 -11 +6 0.2289428485106664 0 1 1 0 1 1 3 2 11 -4 +7 1 0 0.2289428485106664 1 0 1 1 2 2 4 -12 +8 1 0 0 1 0 0.2289428485106664 1 2 2 12 -3 +9 0.2289428485106664 0 0 1 0 0 1 1 2 3 -8 +10 0.1144714242553332 0 0 0.2289428485106664 0 0 1 1 2 8 -2 +11 0.1831542788085332 0 0.1831542788085331 1 0 0.2289428485106664 0 2 12 -10 +12 0.1831542788085331 0 0.1831542788085331 0.2289428485106664 0 1 0 2 10 -11 +13 0 0 0.1831542788085331 0.1831542788085331 0 0.2289428485106664 0 2 10 -7 +14 0.08094352034302833 0 0.08094352034302835 0.1831542788085331 0 0.1831542788085331 0 2 10 -9 +15 0.1831542788085331 0 0 0.2289428485106664 0 0.1831542788085331 0 2 10 -8 +1 0.1831542788085331 0 0.1831542788085331 1 0 1 1 11 4 6 7 11 12 +2 0 0 0.1831542788085331 0.2289428485106664 0 1 1 11 4 12 -5 -4 -13 +3 0 0 0.08094352034302833 0.1831542788085331 0 0.2289428485106664 1 11 4 3 -13 14 2 +4 0.08094352034302832 0 0 0.2289428485106664 0 0.1831542788085331 1 11 4 10 1 -14 15 +5 0.1831542788085331 0 0 1 0 0.2289428485106664 1 11 4 15 -9 -8 11 +$EndEntities +$Nodes +31 3429 1 3429 +0 2 0 1 +1 +0.1144714242553332 0 0 +0 3 0 1 +2 +1 0 0 +0 4 0 1 +3 +1 0 1 +0 5 0 1 +4 +0 0 1 +0 6 0 1 +5 +0 0 0.1144714242553332 +0 7 0 1 +6 +0 0 0.2289428485106664 +0 8 0 1 +7 +0.2289428485106664 0 0 +0 9 0 1 +8 +0.08094352034302833 0 0.08094352034302835 +0 10 0 1 +9 +0.1831542788085331 0 0.1831542788085331 +0 11 0 1 +10 +0.2289428485106664 0 1 +0 12 0 1 +11 +1 0 0.2289428485106664 +1 1 0 29 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +0.1144235381751203 0 0.003310722357926874 +0.1142642979650617 0 0.006883108425419668 +0.1139670830354398 0 0.01073363663618546 +0.1135004033570193 0 0.01487835370054105 +0.1128271652914333 0 0.01933229793232214 +0.111903870300848 0 0.02410872835168795 +0.110679759112017 0 0.02921810900709326 +0.1090959250715778 0 0.03466678675362284 +0.1070844362356546 0 0.04045528997716492 +0.1045675284755073 0 0.04657616299748676 +0.1014569628090837 0 0.05301124096454166 +0.09765368253921315 0 0.05972826179937821 +0.09304796248281967 0 0.06667670994312982 +0.08752031608525934 0 0.07378279774704115 +0.1144594521092167 0 0.00165553432534987 +0.1143578684882567 0 0.005097537235477503 +0.1141319300643747 0 0.008809626032083606 +0.1137526219975546 0 0.01280812085069298 +0.1131856947116999 0 0.01710863769194831 +0.1123908944774024 0 0.02172541851412493 +0.1113211321505056 0 0.02667044258676936 +0.1099216078027383 0 0.0319522629731523 +0.1081289223383099 0 0.03757450099469374 +0.1058702262798221 0 0.04353391963175109 +0.1030624825504462 0 0.04981798532240592 +0.0996119564378487 0 0.05640181828335519 +0.09541409532325117 0 0.06324442572029589 +0.09035402552081596 0 0.07028411657855722 +0.08430797727706929 0 0.07743301581685717 +1 2 0 19 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +0.07434324307036241 0 0.08704475389605905 +0.06728461496540039 0 0.0926093276079807 +0.05981115481637503 0 0.09760293402647331 +0.05196893902633148 0 0.1019947858839947 +0.04380631743741209 0 0.1057578059701371 +0.03537361537405134 0 0.1088687939972385 +0.02672282323422959 0 0.1113085697034896 +0.01790727598757458 0 0.1130620910727788 +0.008981324414803475 0 0.1141185470587517 +0.07770328811955765 0 0.08405894352449056 +0.07086856611499304 0 0.08989634757791522 +0.06359691581601047 0 0.09517951076642367 +0.05593316936603627 0 0.0998758606256526 +0.04792457634384673 0 0.1039564425772029 +0.03962051238365374 0 0.1073960984836098 +0.03107217481315366 0 0.1101736217223765 +0.02233226698026233 0 0.1122718879442524 +0.0134546732706872 0 0.1136779606529935 +0.004494127008582031 0 0.1143831709364416 +1 3 0 19 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +0 0 0.1240058573015336 +0 0 0.1339216676602923 +0 0 0.1442341104296807 +0 0 0.1549590508882251 +0 0 0.1661129889623617 +0 0 0.1777130845791713 +0 0 0.1897771840074287 +0 0 0.2023238474086638 +0 0 0.2153723773538611 +0 0 0.119238640778438 +0 0 0.128963762480919 +0 0 0.1390778890449875 +0 0 0.149596580658948 +0 0 0.1605360199252996 +0 0 0.171913036770748 +0 0 0.1837451342932976 +0 0 0.1960505157080136 +0 0 0.2088481123812614 +0 0 0.2221576129322908 +1 4 0 19 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +0 0 0.3060485636594935 +0 0 0.3831542788082164 +0 0 0.4602599939569155 +0 0 0.5373657091056276 +0 0 0.6144714242543247 +0 0 0.6915771394034511 +0 0 0.7686828545525903 +0 0 0.8457885697017126 +0 0 0.9228942848508347 +0 0 0.2674957060850544 +0 0 0.3446014212338878 +0 0 0.4217071363825706 +0 0 0.4988128515312713 +0 0 0.5759185666800118 +0 0 0.6530242818288925 +0 0 0.7301299969780469 +0 0 0.8072357121271263 +0 0 0.8843414272762943 +0 0 0.961447142425407 +1 5 0 19 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +0.02289428485102339 0 1 +0.04578856970203076 0 1 +0.0686828545530266 0 1 +0.09157713940402648 0 1 +0.1144714242550302 0 1 +0.1373657091061509 0 1 +0.1602599939572798 0 1 +0.1831542788084086 0 1 +0.2060485636595376 0 1 +0.01144714242550991 0 1 +0.03434142727652926 0 1 +0.05723571212753242 0 1 +0.08012999697852891 0 1 +0.1030242818295296 0 1 +0.1259185666805883 0 1 +0.1488128515317205 0 1 +0.1717071363828489 0 1 +0.1946014212339731 0 1 +0.2174957060850969 0 1 +1 6 0 37 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +0.2695248038521554 0 1 +0.3101067591936445 0 1 +0.3506887145350748 0 1 +0.3912706698765142 0 1 +0.4318526252179159 0 1 +0.4724345805593576 0 1 +0.5130165359007646 0 1 +0.5535984912422125 0 1 +0.5941804465836126 0 1 +0.6347624019251177 0 1 +0.6753443572667667 0 1 +0.7159263126084634 0 1 +0.7565082679500894 0 1 +0.7970902232917589 0 1 +0.8376721786333724 0 1 +0.878254133975051 0 1 +0.9188360893166645 0 1 +0.9594180446583374 0 1 +0.2492338261813987 0 1 +0.2898157815228807 0 1 +0.3303977368643629 0 1 +0.370979692205806 0 1 +0.4115616475472191 0 1 +0.452143602888634 0 1 +0.4927255582300829 0 1 +0.5333075135714996 0 1 +0.5738894689129423 0 1 +0.6144714242543104 0 1 +0.6550533795959562 0 1 +0.6956353349376376 0 1 +0.7362172902792777 0 1 +0.7767992456209186 0 1 +0.8173812009625548 0 1 +0.8579631563042126 0 1 +0.8985451116458819 0 1 +0.9391270669874955 0 1 +0.9797090223291632 0 1 +1 7 0 19 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +1 0 0.9228942848512012 +1 0 0.8457885697024586 +1 0 0.7686828545537637 +1 0 0.6915771394050256 +1 0 0.6144714242563307 +1 0 0.5373657091072326 +1 0 0.4602599939580563 +1 0 0.3831542788089408 +1 0 0.3060485636598252 +1 0 0.9614471424256051 +1 0 0.8843414272767801 +1 0 0.8072357121280925 +1 0 0.7301299969793958 +1 0 0.6530242818307028 +1 0 0.5759185666818245 +1 0 0.4988128515326569 +1 0 0.421707136383498 +1 0 0.3446014212344707 +1 0 0.26749570608527 +1 8 0 29 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +1 0 0.2041768404556829 +1 0 0.1812453513999235 +1 0 0.1600124911909048 +1 0 0.1403524354968672 +1 0 0.122148680248608 +1 0 0.1052933512837291 +1 0 0.08968656524331542 +1 0 0.0752358373836213 +1 0 0.06185553368483096 +1 0 0.04946636359018303 +1 0 0.03799490985680357 +1 0 0.0273731935177797 +1 0 0.01753827091918791 +1 0 0.008431861021949733 +1 0 0.216559844483166 +1 0 0.1927110959277934 +1 0 0.1706289212954093 +1 0 0.1501824633438882 +1 0 0.1312505578727438 +1 0 0.113721015766191 +1 0 0.09748995826352608 +1 0 0.08246120131347159 +1 0 0.0685456855342268 +1 0 0.05566094863750448 +1 0 0.04373063672348965 +1 0 0.03268405168729341 +1 0 0.02245573221848618 +1 0 0.01298506597056881 +1 0 0.00421593051097488 +1 9 0 37 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +0.9594180446585577 0 0 +0.9188360893170504 0 0 +0.8782541339755864 0 0 +0.8376721786341659 0 0 +0.7970902232927384 0 0 +0.7565082679513245 0 0 +0.7159263126098823 0 0 +0.6753443572684594 0 0 +0.634762401927041 0 0 +0.5941804465855474 0 0 +0.5535984912438745 0 0 +0.5130165359022187 0 0 +0.4724345805605562 0 0 +0.4318526252188902 0 0 +0.3912706698772801 0 0 +0.350688714535605 0 0 +0.3101067591939949 0 0 +0.2695248038523255 0 0 +0.9797090223292666 0 0 +0.9391270669877942 0 0 +0.8985451116463153 0 0 +0.8579631563048773 0 0 +0.8173812009634533 0 0 +0.7767992456220632 0 0 +0.7362172902805826 0 0 +0.6956353349391715 0 0 +0.6550533795977449 0 0 +0.6144714242563674 0 0 +0.5738894689147478 0 0 +0.5333075135730303 0 0 +0.492725558231389 0 0 +0.4521436028897767 0 0 +0.4115616475480972 0 0 +0.3709796922063827 0 0 +0.3303977368648076 0 0 +0.2898157815231627 0 0 +0.2492338261815059 0 0 +1 10 0 19 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +0.2153723773781112 0 0 +0.2023238474243991 0 0 +0.1897771840152548 0 0 +0.177713084579672 0 0 +0.1661129889560266 0 0 +0.1549590508755068 0 0 +0.1442341104111095 0 0 +0.1339216676363327 0 0 +0.1240058572726187 0 0 +0.2221576129443754 0 0 +0.2088481124012538 0 0 +0.1960505157198421 0 0 +0.1837451342974532 0 0 +0.1719130367678781 0 0 +0.1605360199157749 0 0 +0.1495965806433142 0 0 +0.1390778890237411 0 0 +0.1289637624544853 0 0 +0.1192386407639763 0 0 +1 11 0 37 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +0.9570081199373793 0 0.2265329237895064 +0.9140162398747802 0 0.2241229990683477 +0.8710243598122245 0 0.2217130743471913 +0.8280324797496024 0 0.2193031496260313 +0.7850405996869831 0 0.2168932249048714 +0.742048719624418 0 0.2144833001837145 +0.699056839561853 0 0.2120733754625577 +0.6560649594992047 0 0.2096634507413962 +0.6130730794365939 0 0.2072535260202368 +0.570081199373949 0 0.2048436012990754 +0.5270893193110835 0 0.2024336765779017 +0.4840974392482496 0 0.2000237518567298 +0.4411055591854048 0 0.1976138271355573 +0.3981136791226285 0 0.1952039024143886 +0.3551217990597967 0 0.1927939776932168 +0.3121299189970026 0 0.1903840529720471 +0.2691380389341429 0 0.1879741282508737 +0.2261461588713281 0 0.1855642035297029 +0.9785040599686866 0 0.2277378861500862 +0.9355121799060923 0 0.2253279614289277 +0.8925202998434864 0 0.2229180367077686 +0.8495284197809111 0 0.2205081119866112 +0.8065365397182687 0 0.21809818726545 +0.7635446596557522 0 0.2156882625442959 +0.7205527795931359 0 0.2132783378231362 +0.6775608995305151 0 0.2108684131019762 +0.6345690194678815 0 0.2084584883808155 +0.5915771394053406 0 0.20604856365966 +0.5485852593425236 0 0.203638638938489 +0.5055933792796854 0 0.2012287142173168 +0.462601499216833 0 0.1988187894961439 +0.4196096191540196 0 0.1964088647749731 +0.376617739091213 0 0.1939989400538027 +0.3336258590283853 0 0.1915890153326311 +0.2906339789655791 0 0.1891790906114608 +0.2476420989027356 0 0.1867691658902883 +0.2046502188399432 0 0.1843592411691187 +1 12 0 19 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +0.187733135778738 0 0.2648388509275292 +0.192311992748941 0 0.3465234230464911 +0.1968908497191418 0 0.4282079951654151 +0.2014697066893406 0 0.5098925672843025 +0.2060485636595369 0 0.5915771394031443 +0.2106274206297686 0 0.6732617115226187 +0.215206277599995 0 0.7549462836419989 +0.2197851345702199 0 0.8366308557613531 +0.2243639915404487 0 0.9183154278807755 +0.1854437072936349 0 0.2239965648680195 +0.190022564263841 0 0.3056811369870369 +0.1946014212340419 0 0.3873657091059616 +0.1991802782042401 0 0.4690502812248385 +0.2037591351744383 0 0.5507348533437149 +0.2083379921446503 0 0.6324194254628392 +0.212916849114879 0 0.7141039975822592 +0.2174957060851074 0 0.7957885697016758 +0.2220745630553304 0 0.8774731418209947 +0.2266534200255598 0 0.959157713940427 +1 13 0 19 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +0.1648388509277237 0 0.1877331357787355 +0.1465234230469079 0 0.1923119927489395 +0.1282079951660964 0 0.1968908497191423 +0.1098925672852944 0 0.2014697066893428 +0.09157713940449101 0 0.2060485636595437 +0.07326171152359436 0 0.2106274206297678 +0.05494628364270507 0 0.2152062775999901 +0.0366308557618038 0 0.2197851345702155 +0.01831542788090942 0 0.2243639915404391 +0.1739965648681293 0 0.1854437072936341 +0.1556811369873063 0 0.1900225642638398 +0.137365709106501 0 0.1946014212340411 +0.1190502812256857 0 0.199180278204245 +0.1007348533448953 0 0.2037591351744426 +0.08241942546403361 0 0.208337992144658 +0.06410399758315459 0 0.2129168491148778 +0.04578856970225112 0 0.2174957060851036 +0.02747314182136171 0 0.222074563055326 +0.009157713940463219 0 0.2266534200255506 +1 14 0 19 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +0.171037297158182 0 0.171037297158182 +0.1593863532470352 0 0.1593863532470352 +0.1481835225702688 0 0.1481835225702688 +0.1374115699931462 0 0.1374115699931463 +0.1270539232732193 0 0.1270539232732193 +0.1170946475980702 0 0.1170946475980702 +0.1075184209852189 0 0.1075184209852189 +0.09831051076219954 0 0.09831051076219956 +0.08945675092939973 0 0.08945675092939974 +0.1770957879833571 0 0.1770957879833571 +0.1652118252025942 0 0.1652118252025942 +0.1537849379086454 0 0.1537849379086455 +0.1427975462817117 0 0.1427975462817117 +0.1322327466331965 0 0.1322327466331965 +0.1220742854356444 0 0.1220742854356444 +0.1123065342916434 0 0.1123065342916434 +0.1029144658737102 0 0.1029144658737102 +0.09388363084580836 0 0.09388363084580838 +0.08520013563621376 0 0.08520013563621377 +1 15 0 29 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +0.1881074804246676 0 0.1633414723439953 +0.1926937782402013 0 0.1449962810818604 +0.196940350285711 0 0.1280099928998217 +0.2008723614276172 0 0.1122819483321969 +0.2045131124798395 0 0.09771894412330759 +0.2078841782749123 0 0.08423468094301632 +0.2110055354846798 0 0.07174925210394638 +0.2138956810588974 0 0.06018866980707598 +0.2165717417992956 0 0.04948442684548313 +0.219049575818339 0 0.03957309076930959 +0.2213438665654886 0 0.03039592778071132 +0.2234682098335546 0 0.0218985547084472 +0.2254351943537314 0 0.01403061662774022 +0.22725647633273 0 0.006745488711745545 +0.1856308796166004 0 0.1732478755762639 +0.1904006293324341 0 0.1541688767129293 +0.1948170642629567 0 0.1365031369908388 +0.1989063558566625 0 0.1201459706160157 +0.2026927369537281 0 0.1050004462277531 +0.2061986453773715 0 0.0909768125331796 +0.2094448568797954 0 0.07799196652348384 +0.2124506082717884 0 0.06596896095551215 +0.2152337114290974 0 0.05483654832627616 +0.2178106588088158 0 0.04452875880740237 +0.2201967211919144 0 0.03498450927500796 +0.2224060381995223 0 0.02614724124457649 +0.224451702093643 0 0.01796458566809372 +0.2263458353432309 0 0.01038805266974183 +0.2280996624216989 0 0.003372744355870178 +2 1 0 703 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +1082 +1083 +0.2651869393540685 0 0.9185564203529036 +0.2608490748559711 0 0.8371128407056228 +0.2565112103578775 0 0.755669261058409 +0.2521733458597823 0 0.6742256814111683 +0.2478354813616822 0 0.5927821017638407 +0.2434976168636156 0 0.5113385221170913 +0.2391597523655466 0 0.4298949424702945 +0.2348218878674757 0 0.3484513628234661 +0.2304840233694028 0 0.2670077831766018 +0.3060098871676904 0 0.9187974128250319 +0.3019130151417265 0 0.8375948256498926 +0.2978161431157658 0 0.7563922384748196 +0.2937192710898041 0 0.6751896512997184 +0.2896223990638374 0 0.5939870641245379 +0.2855255270379026 0 0.5127844769498806 +0.2814286550119655 0 0.4315818897751744 +0.2773317829860262 0 0.3503793026004417 +0.2732349109600855 0 0.2691767154256753 +0.3468328349812639 0 0.9190384052971603 +0.3429769554274436 0 0.8380768105941632 +0.3391210758736266 0 0.7571152158912305 +0.3352651963198083 0 0.6761536211882695 +0.3314093167659858 0 0.5951920264852358 +0.3275534372121929 0 0.5142304317826715 +0.3236975576583979 0 0.433268837080056 +0.3198416781046012 0 0.3523072423774196 +0.3159857985508026 0 0.2713456476747512 +0.3876557827948389 0 0.9192793977692885 +0.3840408957131551 0 0.8385587955384327 +0.3804260086314741 0 0.7578381933076407 +0.376811121549792 0 0.6771175910768193 +0.3731962344681058 0 0.5963969888459325 +0.3695813473864475 0 0.5156763866154601 +0.3659664603047872 0 0.4349557843849354 +0.3623515732231253 0 0.3542351821543944 +0.3587366861414618 0 0.2735145799238237 +0.4284787306083841 0 0.9195203902414166 +0.4251048359988437 0 0.8390407804827026 +0.4217309413893066 0 0.7585611707240515 +0.4183570467797681 0 0.6780815609653696 +0.4149831521702257 0 0.5976019512066297 +0.4116092575607097 0 0.5171223414482499 +0.4082353629511917 0 0.436642731689816 +0.404861468341672 0 0.356163121931371 +0.401487573732151 0 0.2756835121728981 +0.4693016784219593 0 0.919761382713545 +0.4661687762845535 0 0.8395227654269724 +0.4630358741471503 0 0.7592841481404613 +0.4599029720097462 0 0.6790455308539189 +0.4567700698723381 0 0.598806913567326 +0.4536371677349545 0 0.5185682962810381 +0.4505042655975692 0 0.4383296789946944 +0.4473713634601825 0 0.358091061708345 +0.4442384613227944 0 0.2778524444219697 +0.5101246262355104 0 0.9200023751856734 +0.5072327165702488 0 0.8400047503712427 +0.5043408069049902 0 0.7600071255568724 +0.5014488972397306 0 0.6800095007424698 +0.4985569875744674 0 0.6000118759280234 +0.4956650779092265 0 0.5200142511138286 +0.4927731682439843 0 0.4400166262995757 +0.4898812585787405 0 0.3600190014853222 +0.4869893489134958 0 0.2800213766710448 +0.5509475740490971 0 0.9202433676578017 +0.5482966568559753 0 0.8404867353155125 +0.5456457396628555 0 0.760730102973283 +0.5429948224697351 0 0.6809734706310204 +0.5403439052766117 0 0.6012168382887212 +0.5376929880835085 0 0.5214602059466185 +0.535042070890404 0 0.4417035736044565 +0.5323911536972983 0 0.3619469412622989 +0.5297402365041916 0 0.2821903089201193 +0.591770521862644 0 0.9204843601299302 +0.5893605971416696 0 0.8409687202597833 +0.5869506724206969 0 0.7614530803896944 +0.5845407476997238 0 0.6819374405195715 +0.5821308229787476 0 0.6024218006494197 +0.5797208982577903 0 0.5229061607794095 +0.5773109735368317 0 0.4433905209093384 +0.5749010488158718 0 0.3638748810392769 +0.572491124094911 0 0.2843592411691954 +0.6325934696762632 0 0.9207253526020576 +0.6304245374274036 0 0.8414507052040512 +0.6282556051785457 0 0.7621760578061019 +0.6260866729296871 0 0.6829014104081178 +0.6239177406808262 0 0.6036267630101118 +0.6217488084319815 0 0.5243521156121931 +0.6195798761831363 0 0.4450774682142118 +0.6174109439342897 0 0.3658028208162452 +0.6152420116854421 0 0.2865281734182604 +0.6734164174900086 0 0.9209663450741848 +0.6714884777132458 0 0.8419326901483186 +0.6695605379364848 0 0.762899035222509 +0.667632598159723 0 0.6838653802966632 +0.6657046583829591 0 0.6048317253708031 +0.6637767186062102 0 0.5257980704449756 +0.66184877882946 0 0.4467644155190837 +0.6599208390527092 0 0.3677307605932117 +0.6579928992759574 0 0.2886971056673237 +0.7142393653038008 0 0.921207337546312 +0.7125524179991338 0 0.8424146750925869 +0.7108654706944691 0 0.7636220126389167 +0.7091785233898028 0 0.6848293501852097 +0.7074915760851352 0 0.6060366877314952 +0.7058046287804803 0 0.5272440252777594 +0.7041176814758248 0 0.4484513628239572 +0.7024307341711683 0 0.3696587003701799 +0.7007437868665111 0 0.2908660379163889 +0.7550623131175208 0 0.9214483300184391 +0.7536163582849488 0 0.842896660036854 +0.7521704034523781 0 0.7643449900553229 +0.7507244486198069 0 0.6857933200737543 +0.7492784937872338 0 0.6072416500921854 +0.7478325389546721 0 0.5286899801105405 +0.7463865841221097 0 0.4501383101288275 +0.7449406292895463 0 0.3715866401471447 +0.7434946744569825 0 0.2930349701654497 +0.7958852609312801 0 0.9216893224905657 +0.7946802985707986 0 0.843378644981121 +0.7934753362103181 0 0.7650679674717293 +0.7922703738498371 0 0.6867572899622989 +0.7910654114893545 0 0.6084466124528756 +0.7898604491288812 0 0.5301359349433213 +0.7886554867684075 0 0.4518252574336978 +0.7874505244079332 0 0.3735145799241092 +0.7862455620474584 0 0.2952039024145109 +0.8367082087449943 0 0.921930314962693 +0.8357442388566142 0 0.8438606299253888 +0.8347802689682347 0 0.7657909448881363 +0.833816299079855 0 0.6877212598508444 +0.8328523291914741 0 0.609651574813567 +0.8318883593031007 0 0.5315818897761041 +0.8309243894147269 0 0.45351220473857 +0.8299604195263526 0 0.3754425197010762 +0.8289964496379777 0 0.2973728346635744 +0.8775311565587678 0 0.9221713074348202 +0.8768081791424827 0 0.8443426148696566 +0.8760852017261982 0 0.7665139223045436 +0.8753622243099134 0 0.6886852297393903 +0.8746392468936279 0 0.6108565371742585 +0.873916269477348 0 0.5330278446088872 +0.8731932920610675 0 0.4551991520434423 +0.8724703146447869 0 0.3773704594780434 +0.8717473372285059 0 0.2995417669126383 +0.9183541043724757 0 0.922412299906947 +0.9178721194282857 0 0.8448245998139234 +0.9173901344840958 0 0.7672368997209497 +0.9169081495399063 0 0.6896491996279345 +0.9164261645957157 0 0.6120614995349486 +0.9159441796515291 0 0.5344737994416676 +0.9154621947073419 0 0.4568860993483123 +0.914980209763155 0 0.3792983992550076 +0.9144982248189679 0 0.3017106991616989 +0.9591770521862414 0 0.9226532923790742 +0.9589360597141449 0 0.8453065847581909 +0.9586950672420482 0 0.7679598771373566 +0.9584540747699519 0 0.6906131695164801 +0.958213082297855 0 0.6132664618956392 +0.9579720898257603 0 0.5359197542744498 +0.9577310973536652 0 0.458573046653184 +0.95749010488157 0 0.3812263390319737 +0.9572491124094746 0 0.3038796314107615 +0.267355871603112 0 0.9592782101764519 +0.2447754654472586 0 0.9184359241168396 +0.2470046458143297 0 0.9592179620584395 +0.2630180071050198 0 0.8778346305292632 +0.2403171047130955 0 0.8368718482334879 +0.2425462850801752 0 0.8776538861751291 +0.2586801426069243 0 0.7963910508820159 +0.2358587439789362 0 0.755307772350204 +0.2380879243460159 0 0.7960898102918459 +0.2543422781088299 0 0.7149474712347887 +0.2314003832447754 0 0.6737436964668935 +0.2336295636118544 0 0.714525734408524 +0.2500044136107322 0 0.6335038915875045 +0.2269420225106095 0 0.5921796205834925 +0.2291712028776913 0 0.6329616585251719 +0.2456665491126489 0 0.552060311940466 +0.2224836617764781 0 0.5106155447006969 +0.2247128421435436 0 0.5513975826420905 +0.2413286846145811 0 0.4706167322936929 +0.2180253010423442 0 0.4290514688178548 +0.2202544814094106 0 0.4698335067592657 +0.2369908201165112 0 0.3891731526468803 +0.2135669403082083 0 0.3474873929349786 +0.2157961206752765 0 0.388269430876421 +0.2326529556184392 0 0.307729573000034 +0.2091085795740704 0 0.2659233170520655 +0.2113377599411401 0 0.3067053549935355 +0.2283150911203654 0 0.2262859933531524 +0.2068793992070064 0 0.2251412791105862 +0.3080583231806674 0 0.959398706412516 +0.2855984132608794 0 0.9186769165889678 +0.2877070973918801 0 0.9593384582944839 +0.3039614511547084 0 0.8781961192374623 +0.2813810449988488 0 0.8373538331777577 +0.2834897291298641 0 0.8780153748833628 +0.2998645791287461 0 0.7969935320623561 +0.2771636767368216 0 0.7560307497666143 +0.2792723608678352 0 0.7966922914721861 +0.2957677071027849 0 0.715790944887269 +0.2729463084747932 0 0.6747076663554434 +0.2750549926058075 0 0.715369208061029 +0.2916708350768207 0 0.6345883577121282 +0.2687289402127598 0 0.5933845829441893 +0.2708376243437765 0 0.6340461246498164 +0.28757396305087 0 0.5533857705372093 +0.2645115719507591 0 0.512061499533486 +0.2666202560817595 0 0.5527230412388376 +0.283477091024934 0 0.4721831833625275 +0.2602942036887561 0 0.4307384161227344 +0.2624028878197576 0 0.4713999578281102 +0.2793802189989958 0 0.390980596187808 +0.256076835426751 0 0.3494153327119539 +0.2581855195577535 0 0.3900768744173442 +0.2752833469730558 0 0.3097780090130585 +0.2518594671647441 0 0.2680922493011386 +0.2539681512957475 0 0.3087537910065463 +0.2711864749471142 0 0.2285754218382745 +0.2497507830337398 0 0.2274307075957134 +0.3487607747581694 0 0.9595192026485801 +0.3264213610744772 0 0.9189179090610962 +0.32840954896942 0 0.9594589545305481 +0.3449048952043537 0 0.8785576079456617 +0.322444985284585 0 0.8378358181220279 +0.3244331731795311 0 0.878376863591562 +0.3410490156505351 0 0.7975960132426969 +0.3184686094946962 0 0.7567537271830251 +0.3204567973896406 0 0.7972947726525265 +0.3371931360967174 0 0.71663441853975 +0.3144922337048062 0 0.675671636243994 +0.3164804215997511 0 0.7162126817135095 +0.3333372565428971 0 0.6356728238367526 +0.3105158579149117 0 0.5945895453048868 +0.3125040458098589 0 0.6351305907744403 +0.3294813769890894 0 0.5547112291339537 +0.3065394821250478 0 0.5135074543662761 +0.3085276700199797 0 0.5540484998355815 +0.3256254974352955 0 0.4737496344313638 +0.3025631063351817 0 0.4324253634276152 +0.3045512942301147 0 0.4729664088969456 +0.3217696178814996 0 0.3927880397287378 +0.2985867305453137 0 0.3513432724889306 +0.3005749184402478 0 0.3918843179582728 +0.3179137383277019 0 0.3118264450260854 +0.294610354755444 0 0.2702611815502133 +0.2965985426503788 0 0.3108022270195719 +0.3140578587739026 0 0.2308648503233991 +0.2926221668605116 0 0.229720136080837 +0.3894632263356765 0 0.9596396988846443 +0.3672443088880514 0 0.9191589015332244 +0.3691120005469286 0 0.9595794507666122 +0.385848339253997 0 0.8789190966538606 +0.3635089255702993 0 0.8383178030662979 +0.3653766172291754 0 0.8787383522997612 +0.3822334521723146 0 0.7981984944230367 +0.3597735422525503 0 0.7574767045994356 +0.3616412339114249 0 0.7978972538328668 +0.3786185650906331 0 0.71747789219223 +0.3560381589348002 0 0.6766356061325445 +0.3579058505936752 0 0.71705615536599 +0.3750036780089488 0 0.6367572899613759 +0.3523027756170458 0 0.5957945076655842 +0.3541704672759231 0 0.6362150568990643 +0.3713887909272767 0 0.5560366877306964 +0.3485673922993202 0 0.5149534091990657 +0.350435083958183 0 0.555373958432325 +0.3677739038456174 0 0.4753160855001978 +0.3448320089815926 0 0.4341123107324957 +0.3466997006404564 0 0.4745328599657807 +0.3641590167639562 0 0.3945954832696649 +0.3410966256638633 0 0.353271212265907 +0.3429643173227279 0 0.3936917614992013 +0.3605441296822935 0 0.313874881039109 +0.3373612423461322 0 0.2724301137992874 +0.3392289340049978 0 0.3128506630325972 +0.3569292426006292 0 0.2331542788085202 +0.3354935506872587 0 0.2320095645659593 +0.43016567791315 0 0.9597601951207083 +0.4080672567016115 0 0.9193998940053525 +0.4098144521244153 0 0.9596999470026764 +0.4267917833036139 0 0.8792805853620596 +0.4045728658559994 0 0.8387997880105676 +0.4063200612788055 0 0.87909984100796 +0.4234178886940752 0 0.798800975603377 +0.4010784750103903 0 0.7581996820158461 +0.4028256704331949 0 0.7984997350132069 +0.4200439940845374 0 0.7183213658447105 +0.3975840841647801 0 0.6775995760210944 +0.3993312795875852 0 0.7178996290184703 +0.4166700994749969 0 0.6378417560859997 +0.3940896933191658 0 0.5969994700262811 +0.3958368887419729 0 0.6372995230236878 +0.4132962048654677 0 0.5573621463274399 +0.3905953024735786 0 0.5163993640318549 +0.3923424978963722 0 0.5566994170290681 +0.4099223102559507 0 0.476882536569033 +0.3871009116279894 0 0.4357992580373757 +0.388848107050784 0 0.4760993110346153 +0.4065484156464318 0 0.3964029268105935 +0.3836065207823987 0 0.3551991520428827 +0.385353716205194 0 0.3954992050401292 +0.4031745210369115 0 0.3159233170521346 +0.3801121299368064 0 0.2745990460483609 +0.3818593253596025 0 0.3148990990456218 +0.3998006264273898 0 0.2354437072936433 +0.3783649345140097 0 0.2342989930510818 +0.4708681294906585 0 0.9598806913567726 +0.4488902045151717 0 0.9196408864774808 +0.4505169037019028 0 0.9598204432387403 +0.4677352273532564 0 0.8796420740702586 +0.4456368061416986 0 0.8392817729548374 +0.4472635053284352 0 0.879461329716159 +0.4646023252158519 0 0.7994034567837168 +0.4423834077682284 0 0.7589226594322565 +0.4440101069549635 0 0.7991022161935469 +0.4614694230784482 0 0.7191648394971901 +0.4391300093947572 0 0.6785635459096443 +0.4407567085814928 0 0.7187431026709503 +0.4583365209410422 0 0.6389262222106225 +0.4358766110212819 0 0.5982044323869778 +0.4375033102080195 0 0.6383839891483111 +0.4552036188036463 0 0.558687604924182 +0.4326232126478321 0 0.5178453188646439 +0.4342499118345571 0 0.5580248756258108 +0.4520707166662619 0 0.4784489876378663 +0.4293698142743805 0 0.4374862053422552 +0.4309965134611063 0 0.4776657621034496 +0.4489378145288758 0 0.3982103703515197 +0.4261164159009272 0 0.357127091819858 +0.4277431150876538 0 0.3973066485810566 +0.4458049123914885 0 0.3179717530651573 +0.4228630175274727 0 0.2767679782974339 +0.4244897167142 0 0.316947535058646 +0.4426720102540996 0 0.2377331357787635 +0.4212363183407462 0 0.2365884215362035 +0.5115705810681375 0 0.9600011875928367 +0.4897131523287348 0 0.9198818789496093 +0.4912193552794089 0 0.9599409394748046 +0.5086786714028796 0 0.880003562778458 +0.4867007464274011 0 0.8397637578991075 +0.488206949378068 0 0.8798228184243584 +0.5057867617376195 0 0.8000059379640576 +0.4836883405260702 0 0.7596456368486668 +0.4851945434767357 0 0.7997046973738873 +0.5028948520723604 0 0.7200083131496711 +0.4806759346247384 0 0.6795275157981944 +0.4821821375754043 0 0.7195865763234306 +0.500002942407099 0 0.6400106883352465 +0.4776635287234028 0 0.5994093947476746 +0.4791697316740705 0 0.6394684552729345 +0.497111032741847 0 0.5600130635209259 +0.4746511228220905 0 0.5192912736974333 +0.4761573257727467 0 0.559350334222554 +0.4942191230766054 0 0.4800154387067022 +0.4716387169207767 0 0.439173152647135 +0.4731449198714336 0 0.4792322131722841 +0.4913272134113624 0 0.4000178138924489 +0.4686263110194615 0 0.3590550315968336 +0.4701325139701191 0 0.3991140921219843 +0.4884353037461182 0 0.3200201890781835 +0.465613905118145 0 0.2789369105465073 +0.4671201080688033 0 0.3189959710716704 +0.4855433940808727 0 0.2400225642638873 +0.4641077021674891 0 0.2388778500213256 +0.5522730326456549 0 0.9601216838289008 +0.5305361001423037 0 0.9201228714217375 +0.5319218068569016 0 0.9600614357108688 +0.5496221154525363 0 0.8803650514866571 +0.5277646867131121 0 0.8402457428433776 +0.529150393427708 0 0.8801843071325575 +0.5469711982594154 0 0.8006084191443978 +0.5249932732839229 0 0.7603686142650777 +0.5263789799985175 0 0.8003071785542277 +0.5443202810662953 0 0.7208517868021518 +0.5222218598547328 0 0.6804914856867451 +0.5236075665693278 0 0.7204300499759114 +0.5416693638731733 0 0.6410951544598709 +0.5194504464255395 0 0.6006143571083723 +0.5208361531401361 0 0.6405529213975587 +0.53901844668006 0 0.5613385221176699 +0.5166790329963675 0 0.5207372285302235 +0.5180647397109536 0 0.5606757928192979 +0.5363675294869563 0 0.4815818897755375 +0.5139076195671941 0 0.4408600999520161 +0.5152933262817809 0 0.4807986642411198 +0.5337166122938511 0 0.4018252574333777 +0.5111362061380194 0 0.3609829713738105 +0.5125219128526068 0 0.4009215356629133 +0.5310656951007449 0 0.3220686250912091 +0.5083647927088437 0 0.281105842795582 +0.5097504994234315 0 0.3210444070846963 +0.5284147779076376 0 0.2423119927490105 +0.5069790859942646 0 0.2411672785064494 +0.5929754842231283 0 0.9602421800649651 +0.5713590479558706 0 0.9203638638938659 +0.5726242584344065 0 0.9601819319469329 +0.5905655595021568 0 0.8807265401948567 +0.5688286269988224 0 0.8407277277876479 +0.5700938374773465 0 0.8805457958407569 +0.5881556347811832 0 0.8012109003247389 +0.5662982060417762 0 0.7610915916814887 +0.5675634165202993 0 0.8009096597345684 +0.5857457100602104 0 0.7216952604546329 +0.5637677850847294 0 0.681455455575296 +0.5650329955632527 0 0.7212735236283925 +0.5833357853392357 0 0.6421796205844956 +0.5612373641276797 0 0.6018193194690704 +0.5625025746062046 0 0.6416373875221832 +0.580925860618269 0 0.5626639807144147 +0.5587069431706494 0 0.5221831833630139 +0.5599721536491645 0 0.5620012514160423 +0.578515935897311 0 0.483148340844374 +0.5561765222136179 0 0.4425470472568974 +0.5574417326921337 0 0.4823651153099557 +0.5761060111763517 0 0.4036327009743076 +0.553646101256585 0 0.3629109111507879 +0.5549113117351014 0 0.4027289792038427 +0.5736960864553914 0 0.3241170611042362 +0.5511156802995513 0 0.2832747750446574 +0.5523808907780681 0 0.3230928430977227 +0.57128616173443 0 0.2446014212341354 +0.5498504698210374 0 0.2434567069915732 +0.6336779358006904 0 0.9603626763010288 +0.6121819957694536 0 0.9206048563659939 +0.613326710011882 0 0.9603024281829968 +0.6315090035518334 0 0.8810880289030544 +0.6098925672845366 0 0.8412097127319172 +0.6110372815269951 0 0.8809072845489555 +0.6293400713029746 0 0.8018133815050765 +0.6076031387996212 0 0.7618145690978981 +0.6087478530420789 0 0.8015121409149076 +0.6271711390541164 0 0.7225387341071099 +0.6053137103147055 0 0.6824194254638447 +0.6064584245571634 0 0.7221169972808714 +0.6250022068052566 0 0.6432640867091148 +0.6030242818297868 0 0.6030242818297658 +0.6041689960722462 0 0.6427218536468052 +0.6228332745564038 0 0.5639894393111524 +0.600734853344886 0 0.5236291381958014 +0.6018795675873364 0 0.5633267100127836 +0.6206643423075588 0 0.4847147919132024 +0.598445424859984 0 0.4442339945617751 +0.599590139102435 0 0.4839315663787882 +0.618495410058713 0 0.4054401445152285 +0.5961559963750808 0 0.364838850927761 +0.5973007106175323 0 0.4045364227447681 +0.6163264778098659 0 0.3261654971172528 +0.5938665678901766 0 0.2854437072937279 +0.5950112821326287 0 0.3251412791107444 +0.614157545561018 0 0.2468908497192486 +0.5927218536477585 0 0.2457461354766939 +0.6743803873783876 0 0.9604831725370924 +0.6530049435831359 0 0.9208458488381213 +0.6540291615895459 0 0.9604229244190607 +0.6724524476016271 0 0.8814495176112518 +0.6509565075703247 0 0.8416916976761849 +0.6519807255767303 0 0.8812687732571531 +0.6705245078248654 0 0.8024158626854139 +0.6489080715575153 0 0.7625375465143054 +0.64993228956392 0 0.8021146220952451 +0.6685965680481039 0 0.7233822077595862 +0.646859635544705 0 0.6833833953523905 +0.6478838535511102 0 0.7229604709333479 +0.666668628271341 0 0.6443485528337332 +0.6448111995318926 0 0.6042292441904574 +0.6458354175382988 0 0.6438063197714241 +0.6647406884945847 0 0.5653148979078894 +0.6427627635190959 0 0.5250750930285843 +0.6437869815254943 0 0.5646521686095208 +0.6628127487178351 0 0.4862812429820297 +0.6407143275062981 0 0.4459209418666478 +0.6417385455126969 0 0.4854980174476161 +0.6608848089410846 0 0.4072475880561477 +0.6386658914934995 0 0.3667667907047285 +0.6396901094998988 0 0.4063438662856881 +0.6589568691643333 0 0.3282139331302677 +0.6366174554806998 0 0.287612639542792 +0.6376416734870995 0 0.3271897151237602 +0.6570289293875811 0 0.2491802782043599 +0.6355932374742905 0 0.2480355639618038 +0.7150828389561321 0 0.9606036687731561 +0.6938278913969047 0 0.9210868413102484 +0.6947316131672712 0 0.9605434206551242 +0.7133958916514673 0 0.8818110063194495 +0.6920204478561898 0 0.8421736826204528 +0.6929241696265471 0 0.8816302619653507 +0.7117089443468014 0 0.8030183438657519 +0.6902130043154771 0 0.7632605239307129 +0.6911167260858334 0 0.8027171032755829 +0.710021997042136 0 0.7242256814120632 +0.6884055607747629 0 0.6843473652409364 +0.6893092825451199 0 0.7238039445858246 +0.708335049737469 0 0.6454330189583525 +0.6865981172340472 0 0.6054342065511491 +0.687501839004405 0 0.6448907858960427 +0.7066481024328077 0 0.5666403565046273 +0.6847906736933453 0 0.5265210478613676 +0.6856943954636963 0 0.5659776272062583 +0.7049611551281525 0 0.4878476940508583 +0.6829832301526424 0 0.4476078891715205 +0.6838869519229938 0 0.487064468516444 +0.7032742078234966 0 0.4090550315970686 +0.6811757866119388 0 0.3686947304816959 +0.6820795083822906 0 0.4081513098266082 +0.7015872605188397 0 0.3302623691432844 +0.6793683430712343 0 0.2897815717918563 +0.6802720648415865 0 0.329238151136776 +0.6999003132141821 0 0.2514697066894733 +0.6784646213008747 0 0.2503249924469162 +0.7557852905338052 0 0.9607241650092195 +0.7346508392106608 0 0.9213278337823756 +0.7354340647449693 0 0.9606639168911878 +0.7543393357012348 0 0.8821724950276466 +0.7330843881420412 0 0.8426556675647205 +0.7338676136763509 0 0.8819917506735481 +0.7528933808686634 0 0.8036208250460884 +0.7315179370734236 0 0.7639835013471198 +0.7323011626077324 0 0.8033195844559201 +0.7514474260360925 0 0.7250691550645385 +0.7299514860048049 0 0.6853113351294819 +0.7307347115391143 0 0.7246474182383008 +0.7500014712035203 0 0.6465174850829698 +0.7283850349361845 0 0.6066391689118403 +0.7291682604704947 0 0.6459752520206611 +0.748555516370953 0 0.5679658151013629 +0.7268185838675763 0 0.5279670026941499 +0.7276018094018805 0 0.567303085802995 +0.7471095615383909 0 0.489414145119684 +0.7252521327989672 0 0.4492948364763923 +0.7260353583332717 0 0.4886309195852711 +0.745663606705828 0 0.4108624751379861 +0.7236856817303573 0 0.3706226702586623 +0.7244689072646622 0 0.4099587533675274 +0.7442176518732644 0 0.3323108051562972 +0.7221192306617468 0 0.2919505040409193 +0.722902456196052 0 0.3312865871497909 +0.7427716970407002 0 0.2537591351745822 +0.7213360051274413 0 0.2526144209320277 +0.7964877421115195 0 0.9608446612452828 +0.7754737870244004 0 0.9215688262545023 +0.7761365163226595 0 0.9607844131272512 +0.7952827797510393 0 0.8825339837358434 +0.7741483284278736 0 0.8431376525089875 +0.7748110577261371 0 0.882353239381745 +0.7940778173905583 0 0.8042233062264252 +0.7728228698313481 0 0.764706478763526 +0.7734855991296108 0 0.8039220656362569 +0.7928728550300777 0 0.7259126287170141 +0.7714974112348221 0 0.6862753050180266 +0.772160140533085 0 0.7254908918907763 +0.7916678926695958 0 0.6476019512075872 +0.7701719526382942 0 0.6078441312725305 +0.7708346819365581 0 0.6470597181452785 +0.7904629303091179 0 0.5692912736980984 +0.7688464940417766 0 0.5294129575269308 +0.7695092233400355 0 0.5686285443997305 +0.7892579679486443 0 0.4909805961885095 +0.7675210354452586 0 0.4509817837812626 +0.7681837647435177 0 0.4901973706540967 +0.7880530055881703 0 0.4126699186789035 +0.7661955768487397 0 0.372550610035627 +0.7668583061469991 0 0.4117661969084448 +0.7868480432276959 0 0.33435924116931 +0.7648701182522204 0 0.2941194362899803 +0.7655328475504801 0 0.3333350231628036 +0.7856430808672208 0 0.2560485636596911 +0.7642073889539864 0 0.2549038494171381 +0.8371901936891833 0 0.9609651574813465 +0.8162967348381371 0 0.9218098187266293 +0.816838967900346 0 0.9609049093633146 +0.8362262238008042 0 0.8828954724440409 +0.8152122687137064 0 0.843619637453255 +0.8157545017759218 0 0.8827147280899422 +0.8352622539124244 0 0.8048257874067626 +0.8141278025892764 0 0.7654294561799329 +0.8146700356514913 0 0.804524546816594 +0.8342982840240448 0 0.7267561023694904 +0.8130433364648461 0 0.6872392749065717 +0.8135855695270613 0 0.7263343655432524 +0.8333343141356646 0 0.6486864173322058 +0.8119588703404144 0 0.6090490936332214 +0.8125011034026303 0 0.6481441842698965 +0.8323703442472874 0 0.5706167322948356 +0.810874404215991 0 0.5308589123597127 +0.8114166372782026 0 0.5699540029964669 +0.8314063743589137 0 0.4925470472573371 +0.8097899380915672 0 0.4526687310861339 +0.8103321711537792 0 0.4917638217229233 +0.8304424044705397 0 0.4144773622198231 +0.8087054719671429 0 0.3744785498125928 +0.8092477050293549 0 0.4135736404493633 +0.8294784345821651 0 0.3364076771823253 +0.807621005842718 0 0.2962883685390426 +0.8081632389049305 0 0.3353834591758177 +0.8285144646937901 0 0.2583379921448029 +0.8070787727804934 0 0.2571932779022463 +0.8778926452669094 0 0.9610856537174102 +0.857119682651881 0 0.9220508111987566 +0.8575414194780467 0 0.9610254055993783 +0.8771696678506252 0 0.8832569611522384 +0.8562762089995484 0 0.8441016223975226 +0.8566979458257147 0 0.8830762167981396 +0.8764466904343404 0 0.8054282685871001 +0.8554327353472164 0 0.7661524335963399 +0.8558544721733824 0 0.8051270279969314 +0.8757237130180557 0 0.7275995760219669 +0.8545892616948843 0 0.6882032447951174 +0.8550109985210503 0 0.7271778391957286 +0.8750007356017706 0 0.6497708834568243 +0.853745788042551 0 0.6102540559939127 +0.8541675248687176 0 0.649228650394515 +0.8742777581854879 0 0.5719421908915728 +0.8529023143902243 0 0.5323048671924957 +0.8533240512163877 0 0.5712794615932042 +0.8735547807692078 0 0.4941134983261647 +0.8520588407378973 0 0.4543556783910062 +0.8524805775640609 0 0.4933302727917509 +0.8728318033529272 0 0.4162848057607428 +0.8512153670855698 0 0.3764064895895598 +0.8516371039117334 0 0.415381083990283 +0.8721088259366464 0 0.3384561131953409 +0.8503718934332418 0 0.2984573007881063 +0.8507936302594057 0 0.3374318951888331 +0.8713858485203652 0 0.2606274206299148 +0.8499501566070766 0 0.2594827063873588 +0.9185950968445701 0 0.9612061499534734 +0.8979426304656217 0 0.9222918036708836 +0.8982438710557517 0 0.9611459018354418 +0.9181131119003807 0 0.8836184498604351 +0.8973401492853842 0 0.8445836073417901 +0.897641389875503 0 0.8834377055063367 +0.9176311269561908 0 0.8060307497674366 +0.896737668105147 0 0.7668754110127467 +0.8970389086952656 0 0.8057295091772684 +0.917149142012001 0 0.7284430496744421 +0.8961351869249099 0 0.6891672146836624 +0.8964364275150285 0 0.7280213128482045 +0.916667157067811 0 0.6508553495814415 +0.8955327057446718 0 0.6114590183546036 +0.8958339463347909 0 0.6503131165191329 +0.9161851721236224 0 0.5732676494883081 +0.8949302245644386 0 0.5337508220252773 +0.8952314651545552 0 0.5726049201899404 +0.9157031871794354 0 0.4956799493949899 +0.8943277433842047 0 0.4560426256958773 +0.8946289839743216 0 0.4948967238605774 +0.9152212022352484 0 0.4180922493016599 +0.8937252622039709 0 0.3783344293665255 +0.8940265027940878 0 0.4171885275312014 +0.9147392172910614 0 0.3405045492083533 +0.893122781023737 0 0.3006262330371686 +0.8934240216138539 0 0.3394803312018471 +0.9142572323468741 0 0.2629168491150233 +0.8928215404336115 0 0.2617721348724686 +0.9592975484222894 0 0.9613266461895371 +0.9387655782793585 0 0.9225327961430105 +0.9389463226334269 0 0.9612663980715053 +0.9590565559501931 0 0.8839799385686326 +0.9384040895712153 0 0.8450655922860572 +0.9385848339252869 0 0.8837991942145338 +0.9588155634780966 0 0.8066332309477737 +0.938042600863072 0 0.7675983884291531 +0.9382233452171436 0 0.8063319903576052 +0.9585745710060001 0 0.7292865233269183 +0.9376811121549291 0 0.6901311845722073 +0.9378618565090007 0 0.7288647865006802 +0.9583335785339034 0 0.6519398157060596 +0.9373196234467853 0 0.6126639807152938 +0.9375003678008572 0 0.6513975826437506 +0.9580925860618077 0 0.5745931080850445 +0.9369581347386446 0 0.5351967768580588 +0.9371388790927149 0 0.5739303787866763 +0.9578515935897127 0 0.4972464004638169 +0.9365966460305035 0 0.4577295730007481 +0.9367773903845741 0 0.4964631749294035 +0.9576106011176176 0 0.4198996928425788 +0.9362351573223625 0 0.3802623691434907 +0.936415901676433 0 0.4189959710721194 +0.9573696086455223 0 0.3425529852213676 +0.9358736686142213 0 0.3027951652862302 +0.9360544129682918 0 0.3415287672148604 +0.9571286161734269 0 0.265206277600134 +0.9356929242601568 0 0.264061563357579 +0.9795885260931207 0 0.9227737886151377 +0.9796487742111419 0 0.9613868943075712 +0.9794680298570724 0 0.8455475772303247 +0.9795282779750966 0 0.8841606829227062 +0.9793475336210241 0 0.7683213658455601 +0.9794077817390483 0 0.806934471537933 +0.979227037384976 0 0.6910951544607529 +0.9792872855030001 0 0.7297082601531573 +0.9791065411489275 0 0.6138689430759849 +0.9791667892669518 0 0.6524820487683812 +0.9789860449128802 0 0.5366427316908412 +0.9790462930309038 0 0.5752558373834344 +0.9788655486768326 0 0.4594165203056201 +0.9789257967948564 0 0.4980296259982369 +0.978745052440785 0 0.3821903089204572 +0.9788053005588088 0 0.4208034146130384 +0.9786245562047373 0 0.3049640975352934 +0.9786848043227612 0 0.3435772032279192 +0.9785643080867119 0 0.2663509918427019 +2 2 0 361 +1084 +1085 +1086 +1087 +1088 +1089 +1090 +1091 +1092 +1093 +1094 +1095 +1096 +1097 +1098 +1099 +1100 +1101 +1102 +1103 +1104 +1105 +1106 +1107 +1108 +1109 +1110 +1111 +1112 +1113 +1114 +1115 +1116 +1117 +1118 +1119 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1154 +1155 +1156 +1157 +1158 +1159 +1160 +1161 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1217 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1231 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1328 +1329 +1330 +1331 +1332 +1333 +1334 +1335 +1336 +1337 +1338 +1339 +1340 +1341 +1342 +1343 +1344 +1345 +1346 +1347 +1348 +1349 +1350 +1351 +1352 +1353 +1354 +1355 +1356 +1357 +1358 +1359 +1360 +1361 +1362 +1363 +1364 +1365 +1366 +1367 +1368 +1369 +1370 +1371 +1372 +1373 +1374 +1375 +1376 +1377 +1378 +1379 +1380 +1381 +1382 +1383 +1384 +1385 +1386 +1387 +1388 +1389 +1390 +1391 +1392 +1393 +1394 +1395 +1396 +1397 +1398 +1399 +1400 +1401 +1402 +1403 +1404 +1405 +1406 +1407 +1408 +1409 +1410 +1411 +1412 +1413 +1414 +1415 +1416 +1417 +1418 +1419 +1420 +1421 +1422 +1423 +1424 +1425 +1426 +1427 +1428 +1429 +1430 +1431 +1432 +1433 +1434 +1435 +1436 +1437 +1438 +1439 +1440 +1441 +1442 +1443 +1444 +0.1689598222008974 0 0.2689598222007157 +0.1501865086230512 0 0.2730807934739037 +0.1314131950452088 0 0.2772017647470908 +0.1126398814673749 0 0.2813227360202757 +0.09386656788954072 0 0.2854437072934609 +0.07509325431163416 0 0.2895646785666671 +0.05631994073373469 0 0.2936856498398715 +0.0375466271558248 0 0.2978066211130788 +0.01877331357791998 0 0.3019275923862844 +0.1730807934740696 0 0.3501865086226549 +0.153849594199193 0 0.3538495941988198 +0.1346183949243199 0 0.3575126797749841 +0.1153871956494544 0 0.3611757653511463 +0.09615599637458944 0 0.3648388509273088 +0.07692479709967324 0 0.3685019365034901 +0.05769359782476373 0 0.3721650220796698 +0.03846239854984544 0 0.3758281076558518 +0.01923119927493033 0 0.3794911932320327 +0.1772017647472397 0 0.4314131950445574 +0.1575126797753331 0 0.4346183949237009 +0.1378235948034296 0 0.4378235948028437 +0.1181345098315326 0 0.4410287946819847 +0.09844542485963712 0 0.444233994561126 +0.07875633988771148 0 0.4474391944402837 +0.05906725491579214 0 0.4506443943194401 +0.03937816994386563 0 0.4538495941985984 +0.01968908497194049 0 0.4570547940777557 +0.181322736020408 0 0.5126398814664286 +0.1611757653514715 0 0.5153871956485554 +0.1410287946825377 0 0.5181345098306815 +0.1208818240136095 0 0.5208818240128065 +0.1007348533446837 0 0.5236291381949315 +0.08058788267574887 0 0.5263764523770705 +0.06044091200681993 0 0.5291237665592083 +0.04029394133788543 0 0.5318710807413481 +0.02014697066895043 0 0.5346183949234866 +0.185443707293574 0 0.5938665678882568 +0.1648388509276079 0 0.5961559963733701 +0.1442339945616441 0 0.598445424858483 +0.1236291381956849 0 0.6007348533435946 +0.1030242818297292 0 0.6030242818287063 +0.08241942546378524 0 0.6053137103138297 +0.06181456909784696 0 0.6076031387989524 +0.0412097127319047 0 0.6098925672840764 +0.02060485636596012 0 0.6121819957691996 +0.1895646785667719 0 0.6750932543106976 +0.1685019365037727 0 0.6769247970987771 +0.1474391944407753 0 0.6787563398868561 +0.1263764523777816 0 0.6805878826749342 +0.1053137103147922 0 0.6824194254630122 +0.0842509682518358 0 0.6842509682511001 +0.06318822618888462 0 0.6860825110391868 +0.04212548412593108 0 0.6879140538272748 +0.02106274206297335 0 0.6897455966153625 +0.1936856498399651 0 0.7563199407330546 +0.1721650220799332 0 0.7576935978241112 +0.1506443943199027 0 0.7590672549151672 +0.1291237665598751 0 0.7604409120062222 +0.1076031387998527 0 0.7618145690972781 +0.08608251103988428 0 0.7631882261883401 +0.06456188327992071 0 0.7645618832794019 +0.04304125551995638 0 0.7659355403704647 +0.02152062775998606 0 0.767309197461527 +0.1978066211131569 0 0.8375466271553871 +0.1758281076560926 0 0.8384623985494211 +0.1538495941990292 0 0.8393781699434548 +0.1318710807419677 0 0.8402939413374882 +0.1098925672849124 0 0.8412097127315217 +0.08791405382793212 0 0.8421254841255599 +0.06593554037095635 0 0.8430412555195973 +0.04395702691398141 0 0.8439570269136359 +0.02197851345699861 0 0.8448727983076738 +0.2019275923863523 0 0.9187733135777804 +0.179491193232255 0 0.9192311992747852 +0.1570547940781584 0 0.9196890849717901 +0.1346183949240626 0 0.9201469706687948 +0.1121819957699741 0 0.9206048563657994 +0.08974559661598151 0 0.9210627420628065 +0.06730919746199315 0 0.9215206277598132 +0.04487279830800719 0 0.9219785134568202 +0.02243639915401156 0 0.9224363991538274 +0.1783464789898177 0 0.2668993365641225 +0.1668993365643106 0 0.2283464789897256 +0.1761715219289732 0 0.2261715219288724 +0.1595731654119743 0 0.2710203078373097 +0.1483549658349795 0 0.2326963931114216 +0.1576271511996403 0 0.2305214360505748 +0.14079985183413 0 0.2751412791104972 +0.1298105951056526 0 0.2370463072331165 +0.1390827804703155 0 0.2348713501722692 +0.1220265382562919 0 0.2792622503836832 +0.1112662243763347 0 0.2413962213548093 +0.1205384097409888 0 0.2392212642939641 +0.1032532246784578 0 0.2833832216568683 +0.09272185364701586 0 0.2457461354765023 +0.1019940390116766 0 0.2435711784156554 +0.08447991110058745 0 0.287504192930064 +0.07417748291761425 0 0.2500960495982175 +0.08344966828231054 0 0.2479210925373611 +0.06570659752268443 0 0.2916251642032693 +0.05563311218821988 0 0.2544459637199308 +0.0649052975529195 0 0.2522710066590735 +0.04693328394477975 0 0.2957461354764751 +0.0370887414588143 0 0.2587958778416471 +0.04636092682351543 0 0.2566209207807894 +0.02815997036687239 0 0.2998671067496816 +0.0185443707294147 0 0.2631457919633617 +0.02781655609411705 0 0.2609708349025038 +0.009386656788959988 0 0.303988078022889 +0.009272185364711603 0 0.265320749024207 +0.1826963931115053 0 0.348354965834573 +0.1710203078374835 0 0.3095731654116853 +0.1805214360506622 0 0.3076271511993611 +0.1634651938366313 0 0.3520180514107374 +0.1520180514111221 0 0.3134651938363618 +0.1615191796243028 0 0.3115191796240236 +0.1442339945617565 0 0.355681136986902 +0.1330157949847644 0 0.3173572222610375 +0.1425169231979432 0 0.3154112080486996 +0.1250027952868872 0 0.3593442225630652 +0.1140135385584147 0 0.321249250685711 +0.1235146667715895 0 0.3193032364733742 +0.1057715960120219 0 0.3630073081392275 +0.09501128213206508 0 0.3251412791103848 +0.1045124103452399 0 0.3231952648980478 +0.08654039673713135 0 0.3666703937153994 +0.07600902570565371 0 0.3290333075350786 +0.0855101539188594 0 0.3270872933227318 +0.06730919746221849 0 0.37033347929158 +0.05700676927924921 0 0.3329253359597707 +0.06650789749245145 0 0.3309793217474247 +0.04807799818730459 0 0.3739965648677608 +0.03800451285283513 0 0.3368173643844653 +0.04750564106604217 0 0.334871350172118 +0.02884679891238789 0 0.3776596504439422 +0.01900225642642515 0 0.3407093928091586 +0.02850338463963014 0 0.3387633785968119 +0.009615599637465166 0 0.3813227360201246 +0.009501128213212577 0 0.3426554070215232 +0.1870463072331908 0 0.4298105951049863 +0.1751412791106546 0 0.3907998518336062 +0.1848713501723483 0 0.3890827804697838 +0.1673572222612864 0 0.4330157949841292 +0.155681136987263 0 0.3942339945612604 +0.1654112080489588 0 0.3925169231974333 +0.1476681372893813 0 0.4362209948632723 +0.1362209948638747 0 0.3976681372889139 +0.1459510659255689 0 0.3959510659250871 +0.1279790523174811 0 0.4394261947424142 +0.1167608527404935 0 0.4011022800165655 +0.1264909238021841 0 0.3993852086527397 +0.1082899673455848 0 0.4426313946215553 +0.09730071061711328 0 0.4045364227442174 +0.1070307816788034 0 0.4028193513803914 +0.08860088237367431 0 0.4458365945007049 +0.07784056849369236 0 0.4079705654718869 +0.08757063955540281 0 0.4062534941080522 +0.06891179740175181 0 0.4490417943798619 +0.05838042637027793 0 0.411404708199555 +0.06811049743198515 0 0.409687636835721 +0.04922271242982888 0 0.4522469942590193 +0.03892028424685554 0 0.4148388509272251 +0.04865035530856673 0 0.41312177956339 +0.02953362745790306 0 0.4554521941381771 +0.01946014212343541 0 0.4182729936548942 +0.02919021318514547 0 0.4165559222910596 +0.009844542485970246 0 0.4586573940173356 +0.009730071061717707 0 0.4199900650187325 +0.1913962213548743 0 0.5112662243753656 +0.1792622503838238 0 0.472026538255493 +0.189221264294032 0 0.4705384097401658 +0.1712492506859398 0 0.514013538557492 +0.1593442225634023 0 0.4750027952861282 +0.1693032364736131 0 0.4735146667708106 +0.1511022800170046 0 0.5167608527396185 +0.1394261947429836 0 0.4779790523167626 +0.149385208653193 0 0.4764909238014453 +0.1309553093480736 0 0.5195081669217441 +0.119508166922571 0 0.4809553093473956 +0.1294671808327773 0 0.4794671808320791 +0.1108083386791466 0 0.522255481103869 +0.09959013910216043 0 0.4839315663780288 +0.1095491530123657 0 0.4824434378627122 +0.09066136801021631 0 0.525002795286001 +0.07967211128173018 0 0.4869078234086771 +0.08963112519194531 0 0.485419694893353 +0.0705143973412844 0 0.5277501094681394 +0.05975408346130603 0 0.4898840804393242 +0.0697130973715181 0 0.4883959519240006 +0.05036742667235268 0 0.5304974236502782 +0.03983605564087553 0 0.4928603374699733 +0.04979506955109078 0 0.4913722089546487 +0.03022045600341793 0 0.5332447378324174 +0.01991802782044546 0 0.4958365945006211 +0.02987704173066049 0 0.4943484659852972 +0.01007348533447521 0 0.5359920520145571 +0.00995901391022273 0 0.4973247230159463 +0.1957461354765554 0 0.5927218536457005 +0.183383221656991 0 0.5532532246773427 +0.1935711784157146 0 0.5519940390105287 +0.175141279110591 0 0.5950112821308134 +0.1630073081395397 0 0.5557715960109628 +0.1731952648982654 0 0.5545124103441528 +0.154536422744626 0 0.5973007106159265 +0.1426313946220909 0 0.5582899673445822 +0.1528193513808153 0 0.5570307816777724 +0.1339315663786645 0 0.5995901391010388 +0.1222554811046472 0 0.5608083386782006 +0.132443437863369 0 0.5595491530113914 +0.113326710012707 0 0.6018795675861504 +0.1018795675872065 0 0.5633267100118189 +0.1120675243459268 0 0.5620675243450097 +0.0927218536467572 0 0.6041689960712679 +0.08150365406976706 0 0.5658450813454501 +0.09169161082848676 0 0.5645858956786345 +0.07211699728081609 0 0.6064584245563911 +0.06112774055233344 0 0.5683634526790804 +0.07131569731105025 0 0.5671042670122652 +0.05151214091487583 0 0.6087478530415145 +0.04075182703489506 0 0.5708818240127123 +0.05093978379361425 0 0.5696226383458963 +0.03090728454893241 0 0.6110372815266381 +0.02037591351745528 0 0.5734001953463431 +0.03056387027617517 0 0.5721410096795279 +0.01030242818298006 0 0.6133267100117621 +0.01018795675872764 0 0.5746593810131774 +0.2000960495982702 0 0.6741774829166581 +0.187504192930173 0 0.6344799110994772 +0.1979210925374116 0 0.6334496682811582 +0.1790333075352723 0 0.6760090257047373 +0.1666703937156903 0 0.6365403967360737 +0.1770872933229316 0 0.6355101539177754 +0.157970565472274 0 0.6778405684928166 +0.1458365945012097 0 0.6386008823726695 +0.15625349410845 0 0.6375706395543714 +0.1369078234092784 0 0.6796721112808952 +0.1250027952867332 0 0.6406613680092643 +0.1354196948939715 0 0.639631125190967 +0.1158450813462869 0 0.6815036540689732 +0.1041689960722607 0 0.6427218536458592 +0.114585895679497 0 0.6416916108275618 +0.094782339283314 0 0.6833351968570561 +0.08333519685781052 0 0.644782339282465 +0.0937520964650356 0 0.6437520964641621 +0.0737195972203602 0 0.6851667396451435 +0.06250139764336579 0 0.6468428249190696 +0.07291829725058815 0 0.6458125821007673 +0.05265685515740785 0 0.6869982824332308 +0.04166759842891789 0 0.6489033105556756 +0.05208449803614183 0 0.6478730677373726 +0.03159411309445222 0 0.6888298252213186 +0.02083379921446674 0 0.6509637961922811 +0.03125069882169231 0 0.6499335533739784 +0.01053137103148668 0 0.6906613680094068 +0.01041689960723337 0 0.6519940390105867 +0.20444596371998 0 0.7556331121875268 +0.1916251642033685 0 0.7157065975218762 +0.2022710066591237 0 0.7149052975520678 +0.1829253359599491 0 0.7570067692785829 +0.1703334792918529 0 0.7173091974614441 +0.1809793217476107 0 0.7165078974916601 +0.161404708199918 0 0.7583804263696392 +0.149041794380339 0 0.7189117974010117 +0.159687636836096 0 0.718110497431228 +0.1398840804398889 0 0.7597540834606947 +0.1277501094688283 0 0.7205143973405782 +0.1383959519245837 0 0.719713097370795 +0.1183634526798639 0 0.7611277405517501 +0.1064584245573225 0 0.7221169972801451 +0.1171042670130754 0 0.7213156973103616 +0.09684282491986848 0 0.7625013976428091 +0.08516673964586004 0 0.7237195972197201 +0.09581258210159124 0 0.7229182972499326 +0.07532219715990249 0 0.7638750547338711 +0.06387505473440266 0 0.7253221971592944 +0.07452089719013133 0 0.7245208971895074 +0.05380156939993855 0 0.7652487118249334 +0.04258336982294373 0 0.7269247970988697 +0.0532292122786732 0 0.726123497129082 +0.03228094163997122 0 0.7666223689159959 +0.02129168491147971 0 0.7285273970384447 +0.03193752736721172 0 0.7277260970686572 +0.01076031387999303 0 0.7679960260070586 +0.01064584245573985 0 0.7293286970082459 +0.2087958778416884 0 0.8370887414583701 +0.195746135476561 0 0.7969332839442209 +0.2066209207808342 0 0.7963609268229485 +0.1868173643846248 0 0.8380045128524041 +0.1739965648680129 0 0.7980779981867661 +0.1848713501722869 0 0.7975056410654934 +0.1648388509275609 0 0.8389202842464379 +0.152246994259466 0 0.799222712429311 +0.1631217795637395 0 0.7986503553080386 +0.1428603374704985 0 0.8398360556404716 +0.1304974236509214 0 0.8003674266718552 +0.1413722089551937 0 0.7997950695505831 +0.1208818240134401 0 0.8407518270345049 +0.1087478530423825 0 0.8015121409143999 +0.119622638346652 0 0.8009397837931276 +0.09890331055642226 0 0.8416675984285408 +0.0869982824339082 0 0.80265685515695 +0.09787306773814537 0 0.8020844980356749 +0.07692479709944423 0 0.8425833698225786 +0.06524871182543854 0 0.8038015693994995 +0.07612349712967337 0 0.8032292122782249 +0.05494628364246888 0 0.8434991412166166 +0.04349914121696889 0 0.8049462836420503 +0.05437392652120372 0 0.804373926520775 +0.03296777018549001 0 0.8444149126106548 +0.02174957060849234 0 0.8060909978846005 +0.03262435591273062 0 0.8055186407633252 +0.01098925672849931 0 0.8453306840046932 +0.01087478530424617 0 0.8066633550058634 +0.2131457919634005 0 0.918544370729278 +0.1998671067497546 0 0.8781599703665837 +0.2109708349025425 0 0.8778165560937892 +0.1907093928093037 0 0.9190022564262827 +0.1776596504441738 0 0.8788467989121032 +0.1887633785969642 0 0.8785033846393435 +0.1682729936552068 0 0.9194601421232877 +0.1554521941385938 0 0.8795336274576224 +0.1665559222913839 0 0.8791902131848628 +0.1458365945011105 0 0.9199180278202925 +0.1332447378330152 0 0.8802204560031415 +0.1443484659858045 0 0.8798770417303821 +0.1234001953470183 0 0.9203759135172971 +0.1110372815274432 0 0.8809072845486605 +0.1221410096802292 0 0.8805638702759009 +0.1009637961929778 0 0.920833799214303 +0.08882982522195682 0 0.8815941130941831 +0.09993355337470003 0 0.8812506988214219 +0.07852739703898734 0 0.9212916849113099 +0.06662236891647474 0 0.8822809416397053 +0.07772609706921579 0 0.8819375273669443 +0.05609099788500017 0 0.9217495706083167 +0.0444149126109943 0 0.8829677701852281 +0.05551864076373453 0 0.8826243559124667 +0.03365459873100937 0 0.9222074563053237 +0.02220745630550509 0 0.8836545987307506 +0.03331118445824969 0 0.8833111844579893 +0.01121819957700578 0 0.922665342002331 +0.01110372815275254 0 0.8839980130035224 +0.2039880780229449 0 0.9593866567888902 +0.2153207490242498 0 0.9592721853646586 +0.1813227360203318 0 0.9596155996373926 +0.1926554070216384 0 0.9595011282131414 +0.1586573940177191 0 0.959844542485895 +0.1699900650190278 0 0.9597300710616439 +0.1359920520151068 0 0.9600734853343974 +0.1473247230164155 0 0.9599590139101463 +0.1133267100125021 0 0.9603024281828997 +0.1246593810138033 0 0.9601879567586484 +0.09066136801000399 0 0.9605313710314032 +0.1019940390112537 0 0.9604168996071514 +0.06799602600750987 0 0.9607603138799066 +0.07932869700875812 0 0.960645842455655 +0.04533068400501897 0 0.9609892567284102 +0.05666335500626629 0 0.9608747853041584 +0.02266534200251748 0 0.9612181995769137 +0.03399801300376931 0 0.9611037281526618 +0.01133267100125785 0 0.9613326710011603 +2 3 0 361 +1445 +1446 +1447 +1448 +1449 +1450 +1451 +1452 +1453 +1454 +1455 +1456 +1457 +1458 +1459 +1460 +1461 +1462 +1463 +1464 +1465 +1466 +1467 +1468 +1469 +1470 +1471 +1472 +1473 +1474 +1475 +1476 +1477 +1478 +1479 +1480 +1481 +1482 +1483 +1484 +1485 +1486 +1487 +1488 +1489 +1490 +1491 +1492 +1493 +1494 +1495 +1496 +1497 +1498 +1499 +1500 +1501 +1502 +1503 +1504 +1505 +1506 +1507 +1508 +1509 +1510 +1511 +1512 +1513 +1514 +1515 +1516 +1517 +1518 +1519 +1520 +1521 +1522 +1523 +1524 +1525 +1526 +1527 +1528 +1529 +1530 +1531 +1532 +1533 +1534 +1535 +1536 +1537 +1538 +1539 +1540 +1541 +1542 +1543 +1544 +1545 +1546 +1547 +1548 +1549 +1550 +1551 +1552 +1553 +1554 +1555 +1556 +1557 +1558 +1559 +1560 +1561 +1562 +1563 +1564 +1565 +1566 +1567 +1568 +1569 +1570 +1571 +1572 +1573 +1574 +1575 +1576 +1577 +1578 +1579 +1580 +1581 +1582 +1583 +1584 +1585 +1586 +1587 +1588 +1589 +1590 +1591 +1592 +1593 +1594 +1595 +1596 +1597 +1598 +1599 +1600 +1601 +1602 +1603 +1604 +1605 +1606 +1607 +1608 +1609 +1610 +1611 +1612 +1613 +1614 +1615 +1616 +1617 +1618 +1619 +1620 +1621 +1622 +1623 +1624 +1625 +1626 +1627 +1628 +1629 +1630 +1631 +1632 +1633 +1634 +1635 +1636 +1637 +1638 +1639 +1640 +1641 +1642 +1643 +1644 +1645 +1646 +1647 +1648 +1649 +1650 +1651 +1652 +1653 +1654 +1655 +1656 +1657 +1658 +1659 +1660 +1661 +1662 +1663 +1664 +1665 +1666 +1667 +1668 +1669 +1670 +1671 +1672 +1673 +1674 +1675 +1676 +1677 +1678 +1679 +1680 +1681 +1682 +1683 +1684 +1685 +1686 +1687 +1688 +1689 +1690 +1691 +1692 +1693 +1694 +1695 +1696 +1697 +1698 +1699 +1700 +1701 +1702 +1703 +1704 +1705 +1706 +1707 +1708 +1709 +1710 +1711 +1712 +1713 +1714 +1715 +1716 +1717 +1718 +1719 +1720 +1721 +1722 +1723 +1724 +1725 +1726 +1727 +1728 +1729 +1730 +1731 +1732 +1733 +1734 +1735 +1736 +1737 +1738 +1739 +1740 +1741 +1742 +1743 +1744 +1745 +1746 +1747 +1748 +1749 +1750 +1751 +1752 +1753 +1754 +1755 +1756 +1757 +1758 +1759 +1760 +1761 +1762 +1763 +1764 +1765 +1766 +1767 +1768 +1769 +1770 +1771 +1772 +1773 +1774 +1775 +1776 +1777 +1778 +1779 +1780 +1781 +1782 +1783 +1784 +1785 +1786 +1787 +1788 +1789 +1790 +1791 +1792 +1793 +1794 +1795 +1796 +1797 +1798 +1799 +1800 +1801 +1802 +1803 +1804 +1805 +0.009758770706239702 0 0.1233009942559456 +0.01946678062675132 0 0.1219511541627764 +0.02907358190173262 0 0.1199623079203577 +0.03852935067831824 0 0.1173443661127837 +0.04778519430687052 0 0.1141111178924382 +0.0567934527187469 0 0.1102801459790135 +0.06550799223331856 0 0.1058727182863003 +0.07388449011245654 0 0.1009136567382804 +0.08188070770023817 0 0.09543118430190772 +0.01056731485155128 0 0.1328507393346952 +0.02108866545593592 0 0.1311957797730625 +0.03151837092260931 0 0.1289621956656721 +0.04181131540367689 0 0.1261589611158668 +0.05192322626229542 0 0.1227985622977523 +0.06181094697233826 0 0.1188969204872169 +0.07143270316273918 0 0.1144732939292237 +0.0807483602835472 0 0.1095501590498687 +0.08971967093585133 0 0.1041530719434914 +0.0114082007623938 0 0.1427824742130306 +0.02277542567772312 0 0.1408101904043305 +0.03406095150346958 0 0.1383220789174825 +0.04522455871690652 0 0.1353261399158479 +0.05622677949449524 0 0.131833504476124 +0.06702914099432415 0 0.1278583659726435 +0.07759440252727029 0 0.1234178925947894 +0.08788678525908655 0 0.1185321214508574 +0.09787219269815246 0 0.113223835087669 +0.01228272210792762 0 0.153111478465696 +0.02452965630488659 0 0.1508091774407299 +0.03670523530229551 0 0.1480563574797991 +0.04877433175559216 0 0.1448600058486866 +0.06070247484706457 0 0.1412298443227872 +0.07245606276637484 0 0.1371782692588201 +0.08400256985361189 0 0.1327202751883686 +0.09531074721885127 0 0.1278733623292217 +0.1063508153140462 0 0.1226574287387877 +0.01319222430708132 0 0.16385364288584 +0.02635405615673243 0 0.1612081239560627 +0.03945529045246509 0 0.1581800071821754 +0.05246609571500684 0 0.1547752264164799 +0.06535719801270429 0 0.151002037761017 +0.07810006140805521 0 0.1468709686741877 +0.09066706387152737 0 0.1423947530834647 +0.1030316676552911 0 0.1375882528405103 +0.1151685828326151 0 0.1324683661337441 +0.01413810659582479 0 0.1750254939017844 +0.02825143200590891 0 0.1720230283504123 +0.04231534781355058 0 0.1687086028905799 +0.05630553023938809 0 0.1650870558245665 +0.07019811011327821 0 0.161165118954122 +0.08396982000547672 0 0.1569513760833935 +0.09759813766205429 0 0.1524562101115745 +0.1110614249229679 0 0.1476917389895508 +0.1243390610676625 0 0.1426717410419882 +0.01512182417505932 0 0.1866442189456474 +0.03022470288692879 0 0.1832705289082419 +0.0452898074658782 0 0.1796583424153718 +0.0602985421404468 0 0.1758113583972945 +0.07523265869245586 0 0.1717347233834592 +0.0900743689402235 0 0.1674349997775908 +0.1048064543964417 0 0.1629201254094755 +0.1194123724723602 0 0.1581993645731942 +0.1338763584218416 0 0.1532832509351129 +0.01614489045715001 0 0.198727692987288 +0.03227690460256107 0 0.1949679294845586 +0.04838324550335152 0 0.1910460715174564 +0.06445127451627573 0 0.1869646330693354 +0.08046858921319618 0 0.1827271119864533 +0.096423099830414 0 0.1783379684160963 +0.1123031037979055 0 0.1738025973158676 +0.1280973579210632 0 0.1691272951767728 +0.1437951476671429 0 0.1643192212205458 +0.01720887939119283 0 0.2112945059982353 +0.03441119438815951 0 0.2071332260913472 +0.05160042106434482 0 0.2028893097908703 +0.06877011618985067 0 0.1985640387353795 +0.08591395695818609 0 0.1941591961406112 +0.1030257799603583 0 0.1896770558071548 +0.1200996191803228 0 0.1851203681055412 +0.1371297427933841 0 0.1804923430115754 +0.1541106884887298 0 0.1757966303245727 +0.004879385353119851 0 0.1236534257787396 +0.009370047560521589 0 0.1187097706573487 +0.004686756180850941 0 0.1190182983575929 +0.01461277566649551 0 0.122626074209361 +0.01868702830716295 0 0.1175066226177776 +0.01403372446859135 0 0.1181520174311772 +0.02427018126424197 0 0.1209567310415671 +0.0278982025679811 0 0.1156354388119236 +0.02330122412225215 0 0.1166143094929097 +0.03380146629002543 0 0.1186533370165707 +0.03695148302618478 0 0.1131065800550111 +0.03243682055158954 0 0.1144134793694736 +0.04315727249259438 0 0.1157277420026109 +0.0457957558721413 0 0.1099344619312877 +0.04138889243812406 0 0.1115619202431104 +0.05228932351280871 0 0.1121956319357258 +0.05438119587253919 0 0.1061374659315041 +0.05010694992832772 0 0.1080760372564644 +0.06115072247603273 0 0.1080764321326569 +0.0626595735248468 0 0.1017378261563868 +0.0585419459210345 0 0.1039761463791547 +0.06969624117288756 0 0.1033931875122903 +0.07058455253892847 0 0.09676149217313054 +0.06664657849444901 0 0.09928634913935701 +0.07788259890634736 0 0.09817242052009406 +0.07811197538530029 0 0.09123796909898338 +0.0743755825106702 0 0.09403438404900463 +0.08566872931481895 0 0.09244396761565374 +0.08168600871718816 0 0.088251455570072 +0.005283657425775642 0 0.1333862034974937 +0.01016304277889549 0 0.1280758667953204 +0.005081521389447747 0 0.1285198146381197 +0.0158279901537436 0 0.1320232595538788 +0.02027772304134362 0 0.1265734669679194 +0.01522038291011956 0 0.1273246668816199 +0.02630351818927262 0 0.1300789877193673 +0.03029597641217097 0 0.1244622517930149 +0.02528684972675729 0 0.1255178593804672 +0.0366648431631431 0 0.1275605783907695 +0.04017033304099756 0 0.1217516636143252 +0.03523315472658426 0 0.1231069577036701 +0.04686727083298615 0 0.1244787617068095 +0.04985421028458297 0 0.1184548400950953 +0.04501227166279027 0 0.1201032518547103 +0.05686708661731684 0 0.1208477413924846 +0.05930219984554258 0 0.1145885332331152 +0.05457820506506278 0 0.1165216866641052 +0.06662182506753872 0 0.1166851072082203 +0.06847034769802887 0 0.110173006107762 +0.06388627377178573 0 0.1123807696704386 +0.0760905317231432 0 0.1120117264895462 +0.07731642519800187 0 0.1052319078940746 +0.07289338644801538 0 0.1077024570009183 +0.08523401560969926 0 0.10685161549668 +0.08580018931804476 0 0.09979212812269955 +0.08155830725802329 0 0.1025120180083871 +0.09401509084902543 0 0.1012317913528455 +0.08984191008192656 0 0.09683787948425397 +0.005704100381196902 0 0.1435082923213556 +0.01098775780697255 0 0.1378166067738629 +0.005493878903486273 0 0.1384472479094252 +0.01709181322005846 0 0.1417963323086806 +0.02193204556682952 0 0.1360029850886965 +0.01645990168690104 0 0.1369097959312797 +0.02841818859059635 0 0.1395661346609065 +0.03278966121303944 0 0.1336421372915773 +0.02736085338993448 0 0.1348225611901369 +0.03964275511018805 0 0.1368241094166652 +0.0435179370602917 0 0.1307425505158573 +0.03815379913666558 0 0.1321923439037173 +0.05072566910570088 0 0.1335798221959859 +0.05407500287839533 0 0.1273160333869381 +0.04879646996934352 0 0.1290292919513977 +0.0616279602444097 0 0.1298459352243837 +0.0644200439833312 0 0.1233776432299302 +0.05924752343086327 0 0.1253468383084342 +0.07231177176079723 0 0.1256381292837164 +0.07451355284500474 0 0.1189455932620065 +0.06946679841416797 0 0.1211616182459684 +0.08274059389317842 0 0.1209750070228234 +0.08431757277131688 0 0.114041140250363 +0.07941556280816081 0 0.1164933667561848 +0.0928794889786195 0 0.1158779782692632 +0.0937959318170019 0 0.1086884535155802 +0.08905675229415938 0 0.1113647968829716 +0.1026953068416857 0 0.1103711280364439 +0.09835519884535604 0 0.1058014596946452 +0.006141361053963811 0 0.1540352646769605 +0.01184546143516071 0 0.1479469763393633 +0.005922730717580356 0 0.1487717784991556 +0.01840618920640711 0 0.1519603279532129 +0.02365254099130485 0 0.1458096839225302 +0.01774900121323279 0 0.1468783301309468 +0.03061744580359105 0 0.1494327674602645 +0.03538309340288255 0 0.1431892181986408 +0.02951781719709371 0 0.1444994510605855 +0.04273978352894384 0 0.1464581816642428 +0.04699944523624934 0 0.1400930728822672 +0.04119126931956595 0 0.141641145540454 +0.05473840330132837 0 0.1430449250857369 +0.05846462717077991 0 0.1365316743994556 +0.05273203620351463 0 0.1383123736408614 +0.0665792688067197 0 0.1392040567908036 +0.0697426018803495 0 0.1325183176157318 +0.06410361452556471 0 0.1345249960075937 +0.07822931630999336 0 0.1349492722235943 +0.08079848619044108 0 0.128069083891579 +0.07527054403539529 0 0.1302937007536554 +0.08965665853623159 0 0.1302968187587951 +0.09159876623896891 0 0.1232027418900395 +0.086198626214705 0 0.1256359128908093 +0.1008307812664487 0 0.1252653955340047 +0.1021115040060993 0 0.1179406319132284 +0.09685513512253413 0 0.120571686901634 +0.1117227314560582 0 0.1198760381684289 +0.1072090191488714 0 0.1151235831024359 +0.00659611215354066 0 0.1649833159241008 +0.01273747320750447 0 0.158482560675768 +0.006368736603752236 0 0.1595092903005338 +0.01977314023190687 0 0.1625308834209513 +0.02544185623080951 0 0.1560086506983963 +0.01908966471915699 0 0.1572456056870821 +0.03290467330459876 0 0.159694065569119 +0.0380802628773803 0 0.1531181823309872 +0.0317610595540949 0 0.1545634165146917 +0.04596069308373596 0 0.1564776167993276 +0.0506202137352995 0 0.1498176161325832 +0.0443502383063399 0 0.1514678992317852 +0.05891164686385556 0 0.1528886320887485 +0.06302983642988443 0 0.1461159410419021 +0.05682502508259196 0 0.1479667785872427 +0.07172862971037974 0 0.1489365032176023 +0.07527806208721502 0 0.1420246189665039 +0.06915394925854972 0 0.144070280004203 +0.0843835626397913 0 0.1446328608788262 +0.08733481686256964 0 0.1375575141359167 +0.08130643947489233 0 0.1397910665512103 +0.09684936576340923 0 0.1399915029619875 +0.09917120743707118 0 0.1327308075848661 +0.09325301214982042 0 0.1351441608603913 +0.1091001252439531 0 0.1350283094871272 +0.1107596990733306 0 0.1275628974362659 +0.1049654532552009 0 0.130146852510566 +0.1211112530529172 0 0.1297611447034817 +0.1164169922544875 0 0.1248185914359551 +0.007069053297912393 0 0.1763692892404778 +0.01366516545145305 0 0.1694395683938122 +0.006832582725726526 0 0.1706763025822801 +0.02119476930086685 0 0.1735242611260984 +0.02730274408132067 0 0.1666155761532375 +0.02048395476638686 0 0.1680275722735249 +0.03528338990972974 0 0.1703658156204961 +0.04088531913300783 0 0.1634443050363777 +0.03409403160716425 0 0.1650299405948076 +0.04931043902646934 0 0.1668978293575732 +0.05438581297719747 0 0.1599311411205232 +0.04763556605510265 0 0.1616877230784504 +0.06325182017633316 0 0.1631260873893443 +0.06777765406299124 0 0.1560835783575695 +0.06108173352009436 0 0.1580073597390464 +0.07708396505937747 0 0.1590582475187577 +0.08103494070676596 0 0.1519111723787906 +0.07440629738487861 0 0.15399737536818 +0.0907839788337655 0 0.154703793097484 +0.09413260076679084 0 0.1474254815975196 +0.08758377073677841 0 0.1496683269881551 +0.1043297812925111 0 0.1500739745505627 +0.1070465462891295 0 0.1426399959150306 +0.1005895735279602 0 0.1450327387562751 +0.1177002429953152 0 0.1451817400157696 +0.1197538219501388 0 0.1375700535878662 +0.1134001841196342 0 0.1401050247514484 +0.1308753155304044 0 0.1400416555175673 +0.1259932842916676 0 0.1349014001105313 +0.00756091208752966 0 0.1882107014765381 +0.01462996538544205 0 0.1808348564237159 +0.007314982692721027 0 0.1822899953585067 +0.02267326353099405 0 0.1849573739269446 +0.02923806744641885 0 0.1776467786293271 +0.02193401641593045 0 0.1792408175265215 +0.03775725517640349 0 0.1814644356618068 +0.04380257763971439 0 0.1741834726529759 +0.03652032254306662 0 0.1759151256411515 +0.0527941748031625 0 0.1777348504063332 +0.05830203618991744 0 0.1704492071109305 +0.05105230691481592 0 0.1723163398819532 +0.06776560041645133 0 0.1737730408903768 +0.07271538440286704 0 0.1664499211687906 +0.06550871029639224 0 0.1684495641398605 +0.08265351381633967 0 0.169584861580525 +0.08702209447285011 0 0.1621931879304921 +0.07986873943785858 0 0.1643215545496413 +0.0974404116683326 0 0.1651775625935331 +0.101202296029248 0 0.157688167760525 +0.09411219525104905 0 0.1599406778455085 +0.1121094134344009 0 0.1605597449913349 +0.1152368986976641 0 0.1529455517813725 +0.108219597363456 0 0.1553168597709488 +0.1266443654471009 0 0.1557413077541535 +0.1291077097447521 0 0.1479774959885505 +0.1221723042212081 0 0.1504615238849615 +0.1410299404960552 0 0.1507333867526909 +0.1359526280132319 0 0.1453875211351311 +0.008072445228575007 0 0.2005257701979759 +0.01563335731610467 0 0.1926859559664677 +0.007816678658052334 0 0.1943682358372407 +0.02421089752985554 0 0.1968478112359233 +0.03125080374474493 0 0.1891192291964002 +0.0234420805304248 0 0.1909025925814339 +0.04033007505295629 0 0.1930070005010075 +0.04683652648461486 0 0.1853522069664141 +0.03904366511467989 0 0.1872357180814072 +0.05641726000981363 0 0.1890053522933959 +0.06237490832836127 0 0.181387995733315 +0.05460571740648806 0 0.1833701013498645 +0.07245993186473595 0 0.1848458725278944 +0.07785062395282602 0 0.1772309176849562 +0.07011276614059364 0 0.1793094567091356 +0.08844584452180509 0 0.1805325402012748 +0.09324873438531875 0 0.1728864840968435 +0.08554967916907238 0 0.1750587008908999 +0.1043631018141598 0 0.176070282865982 +0.1085547790971736 0 0.1683613613626715 +0.1009017567412462 0 0.1706239227297575 +0.1202002308594844 0 0.1714649462463202 +0.1237548651967117 0 0.1636633298749835 +0.1161548221469427 0 0.1660123456188275 +0.1359462527941031 0 0.1667232581986593 +0.1388357530444922 0 0.1588012360778294 +0.131295309120602 0 0.1612322829764064 +0.151590750457089 0 0.1618527872337905 +0.1463103454765688 0 0.1562930869932374 +0.008604439695596414 0 0.2133334416760482 +0.01667688492417142 0 0.2050110994927617 +0.008338442462085711 0 0.2069296059370115 +0.02581003688967617 0 0.2092138660447913 +0.03334404949536029 0 0.2010505777879529 +0.02501046720976585 0 0.2030308386403573 +0.04300580772625216 0 0.2050112679411087 +0.04999183328384817 0 0.1969676906541633 +0.04166794138960422 0 0.1990091342210581 +0.06018526862709775 0 0.2007266742631249 +0.0666106953530632 0 0.1927643359023575 +0.05830126431845568 0 0.1948660132782604 +0.07734203657401838 0 0.1963616174379954 +0.08319127308569113 0 0.1884431540635323 +0.07490098421937717 0 0.1906037449829449 +0.09446986845927217 0 0.191918125973883 +0.09972443989538612 0 0.1840075121116256 +0.09145785649053861 0 0.1862253330875789 +0.1115626995703405 0 0.187398711956348 +0.1162013614891142 0 0.1794614827107044 +0.1079629006922502 0 0.181734497411165 +0.1286146809868535 0 0.1828063555585583 +0.1326135503572237 0 0.1748098190941741 +0.1244074559231689 0 0.1771356509024393 +0.145620215641057 0 0.178144486668074 +0.1489529180779363 0 0.1700579257725593 +0.14078323421758 0 0.1724338724333667 +0.1625739928234559 0 0.1734169637413774 +0.1570823716402652 0 0.1676348754875767 +0.01776215363605112 0 0.2178292487693372 +0.008881076818029816 0 0.219993430850813 +0.03552102507498166 0 0.2134591803307813 +0.02664158935551894 0 0.2156442145500586 +0.05327335235352494 0 0.2090477936954302 +0.04439718871425164 0 0.2112534870131062 +0.07101591385672251 0 0.2045957296825737 +0.06214463310512616 0 0.2068217616890013 +0.08874554818133855 0 0.2001038799000774 +0.07988073101902599 0 0.2023498047913267 +0.1064591736228263 0 0.1955733812482488 +0.09760236090208375 0 0.1978386305741628 +0.1241538071732096 0 0.1910056089123418 +0.1153064903980131 0 0.1932894950802965 +0.141826582920146 0 0.1864021678802574 +0.1329901950466773 0 0.1887038883962998 +0.1594747697082267 0 0.1817648830516541 +0.1506506763141816 0 0.1840835254659569 +0.1682852788457923 0 0.1794303355175055 +2 4 0 551 +1806 +1807 +1808 +1809 +1810 +1811 +1812 +1813 +1814 +1815 +1816 +1817 +1818 +1819 +1820 +1821 +1822 +1823 +1824 +1825 +1826 +1827 +1828 +1829 +1830 +1831 +1832 +1833 +1834 +1835 +1836 +1837 +1838 +1839 +1840 +1841 +1842 +1843 +1844 +1845 +1846 +1847 +1848 +1849 +1850 +1851 +1852 +1853 +1854 +1855 +1856 +1857 +1858 +1859 +1860 +1861 +1862 +1863 +1864 +1865 +1866 +1867 +1868 +1869 +1870 +1871 +1872 +1873 +1874 +1875 +1876 +1877 +1878 +1879 +1880 +1881 +1882 +1883 +1884 +1885 +1886 +1887 +1888 +1889 +1890 +1891 +1892 +1893 +1894 +1895 +1896 +1897 +1898 +1899 +1900 +1901 +1902 +1903 +1904 +1905 +1906 +1907 +1908 +1909 +1910 +1911 +1912 +1913 +1914 +1915 +1916 +1917 +1918 +1919 +1920 +1921 +1922 +1923 +1924 +1925 +1926 +1927 +1928 +1929 +1930 +1931 +1932 +1933 +1934 +1935 +1936 +1937 +1938 +1939 +1940 +1941 +1942 +1943 +1944 +1945 +1946 +1947 +1948 +1949 +1950 +1951 +1952 +1953 +1954 +1955 +1956 +1957 +1958 +1959 +1960 +1961 +1962 +1963 +1964 +1965 +1966 +1967 +1968 +1969 +1970 +1971 +1972 +1973 +1974 +1975 +1976 +1977 +1978 +1979 +1980 +1981 +1982 +1983 +1984 +1985 +1986 +1987 +1988 +1989 +1990 +1991 +1992 +1993 +1994 +1995 +1996 +1997 +1998 +1999 +2000 +2001 +2002 +2003 +2004 +2005 +2006 +2007 +2008 +2009 +2010 +2011 +2012 +2013 +2014 +2015 +2016 +2017 +2018 +2019 +2020 +2021 +2022 +2023 +2024 +2025 +2026 +2027 +2028 +2029 +2030 +2031 +2032 +2033 +2034 +2035 +2036 +2037 +2038 +2039 +2040 +2041 +2042 +2043 +2044 +2045 +2046 +2047 +2048 +2049 +2050 +2051 +2052 +2053 +2054 +2055 +2056 +2057 +2058 +2059 +2060 +2061 +2062 +2063 +2064 +2065 +2066 +2067 +2068 +2069 +2070 +2071 +2072 +2073 +2074 +2075 +2076 +2077 +2078 +2079 +2080 +2081 +2082 +2083 +2084 +2085 +2086 +2087 +2088 +2089 +2090 +2091 +2092 +2093 +2094 +2095 +2096 +2097 +2098 +2099 +2100 +2101 +2102 +2103 +2104 +2105 +2106 +2107 +2108 +2109 +2110 +2111 +2112 +2113 +2114 +2115 +2116 +2117 +2118 +2119 +2120 +2121 +2122 +2123 +2124 +2125 +2126 +2127 +2128 +2129 +2130 +2131 +2132 +2133 +2134 +2135 +2136 +2137 +2138 +2139 +2140 +2141 +2142 +2143 +2144 +2145 +2146 +2147 +2148 +2149 +2150 +2151 +2152 +2153 +2154 +2155 +2156 +2157 +2158 +2159 +2160 +2161 +2162 +2163 +2164 +2165 +2166 +2167 +2168 +2169 +2170 +2171 +2172 +2173 +2174 +2175 +2176 +2177 +2178 +2179 +2180 +2181 +2182 +2183 +2184 +2185 +2186 +2187 +2188 +2189 +2190 +2191 +2192 +2193 +2194 +2195 +2196 +2197 +2198 +2199 +2200 +2201 +2202 +2203 +2204 +2205 +2206 +2207 +2208 +2209 +2210 +2211 +2212 +2213 +2214 +2215 +2216 +2217 +2218 +2219 +2220 +2221 +2222 +2223 +2224 +2225 +2226 +2227 +2228 +2229 +2230 +2231 +2232 +2233 +2234 +2235 +2236 +2237 +2238 +2239 +2240 +2241 +2242 +2243 +2244 +2245 +2246 +2247 +2248 +2249 +2250 +2251 +2252 +2253 +2254 +2255 +2256 +2257 +2258 +2259 +2260 +2261 +2262 +2263 +2264 +2265 +2266 +2267 +2268 +2269 +2270 +2271 +2272 +2273 +2274 +2275 +2276 +2277 +2278 +2279 +2280 +2281 +2282 +2283 +2284 +2285 +2286 +2287 +2288 +2289 +2290 +2291 +2292 +2293 +2294 +2295 +2296 +2297 +2298 +2299 +2300 +2301 +2302 +2303 +2304 +2305 +2306 +2307 +2308 +2309 +2310 +2311 +2312 +2313 +2314 +2315 +2316 +2317 +2318 +2319 +2320 +2321 +2322 +2323 +2324 +2325 +2326 +2327 +2328 +2329 +2330 +2331 +2332 +2333 +2334 +2335 +2336 +2337 +2338 +2339 +2340 +2341 +2342 +2343 +2344 +2345 +2346 +2347 +2348 +2349 +2350 +2351 +2352 +2353 +2354 +2355 +2356 +0.2138802460636474 0 0.006338300647521283 +0.2122559974490299 0 0.01318328678660145 +0.2104869624186416 0 0.02057496500575538 +0.2085591334862463 0 0.02855633512715678 +0.2064570168887823 0 0.03717356532720951 +0.2041634718933745 0 0.04647616355079368 +0.2016595382982767 0 0.05651714126596735 +0.1989242546302042 0 0.06735316348328244 +0.1959344711894036 0 0.07904467858944038 +0.1926646649622194 0 0.09165601934167981 +0.1890867668492331 0 0.1052554661461795 +0.1851700166215185 0 0.1199152629983946 +0.1808808679439316 0 0.1357115754344443 +0.1761829742096695 0 0.1527243823916955 +0.2010184861712321 0 0.005946773662133139 +0.1995836927149431 0 0.01236854655357793 +0.1980049937326986 0 0.01930228259750997 +0.1962661208925633 0 0.02678749603468354 +0.1943487871315981 0 0.03486632932190712 +0.1922324431207071 0 0.0435836026863994 +0.1898940163963257 0 0.05298682535603178 +0.1873076384074507 0 0.06312615518816771 +0.1844443682062209 0 0.07405429170390095 +0.1812719269482986 0 0.0858262839664347 +0.1777544643538942 0 0.09849923326539527 +0.1738523880821536 0 0.1121318688513317 +0.1695223003352028 0 0.1267839738376869 +0.1647171028327796 0 0.1425156420384194 +0.1886514093593754 0 0.005570305407188413 +0.1873987843244409 0 0.01158514248385447 +0.1860031007729888 0 0.01807854951342634 +0.1844459164829883 0 0.02508668921606474 +0.1827062585262368 0 0.03264783316435431 +0.1807603000772733 0 0.04080229416468825 +0.1785810145746338 0 0.04959229082937718 +0.1761378151233579 0 0.05906172413772264 +0.173396192267792 0 0.06925584277850802 +0.1703173711725618 0 0.08022076918606191 +0.1668580196536794 0 0.0920028554994861 +0.1629700529549805 0 0.1046478360223127 +0.1586006007182804 0 0.1181997415384983 +0.1536922265157655 0 0.1326995455510432 +0.1767599893443148 0 0.005208316700399608 +0.1756825262530446 0 0.01083186933965825 +0.1744628190774086 0 0.01690188308606144 +0.1730803353164383 0 0.0234512980438136 +0.1715115194791757 0 0.03051466378143681 +0.1697293933013473 0 0.0381279590468369 +0.1677031282042763 0 0.046328315321976 +0.1653976004238115 0 0.05515361735724819 +0.1627729461698821 0 0.06464194957959771 +0.1597841444618838 0 0.07483085112635564 +0.1563806689771748 0 0.08575633841496252 +0.1525062691756363 0 0.09745165060758411 +0.1480989664680123 0 0.1099456720175123 +0.1430913838999951 0 0.1232609912333592 +0.165325931625197 0 0.004860250635804755 +0.16441689347994 0 0.01010756823868954 +0.1633663943581563 0 0.01577047305853056 +0.1621518918752812 0 0.02187880653034015 +0.1607473473069357 0 0.0284635393725764 +0.1591227521592154 0 0.03555648296921046 +0.1572436220676582 0 0.04318987733071029 +0.155070470893886 0 0.05139582237197576 +0.1525582864493444 0 0.06020551380663682 +0.1496560418445483 0 0.06964823760182579 +0.1463062933158343 0 0.07975007198106739 +0.1424449386077344 0 0.09053224154750845 +0.1380012412164919 0 0.1020090667003243 +0.1328982659892363 0 0.1141854582258119 +0.1543316453756799 0 0.004525571728114719 +0.1535845542936191 0 0.009411124873568436 +0.1526967552233373 0 0.01468257880315595 +0.1516437731998918 0 0.02036679546228693 +0.1503971817744649 0 0.02649130436744075 +0.1489240587708192 0 0.03308390982188907 +0.1471864046458593 0 0.04017214849813267 +0.1451405386706116 0 0.04778255796925965 +0.1427364982733727 0 0.05593971018610912 +0.1399174816522818 0 0.06466495537525133 +0.1366193936580896 0 0.07397481580453905 +0.1327705823090439 0 0.08387896361654373 +0.1282918900297666 0 0.09437771544689141 +0.1230971910918621 0 0.1054589841950663 +0.1437602162872796 0 0.004203765086033422 +0.1431688435352486 0 0.00874146779157213 +0.1424374868222136 0 0.01363652663429364 +0.1415398129328684 0 0.01891293866575825 +0.1404450995295107 0 0.02459492455438814 +0.1391176228182755 0 0.03070643564124304 +0.1375160032766107 0 0.03727048615846973 +0.1355925269153543 0 0.04430826527356688 +0.1332924711790046 0 0.05183797593468864 +0.1305534814653385 0 0.05987333784863232 +0.1273050670620416 0 0.06842168486433339 +0.1234683166351636 0 0.07748158098919224 +0.1189559754250737 0 0.08703987770157276 +0.1136730806115233 0 0.09706814377902057 +0.1335953806051016 0 0.003894335621876902 +0.1331537370168589 0 0.008097566749907529 +0.13257280564763 0 0.01263070723915182 +0.1318244665029092 0 0.01751499943554019 +0.1308757896595242 0 0.02277148242281812 +0.1296883574605007 0 0.0284204027706803 +0.128217540403034 0 0.03448042621092451 +0.126411746363157 0 0.04096759921335692 +0.1242116758778612 0 0.04789400068507636 +0.1215496351137947 0 0.05526601329462223 +0.118348983778761 0 0.06308213587272272 +0.1145238303924514 0 0.07133025152755394 +0.1099791344411304 0 0.07998426447085583 +0.1046114359008275 0 0.08900002797827852 +0.1238215001381658 0 0.003596807290857275 +0.1235238268997689 0 0.007478431132714453 +0.1230875352842493 0 0.01166357320503688 +0.1224827872401782 0 0.01617082709834074 +0.1216745301660459 0 0.02101817268033518 +0.1206217561518879 0 0.02622229424055501 +0.1192767107138858 0 0.031797676260461 +0.1175840727522979 0 0.03775542030823032 +0.1154801419315106 0 0.04410171678994503 +0.1128920905420855 0 0.05083589352966342 +0.1097373652342451 0 0.05794795414829612 +0.1059233628484875 0 0.06541551165860778 +0.1013475565690511 0 0.07320002097750358 +0.09589831598376856 0 0.0812422243211135 +0.2146263117208793 0 0.003169150323760641 +0.2205683611981887 0 0.006541894679633414 +0.2213629870712823 0 0.003270947339815409 +0.2130681217563386 0 0.009760793717061367 +0.2188455959013806 0 0.01360695170717083 +0.2197069785497848 0 0.0100744231934016 +0.2113714799338357 0 0.01687912589617841 +0.2169775861260981 0 0.02123675985710129 +0.2179115910137394 0 0.01742185578213607 +0.2095230479524439 0 0.02456565006645608 +0.2149515000258674 0 0.02947613145393405 +0.2159645430759831 0 0.02535644565551628 +0.2075080751875143 0 0.03286495022718314 +0.2127532963535606 0 0.03837332804825955 +0.2138523981897144 0 0.03392472975109555 +0.2053102443910784 0 0.04182486443900159 +0.210367606846335 0 0.0479802951981384 +0.2115604515999471 0 0.04317681162320198 +0.2029115050958256 0 0.05149665240838051 +0.207777609678587 0 0.05835290553652166 +0.2090726082624615 0 0.05316660036732833 +0.2002918964642404 0 0.06193515237462489 +0.204964895057442 0 0.0695512077936144 +0.2063712523680144 0 0.06395205666506852 +0.1974293629098039 0 0.07319892103636141 +0.2019093247321579 0 0.08163967976622835 +0.2034371098947997 0 0.07559544377992262 +0.1942995680758115 0 0.0853503489655601 +0.1985888887210294 0 0.09468748173249369 +0.2002491067265915 0 0.08816358074936984 +0.1908757159057263 0 0.09845574274392965 +0.1949795641384252 0 0.1087687072391882 +0.1967842264297272 0 0.1017280944858414 +0.1871283917353758 0 0.112585364572287 +0.1910551834536148 0 0.1239626279491081 +0.1930173737960192 0 0.1163656675941514 +0.183025442282725 0 0.1278134192164194 +0.1867873230920664 0 0.1403539282581523 +0.1889212532728409 0 0.1321582781036291 +0.1785319210768005 0 0.1442179789130699 +0.1821452273171685 0 0.1580329273678454 +0.1844662752046173 0 0.1491934278129996 +0.1736101356839257 0 0.1618808397749388 +0.1796205076502628 0 0.1675643576756011 +0.2016711667978156 0 0.002973386831066569 +0.2074493661174397 0 0.006142537154827211 +0.2081487392593468 0 0.003071268577413605 +0.2003010894430876 0 0.009157660107855535 +0.2059198450819865 0 0.01277591667008969 +0.2066846055997131 0 0.00945922691245845 +0.1987943432238209 0 0.01583541457554395 +0.2042459780756701 0 0.01993862380163267 +0.2050829115788283 0 0.01635727023586118 +0.197135557312631 0 0.02304488931609675 +0.2024126271894048 0 0.02767191558092016 +0.2033293026325375 0 0.02380526969127642 +0.1953074540120807 0 0.03082691267829533 +0.2004029020101902 0 0.03601994732455831 +0.2014077645997975 0 0.03184593145273924 +0.1932906151261526 0 0.03922496600415326 +0.1981979575070408 0 0.04502988311859654 +0.1993004297586155 0 0.04052491522157743 +0.1910632297585164 0 0.04828521402121559 +0.1957767773473011 0 0.05475198331099956 +0.196987367427171 0 0.04989093321479805 +0.1886008274018882 0 0.05805649027209975 +0.1931159465188275 0 0.06523965933572506 +0.1944463619330643 0 0.05999582132336231 +0.1858760033068358 0 0.06859022344603433 +0.1901894196978122 0 0.07654948514667066 +0.1916526831083198 0 0.07089457224119788 +0.1828581475772598 0 0.07994028783516782 +0.186968295955259 0 0.08874115165405726 +0.1885788578265357 0 0.08264531840036396 +0.1795131956510964 0 0.09216275861591498 +0.1834206156015637 0 0.1018773497057874 +0.1851944557784113 0 0.09530925067992232 +0.1758034262180239 0 0.1053155510583635 +0.179511202351836 0 0.1160235659248632 +0.1814659089766999 0 0.1089504578153253 +0.1716873442086782 0 0.1194579213445093 +0.1752015841395672 0 0.1312477746360656 +0.1773563932457016 0 0.1236356702804644 +0.1671197015839912 0 0.1346498079380531 +0.1704500385212245 0 0.1476200122150574 +0.1728258113303959 0 0.1394338934255615 +0.1620517280399074 0 0.1509509976427273 +0.1678309318619093 0 0.1564159187088258 +0.189214296687315 0 0.002785152703594206 +0.1948349477653037 0 0.005758539534660776 +0.1954427317425729 0 0.002879269767330388 +0.1880250968419081 0 0.008577723945521441 +0.193491238519692 0 0.0119768445187162 +0.1941630931424979 0 0.008867692026688488 +0.1867009425487148 0 0.0148318459986404 +0.1920040472528437 0 0.01869041605546815 +0.1927476428862678 0 0.01533363028709218 +0.1852245086279886 0 0.02158261936474554 +0.1903560186877758 0 0.02593709262537414 +0.1911800329703098 0 0.02231375434042114 +0.1835760875046125 0 0.02886726119020952 +0.1885275228289174 0 0.03375708124313072 +0.1894417707583466 0 0.02984708693425243 +0.181733279301755 0 0.03672506366452127 +0.1864963715989902 0 0.04219294842554382 +0.1875119472139538 0 0.03797501483433727 +0.1796706573259536 0 0.04519729249703271 +0.1842375154854797 0 0.05128955809270448 +0.185366943542235 0 0.04674125325912415 +0.1773594148489959 0 0.05432700748354991 +0.1817227267654043 0 0.06109393966294517 +0.182980121125442 0 0.05619174887782483 +0.174767003695575 0 0.06415878345811533 +0.1789202802370065 0 0.07165506724120449 +0.1803215035012054 0 0.06637450345207484 +0.1718567817201769 0 0.07473830598228497 +0.1757946490604302 0 0.08302352657624831 +0.1773574646487183 0 0.0773392969087264 +0.1685876954131206 0 0.08611181234277401 +0.1723062420037868 0 0.09525104438244068 +0.1740504455321085 0 0.08913728547934449 +0.1649140363043299 0 0.09832534576089941 +0.1684112205185671 0 0.1083898524368222 +0.170358731261177 0 0.1018204484096314 +0.1607853268366304 0 0.1114237887804055 +0.1640614505267416 0 0.1224918576880926 +0.1662363355226543 0 0.1154408550624574 +0.1561464136170229 0 0.1254496435447707 +0.1592046646742726 0 0.1376075937947313 +0.1616330576005071 0 0.130049725741412 +0.1509378745430172 0 0.140441534060656 +0.156494801291459 0 0.1456962658516884 +0.1772365369619934 0 0.002604158350199804 +0.1827056993518451 0 0.00538931105379401 +0.1832254168246492 0 0.002694655526897005 +0.1762212577986797 0 0.008020093020028929 +0.1815406552887427 0 0.01120850591175636 +0.1821231773202939 0 0.008298908482775185 +0.1750726726652266 0 0.01386687621285984 +0.1802329599251987 0 0.01749021629974389 +0.1808868076069707 0 0.01434936110575012 +0.1737715771969234 0 0.02017659056493752 +0.1787631258997133 0 0.02426899362993917 +0.179498042912456 0 0.02087960496484153 +0.172295927397807 0 0.0269829809126252 +0.1771088890027062 0 0.03158124847289556 +0.1779360074512097 0 0.02792512105141736 +0.1706204563902615 0 0.03432131141413686 +0.1752448466893103 0 0.03946512660576257 +0.1761768678460083 0 0.03552318753932907 +0.1687162607528118 0 0.04222813718440645 +0.1731420713894551 0 0.04796030307567659 +0.1741934590393827 0 0.04371271484071958 +0.1665503643140439 0 0.0507409663396121 +0.1707677077735847 0 0.05710767074748542 +0.1719548895815199 0 0.052533986911581 +0.1640852732968468 0 0.05989778346842295 +0.1680845692188371 0 0.06694889617905286 +0.1694261384962109 0 0.06202828346326914 +0.1612785453158829 0 0.06973640035297668 +0.1650507578172228 0 0.07752581015620877 +0.1665676635180299 0 0.07223735316763083 +0.1580824067195293 0 0.08029359477065909 +0.1616193443154271 0 0.0888795969572243 +0.163335051066325 0 0.08320270355671655 +0.1544434690764055 0 0.09160399451127332 +0.1577381610653084 0 0.1010497433149484 +0.1596787526903677 0 0.09496467013608637 +0.1503026178218243 0 0.1036986613125482 +0.1533497835931464 0 0.1140727067780053 +0.1555439723292274 0 0.1075612250464768 +0.1455951751840037 0 0.1166033316254358 +0.1483918052078803 0 0.1279802683922012 +0.1508707944005133 0 0.1210264875851032 +0.1402514769465706 0 0.1303362806132528 +0.145594675744796 0 0.1353889073369564 +0.1657194602906118 0 0.002430125317902378 +0.1710429604847559 0 0.005034283668102182 +0.171477998626317 0 0.002517141834051091 +0.1648714125525685 0 0.007483909437247147 +0.1700497098664923 0 0.01046971878917389 +0.1705463351756241 0 0.007752001228638038 +0.1638916439190481 0 0.01293902064861005 +0.1689146067177825 0 0.016336178072296 +0.1694821582921374 0 0.01340294843073495 +0.1627591431167187 0 0.01882463979443536 +0.1676161135958598 0 0.02266505228707688 +0.1682653601568211 0 0.01950061517968644 +0.1614496195911084 0 0.02517117295145828 +0.1661294333930557 0 0.0294891015770066 +0.1668727734944577 0 0.02607707693204174 +0.1599350497330755 0 0.03201001117089343 +0.1644260727302814 0 0.03684222100802368 +0.1652777530616685 0 0.03316566129251515 +0.1581831871134368 0 0.03937318014996038 +0.1624733751359673 0 0.04475909632634315 +0.1634497239331243 0 0.04080065866718341 +0.1561570464807721 0 0.04729284985134303 +0.1602340356588488 0 0.05327471986461198 +0.161353705397408 0 0.04901690809547757 +0.1538143786716152 0 0.05580066808930629 +0.1576656163096132 0 0.06242373169311726 +0.158949825984231 0 0.05784922577886462 +0.1511071641469463 0 0.06492687570423131 +0.154720093153216 0 0.07223954436409072 +0.1561928547314146 0 0.06733163802860401 +0.1479811675801913 0 0.07469915479144659 +0.1513434811465045 0 0.08275320519801496 +0.1530317871498603 0 0.07749637478105284 +0.1443756159617843 0 0.08514115676428792 +0.1474756038916853 0 0.09399194607754628 +0.1494095425190949 0 0.08837257563778063 +0.1402230899121132 0 0.09627065412391639 +0.1430501038422521 0 0.1059773693589183 +0.1452628538669687 0 0.0999846577182323 +0.1354497536028641 0 0.1080972624630681 +0.1379948249446157 0 0.1187232247295856 +0.1405224643934339 0 0.112350297044252 +0.1299760946312278 0 0.1206196907495156 +0.1351137857889061 0 0.125477985681391 +0.1546453481255934 0 0.002262785864057359 +0.1598287885004385 0 0.004692911181959736 +0.1601824042081067 0 0.002346455590979868 +0.1539580998346495 0 0.006968348300841577 +0.1590007238867795 0 0.009759346556128987 +0.159414756193609 0 0.007226128869044363 +0.1531406547584782 0 0.0120468518383622 +0.1580315747907468 0 0.01522652593084326 +0.1585161493387632 0 0.01249293624348612 +0.1521702642116146 0 0.01752468713272145 +0.1568978325375865 0 0.02112280099631354 +0.1574647036641666 0 0.01817466346357841 +0.1510204774871784 0 0.02342904991486384 +0.1555722645407003 0 0.02747742187000857 +0.1562350485391434 0 0.02430011143316106 +0.149660620272642 0 0.02978760709466491 +0.1540234054650173 0 0.03432019639554976 +0.1547978350028588 0 0.03089880913277917 +0.1480552317083392 0 0.03662802916001087 +0.1522150133567587 0 0.04168101291442149 +0.153119209410888 0 0.03800060465498562 +0.1461634716582354 0 0.04397735323369616 +0.1501055047822488 0 0.04958919017061771 +0.1511602590695038 0 0.0456351015425196 +0.1439385184719921 0 0.05186113407768438 +0.1476473923613585 0 0.05807261199637297 +0.1488764485718037 0 0.05383090108349534 +0.1413269899628272 0 0.06030233278068022 +0.144786761748415 0 0.06715659648853856 +0.1462170770548867 0 0.06261460424245575 +0.1382684376551857 0 0.06931988558989519 +0.1414628434869619 0 0.07686244389280322 +0.1431248026176885 0 0.07200952019067089 +0.1346949879835668 0 0.07892688971054139 +0.1376077604583892 0 0.08720560258202609 +0.1395353019726756 0 0.08203402323741465 +0.1305312361694052 0 0.08912833953171757 +0.1331465656231293 0 0.09819339107360787 +0.1353771630407592 0 0.09269949682781697 +0.1256945405608144 0 0.09991834982097889 +0.1279977285405492 0 0.1098222212104391 +0.1305721470818393 0 0.1040078061420235 +0.1200959193449661 0 0.1112768158965683 +0.1250360069880968 0 0.1159482533230418 +0.1439971633491945 0 0.002101882543016711 +0.1490459308314798 0 0.00436466840707407 +0.149321255737397 0 0.002182334203537035 +0.1434645299112641 0 0.006472616438802776 +0.1483766989144338 0 0.009076296332570283 +0.1487113148729568 0 0.006720482369822176 +0.1428031651787311 0 0.01118899721293289 +0.1475671210227755 0 0.0141595527187248 +0.1479719099686047 0 0.01161792452564754 +0.141988649877541 0 0.01627473265002595 +0.1465917930663801 0 0.01963986706402259 +0.1470794570445778 0 0.0168997098913737 +0.1409924562311896 0 0.0217539316100732 +0.1454211406519878 0 0.02554311446091445 +0.1460064668591839 0 0.02259149076246852 +0.1397813611738931 0 0.02765068009781559 +0.1440208407945474 0 0.03189517273156605 +0.1447209907232676 0 0.02871914359624025 +0.1383168130474431 0 0.03398846089985638 +0.142351203961235 0 0.0387213173283012 +0.1431860223778911 0 0.03530824502993363 +0.1365542650959825 0 0.0407893757160183 +0.1403665327929829 0 0.04604541162141326 +0.141358868377109 0 0.04238336447485723 +0.1344424990471794 0 0.04807312060412776 +0.1380144847261887 0 0.05388884306039888 +0.1391905087595858 0 0.04996712734090607 +0.1319229763221715 0 0.05585565689166048 +0.1352354815588101 0 0.06226914661194182 +0.1366249831424994 0 0.05807899483617035 +0.1289292742636901 0 0.06414751135648286 +0.1319622303600656 0 0.07119825033443622 +0.1335988559594379 0 0.06673369847318902 +0.1253866918486026 0 0.07295163292676282 +0.1281194494721037 0 0.08068027230286798 +0.1300408399160847 0 0.07593926131865211 +0.1212121460301187 0 0.08226072934538251 +0.1236239327274201 0 0.09070879657423209 +0.1258716910997619 0 0.08569453443855005 +0.1163145280182985 0 0.09205401074029666 +0.1183851358516927 0 0.1012635639870434 +0.1210045342895564 0 0.09598618028063777 +0.1105957507983711 0 0.1022932823821197 +0.1153458350716681 0 0.1067850491393434 +0.1337585241207171 0 0.001947167810938451 +0.1386777984461906 0 0.004049050353955162 +0.1388778437349659 0 0.002024525176977581 +0.1333745588109803 0 0.005995951185892216 +0.1381612902760537 0 0.008419517270739829 +0.1384195443611221 0 0.006234283812347496 +0.1328632713322445 0 0.01036413699452967 +0.1375051462349218 0 0.01313361693672273 +0.1378332182554878 0 0.01077656710373128 +0.1321986360752696 0 0.01507285333734601 +0.1366821397178888 0 0.01821396905064922 +0.1370936429764053 0 0.01567379299368598 +0.1313501280812167 0 0.02014324092917916 +0.1356604445945175 0 0.02368320348860313 +0.1361712921562032 0 0.02094858626962618 +0.1302820735600125 0 0.02559594259674921 +0.1344029901393881 0 0.02956341920596167 +0.1350317173669528 0 0.0266233113472824 +0.1289529489317673 0 0.03145041449080241 +0.1328667718398223 0 0.03587545618469712 +0.1336348809896052 0 0.0327194376953294 +0.1273146433830955 0 0.03772401271214072 +0.1310021366392556 0 0.04263793224346191 +0.131934454239539 0 0.03925669421407951 +0.1253117111205091 0 0.04443079994921664 +0.1287520735284329 0 0.0498659883098825 +0.1298771050838443 0 0.04625196027667219 +0.1228806554958279 0 0.0515800069898493 +0.1260515582895665 0 0.05756967557162727 +0.1274018159089997 0 0.05371783194075489 +0.1199493094462778 0 0.05917407458367248 +0.1228270254204013 0 0.06575191036852807 +0.1244392918549839 0 0.06166079297007767 +0.1164364070856062 0 0.06720619370013833 +0.1189960735138075 0 0.07440591625837309 +0.1209115494671044 0 0.07007891331345058 +0.1122514824167909 0 0.07565725799920489 +0.1144675549331021 0 0.08351207108621429 +0.1167318142234548 0 0.0789589936722937 +0.107295285170979 0 0.08449214622456717 +0.1091422582561754 0 0.09303408587864954 +0.1118049065946387 0 0.08827307848243192 +0.1014609733315135 0 0.09365526937023905 +0.1060283620649428 0 0.09797427587617988 +0.1239136787053922 0 0.001798403645428638 +0.1287084403716337 0 0.003745571456367089 +0.1288361014130595 0 0.001872785728183544 +0.1236726635189673 0 0.005537619211785864 +0.1283387819583139 0 0.007787998941310991 +0.1285236111649738 0 0.00576678519883904 +0.1233056810920091 0 0.009571002168875666 +0.1278301704659396 0 0.01214714022209435 +0.1280844762121268 0 0.009967569581702669 +0.1227851612622137 0 0.01391720015168881 +0.1271536268715437 0 0.01684291326694046 +0.1274918986687417 0 0.01449502674451741 +0.122078658703112 0 0.01859449988933796 +0.1262751599127851 0 0.02189482755157665 +0.1267143933921644 0 0.01936887040925856 +0.1211481431589669 0 0.0236202334604451 +0.1251550568061943 0 0.02732134850561766 +0.1257151083594897 0 0.02460808802859716 +0.1199492334328869 0 0.02900998525050801 +0.1237471255584599 0 0.03313905123569275 +0.1244510911823271 0 0.0302301998706552 +0.1184303917330919 0 0.03477654828434566 +0.1219979095577274 0 0.03936150976079363 +0.1228725175580937 0 0.03625028049824319 +0.1165321073419043 0 0.04092856854908768 +0.1198459089046859 0 0.04599785873751069 +0.1209219092312067 0 0.04267968424915216 +0.1141861162367981 0 0.04746880515980422 +0.1172208628279401 0 0.05305095341214282 +0.118533385866313 0 0.04952440607482676 +0.1113147278881653 0 0.05439192383897977 +0.114043174506503 0 0.06051504501050942 +0.1156320186672216 0 0.05678299921132612 +0.1078303640413663 0 0.06168173290345195 +0.1102235966204695 0 0.06837288159308086 +0.1121333855634862 0 0.06444396330179514 +0.1036354597087693 0 0.06930776631805569 +0.1056633455050908 0 0.0765921427241797 +0.1079434710627801 0 0.0724825121586303 +0.09862293627640986 0 0.07722112264930854 +0.100254875942298 0 0.08512112614969601 +0.1029591107236944 0 0.08085663443693786 +0.09267753345658414 0 0.08534948762525663 +0.0970692533940532 0 0.08950237849775221 +0.119122519156643 0 0.003453764824392074 +0.1191865654073047 0 0.001726968985389254 +0.1188940624324153 0 0.007180769779067061 +0.119015266003612 0 0.005317578223631684 +0.1185273091598445 0 0.01119860492061117 +0.1187188055781919 0 0.009190314100479637 +0.1179915952985987 0 0.01552459039944089 +0.1182688916298841 0 0.01336266050119089 +0.1172508477287396 0 0.02017523530632866 +0.117632176707406 0 0.01785156879064313 +0.1162628132263679 0 0.02516551129612148 +0.1167695188181847 0 0.02267282598728501 +0.1149782349129514 0 0.03050789263377713 +0.1156351827916962 0 0.02784021391863868 +0.1133399989119379 0 0.03621110353092657 +0.1141759997679151 0 0.03336440562874898 +0.1112822890835826 0 0.04227850338355497 +0.1123305148401071 0 0.03925153477189071 +0.1087298095087964 0 0.04870602826357509 +0.11002817125831 0 0.04550136239577765 +0.1055971640216644 0 0.05547959755641889 +0.1071886052193058 0 0.05210495458069284 +0.1017885226938503 0 0.062571886728993 +0.1037211602396075 0 0.05904177559340357 +0.0971977595259354 0 0.0699383654603167 +0.09952477751601024 0 0.06627609601917578 +0.09170931603451396 0 0.07751251103407733 +0.09448848089861292 0 0.07375261961393288 +0.08849275536682659 0 0.08139125172105677 +2 5 0 1073 +2357 +2358 +2359 +2360 +2361 +2362 +2363 +2364 +2365 +2366 +2367 +2368 +2369 +2370 +2371 +2372 +2373 +2374 +2375 +2376 +2377 +2378 +2379 +2380 +2381 +2382 +2383 +2384 +2385 +2386 +2387 +2388 +2389 +2390 +2391 +2392 +2393 +2394 +2395 +2396 +2397 +2398 +2399 +2400 +2401 +2402 +2403 +2404 +2405 +2406 +2407 +2408 +2409 +2410 +2411 +2412 +2413 +2414 +2415 +2416 +2417 +2418 +2419 +2420 +2421 +2422 +2423 +2424 +2425 +2426 +2427 +2428 +2429 +2430 +2431 +2432 +2433 +2434 +2435 +2436 +2437 +2438 +2439 +2440 +2441 +2442 +2443 +2444 +2445 +2446 +2447 +2448 +2449 +2450 +2451 +2452 +2453 +2454 +2455 +2456 +2457 +2458 +2459 +2460 +2461 +2462 +2463 +2464 +2465 +2466 +2467 +2468 +2469 +2470 +2471 +2472 +2473 +2474 +2475 +2476 +2477 +2478 +2479 +2480 +2481 +2482 +2483 +2484 +2485 +2486 +2487 +2488 +2489 +2490 +2491 +2492 +2493 +2494 +2495 +2496 +2497 +2498 +2499 +2500 +2501 +2502 +2503 +2504 +2505 +2506 +2507 +2508 +2509 +2510 +2511 +2512 +2513 +2514 +2515 +2516 +2517 +2518 +2519 +2520 +2521 +2522 +2523 +2524 +2525 +2526 +2527 +2528 +2529 +2530 +2531 +2532 +2533 +2534 +2535 +2536 +2537 +2538 +2539 +2540 +2541 +2542 +2543 +2544 +2545 +2546 +2547 +2548 +2549 +2550 +2551 +2552 +2553 +2554 +2555 +2556 +2557 +2558 +2559 +2560 +2561 +2562 +2563 +2564 +2565 +2566 +2567 +2568 +2569 +2570 +2571 +2572 +2573 +2574 +2575 +2576 +2577 +2578 +2579 +2580 +2581 +2582 +2583 +2584 +2585 +2586 +2587 +2588 +2589 +2590 +2591 +2592 +2593 +2594 +2595 +2596 +2597 +2598 +2599 +2600 +2601 +2602 +2603 +2604 +2605 +2606 +2607 +2608 +2609 +2610 +2611 +2612 +2613 +2614 +2615 +2616 +2617 +2618 +2619 +2620 +2621 +2622 +2623 +2624 +2625 +2626 +2627 +2628 +2629 +2630 +2631 +2632 +2633 +2634 +2635 +2636 +2637 +2638 +2639 +2640 +2641 +2642 +2643 +2644 +2645 +2646 +2647 +2648 +2649 +2650 +2651 +2652 +2653 +2654 +2655 +2656 +2657 +2658 +2659 +2660 +2661 +2662 +2663 +2664 +2665 +2666 +2667 +2668 +2669 +2670 +2671 +2672 +2673 +2674 +2675 +2676 +2677 +2678 +2679 +2680 +2681 +2682 +2683 +2684 +2685 +2686 +2687 +2688 +2689 +2690 +2691 +2692 +2693 +2694 +2695 +2696 +2697 +2698 +2699 +2700 +2701 +2702 +2703 +2704 +2705 +2706 +2707 +2708 +2709 +2710 +2711 +2712 +2713 +2714 +2715 +2716 +2717 +2718 +2719 +2720 +2721 +2722 +2723 +2724 +2725 +2726 +2727 +2728 +2729 +2730 +2731 +2732 +2733 +2734 +2735 +2736 +2737 +2738 +2739 +2740 +2741 +2742 +2743 +2744 +2745 +2746 +2747 +2748 +2749 +2750 +2751 +2752 +2753 +2754 +2755 +2756 +2757 +2758 +2759 +2760 +2761 +2762 +2763 +2764 +2765 +2766 +2767 +2768 +2769 +2770 +2771 +2772 +2773 +2774 +2775 +2776 +2777 +2778 +2779 +2780 +2781 +2782 +2783 +2784 +2785 +2786 +2787 +2788 +2789 +2790 +2791 +2792 +2793 +2794 +2795 +2796 +2797 +2798 +2799 +2800 +2801 +2802 +2803 +2804 +2805 +2806 +2807 +2808 +2809 +2810 +2811 +2812 +2813 +2814 +2815 +2816 +2817 +2818 +2819 +2820 +2821 +2822 +2823 +2824 +2825 +2826 +2827 +2828 +2829 +2830 +2831 +2832 +2833 +2834 +2835 +2836 +2837 +2838 +2839 +2840 +2841 +2842 +2843 +2844 +2845 +2846 +2847 +2848 +2849 +2850 +2851 +2852 +2853 +2854 +2855 +2856 +2857 +2858 +2859 +2860 +2861 +2862 +2863 +2864 +2865 +2866 +2867 +2868 +2869 +2870 +2871 +2872 +2873 +2874 +2875 +2876 +2877 +2878 +2879 +2880 +2881 +2882 +2883 +2884 +2885 +2886 +2887 +2888 +2889 +2890 +2891 +2892 +2893 +2894 +2895 +2896 +2897 +2898 +2899 +2900 +2901 +2902 +2903 +2904 +2905 +2906 +2907 +2908 +2909 +2910 +2911 +2912 +2913 +2914 +2915 +2916 +2917 +2918 +2919 +2920 +2921 +2922 +2923 +2924 +2925 +2926 +2927 +2928 +2929 +2930 +2931 +2932 +2933 +2934 +2935 +2936 +2937 +2938 +2939 +2940 +2941 +2942 +2943 +2944 +2945 +2946 +2947 +2948 +2949 +2950 +2951 +2952 +2953 +2954 +2955 +2956 +2957 +2958 +2959 +2960 +2961 +2962 +2963 +2964 +2965 +2966 +2967 +2968 +2969 +2970 +2971 +2972 +2973 +2974 +2975 +2976 +2977 +2978 +2979 +2980 +2981 +2982 +2983 +2984 +2985 +2986 +2987 +2988 +2989 +2990 +2991 +2992 +2993 +2994 +2995 +2996 +2997 +2998 +2999 +3000 +3001 +3002 +3003 +3004 +3005 +3006 +3007 +3008 +3009 +3010 +3011 +3012 +3013 +3014 +3015 +3016 +3017 +3018 +3019 +3020 +3021 +3022 +3023 +3024 +3025 +3026 +3027 +3028 +3029 +3030 +3031 +3032 +3033 +3034 +3035 +3036 +3037 +3038 +3039 +3040 +3041 +3042 +3043 +3044 +3045 +3046 +3047 +3048 +3049 +3050 +3051 +3052 +3053 +3054 +3055 +3056 +3057 +3058 +3059 +3060 +3061 +3062 +3063 +3064 +3065 +3066 +3067 +3068 +3069 +3070 +3071 +3072 +3073 +3074 +3075 +3076 +3077 +3078 +3079 +3080 +3081 +3082 +3083 +3084 +3085 +3086 +3087 +3088 +3089 +3090 +3091 +3092 +3093 +3094 +3095 +3096 +3097 +3098 +3099 +3100 +3101 +3102 +3103 +3104 +3105 +3106 +3107 +3108 +3109 +3110 +3111 +3112 +3113 +3114 +3115 +3116 +3117 +3118 +3119 +3120 +3121 +3122 +3123 +3124 +3125 +3126 +3127 +3128 +3129 +3130 +3131 +3132 +3133 +3134 +3135 +3136 +3137 +3138 +3139 +3140 +3141 +3142 +3143 +3144 +3145 +3146 +3147 +3148 +3149 +3150 +3151 +3152 +3153 +3154 +3155 +3156 +3157 +3158 +3159 +3160 +3161 +3162 +3163 +3164 +3165 +3166 +3167 +3168 +3169 +3170 +3171 +3172 +3173 +3174 +3175 +3176 +3177 +3178 +3179 +3180 +3181 +3182 +3183 +3184 +3185 +3186 +3187 +3188 +3189 +3190 +3191 +3192 +3193 +3194 +3195 +3196 +3197 +3198 +3199 +3200 +3201 +3202 +3203 +3204 +3205 +3206 +3207 +3208 +3209 +3210 +3211 +3212 +3213 +3214 +3215 +3216 +3217 +3218 +3219 +3220 +3221 +3222 +3223 +3224 +3225 +3226 +3227 +3228 +3229 +3230 +3231 +3232 +3233 +3234 +3235 +3236 +3237 +3238 +3239 +3240 +3241 +3242 +3243 +3244 +3245 +3246 +3247 +3248 +3249 +3250 +3251 +3252 +3253 +3254 +3255 +3256 +3257 +3258 +3259 +3260 +3261 +3262 +3263 +3264 +3265 +3266 +3267 +3268 +3269 +3270 +3271 +3272 +3273 +3274 +3275 +3276 +3277 +3278 +3279 +3280 +3281 +3282 +3283 +3284 +3285 +3286 +3287 +3288 +3289 +3290 +3291 +3292 +3293 +3294 +3295 +3296 +3297 +3298 +3299 +3300 +3301 +3302 +3303 +3304 +3305 +3306 +3307 +3308 +3309 +3310 +3311 +3312 +3313 +3314 +3315 +3316 +3317 +3318 +3319 +3320 +3321 +3322 +3323 +3324 +3325 +3326 +3327 +3328 +3329 +3330 +3331 +3332 +3333 +3334 +3335 +3336 +3337 +3338 +3339 +3340 +3341 +3342 +3343 +3344 +3345 +3346 +3347 +3348 +3349 +3350 +3351 +3352 +3353 +3354 +3355 +3356 +3357 +3358 +3359 +3360 +3361 +3362 +3363 +3364 +3365 +3366 +3367 +3368 +3369 +3370 +3371 +3372 +3373 +3374 +3375 +3376 +3377 +3378 +3379 +3380 +3381 +3382 +3383 +3384 +3385 +3386 +3387 +3388 +3389 +3390 +3391 +3392 +3393 +3394 +3395 +3396 +3397 +3398 +3399 +3400 +3401 +3402 +3403 +3404 +3405 +3406 +3407 +3408 +3409 +3410 +3411 +3412 +3413 +3414 +3415 +3416 +3417 +3418 +3419 +3420 +3421 +3422 +3423 +3424 +3425 +3426 +3427 +3428 +3429 +0.2308386656655639 0 0.1654907022446148 +0.273569850906479 0 0.1676399321452352 +0.3163010361474277 0 0.1697891620458578 +0.3590322213883249 0 0.1719383919464773 +0.4017634066292489 0 0.1740876218470986 +0.4444945918701292 0 0.176236851747717 +0.4872257771110703 0 0.178386081648339 +0.5299569623520008 0 0.1805353115489604 +0.5726881475929616 0 0.1826845414495833 +0.6154193328337061 0 0.1848337713501954 +0.6581505180744123 0 0.1869830012508056 +0.7008817033151522 0 0.1891322311514177 +0.7436128885558198 0 0.1912814610520256 +0.7863440737964847 0 0.1934306909526336 +0.8290752590371993 0 0.1955799208532443 +0.8718064442779155 0 0.197729150753855 +0.9145376295185773 0 0.1998783806544625 +0.9572688147592825 0 0.2020276105550722 +0.235183579385546 0 0.1469041268880781 +0.2776733805309088 0 0.1488119726942966 +0.3201631816762946 0 0.1507198185005172 +0.362652982821642 0 0.1526276643067348 +0.4051427839670059 0 0.154535510112954 +0.4476325851123374 0 0.1564433559191709 +0.4901223862577222 0 0.1583512017253908 +0.5326121874030972 0 0.1602590475316102 +0.5751019885485007 0 0.162166893337831 +0.6175917896936922 0 0.164074739144042 +0.6600815908388411 0 0.1659825849502515 +0.7025713919840206 0 0.1678904307564627 +0.7450611931291379 0 0.1697982765626702 +0.7875509942742498 0 0.1717061223688776 +0.8300407954194072 0 0.1736139681750875 +0.8725305965645653 0 0.1755218139812975 +0.9150203977096802 0 0.1774296597875045 +0.9575101988548382 0 0.1793375055937134 +0.2392066476391895 0 0.1296943349151453 +0.2814729449926852 0 0.1313786769304696 +0.3237392423461941 0 0.1330630189457956 +0.3660055396996769 0 0.1347473609611192 +0.4082718370531665 0 0.1364317029764441 +0.450538134406634 0 0.138116044991767 +0.4928044317601484 0 0.1398003870070924 +0.5350707291136532 0 0.1414847290224174 +0.5773370264671852 0 0.1431690710377438 +0.6196033238205091 0 0.1448534130530614 +0.6618696211737864 0 0.1465377550683777 +0.7041359185270915 0 0.1482220970836955 +0.7464022158803438 0 0.1499064390990101 +0.7886685132335882 0 0.1515907811143246 +0.8309348105868741 0 0.1532751231296413 +0.8732011079401598 0 0.154959465144958 +0.9154674052934124 0 0.1566438071602722 +0.9577337026467083 0 0.158328149175588 +0.242931710826261 0 0.1137593423934983 +0.2849910602249212 0 0.1152367364548004 +0.3270504096235856 0 0.116714130516104 +0.3691097590222353 0 0.1181915245774053 +0.4111691084208827 0 0.119668918638708 +0.4532284578195179 0 0.1211463127000088 +0.4952878072181936 0 0.1226237067613119 +0.5373471566168602 0 0.1241011008226146 +0.5794065060155524 0 0.1255784948839184 +0.6214658554140404 0 0.1270558889452146 +0.6635252048124783 0 0.1285332830065097 +0.7055845542109409 0 0.1300106770678061 +0.7476439036093596 0 0.1314880711290996 +0.7897032530077679 0 0.1329654651903931 +0.8317626024062146 0 0.1344428592516884 +0.8738219518046602 0 0.1359202533129839 +0.915881301203082 0 0.137397647374277 +0.9579406506015467 0 0.1388750414355717 +0.2463808434020529 0 0.0990047197088523 +0.2882485743242819 0 0.1002904952943976 +0.3301163052465069 0 0.1015762708799442 +0.3719840361687274 0 0.1028620464654889 +0.4138517670909375 0 0.1041478220510347 +0.4557194980131444 0 0.1054335976365789 +0.4975872289353858 0 0.1067193732221251 +0.5394549598576184 0 0.1080051488076709 +0.5813226907798761 0 0.1092909243932178 +0.6231904217019324 0 0.110576699978758 +0.6650581526239352 0 0.1118624755642972 +0.7069258835459602 0 0.1131482511498375 +0.7487936144679497 0 0.1144340267353753 +0.7906613453899263 0 0.1157198023209132 +0.832529076311938 0 0.1170055779064526 +0.8743968072339479 0 0.1182913534919921 +0.9162645381559427 0 0.1195771290775297 +0.9581322690779809 0 0.1208629046630685 +0.2495744846815978 0 0.0853430320135824 +0.2912647910882979 0 0.08645138308414894 +0.3329550974949866 0 0.08755973415471667 +0.3746454039016803 0 0.08866808522528269 +0.4163357103083562 0 0.08977643629584971 +0.4580260167150368 0 0.09088478736641525 +0.4997163231217469 0 0.09199313843698262 +0.5414066295284485 0 0.09310148950754968 +0.5830969359351738 0 0.09420984057811752 +0.6247872423417009 0 0.09531819164867972 +0.6664775487481716 0 0.09642654271924103 +0.7081678551546621 0 0.09753489378980332 +0.7498581615611245 0 0.09864324486036344 +0.7915484679675718 0 0.09975159593092356 +0.8332387743740512 0 0.1008599470014851 +0.8749290807805286 0 0.1019682980720467 +0.9166193871869984 0 0.1030766491426066 +0.9583096935935118 0 0.1041850002131676 +0.2525315599329583 0 0.07269332121654665 +0.294057584381251 0 0.07363739032914735 +0.3355836088295252 0 0.07458145944174903 +0.3771096332778132 0 0.07552552855434927 +0.4186356577260764 0 0.07646959766695031 +0.460161682174352 0 0.07741366677955018 +0.5016877066226522 0 0.07835773589215156 +0.5432137310709438 0 0.07930180500475267 +0.5847397555192586 0 0.08024587411735448 +0.6262657799673778 0 0.08118994322995143 +0.6677918044154376 0 0.08213401234254766 +0.7093178288635152 0 0.08307808145514473 +0.7508438533115718 0 0.08402215056773991 +0.7923698777596111 0 0.08496621968033513 +0.8338959022076802 0 0.08591028879293154 +0.8754219266557458 0 0.08685435790552801 +0.9169479511038121 0 0.08779842701812304 +0.9584739755519215 0 0.08874249613071897 +0.2552695925822189 0 0.06098062599531678 +0.2966435041055541 0 0.06177258218355797 +0.3380174156288641 0 0.06256453837179997 +0.3793913271521961 0 0.06335649456004079 +0.4207652386754969 0 0.06414845074828228 +0.462139150198817 0 0.06494040693652274 +0.5035130617221573 0 0.06573236312476449 +0.5448869732454896 0 0.06652431931300599 +0.5862608847688435 0 0.06731627550124811 +0.6276347962920047 0 0.06810823168948618 +0.6690087078151041 0 0.06890018787772359 +0.7103826193382189 0 0.06969214406596172 +0.7517565308613194 0 0.07048410025419828 +0.7931304423844008 0 0.07127605644243487 +0.8345043539075094 0 0.07206801263067246 +0.8758782654306139 0 0.07285996881891008 +0.9172521769537256 0 0.0736519250071465 +0.9586260884768811 0 0.0744438811953837 +0.2578048080204927 0 0.05013553773176588 +0.2990378742417027 0 0.05078664861804898 +0.3402709404628814 0 0.05143775950433273 +0.38150400668409 0 0.05208887039061547 +0.4227370729052613 0 0.05273998127689882 +0.4639701391264584 0 0.05339109216318129 +0.5052032053476713 0 0.0540422030494648 +0.5464362715688765 0 0.05469331393574817 +0.5876693377901029 0 0.05534442482203201 +0.6289024040111386 0 0.0559955357083125 +0.6701354702321102 0 0.05664664659459248 +0.7113685364530953 0 0.05729775748087303 +0.7526016026740721 0 0.05794886836715234 +0.793834668895028 0 0.05859997925343161 +0.8350677351160085 0 0.05925109013971171 +0.8763008013369848 0 0.05990220102599188 +0.9175338675579747 0 0.06055331191227102 +0.9587669337790082 0 0.06120442279855081 +0.2601522297227458 0 0.04009378933883027 +0.3012548836271652 0 0.04061448790835123 +0.3423575375315477 0 0.0411351864778727 +0.3834601914359669 0 0.04165588504739341 +0.4245628453403434 0 0.04217658361691454 +0.4656654992447517 0 0.04269728218643502 +0.5067681531491719 0 0.04321798075595631 +0.5478708070535846 0 0.04373867932547749 +0.5889734609580176 0 0.04425937789499903 +0.6300761148622622 0 0.04478007646451793 +0.6711787687664409 0 0.04530077503403639 +0.7122814226706309 0 0.04582147360355532 +0.753384076574818 0 0.04634217217307322 +0.7944867304789829 0 0.04686287074259112 +0.8355893843831705 0 0.04738356931210971 +0.876692038287353 0 0.04790426788162831 +0.9177946921915552 0 0.04842496645114612 +0.9588973460958009 0 0.04894566502066444 +0.26232576832531 0 0.03079587420576961 +0.3033076700851436 0 0.03119582063082808 +0.344289571844935 0 0.03159576705588696 +0.3852714736047698 0 0.03199571348094526 +0.4262533753645563 0 0.03239565990600389 +0.4672352771243806 0 0.032795606331062 +0.5082171788842134 0 0.03319555275612075 +0.5491990806440386 0 0.0335954991811794 +0.5901809824038833 0 0.03399544560623835 +0.6311628841635417 0 0.03439539203129523 +0.6721447859231322 0 0.03479533845635181 +0.7131266876827322 0 0.03519528488140873 +0.7541085894423346 0 0.03559523130646489 +0.7950904912019136 0 0.03599517773152103 +0.8360723929615129 0 0.03639512415657769 +0.8770542947211069 0 0.03679507058163436 +0.9180361964807257 0 0.03719501700669043 +0.9590180982403882 0 0.03759496343174691 +0.2643383040529528 0 0.02218669359314949 +0.3052083982723627 0 0.02247483247785191 +0.3460784924917257 0 0.02276297136255464 +0.3869485867111381 0 0.02305111024725691 +0.4278186809304976 0 0.02333924913195946 +0.4686887751498998 0 0.02362738801666162 +0.5095588693693071 0 0.02391552690136424 +0.5504289635887072 0 0.02420366578606678 +0.5912990578081261 0 0.02449180467076954 +0.6321691520273609 0 0.02477994355547082 +0.6730392462465254 0 0.02506808244017188 +0.713909340465698 0 0.02535622132487318 +0.7547794346848782 0 0.02564436020957393 +0.795649528904033 0 0.02593249909427468 +0.8365196231232065 0 0.02622063797897579 +0.877389717342374 0 0.02650877686367691 +0.9182598115615721 0 0.0267969157483776 +0.9591299057808134 0 0.02708505463307858 +0.2662017630720689 0 0.01421523001150099 +0.3069683317904178 0 0.01439984339526185 +0.3477349005087151 0 0.0145844567790229 +0.3885014692270675 0 0.01476907016278367 +0.4292680379453627 0 0.01495368354654461 +0.4700346066637053 0 0.01513829693030531 +0.5108011753820499 0 0.0153229103140663 +0.5515677441003876 0 0.01550752369782724 +0.5923343128187434 0 0.01569213708158832 +0.6331008815369167 0 0.01587675046534845 +0.673867450255018 0 0.01606136384910843 +0.7146340189731264 0 0.01624597723286857 +0.7554005876912462 0 0.01643059061662836 +0.7961671564093397 0 0.01661520400038816 +0.8369337251274501 0 0.01679981738414817 +0.877700293845554 0 0.01698443076790821 +0.9184668625636935 0 0.01716904415166796 +0.9592334312818759 0 0.01735365753542789 +0.2679271881048057 0 0.00683424514912489 +0.3085978998768922 0 0.006923001586504279 +0.349268611648923 0 0.007011758023883755 +0.3899393234210141 0 0.007100514461263099 +0.4306100351930442 0 0.007189270898642523 +0.4712807469651258 0 0.00727802733602183 +0.5119514587372065 0 0.007366783773401279 +0.5526221705092804 0 0.007455540210780702 +0.5932928822813722 0 0.007544296648160195 +0.633963594053283 0 0.007633053085539231 +0.6746343058251201 0 0.007721809522918196 +0.7153050175969629 0 0.00781056596029724 +0.7559757293688214 0 0.007899322397676108 +0.7966464411406523 0 0.007988078835054983 +0.8373171529124985 0 0.008076835272433965 +0.8779878646843382 0 0.008165591709812953 +0.9186585764562174 0 0.008254348147191806 +0.9593292882281395 0 0.008343104584570746 +0.2094730730451157 0 0.1644160872943051 +0.228492412268446 0 0.1755274528871588 +0.2070616459425295 0 0.1743876642317117 +0.2522042582860214 0 0.166565317194925 +0.271353944920311 0 0.1778070301980545 +0.2499231785943785 0 0.1766672415426067 +0.2949354435269533 0 0.1687145470955465 +0.3142154775722151 0 0.1800866075089524 +0.2927847112462662 0 0.1789468188535037 +0.3376666287678763 0 0.1708637769961676 +0.3570770102240608 0 0.182366184819847 +0.3356462438981308 0 0.1812263961643993 +0.3803978140087869 0 0.1730130068967879 +0.3999385428759387 0 0.1846457621307436 +0.37850777655 0 0.1835059734752953 +0.4231289992496891 0 0.1751622367974078 +0.442800075527767 0 0.1869253394416371 +0.4213693092018543 0 0.1857855507861904 +0.4658601844905997 0 0.177311466698028 +0.4856616081796599 0 0.1892049167525344 +0.4642308418537164 0 0.1880651280970859 +0.5085913697315356 0 0.1794606965986497 +0.5285231408315422 0 0.1914844940634311 +0.5070923745056104 0 0.1903447054079832 +0.5513225549724812 0 0.1816099264992719 +0.5713846734834553 0 0.1937640713743294 +0.5499539071575024 0 0.1926242827188804 +0.5940537402133339 0 0.1837591563998894 +0.61424620613515 0 0.1960436486852161 +0.5928154398093373 0 0.1949038600297747 +0.6367849254540592 0 0.1859083863005005 +0.6571077387868085 0 0.1983232259961009 +0.6356769724609703 0 0.197183437340658 +0.6795161106947822 0 0.1880576162011116 +0.6999692714385026 0 0.2006028033069877 +0.6785385051126487 0 0.1994630146515439 +0.722247295935486 0 0.1902068461017216 +0.7428308040901188 0 0.2028823806178701 +0.7214000377643109 0 0.2017425919624289 +0.7649784811761522 0 0.1923560760023296 +0.7856923367417339 0 0.2051619579287525 +0.7642615704159522 0 0.2040221692733127 +0.8077096664168419 0 0.1945053059029389 +0.8285538693934008 0 0.2074415352396378 +0.8071231030675552 0 0.2063017465841945 +0.8504408516575575 0 0.1966545358035496 +0.87141540204507 0 0.2097211125505232 +0.8499846357192343 0 0.2085813238950804 +0.8931720368982464 0 0.1988037657041588 +0.9142769346966788 0 0.2120006898614051 +0.8928461683708664 0 0.2108609012059637 +0.9359032221389298 0 0.2009529956047673 +0.957138467348331 0 0.2142802671722893 +0.9357077010225112 0 0.2131404785168475 +0.9786344073796412 0 0.2031022255053775 +0.9785692336741639 0 0.2154200558277276 +0.2139386788128737 0 0.1459502039849692 +0.2330111225255549 0 0.1561974145663464 +0.2117058759289945 0 0.1551831456396379 +0.2564284799582274 0 0.1478580497911873 +0.2756216157186939 0 0.1582259524197659 +0.2543163691221245 0 0.1572116834930562 +0.2989182811036017 0 0.1497658955974069 +0.3182321089118612 0 0.1602544902731875 +0.2969268623152775 0 0.1592402213464767 +0.3414080822489683 0 0.151673741403626 +0.3608426021049835 0 0.162283028126606 +0.3395373555084223 0 0.1612687591998967 +0.383897883394324 0 0.1535815872098444 +0.4034530952981274 0 0.1643115659800263 +0.3821478487015554 0 0.1632972970533162 +0.4263876845396717 0 0.1554894330160625 +0.4460635884912333 0 0.1663401038334439 +0.4247583418946804 0 0.1653258349067351 +0.4688774856850298 0 0.1573972788222808 +0.4886740816843962 0 0.1683686416868649 +0.4673688350878147 0 0.1673543727601544 +0.5113672868304098 0 0.1593051246285005 +0.531284574877549 0 0.1703971795402853 +0.5099793282809727 0 0.1693829106135751 +0.5538570879757989 0 0.1612129704347206 +0.5738950680707311 0 0.1724257173937072 +0.55258982147414 0 0.1714114484669962 +0.5963468891210965 0 0.1631208162409365 +0.6165055612636992 0 0.1744542552471187 +0.5952003146672151 0 0.1734399863204129 +0.6388366902662667 0 0.1650286620471468 +0.6591160544566267 0 0.1764827931005285 +0.6378108078601629 0 0.1754685241738236 +0.6813264914114309 0 0.1669365078533571 +0.7017265476495864 0 0.1785113309539402 +0.6804213010531066 0 0.1774970620272344 +0.7238162925565792 0 0.1688443536595664 +0.7443370408424788 0 0.1805398688073479 +0.7230317942460326 0 0.179525599880644 +0.7663060937016939 0 0.1707521994657739 +0.7869475340353673 0 0.1825684066607556 +0.7656422874389232 0 0.1815541377340517 +0.8087958948468286 0 0.1726600452719825 +0.8295580272283032 0 0.1845969445141659 +0.8082527806318353 0 0.1835826755874607 +0.8512856959919863 0 0.1745678910781925 +0.8721685204212404 0 0.1866254823675763 +0.8508632738247719 0 0.1856112134408711 +0.8937754971371228 0 0.176475736884401 +0.9147790136141287 0 0.1886540202209835 +0.8934737670176847 0 0.1876397512942799 +0.9362652982822592 0 0.178383582690609 +0.9573895068070604 0 0.1906825580743928 +0.9360842602105945 0 0.1896682891476882 +0.9787550994274191 0 0.1802914284968185 +0.9786947534035302 0 0.1916968270010931 +0.2180734989624503 0 0.1288521639074835 +0.2371951135123678 0 0.1382992309016117 +0.2160060888876623 0 0.1374011839462252 +0.2603397963159373 0 0.1305365059228074 +0.279573162761797 0 0.1400953248123831 +0.2583841381370824 0 0.1391972778569974 +0.3026060936694396 0 0.1322208479381326 +0.3219512120112443 0 0.1418914187231564 +0.3007621873865207 0 0.1409933717677697 +0.3448723910229355 0 0.1339051899534574 +0.3643292612606595 0 0.143687512633927 +0.3431402366359519 0 0.1427894656785417 +0.3871386883764217 0 0.1355895319687817 +0.4067073105100862 0 0.1454836065446991 +0.3855182858853728 0 0.144585559589313 +0.4294049857299003 0 0.1372738739841055 +0.4490853597594857 0 0.1472797004554689 +0.427896335134786 0 0.146381653500084 +0.4716712830833912 0 0.1389582159994297 +0.4914634090089353 0 0.1490757943662416 +0.4702743843842105 0 0.1481777474108553 +0.5139375804369009 0 0.1406425580147549 +0.5338414582583753 0 0.1508718882770138 +0.5126524336336553 0 0.1499738413216277 +0.5562038777904192 0 0.1423269000300806 +0.5762195075078429 0 0.1526679821877874 +0.555030482883109 0 0.1517699352324006 +0.5984701751438471 0 0.1440112420454026 +0.6185975567571007 0 0.1544640760985517 +0.5974085321324718 0 0.1535660291431696 +0.6407364724971478 0 0.1456955840607196 +0.6609756060063138 0 0.1562601700093146 +0.6397865813817073 0 0.1553621230539332 +0.683002769850439 0 0.1473799260760366 +0.703353655255556 0 0.1580562639200791 +0.6821646306309349 0 0.1571582169646969 +0.7252690672037176 0 0.1490642680913528 +0.7457317045047409 0 0.1598523578308401 +0.7245426798801484 0 0.1589543108754596 +0.767535364556966 0 0.1507486101066673 +0.788109753753919 0 0.1616484517416011 +0.7669207291293298 0 0.1607504047862206 +0.8098016619102312 0 0.1524329521219829 +0.8304878030031406 0 0.1634445456523644 +0.8092987783785299 0 0.1625464986969827 +0.852067959263517 0 0.1541172941372997 +0.8728658522523626 0 0.1652406395631278 +0.8516768276277518 0 0.1643425926077461 +0.8943342566167861 0 0.1558016361526151 +0.9152439015015463 0 0.1670367334738884 +0.8940548768769544 0 0.1661386865185081 +0.9366005539700604 0 0.1574859781679301 +0.9576219507507733 0 0.1688328273846507 +0.9364329261261597 0 0.1679347804292696 +0.9788668513233542 0 0.1591703201832464 +0.9788109753753866 0 0.16973087434003 +0.2219020361269391 0 0.1130206453628476 +0.2410691792327253 0 0.1217268386543218 +0.2199877675446939 0 0.1209364046351687 +0.2639613855255911 0 0.1144980394241493 +0.2832320026088032 0 0.123307706692635 +0.2621505909207642 0 0.1225172726734784 +0.3060207349242534 0 0.1159754334854522 +0.3253948259848899 0 0.1248885747309498 +0.3043134142968465 0 0.1240981407117924 +0.3480800843229105 0 0.1174528275467547 +0.3675576493609561 0 0.1264694427692622 +0.346476237672923 0 0.125679008750106 +0.390139433721559 0 0.1189302216080567 +0.4097204727370246 0 0.1280503108075761 +0.3886390610489903 0 0.1272598767884192 +0.4321987831202003 0 0.1204076156693584 +0.451883296113076 0 0.1296311788458879 +0.4308018844250503 0 0.128840744826732 +0.4742581325188557 0 0.1218850097306603 +0.494046119489171 0 0.1312120468842021 +0.4729647078011234 0 0.130421612865045 +0.5163174819175269 0 0.1233624037919632 +0.5362089428652567 0 0.132792914922516 +0.5151275311772139 0 0.1320024809033591 +0.5583768313162063 0 0.1248397978532665 +0.5783717662413688 0 0.1343737829608311 +0.5572903545533128 0 0.1335833489416735 +0.6004361807147964 0 0.1263171919145665 +0.6205345896172747 0 0.135954650999138 +0.5994531779293217 0 0.1351642169799846 +0.6424955301132593 0 0.1277945859758622 +0.6626974129931325 0 0.1375355190374437 +0.6416160013052036 0 0.1367450850182909 +0.6845548795117096 0 0.1292719800371579 +0.7048602363690162 0 0.1391163870757508 +0.6837788246810743 0 0.1383259530565973 +0.7266142289101503 0 0.1307493740984528 +0.7470230597448517 0 0.1406972551140548 +0.7259416480569341 0 0.1399068210949028 +0.7686735783085638 0 0.1322267681597463 +0.7891858831206781 0 0.1422781231523589 +0.7681044714327648 0 0.1414876891332069 +0.8107329277069912 0 0.1337041622210408 +0.8313487064965444 0 0.1438589911906649 +0.8102672948086113 0 0.1430685571715118 +0.8527922771054374 0 0.1351815562823362 +0.87351152987241 0 0.145439859228971 +0.8524301181844772 0 0.1446494252098179 +0.8948516265038711 0 0.1366589503436305 +0.9156743532482472 0 0.1470207272672746 +0.8945929415603285 0 0.1462302932481228 +0.9369109759023143 0 0.1381363444049244 +0.9578371766241275 0 0.1486015953055799 +0.9367557649361874 0 0.1478111612864273 +0.9789703253007733 0 0.1396137384662194 +0.9789185883120638 0 0.149392029324734 +0.2254469779409462 0 0.09836183191607994 +0.244656277114157 0 0.1063820310511753 +0.2236745070339425 0 0.1056912386394642 +0.2673147088631674 0 0.09964760750162496 +0.2866198172746015 0 0.107763615874599 +0.2656380471943792 0 0.1070728234628871 +0.3091824397853944 0 0.1009333830871709 +0.3285833574350462 0 0.1091452006980241 +0.3076015873548239 0 0.1084544082863115 +0.3510501707076171 0 0.1022191586727166 +0.3705468975954814 0 0.1105267855214471 +0.3495651275152638 0 0.1098359931097356 +0.3929179016298325 0 0.1035049342582618 +0.4125104377559101 0 0.1119083703448714 +0.3915286676756958 0 0.1112175779331592 +0.4347856325520409 0 0.1047907098438068 +0.4544739779163312 0 0.1132899551682938 +0.4334922078361206 0 0.1125991627565826 +0.4766533634742651 0 0.106076485429352 +0.4964375180767897 0 0.1146715399917185 +0.4754557479965604 0 0.1139807475800062 +0.5185210943965021 0 0.107362261014898 +0.5384010582372393 0 0.1160531248151428 +0.5174192881570144 0 0.1153623324034306 +0.5603888253187472 0 0.1086480366004444 +0.5803645983977143 0 0.1174347096385681 +0.5593828283174768 0 0.1167439172268554 +0.6022565562409042 0 0.1099338121859879 +0.6223281385579864 0 0.1188162944619863 +0.6013463684778503 0 0.1181255020502772 +0.6441242871629338 0 0.1112195877715276 +0.6642916787182067 0 0.1201978792854034 +0.6433099086380966 0 0.1195070868736949 +0.6859920180849477 0 0.1125053633570673 +0.7062552188784506 0 0.1215794641088218 +0.6852734487983285 0 0.1208886716971126 +0.7278597490069549 0 0.1137911389426064 +0.7482187590386546 0 0.1229610489322374 +0.7272369889585526 0 0.1222702565205296 +0.769727479928938 0 0.1150769145281442 +0.7901822991988471 0 0.1243426337556531 +0.7692005291187508 0 0.1236518413439453 +0.8115952108509321 0 0.1163626901136829 +0.8321458393590763 0 0.1257242185790705 +0.8111640692789617 0 0.1250334261673618 +0.8534629417729429 0 0.1176484656992224 +0.874109379519304 0 0.127105803402488 +0.8531276094391901 0 0.1264150109907793 +0.8953306726949453 0 0.1189342412847609 +0.9160729196795123 0 0.1284873882259034 +0.8950911495994083 0 0.1277965958141957 +0.9371984036169618 0 0.1202200168702991 +0.9580364598397637 0 0.1298689730493201 +0.9370546897596381 0 0.1291781806376117 +0.9790661345389904 0 0.1215057924558383 +0.9790182299198819 0 0.1305597654610319 +0.228729331478255 0 0.08478885647829937 +0.2479776640418254 0 0.09217387586121735 +0.2270881547095984 0 0.09157534419719848 +0.2704196378849478 0 0.08589720754886568 +0.2897566827062898 0 0.09337093918927328 +0.2688671733740576 0 0.09277240752524532 +0.3121099442916422 0 0.08700555861943281 +0.3315357013707467 0 0.09456800251733045 +0.3106461920385183 0 0.09396947085330186 +0.3538002506983334 0 0.08811390968999969 +0.3733147200352038 0 0.0957650658453858 +0.3524252107029753 0 0.09516653418135815 +0.3954905571050182 0 0.08922226076056619 +0.4150937386996468 0 0.09696212917344221 +0.3942042293674253 0 0.09636359750941401 +0.4371808635116965 0 0.09033061183113247 +0.4568727573640906 0 0.09815919250149707 +0.4359832480318687 0 0.09756066083746964 +0.4788711699183918 0 0.09143896290169894 +0.4986517760285664 0 0.09935625582955386 +0.4777622666963285 0 0.09875772416552546 +0.5205614763250976 0 0.09254731397226615 +0.5404307946930335 0 0.1005533191576103 +0.5195412853607999 0 0.09995478749358208 +0.5622517827318112 0 0.0936556650428336 +0.5822098133575249 0 0.1017503824856676 +0.5613203040252792 0 0.101151850821639 +0.6039420891384373 0 0.09476401611339862 +0.6239888320218167 0 0.1029474458137188 +0.6030993226896707 0 0.1023489141496932 +0.6456323955449362 0 0.09587236718396037 +0.6657678506860534 0 0.1041445091417691 +0.6448783413539351 0 0.103545977477744 +0.6873227019514168 0 0.09698071825452217 +0.7075468693503111 0 0.1053415724698204 +0.6866573600181822 0 0.1047430408057948 +0.7290130083578933 0 0.09808906932508338 +0.749325888014537 0 0.1065386357978694 +0.7284363786824239 0 0.1059401041338449 +0.7707033147643482 0 0.0991974203956435 +0.791104906678749 0 0.1077356991259184 +0.770215397346643 0 0.1071371674618939 +0.8123936211708116 0 0.1003057714662043 +0.8328839253429946 0 0.1089327624539689 +0.8119944160108719 0 0.1083342307899436 +0.8540839275772899 0 0.1014141225367659 +0.8746629440072382 0 0.1101298257820194 +0.8537734346751163 0 0.1095312941179941 +0.8957742339837635 0 0.1025224736073266 +0.9164419626714706 0 0.1113268891100681 +0.8955524533393544 0 0.1107283574460438 +0.9374645403902551 0 0.1036308246778871 +0.9582209813357463 0 0.1125239524381181 +0.9373314720036084 0 0.1119254207740931 +0.9791548467967559 0 0.1047391757484483 +0.9791104906678731 0 0.1131224841021545 +0.2317685477088191 0 0.07222128666024652 +0.2510530223072781 0 0.07901817661506452 +0.2302489395935368 0 0.07850507156927418 +0.2732945721571047 0 0.073165355772847 +0.2926611877347745 0 0.08004438670664815 +0.2718571050210262 0 0.07953128166085634 +0.3148205966053881 0 0.07410942488544819 +0.3342693531622559 0 0.08107059679823285 +0.3134652704485151 0 0.08055749175244049 +0.3563466210536692 0 0.07505349399804914 +0.3758775185897467 0 0.08209680688981598 +0.3550734358760013 0 0.08158370184402441 +0.3978726455019448 0 0.07599756311064979 +0.4174856840172163 0 0.08312301698140001 +0.3966816013034815 0 0.08260991193560799 +0.4393986699502142 0 0.07694163222325025 +0.4590938494446944 0 0.08414922707298272 +0.4382897667309554 0 0.08363612202719137 +0.4809246943985021 0 0.07788570133585088 +0.5007020148721995 0 0.08517543716456709 +0.4798979321584468 0 0.0846623321187749 +0.5224507188467979 0 0.07882977044845212 +0.5423101802996961 0 0.08620164725615118 +0.5215060975859478 0 0.08568854221035914 +0.5639767432951013 0 0.07977383956105358 +0.5839183457272161 0 0.087227857347736 +0.5631142630134562 0 0.08671475230194359 +0.6055027677433182 0 0.08071790867365296 +0.6255265111545394 0 0.08825406743931558 +0.6047224284408778 0 0.08774096239352579 +0.6470287921914077 0 0.08166197778624955 +0.6671346765818046 0 0.08928027753089435 +0.6463305938681719 0 0.08876717248510496 +0.6885548166394764 0 0.08260604689884619 +0.7087428420090887 0 0.09030648762247402 +0.6879387592954465 0 0.08979338257668419 +0.7300808410875435 0 0.08355011601144233 +0.7503510074363482 0 0.09133269771405167 +0.7295469247227184 0 0.09081959266826287 +0.7716068655355914 0 0.08449418512403753 +0.7919591728635915 0 0.09235890780562934 +0.7711550901499697 0 0.09184580275984053 +0.8131328899836456 0 0.08543825423663334 +0.8335673382908657 0 0.09338511789720831 +0.8127632555772286 0 0.09287201285141883 +0.8546589144317129 0 0.08638232334922977 +0.8751755037181372 0 0.09441132798878735 +0.8543714210045015 0 0.09389822294299782 +0.8961849388797789 0 0.08732639246182552 +0.9167836691454052 0 0.09543753808036481 +0.8959795864317712 0 0.09492443303457607 +0.9377109633278669 0 0.08827046157442101 +0.9583918345727167 0 0.09646374817194328 +0.937587751859061 0 0.09595064312615406 +0.9792369877759608 0 0.08921453068701719 +0.9791959172863584 0 0.09697685321773467 +0.2345826368205581 0 0.06058464790119638 +0.2539005762575886 0 0.06683697360593172 +0.2331755922646885 0 0.06640296728072193 +0.2759565483438865 0 0.06137660408943738 +0.2953505442434026 0 0.06770498625635266 +0.2746255602504956 0 0.06727097993114219 +0.3173304598672091 0 0.06216856027767897 +0.3368005122291946 0 0.0685729989067745 +0.3160755282362986 0 0.06813899258156357 +0.3587043713905301 0 0.06296051646592038 +0.3782504802150047 0 0.06944101155719504 +0.3575254962220997 0 0.06900700523198475 +0.4000782829138465 0 0.06375247265416153 +0.4197004482007867 0 0.0703090242076163 +0.3989754642078956 0 0.06987501788240566 +0.4414521944371569 0 0.06454442884240251 +0.4611504161865845 0 0.07117703685803646 +0.4404254321936856 0 0.07074303053282638 +0.4828261059604871 0 0.06533638503064362 +0.5026003841724047 0 0.07204504950845803 +0.4818754001794946 0 0.07161104318324726 +0.5242000174838235 0 0.06612834121888525 +0.5440503521582167 0 0.07291306215887933 +0.5233253681653107 0 0.07247905583366868 +0.5655739290071666 0 0.06692029740712704 +0.5855003201440511 0 0.07378107480930129 +0.5647753361511341 0 0.07334706848409031 +0.6069478405304241 0 0.06771225359536714 +0.6269502881296912 0 0.07464908745971881 +0.6062253041368711 0 0.07421508113451004 +0.6483217520535545 0 0.06850420978360489 +0.6684002561152709 0 0.07551710011013563 +0.6476752721224812 0 0.07508309378492721 +0.6896956635766616 0 0.06929616597184265 +0.7098502241008671 0 0.07638511276055322 +0.689125240108069 0 0.07595110643534443 +0.7310695750997691 0 0.07008812216008001 +0.7513001920864456 0 0.0772531254109691 +0.7305752080936563 0 0.07681911908576117 +0.7724434866228601 0 0.07088007834831658 +0.7927501600720059 0 0.078121138061385 +0.7720251760792258 0 0.07768713173617706 +0.8138173981459551 0 0.07167203453655366 +0.8342001280575948 0 0.078989150711802 +0.8134751440648004 0 0.0785551443865935 +0.8551913096690617 0 0.07246399072479126 +0.8756500960431799 0 0.07985716336221904 +0.8549251120503873 0 0.0794231570370105 +0.8965652211921697 0 0.07325594691302828 +0.9171000640287689 0 0.08072517601263476 +0.8963750800359742 0 0.08029116968742689 +0.9379391327153034 0 0.07404790310126511 +0.9585500320144014 0 0.08159318866305133 +0.9378250480215852 0 0.08115918233784306 +0.9793130442384406 0 0.0748398592895025 +0.9792750160072007 0 0.08202719498826147 +0.2371882749098941 0 0.0498099822886245 +0.2565372003013557 0 0.05555808186354133 +0.2358854558652266 0 0.05519731509490874 +0.2784213411310977 0 0.05046109317490743 +0.2978406891736284 0 0.05627961540080347 +0.2771889447374921 0 0.0559188486321724 +0.3196544073522921 0 0.05111220406119085 +0.3391441780458727 0 0.05700114893806635 +0.3184924336097505 0 0.05664038216943491 +0.3608874735734857 0 0.0517633149474741 +0.3804476669181431 0 0.05772268247532813 +0.359795922482008 0 0.05736191570669723 +0.4021205397946757 0 0.05241442583375715 +0.4217511557903791 0 0.05844421601259055 +0.4010994113542611 0 0.05808344924395935 +0.4433536060158598 0 0.05306553672004005 +0.4630546446626377 0 0.05916574954985201 +0.4424029002265084 0 0.05880498278122127 +0.4845866722370649 0 0.05371664760632305 +0.5043581335349143 0 0.05988728308711465 +0.483706389098776 0 0.05952651631848334 +0.5258197384582739 0 0.05436775849260649 +0.5456616224071831 0 0.06060881662437709 +0.5250098779710487 0 0.06024804985574587 +0.5670528046794897 0 0.05501886937889009 +0.5869651112794732 0 0.06133035016164005 +0.566313366843328 0 0.06096958339300856 +0.6082858709006207 0 0.05566998026517225 +0.6282686001515716 0 0.06205188369889934 +0.6076168557155224 0 0.0616911169302697 +0.6495189371216243 0 0.05632109115145249 +0.6695720890236072 0 0.06277341723615804 +0.6489203445875894 0 0.06241265046752869 +0.6907520033426027 0 0.05697220203773275 +0.710875577895657 0 0.06349495077341738 +0.690223833459632 0 0.06313418400478771 +0.7319850695635837 0 0.05762331292401268 +0.7521790667676957 0 0.06421648431067531 +0.7315273223316763 0 0.06385571754204634 +0.77321813578455 0 0.05827442381029197 +0.7934825556397144 0 0.06493801784793324 +0.7728308112037051 0 0.06457725107930427 +0.8144512020055182 0 0.05892553469657166 +0.834786044511759 0 0.06565955138519208 +0.8141343000757367 0 0.06529878461656266 +0.8556842682264967 0 0.0595766455828518 +0.8760895333837994 0 0.06638108492245098 +0.8554377889477792 0 0.06602031815382153 +0.8969173344474798 0 0.06022775646913145 +0.9173930222558502 0 0.06710261845970876 +0.8967412778198248 0 0.06674185169107985 +0.9381504006684915 0 0.06087886735541091 +0.9586965111279446 0 0.06782415199696726 +0.9380447666918974 0 0.06746338522833802 +0.9793834668895041 0 0.06152997824169089 +0.9793482555639723 0 0.06818491876559703 +0.2396009027705424 0 0.03983344005406993 +0.2589785188716193 0 0.04511466353529808 +0.2383945888402176 0 0.04482171117135023 +0.2807035566749555 0 0.04035413862359075 +0.300146378934434 0 0.0457005682632001 +0.2795624489030266 0 0.04540761589924909 +0.3218062105793564 0 0.04087483719311197 +0.3413142389972146 0 0.04628647299110272 +0.3207303089658242 0 0.04599352062715141 +0.3629088644837574 0 0.04139553576263305 +0.3824820990600285 0 0.04687237771900443 +0.3618981690286215 0 0.04657942535505357 +0.4040115183881552 0 0.04191623433215397 +0.4236499591228023 0 0.04745828244690668 +0.4030660290914154 0 0.04716533008295556 +0.4451141722925476 0 0.04243693290167479 +0.4648178191856051 0 0.04804418717480816 +0.4442338891542037 0 0.04775123481085743 +0.4862168261969618 0 0.04295763147119567 +0.5059856792484216 0 0.04863009190271056 +0.4854017492170134 0 0.04833713953875936 +0.5273194801013783 0 0.0434783300407169 +0.5471535393112306 0 0.04921599663061284 +0.5265696092798261 0 0.04892304426666171 +0.5684221340058011 0 0.04399902861023826 +0.5883213993740602 0 0.04980190135851552 +0.5677374693426454 0 0.04950894899456418 +0.60952478791014 0 0.04451972717975848 +0.6294892594367004 0 0.05038780608641522 +0.6089053294053803 0 0.05009485372246537 +0.6506274418143516 0 0.04504042574927716 +0.6706571194992755 0 0.05097371081431443 +0.650073189467988 0 0.05068075845036482 +0.6917300957185359 0 0.04556112431879585 +0.7118249795618631 0 0.05155961554221417 +0.6912410495305692 0 0.05126666317826431 +0.7328327496227245 0 0.04608182288831427 +0.752992839624445 0 0.05214552027011278 +0.7324089095931541 0 0.05185256790616347 +0.7739354035269004 0 0.04660252145783217 +0.7941606996870054 0 0.05273142499801137 +0.7735767696557252 0 0.05243847263406207 +0.8150380574310767 0 0.04712322002735041 +0.8353285597495895 0 0.05331732972591071 +0.8147446297182975 0 0.05302437736196104 +0.8561407113352617 0 0.04764391859686901 +0.876496419812169 0 0.05390323445381009 +0.8559124897808792 0 0.0536102820898604 +0.897243365239454 0 0.04816461716638722 +0.917664279874765 0 0.05448913918170857 +0.897080349843467 0 0.05419618681775933 +0.9383460191436781 0 0.04868531573590528 +0.9588321399374046 0 0.05507504390960763 +0.9382482099060849 0 0.05478209154565809 +0.9794486730479004 0 0.04920601430542373 +0.9794160699687022 0 0.05536799627355606 +0.2418348174453993 0 0.03059590099324046 +0.2612389990240279 0 0.03544483177229994 +0.2407178601079712 0 0.03521467052365395 +0.2828167192052268 0 0.03099584741829885 +0.3022812768561544 0 0.03590515426958966 +0.2817601379400912 0 0.0356749930209448 +0.3237986209650393 0 0.03139579384335752 +0.3433235546882414 0 0.03636547676687983 +0.3228024157721978 0 0.03613531551823474 +0.3647805227248524 0 0.03179574026841611 +0.3843658325203684 0 0.03682579926416933 +0.3638446936043049 0 0.03659563801552458 +0.405762424484663 0 0.03219568669347457 +0.4254081103524499 0 0.03728612176145922 +0.4048869714364091 0 0.03705596051281428 +0.4467443262444685 0 0.03259563311853295 +0.4664503881845661 0 0.03774644425874851 +0.445929249268508 0 0.03751628301010387 +0.487726228004297 0 0.03299557954359138 +0.5074926660166926 0 0.03820676675603853 +0.4869715271006295 0 0.03797660550739352 +0.528708129764126 0 0.03339552596865007 +0.5485349438488116 0 0.03866708925332844 +0.5280138049327522 0 0.03843692800468349 +0.5696900315239609 0 0.03379547239370888 +0.5895772216809505 0 0.03912741175061869 +0.569056082764881 0 0.03889725050197357 +0.6106719332837125 0 0.03419541881876679 +0.630619499512902 0 0.03958773424790658 +0.6100983605969262 0 0.03935757299926263 +0.651653835043337 0 0.03459536524382352 +0.6716617773447866 0 0.0400480567451941 +0.6511406384288443 0 0.03981789549655034 +0.6926357368029322 0 0.03499531166888027 +0.7127040551766816 0 0.04050837924248202 +0.6921829162607341 0 0.04027821799383807 +0.7336176385625335 0 0.03539525809393681 +0.7537463330085763 0 0.04096870173976905 +0.7332251940926289 0 0.04073854049112554 +0.7745995403221241 0 0.03579520451899296 +0.7947886108404483 0 0.04142902423705608 +0.7742674719245124 0 0.04119886298841256 +0.8155814420817132 0 0.03619515094404936 +0.8358308886723418 0 0.0418893467343437 +0.815309749756395 0 0.04165918548569988 +0.8565633438413098 0 0.03659509736910603 +0.87687316650423 0 0.04234966923163134 +0.8563520275882858 0 0.04211950798298752 +0.8975452456009163 0 0.03699504379416239 +0.9179154443361404 0 0.04280999172891828 +0.8973943054201852 0 0.04257983048027481 +0.938527147360557 0 0.03739499021921867 +0.9589577221680945 0 0.04327031422620568 +0.9384365832521175 0 0.04304015297756198 +0.9795090491201941 0 0.03779493664427524 +0.9794788610840472 0 0.04350047547484766 +0.2439032569432537 0 0.02204262415079835 +0.2633320361891314 0 0.02649128389945955 +0.2428690371943269 0 0.02631926257201802 +0.2847733511626578 0 0.0223307630355007 +0.3042580341787532 0 0.02683532655433999 +0.2837950351839423 0 0.02666330522689977 +0.3256434453820442 0 0.02261890192020327 +0.3451840321683304 0 0.0271793692092208 +0.3247210331735417 0 0.02700734788178039 +0.3665135396014319 0 0.02290704080490577 +0.386110030157954 0 0.02752341186410109 +0.3656470311631421 0 0.02735139053666094 +0.4073836338208179 0 0.02319517968960819 +0.4270360281475269 0 0.02786745451898167 +0.4065730291527405 0 0.02769543319154138 +0.4482537280401987 0 0.02348331857431054 +0.4679620261371402 0 0.02821149717386181 +0.4474990271423336 0 0.02803947584642175 +0.4891238222596034 0 0.02377145745901293 +0.5088880241267602 0 0.0285555398287425 +0.4884250251319502 0 0.02838351850130215 +0.5299939164790071 0 0.02405959634371551 +0.5498140221163729 0 0.02889958248362309 +0.5293510231215665 0 0.02872756115618279 +0.5708640106984166 0 0.02434773522841816 +0.5907400201060047 0 0.02924362513850395 +0.5702770211111888 0 0.02907160381106352 +0.6117341049177435 0 0.02463587411312018 +0.6316660180954513 0 0.02958766779338302 +0.6112030191007279 0 0.02941564646594349 +0.6526041991369431 0 0.02492401299782136 +0.6725920160848289 0 0.02993171044826184 +0.6521290170901402 0 0.02975968912082244 +0.6934742933561118 0 0.02521215188252253 +0.7135180140742151 0 0.03027575310314096 +0.6930550150795219 0 0.0301037317757014 +0.7343443875752881 0 0.02550029076722355 +0.7544440120636065 0 0.03061979575801941 +0.7339810130689108 0 0.03044777443058018 +0.7752144817944555 0 0.0257884296519243 +0.7953700100529733 0 0.03096383841289786 +0.7749070110582899 0 0.03079181708545863 +0.8160845760136197 0 0.02607656853662523 +0.8362960080423597 0 0.03130788106777674 +0.8158330090476665 0 0.03113585974033729 +0.8569546702327903 0 0.02636470742132635 +0.8772220060317404 0 0.03165192372265564 +0.85675900703705 0 0.03147990239521619 +0.897824764451973 0 0.02665284630602726 +0.9181480040211489 0 0.03199596637753402 +0.8976850050264447 0 0.03182394505009482 +0.9386948586711927 0 0.02694098519072809 +0.9590740020106008 0 0.03234000903241275 +0.9386110030158749 0 0.03216798770497339 +0.9795649528904067 0 0.02722912407542914 +0.9795370010053004 0 0.03251203035985308 +0.2458184787129001 0 0.0141229233196206 +0.2652700335625109 0 0.01820096180232524 +0.2448608678280769 0 0.01808277373520948 +0.2865850474312434 0 0.01430753670338142 +0.3060883650313903 0 0.01843733793655688 +0.2856791992969506 0 0.01831914986944106 +0.3273516161495664 0 0.01449215008714238 +0.3469066965002204 0 0.01867371407078877 +0.3264975307658053 0 0.01855552600367283 +0.3681181848678913 0 0.01467676347090329 +0.3877250279691028 0 0.01891009020502029 +0.3673158622346616 0 0.01879190213790453 +0.4088847535862151 0 0.01486137685466414 +0.4285433594379301 0 0.01914646633925204 +0.4081341937035166 0 0.01902827827213617 +0.449651322304534 0 0.01504599023842496 +0.4693616909068025 0 0.01938284247348347 +0.4489525251723663 0 0.01926465440636775 +0.4904178910228776 0 0.0152306036221858 +0.5101800223756785 0 0.01961921860771527 +0.4897708566412405 0 0.01950103054059937 +0.5311844597412188 0 0.01541521700594677 +0.5509983538445473 0 0.01985559474194701 +0.5305891881101129 0 0.01973740667483114 +0.5719510284595655 0 0.01559983038970778 +0.5918166853134348 0 0.02009197087617893 +0.5714075195789911 0 0.01997378280906297 +0.61271759717783 0 0.01578444377346838 +0.6326350167821388 0 0.02032834701040964 +0.6122258510477869 0 0.02021015894329428 +0.6534841658959674 0 0.01596905715722844 +0.6734533482507717 0 0.02056472314464016 +0.6530441825164552 0 0.0204465350775249 +0.6942507346140723 0 0.0161536705409885 +0.7142716797194122 0 0.02080109927887087 +0.693862513985092 0 0.02068291121175551 +0.7350173033321863 0 0.01633828392474847 +0.7550900111880622 0 0.02103747541310114 +0.7346808454537371 0 0.02091928734598601 +0.775783872050293 0 0.01652289730850826 +0.7959083426566863 0 0.02127385154733142 +0.7754991769223742 0 0.02115566348021628 +0.8165504407683949 0 0.01670751069226816 +0.8367266741253283 0 0.02151022768156198 +0.8163175083910074 0 0.0213920396144467 +0.8573170094865021 0 0.01689212407602819 +0.877545005593964 0 0.02174660381579256 +0.8571358398596463 0 0.02162841574867727 +0.8980835782046237 0 0.01707673745978808 +0.9183633370626327 0 0.02198297995002278 +0.8979541713282984 0 0.02186479188290767 +0.9388501469227847 0 0.01726135084354792 +0.9591816685313446 0 0.02221935608425324 +0.9387725027969887 0 0.02210116801713801 +0.9796167156409379 0 0.0174459642273079 +0.9795908342656723 0 0.02233754415136971 +0.2475918322187678 0 0.006789866930435218 +0.2670644755884373 0 0.01052473758031294 +0.2467051554658341 0 0.01045639512502738 +0.2882625439908489 0 0.006878623367814585 +0.307783115833655 0 0.01066142249088307 +0.2874237957110461 0 0.010593080035598 +0.3289332557629076 0 0.006967379805194017 +0.3485017560788191 0 0.01079810740145333 +0.328142435956237 0 0.0107297649461682 +0.3696039675349686 0 0.007056136242573428 +0.3892203963240408 0 0.01093479231202339 +0.3688610762014299 0 0.01086644985673836 +0.4102746793070292 0 0.007144892679952811 +0.4299390365692035 0 0.01107147722259357 +0.4095797164466221 0 0.01100313476730848 +0.450945391079085 0 0.007233649117332176 +0.4706576768144156 0 0.01120816213316357 +0.4502983566918095 0 0.01113981967787857 +0.4916161028511662 0 0.007322405554711554 +0.5113763170596282 0 0.01134484704373379 +0.4910169969370218 0 0.01127650458844868 +0.5322868146232435 0 0.00741116199209099 +0.5520949573048339 0 0.01148153195430397 +0.531735637182231 0 0.01141318949901888 +0.5729575263953264 0 0.007499918429470448 +0.5928135975500578 0 0.01161821686487426 +0.5724542774274459 0 0.01154987440958911 +0.6136282381673276 0 0.007588674866849713 +0.6335322377950998 0 0.01175490177544384 +0.6131729176725789 0 0.01168655932015905 +0.6542989499392016 0 0.007677431304228714 +0.6742508780400691 0 0.01189158668601331 +0.6538915579175845 0 0.01182324423072858 +0.6949696617110415 0 0.007766187741607718 +0.7149695182850446 0 0.0120282715965829 +0.6946101981625569 0 0.01195992914129811 +0.7356403734828921 0 0.007854944178986674 +0.7556881585300338 0 0.01216495650715223 +0.7353288384075392 0 0.01209661405186757 +0.7763110852547368 0 0.007943700616365545 +0.796406798774996 0 0.01230164141772157 +0.7760474786525149 0 0.0122332989624369 +0.8169817970265754 0 0.008032457053744474 +0.8371254390199743 0 0.01243832632829107 +0.8167661188974851 0 0.01236998387300632 +0.8576525087984184 0 0.00812121349112346 +0.8778440792649461 0 0.01257501123886058 +0.8574847591424604 0 0.01250666878357582 +0.8983232205702778 0 0.00820996992850238 +0.9185627195099555 0 0.01271169614942988 +0.8982033993874508 0 0.01264335369414523 +0.9389939323421784 0 0.008298726365881276 +0.9592813597550076 0 0.01284838105999932 +0.9389220396324816 0 0.0127800386047146 +0.9796646441140697 0 0.008387482803260239 +0.9796406798775038 0 0.01291672351528407 +0.2687259959785656 0 0.003417122574562445 +0.2484128292001372 0 0.003394933465216311 +0.3093523295354436 0 0.003461500793252139 +0.2890391627570058 0 0.003439311683907292 +0.349978663092264 0 0.003505879011941878 +0.3296654963138576 0 0.003483689902597008 +0.3906049966491471 0 0.00355025723063155 +0.3702918298706757 0 0.003528068121286714 +0.4312313302059672 0 0.003594635449321261 +0.4109181634275632 0 0.003572446339976405 +0.471857663762841 0 0.003639013668010915 +0.4515444969844309 0 0.003616824558666088 +0.5124839973197126 0 0.003683391886700639 +0.4921708305412776 0 0.003661202777355777 +0.5531103308765775 0 0.003727770105390351 +0.5327971640981368 0 0.003705580996045495 +0.5937366644334598 0 0.003772148324080097 +0.5734234976550371 0 0.003749959214735224 +0.6343629979901619 0 0.003816526542769615 +0.6140498312118474 0 0.003794337433424856 +0.6749893315467898 0 0.003860904761459098 +0.6546761647684733 0 0.003838715652114357 +0.7156156651034226 0 0.00390528298014862 +0.6953024983251065 0 0.003883093870803859 +0.756241998660073 0 0.003949661198838054 +0.7359288318817373 0 0.003927472089493337 +0.7968683322166954 0 0.003994039417527491 +0.7765551654384 0 0.003971850308182773 +0.8374946657733322 0 0.004038417636216983 +0.8171814989950145 0 0.004016228526872237 +0.8781209993299623 0 0.004082795854906477 +0.8578078325516479 0 0.00406060674556173 +0.9187473328866339 0 0.004127174073595903 +0.8984341661082965 0 0.00410498496425119 +0.9593736664433485 0 0.004171552292285373 +0.9390604996649863 0 0.004149363182940638 +0.9796868332216682 0 0.004193741401630127 +$EndNodes +$Elements +19 934 1 934 +0 2 15 1 +1 1 +0 3 15 1 +2 2 +0 4 15 1 +3 3 +0 5 15 1 +4 4 +0 6 15 1 +5 5 +0 9 15 1 +6 8 +1 3 8 10 +7 5 60 69 +8 60 61 70 +9 61 62 71 +10 62 63 72 +11 63 64 73 +12 64 65 74 +13 65 66 75 +14 66 67 76 +15 67 68 77 +16 68 6 78 +1 4 8 10 +17 6 79 88 +18 79 80 89 +19 80 81 90 +20 81 82 91 +21 82 83 92 +22 83 84 93 +23 84 85 94 +24 85 86 95 +25 86 87 96 +26 87 4 97 +1 5 8 10 +27 4 98 107 +28 98 99 108 +29 99 100 109 +30 100 101 110 +31 101 102 111 +32 102 103 112 +33 103 104 113 +34 104 105 114 +35 105 106 115 +36 106 10 116 +1 6 8 19 +37 10 117 135 +38 117 118 136 +39 118 119 137 +40 119 120 138 +41 120 121 139 +42 121 122 140 +43 122 123 141 +44 123 124 142 +45 124 125 143 +46 125 126 144 +47 126 127 145 +48 127 128 146 +49 128 129 147 +50 129 130 148 +51 130 131 149 +52 131 132 150 +53 132 133 151 +54 133 134 152 +55 134 3 153 +1 7 8 10 +56 3 154 163 +57 154 155 164 +58 155 156 165 +59 156 157 166 +60 157 158 167 +61 158 159 168 +62 159 160 169 +63 160 161 170 +64 161 162 171 +65 162 11 172 +1 8 8 15 +66 11 173 187 +67 173 174 188 +68 174 175 189 +69 175 176 190 +70 176 177 191 +71 177 178 192 +72 178 179 193 +73 179 180 194 +74 180 181 195 +75 181 182 196 +76 182 183 197 +77 183 184 198 +78 184 185 199 +79 185 186 200 +80 186 2 201 +1 9 8 19 +81 2 202 220 +82 202 203 221 +83 203 204 222 +84 204 205 223 +85 205 206 224 +86 206 207 225 +87 207 208 226 +88 208 209 227 +89 209 210 228 +90 210 211 229 +91 211 212 230 +92 212 213 231 +93 213 214 232 +94 214 215 233 +95 215 216 234 +96 216 217 235 +97 217 218 236 +98 218 219 237 +99 219 7 238 +1 10 8 10 +100 7 239 248 +101 239 240 249 +102 240 241 250 +103 241 242 251 +104 242 243 252 +105 243 244 253 +106 244 245 254 +107 245 246 255 +108 246 247 256 +109 247 1 257 +2 1 10 190 +110 10 117 381 303 135 543 544 313 545 +111 303 381 382 302 544 546 547 312 548 +112 302 382 383 301 547 549 550 311 551 +113 301 383 384 300 550 552 553 310 554 +114 300 384 385 299 553 555 556 309 557 +115 299 385 386 298 556 558 559 308 560 +116 298 386 387 297 559 561 562 307 563 +117 297 387 388 296 562 564 565 306 566 +118 296 388 389 295 565 567 568 305 569 +119 295 389 275 9 568 570 294 304 571 +120 117 118 390 381 136 572 573 543 574 +121 381 390 391 382 573 575 576 546 577 +122 382 391 392 383 576 578 579 549 580 +123 383 392 393 384 579 581 582 552 583 +124 384 393 394 385 582 584 585 555 586 +125 385 394 395 386 585 587 588 558 589 +126 386 395 396 387 588 590 591 561 592 +127 387 396 397 388 591 593 594 564 595 +128 388 397 398 389 594 596 597 567 598 +129 389 398 274 275 597 599 293 570 600 +130 118 119 399 390 137 601 602 572 603 +131 390 399 400 391 602 604 605 575 606 +132 391 400 401 392 605 607 608 578 609 +133 392 401 402 393 608 610 611 581 612 +134 393 402 403 394 611 613 614 584 615 +135 394 403 404 395 614 616 617 587 618 +136 395 404 405 396 617 619 620 590 621 +137 396 405 406 397 620 622 623 593 624 +138 397 406 407 398 623 625 626 596 627 +139 398 407 273 274 626 628 292 599 629 +140 119 120 408 399 138 630 631 601 632 +141 399 408 409 400 631 633 634 604 635 +142 400 409 410 401 634 636 637 607 638 +143 401 410 411 402 637 639 640 610 641 +144 402 411 412 403 640 642 643 613 644 +145 403 412 413 404 643 645 646 616 647 +146 404 413 414 405 646 648 649 619 650 +147 405 414 415 406 649 651 652 622 653 +148 406 415 416 407 652 654 655 625 656 +149 407 416 272 273 655 657 291 628 658 +150 120 121 417 408 139 659 660 630 661 +151 408 417 418 409 660 662 663 633 664 +152 409 418 419 410 663 665 666 636 667 +153 410 419 420 411 666 668 669 639 670 +154 411 420 421 412 669 671 672 642 673 +155 412 421 422 413 672 674 675 645 676 +156 413 422 423 414 675 677 678 648 679 +157 414 423 424 415 678 680 681 651 682 +158 415 424 425 416 681 683 684 654 685 +159 416 425 271 272 684 686 290 657 687 +160 121 122 426 417 140 688 689 659 690 +161 417 426 427 418 689 691 692 662 693 +162 418 427 428 419 692 694 695 665 696 +163 419 428 429 420 695 697 698 668 699 +164 420 429 430 421 698 700 701 671 702 +165 421 430 431 422 701 703 704 674 705 +166 422 431 432 423 704 706 707 677 708 +167 423 432 433 424 707 709 710 680 711 +168 424 433 434 425 710 712 713 683 714 +169 425 434 270 271 713 715 289 686 716 +170 122 123 435 426 141 717 718 688 719 +171 426 435 436 427 718 720 721 691 722 +172 427 436 437 428 721 723 724 694 725 +173 428 437 438 429 724 726 727 697 728 +174 429 438 439 430 727 729 730 700 731 +175 430 439 440 431 730 732 733 703 734 +176 431 440 441 432 733 735 736 706 737 +177 432 441 442 433 736 738 739 709 740 +178 433 442 443 434 739 741 742 712 743 +179 434 443 269 270 742 744 288 715 745 +180 123 124 444 435 142 746 747 717 748 +181 435 444 445 436 747 749 750 720 751 +182 436 445 446 437 750 752 753 723 754 +183 437 446 447 438 753 755 756 726 757 +184 438 447 448 439 756 758 759 729 760 +185 439 448 449 440 759 761 762 732 763 +186 440 449 450 441 762 764 765 735 766 +187 441 450 451 442 765 767 768 738 769 +188 442 451 452 443 768 770 771 741 772 +189 443 452 268 269 771 773 287 744 774 +190 124 125 453 444 143 775 776 746 777 +191 444 453 454 445 776 778 779 749 780 +192 445 454 455 446 779 781 782 752 783 +193 446 455 456 447 782 784 785 755 786 +194 447 456 457 448 785 787 788 758 789 +195 448 457 458 449 788 790 791 761 792 +196 449 458 459 450 791 793 794 764 795 +197 450 459 460 451 794 796 797 767 798 +198 451 460 461 452 797 799 800 770 801 +199 452 461 267 268 800 802 286 773 803 +200 125 126 462 453 144 804 805 775 806 +201 453 462 463 454 805 807 808 778 809 +202 454 463 464 455 808 810 811 781 812 +203 455 464 465 456 811 813 814 784 815 +204 456 465 466 457 814 816 817 787 818 +205 457 466 467 458 817 819 820 790 821 +206 458 467 468 459 820 822 823 793 824 +207 459 468 469 460 823 825 826 796 827 +208 460 469 470 461 826 828 829 799 830 +209 461 470 266 267 829 831 285 802 832 +210 126 127 471 462 145 833 834 804 835 +211 462 471 472 463 834 836 837 807 838 +212 463 472 473 464 837 839 840 810 841 +213 464 473 474 465 840 842 843 813 844 +214 465 474 475 466 843 845 846 816 847 +215 466 475 476 467 846 848 849 819 850 +216 467 476 477 468 849 851 852 822 853 +217 468 477 478 469 852 854 855 825 856 +218 469 478 479 470 855 857 858 828 859 +219 470 479 265 266 858 860 284 831 861 +220 127 128 480 471 146 862 863 833 864 +221 471 480 481 472 863 865 866 836 867 +222 472 481 482 473 866 868 869 839 870 +223 473 482 483 474 869 871 872 842 873 +224 474 483 484 475 872 874 875 845 876 +225 475 484 485 476 875 877 878 848 879 +226 476 485 486 477 878 880 881 851 882 +227 477 486 487 478 881 883 884 854 885 +228 478 487 488 479 884 886 887 857 888 +229 479 488 264 265 887 889 283 860 890 +230 128 129 489 480 147 891 892 862 893 +231 480 489 490 481 892 894 895 865 896 +232 481 490 491 482 895 897 898 868 899 +233 482 491 492 483 898 900 901 871 902 +234 483 492 493 484 901 903 904 874 905 +235 484 493 494 485 904 906 907 877 908 +236 485 494 495 486 907 909 910 880 911 +237 486 495 496 487 910 912 913 883 914 +238 487 496 497 488 913 915 916 886 917 +239 488 497 263 264 916 918 282 889 919 +240 129 130 498 489 148 920 921 891 922 +241 489 498 499 490 921 923 924 894 925 +242 490 499 500 491 924 926 927 897 928 +243 491 500 501 492 927 929 930 900 931 +244 492 501 502 493 930 932 933 903 934 +245 493 502 503 494 933 935 936 906 937 +246 494 503 504 495 936 938 939 909 940 +247 495 504 505 496 939 941 942 912 943 +248 496 505 506 497 942 944 945 915 946 +249 497 506 262 263 945 947 281 918 948 +250 130 131 507 498 149 949 950 920 951 +251 498 507 508 499 950 952 953 923 954 +252 499 508 509 500 953 955 956 926 957 +253 500 509 510 501 956 958 959 929 960 +254 501 510 511 502 959 961 962 932 963 +255 502 511 512 503 962 964 965 935 966 +256 503 512 513 504 965 967 968 938 969 +257 504 513 514 505 968 970 971 941 972 +258 505 514 515 506 971 973 974 944 975 +259 506 515 261 262 974 976 280 947 977 +260 131 132 516 507 150 978 979 949 980 +261 507 516 517 508 979 981 982 952 983 +262 508 517 518 509 982 984 985 955 986 +263 509 518 519 510 985 987 988 958 989 +264 510 519 520 511 988 990 991 961 992 +265 511 520 521 512 991 993 994 964 995 +266 512 521 522 513 994 996 997 967 998 +267 513 522 523 514 997 999 1000 970 1001 +268 514 523 524 515 1000 1002 1003 973 1004 +269 515 524 260 261 1003 1005 279 976 1006 +270 132 133 525 516 151 1007 1008 978 1009 +271 516 525 526 517 1008 1010 1011 981 1012 +272 517 526 527 518 1011 1013 1014 984 1015 +273 518 527 528 519 1014 1016 1017 987 1018 +274 519 528 529 520 1017 1019 1020 990 1021 +275 520 529 530 521 1020 1022 1023 993 1024 +276 521 530 531 522 1023 1025 1026 996 1027 +277 522 531 532 523 1026 1028 1029 999 1030 +278 523 532 533 524 1029 1031 1032 1002 1033 +279 524 533 259 260 1032 1034 278 1005 1035 +280 133 134 534 525 152 1036 1037 1007 1038 +281 525 534 535 526 1037 1039 1040 1010 1041 +282 526 535 536 527 1040 1042 1043 1013 1044 +283 527 536 537 528 1043 1045 1046 1016 1047 +284 528 537 538 529 1046 1048 1049 1019 1050 +285 529 538 539 530 1049 1051 1052 1022 1053 +286 530 539 540 531 1052 1054 1055 1025 1056 +287 531 540 541 532 1055 1057 1058 1028 1059 +288 532 541 542 533 1058 1060 1061 1031 1062 +289 533 542 258 259 1061 1063 277 1034 1064 +290 134 3 154 534 153 163 1065 1036 1066 +291 534 154 155 535 1065 164 1067 1039 1068 +292 535 155 156 536 1067 165 1069 1042 1070 +293 536 156 157 537 1069 166 1071 1045 1072 +294 537 157 158 538 1071 167 1073 1048 1074 +295 538 158 159 539 1073 168 1075 1051 1076 +296 539 159 160 540 1075 169 1077 1054 1078 +297 540 160 161 541 1077 170 1079 1057 1080 +298 541 161 162 542 1079 171 1081 1060 1082 +299 542 162 11 258 1081 172 276 1063 1083 +2 2 10 100 +300 9 295 1084 314 304 1165 1166 323 1167 +301 314 1084 1085 315 1166 1168 1169 324 1170 +302 315 1085 1086 316 1169 1171 1172 325 1173 +303 316 1086 1087 317 1172 1174 1175 326 1176 +304 317 1087 1088 318 1175 1177 1178 327 1179 +305 318 1088 1089 319 1178 1180 1181 328 1182 +306 319 1089 1090 320 1181 1183 1184 329 1185 +307 320 1090 1091 321 1184 1186 1187 330 1188 +308 321 1091 1092 322 1187 1189 1190 331 1191 +309 322 1092 79 6 1190 1192 88 332 1193 +310 295 296 1093 1084 305 1194 1195 1165 1196 +311 1084 1093 1094 1085 1195 1197 1198 1168 1199 +312 1085 1094 1095 1086 1198 1200 1201 1171 1202 +313 1086 1095 1096 1087 1201 1203 1204 1174 1205 +314 1087 1096 1097 1088 1204 1206 1207 1177 1208 +315 1088 1097 1098 1089 1207 1209 1210 1180 1211 +316 1089 1098 1099 1090 1210 1212 1213 1183 1214 +317 1090 1099 1100 1091 1213 1215 1216 1186 1217 +318 1091 1100 1101 1092 1216 1218 1219 1189 1220 +319 1092 1101 80 79 1219 1221 89 1192 1222 +320 296 297 1102 1093 306 1223 1224 1194 1225 +321 1093 1102 1103 1094 1224 1226 1227 1197 1228 +322 1094 1103 1104 1095 1227 1229 1230 1200 1231 +323 1095 1104 1105 1096 1230 1232 1233 1203 1234 +324 1096 1105 1106 1097 1233 1235 1236 1206 1237 +325 1097 1106 1107 1098 1236 1238 1239 1209 1240 +326 1098 1107 1108 1099 1239 1241 1242 1212 1243 +327 1099 1108 1109 1100 1242 1244 1245 1215 1246 +328 1100 1109 1110 1101 1245 1247 1248 1218 1249 +329 1101 1110 81 80 1248 1250 90 1221 1251 +330 297 298 1111 1102 307 1252 1253 1223 1254 +331 1102 1111 1112 1103 1253 1255 1256 1226 1257 +332 1103 1112 1113 1104 1256 1258 1259 1229 1260 +333 1104 1113 1114 1105 1259 1261 1262 1232 1263 +334 1105 1114 1115 1106 1262 1264 1265 1235 1266 +335 1106 1115 1116 1107 1265 1267 1268 1238 1269 +336 1107 1116 1117 1108 1268 1270 1271 1241 1272 +337 1108 1117 1118 1109 1271 1273 1274 1244 1275 +338 1109 1118 1119 1110 1274 1276 1277 1247 1278 +339 1110 1119 82 81 1277 1279 91 1250 1280 +340 298 299 1120 1111 308 1281 1282 1252 1283 +341 1111 1120 1121 1112 1282 1284 1285 1255 1286 +342 1112 1121 1122 1113 1285 1287 1288 1258 1289 +343 1113 1122 1123 1114 1288 1290 1291 1261 1292 +344 1114 1123 1124 1115 1291 1293 1294 1264 1295 +345 1115 1124 1125 1116 1294 1296 1297 1267 1298 +346 1116 1125 1126 1117 1297 1299 1300 1270 1301 +347 1117 1126 1127 1118 1300 1302 1303 1273 1304 +348 1118 1127 1128 1119 1303 1305 1306 1276 1307 +349 1119 1128 83 82 1306 1308 92 1279 1309 +350 299 300 1129 1120 309 1310 1311 1281 1312 +351 1120 1129 1130 1121 1311 1313 1314 1284 1315 +352 1121 1130 1131 1122 1314 1316 1317 1287 1318 +353 1122 1131 1132 1123 1317 1319 1320 1290 1321 +354 1123 1132 1133 1124 1320 1322 1323 1293 1324 +355 1124 1133 1134 1125 1323 1325 1326 1296 1327 +356 1125 1134 1135 1126 1326 1328 1329 1299 1330 +357 1126 1135 1136 1127 1329 1331 1332 1302 1333 +358 1127 1136 1137 1128 1332 1334 1335 1305 1336 +359 1128 1137 84 83 1335 1337 93 1308 1338 +360 300 301 1138 1129 310 1339 1340 1310 1341 +361 1129 1138 1139 1130 1340 1342 1343 1313 1344 +362 1130 1139 1140 1131 1343 1345 1346 1316 1347 +363 1131 1140 1141 1132 1346 1348 1349 1319 1350 +364 1132 1141 1142 1133 1349 1351 1352 1322 1353 +365 1133 1142 1143 1134 1352 1354 1355 1325 1356 +366 1134 1143 1144 1135 1355 1357 1358 1328 1359 +367 1135 1144 1145 1136 1358 1360 1361 1331 1362 +368 1136 1145 1146 1137 1361 1363 1364 1334 1365 +369 1137 1146 85 84 1364 1366 94 1337 1367 +370 301 302 1147 1138 311 1368 1369 1339 1370 +371 1138 1147 1148 1139 1369 1371 1372 1342 1373 +372 1139 1148 1149 1140 1372 1374 1375 1345 1376 +373 1140 1149 1150 1141 1375 1377 1378 1348 1379 +374 1141 1150 1151 1142 1378 1380 1381 1351 1382 +375 1142 1151 1152 1143 1381 1383 1384 1354 1385 +376 1143 1152 1153 1144 1384 1386 1387 1357 1388 +377 1144 1153 1154 1145 1387 1389 1390 1360 1391 +378 1145 1154 1155 1146 1390 1392 1393 1363 1394 +379 1146 1155 86 85 1393 1395 95 1366 1396 +380 302 303 1156 1147 312 1397 1398 1368 1399 +381 1147 1156 1157 1148 1398 1400 1401 1371 1402 +382 1148 1157 1158 1149 1401 1403 1404 1374 1405 +383 1149 1158 1159 1150 1404 1406 1407 1377 1408 +384 1150 1159 1160 1151 1407 1409 1410 1380 1411 +385 1151 1160 1161 1152 1410 1412 1413 1383 1414 +386 1152 1161 1162 1153 1413 1415 1416 1386 1417 +387 1153 1162 1163 1154 1416 1418 1419 1389 1420 +388 1154 1163 1164 1155 1419 1421 1422 1392 1423 +389 1155 1164 87 86 1422 1424 96 1395 1425 +390 303 10 106 1156 313 116 1426 1397 1427 +391 1156 106 105 1157 1426 115 1428 1400 1429 +392 1157 105 104 1158 1428 114 1430 1403 1431 +393 1158 104 103 1159 1430 113 1432 1406 1433 +394 1159 103 102 1160 1432 112 1434 1409 1435 +395 1160 102 101 1161 1434 111 1436 1412 1437 +396 1161 101 100 1162 1436 110 1438 1415 1439 +397 1162 100 99 1163 1438 109 1440 1418 1441 +398 1163 99 98 1164 1440 108 1442 1421 1443 +399 1164 98 4 87 1442 107 97 1424 1444 +2 3 10 100 +400 5 60 1445 49 69 1526 1527 59 1528 +401 49 1445 1446 48 1527 1529 1530 58 1531 +402 48 1446 1447 47 1530 1532 1533 57 1534 +403 47 1447 1448 46 1533 1535 1536 56 1537 +404 46 1448 1449 45 1536 1538 1539 55 1540 +405 45 1449 1450 44 1539 1541 1542 54 1543 +406 44 1450 1451 43 1542 1544 1545 53 1546 +407 43 1451 1452 42 1545 1547 1548 52 1549 +408 42 1452 1453 41 1548 1550 1551 51 1552 +409 41 1453 341 8 1551 1553 351 50 1554 +410 60 61 1454 1445 70 1555 1556 1526 1557 +411 1445 1454 1455 1446 1556 1558 1559 1529 1560 +412 1446 1455 1456 1447 1559 1561 1562 1532 1563 +413 1447 1456 1457 1448 1562 1564 1565 1535 1566 +414 1448 1457 1458 1449 1565 1567 1568 1538 1569 +415 1449 1458 1459 1450 1568 1570 1571 1541 1572 +416 1450 1459 1460 1451 1571 1573 1574 1544 1575 +417 1451 1460 1461 1452 1574 1576 1577 1547 1578 +418 1452 1461 1462 1453 1577 1579 1580 1550 1581 +419 1453 1462 340 341 1580 1582 350 1553 1583 +420 61 62 1463 1454 71 1584 1585 1555 1586 +421 1454 1463 1464 1455 1585 1587 1588 1558 1589 +422 1455 1464 1465 1456 1588 1590 1591 1561 1592 +423 1456 1465 1466 1457 1591 1593 1594 1564 1595 +424 1457 1466 1467 1458 1594 1596 1597 1567 1598 +425 1458 1467 1468 1459 1597 1599 1600 1570 1601 +426 1459 1468 1469 1460 1600 1602 1603 1573 1604 +427 1460 1469 1470 1461 1603 1605 1606 1576 1607 +428 1461 1470 1471 1462 1606 1608 1609 1579 1610 +429 1462 1471 339 340 1609 1611 349 1582 1612 +430 62 63 1472 1463 72 1613 1614 1584 1615 +431 1463 1472 1473 1464 1614 1616 1617 1587 1618 +432 1464 1473 1474 1465 1617 1619 1620 1590 1621 +433 1465 1474 1475 1466 1620 1622 1623 1593 1624 +434 1466 1475 1476 1467 1623 1625 1626 1596 1627 +435 1467 1476 1477 1468 1626 1628 1629 1599 1630 +436 1468 1477 1478 1469 1629 1631 1632 1602 1633 +437 1469 1478 1479 1470 1632 1634 1635 1605 1636 +438 1470 1479 1480 1471 1635 1637 1638 1608 1639 +439 1471 1480 338 339 1638 1640 348 1611 1641 +440 63 64 1481 1472 73 1642 1643 1613 1644 +441 1472 1481 1482 1473 1643 1645 1646 1616 1647 +442 1473 1482 1483 1474 1646 1648 1649 1619 1650 +443 1474 1483 1484 1475 1649 1651 1652 1622 1653 +444 1475 1484 1485 1476 1652 1654 1655 1625 1656 +445 1476 1485 1486 1477 1655 1657 1658 1628 1659 +446 1477 1486 1487 1478 1658 1660 1661 1631 1662 +447 1478 1487 1488 1479 1661 1663 1664 1634 1665 +448 1479 1488 1489 1480 1664 1666 1667 1637 1668 +449 1480 1489 337 338 1667 1669 347 1640 1670 +450 64 65 1490 1481 74 1671 1672 1642 1673 +451 1481 1490 1491 1482 1672 1674 1675 1645 1676 +452 1482 1491 1492 1483 1675 1677 1678 1648 1679 +453 1483 1492 1493 1484 1678 1680 1681 1651 1682 +454 1484 1493 1494 1485 1681 1683 1684 1654 1685 +455 1485 1494 1495 1486 1684 1686 1687 1657 1688 +456 1486 1495 1496 1487 1687 1689 1690 1660 1691 +457 1487 1496 1497 1488 1690 1692 1693 1663 1694 +458 1488 1497 1498 1489 1693 1695 1696 1666 1697 +459 1489 1498 336 337 1696 1698 346 1669 1699 +460 65 66 1499 1490 75 1700 1701 1671 1702 +461 1490 1499 1500 1491 1701 1703 1704 1674 1705 +462 1491 1500 1501 1492 1704 1706 1707 1677 1708 +463 1492 1501 1502 1493 1707 1709 1710 1680 1711 +464 1493 1502 1503 1494 1710 1712 1713 1683 1714 +465 1494 1503 1504 1495 1713 1715 1716 1686 1717 +466 1495 1504 1505 1496 1716 1718 1719 1689 1720 +467 1496 1505 1506 1497 1719 1721 1722 1692 1723 +468 1497 1506 1507 1498 1722 1724 1725 1695 1726 +469 1498 1507 335 336 1725 1727 345 1698 1728 +470 66 67 1508 1499 76 1729 1730 1700 1731 +471 1499 1508 1509 1500 1730 1732 1733 1703 1734 +472 1500 1509 1510 1501 1733 1735 1736 1706 1737 +473 1501 1510 1511 1502 1736 1738 1739 1709 1740 +474 1502 1511 1512 1503 1739 1741 1742 1712 1743 +475 1503 1512 1513 1504 1742 1744 1745 1715 1746 +476 1504 1513 1514 1505 1745 1747 1748 1718 1749 +477 1505 1514 1515 1506 1748 1750 1751 1721 1752 +478 1506 1515 1516 1507 1751 1753 1754 1724 1755 +479 1507 1516 334 335 1754 1756 344 1727 1757 +480 67 68 1517 1508 77 1758 1759 1729 1760 +481 1508 1517 1518 1509 1759 1761 1762 1732 1763 +482 1509 1518 1519 1510 1762 1764 1765 1735 1766 +483 1510 1519 1520 1511 1765 1767 1768 1738 1769 +484 1511 1520 1521 1512 1768 1770 1771 1741 1772 +485 1512 1521 1522 1513 1771 1773 1774 1744 1775 +486 1513 1522 1523 1514 1774 1776 1777 1747 1778 +487 1514 1523 1524 1515 1777 1779 1780 1750 1781 +488 1515 1524 1525 1516 1780 1782 1783 1753 1784 +489 1516 1525 333 334 1783 1785 343 1756 1786 +490 68 6 322 1517 78 332 1787 1758 1788 +491 1517 322 321 1518 1787 331 1789 1761 1790 +492 1518 321 320 1519 1789 330 1791 1764 1792 +493 1519 320 319 1520 1791 329 1793 1767 1794 +494 1520 319 318 1521 1793 328 1795 1770 1796 +495 1521 318 317 1522 1795 327 1797 1773 1798 +496 1522 317 316 1523 1797 326 1799 1776 1800 +497 1523 316 315 1524 1799 325 1801 1779 1802 +498 1524 315 314 1525 1801 324 1803 1782 1804 +499 1525 314 9 333 1803 323 342 1785 1805 +2 4 10 150 +500 7 239 1806 365 248 1932 1933 380 1934 +501 365 1806 1807 364 1933 1935 1936 379 1937 +502 364 1807 1808 363 1936 1938 1939 378 1940 +503 363 1808 1809 362 1939 1941 1942 377 1943 +504 362 1809 1810 361 1942 1944 1945 376 1946 +505 361 1810 1811 360 1945 1947 1948 375 1949 +506 360 1811 1812 359 1948 1950 1951 374 1952 +507 359 1812 1813 358 1951 1953 1954 373 1955 +508 358 1813 1814 357 1954 1956 1957 372 1958 +509 357 1814 1815 356 1957 1959 1960 371 1961 +510 356 1815 1816 355 1960 1962 1963 370 1964 +511 355 1816 1817 354 1963 1965 1966 369 1967 +512 354 1817 1818 353 1966 1968 1969 368 1970 +513 353 1818 1819 352 1969 1971 1972 367 1973 +514 352 1819 333 9 1972 1974 342 366 1975 +515 239 240 1820 1806 249 1976 1977 1932 1978 +516 1806 1820 1821 1807 1977 1979 1980 1935 1981 +517 1807 1821 1822 1808 1980 1982 1983 1938 1984 +518 1808 1822 1823 1809 1983 1985 1986 1941 1987 +519 1809 1823 1824 1810 1986 1988 1989 1944 1990 +520 1810 1824 1825 1811 1989 1991 1992 1947 1993 +521 1811 1825 1826 1812 1992 1994 1995 1950 1996 +522 1812 1826 1827 1813 1995 1997 1998 1953 1999 +523 1813 1827 1828 1814 1998 2000 2001 1956 2002 +524 1814 1828 1829 1815 2001 2003 2004 1959 2005 +525 1815 1829 1830 1816 2004 2006 2007 1962 2008 +526 1816 1830 1831 1817 2007 2009 2010 1965 2011 +527 1817 1831 1832 1818 2010 2012 2013 1968 2014 +528 1818 1832 1833 1819 2013 2015 2016 1971 2017 +529 1819 1833 334 333 2016 2018 343 1974 2019 +530 240 241 1834 1820 250 2020 2021 1976 2022 +531 1820 1834 1835 1821 2021 2023 2024 1979 2025 +532 1821 1835 1836 1822 2024 2026 2027 1982 2028 +533 1822 1836 1837 1823 2027 2029 2030 1985 2031 +534 1823 1837 1838 1824 2030 2032 2033 1988 2034 +535 1824 1838 1839 1825 2033 2035 2036 1991 2037 +536 1825 1839 1840 1826 2036 2038 2039 1994 2040 +537 1826 1840 1841 1827 2039 2041 2042 1997 2043 +538 1827 1841 1842 1828 2042 2044 2045 2000 2046 +539 1828 1842 1843 1829 2045 2047 2048 2003 2049 +540 1829 1843 1844 1830 2048 2050 2051 2006 2052 +541 1830 1844 1845 1831 2051 2053 2054 2009 2055 +542 1831 1845 1846 1832 2054 2056 2057 2012 2058 +543 1832 1846 1847 1833 2057 2059 2060 2015 2061 +544 1833 1847 335 334 2060 2062 344 2018 2063 +545 241 242 1848 1834 251 2064 2065 2020 2066 +546 1834 1848 1849 1835 2065 2067 2068 2023 2069 +547 1835 1849 1850 1836 2068 2070 2071 2026 2072 +548 1836 1850 1851 1837 2071 2073 2074 2029 2075 +549 1837 1851 1852 1838 2074 2076 2077 2032 2078 +550 1838 1852 1853 1839 2077 2079 2080 2035 2081 +551 1839 1853 1854 1840 2080 2082 2083 2038 2084 +552 1840 1854 1855 1841 2083 2085 2086 2041 2087 +553 1841 1855 1856 1842 2086 2088 2089 2044 2090 +554 1842 1856 1857 1843 2089 2091 2092 2047 2093 +555 1843 1857 1858 1844 2092 2094 2095 2050 2096 +556 1844 1858 1859 1845 2095 2097 2098 2053 2099 +557 1845 1859 1860 1846 2098 2100 2101 2056 2102 +558 1846 1860 1861 1847 2101 2103 2104 2059 2105 +559 1847 1861 336 335 2104 2106 345 2062 2107 +560 242 243 1862 1848 252 2108 2109 2064 2110 +561 1848 1862 1863 1849 2109 2111 2112 2067 2113 +562 1849 1863 1864 1850 2112 2114 2115 2070 2116 +563 1850 1864 1865 1851 2115 2117 2118 2073 2119 +564 1851 1865 1866 1852 2118 2120 2121 2076 2122 +565 1852 1866 1867 1853 2121 2123 2124 2079 2125 +566 1853 1867 1868 1854 2124 2126 2127 2082 2128 +567 1854 1868 1869 1855 2127 2129 2130 2085 2131 +568 1855 1869 1870 1856 2130 2132 2133 2088 2134 +569 1856 1870 1871 1857 2133 2135 2136 2091 2137 +570 1857 1871 1872 1858 2136 2138 2139 2094 2140 +571 1858 1872 1873 1859 2139 2141 2142 2097 2143 +572 1859 1873 1874 1860 2142 2144 2145 2100 2146 +573 1860 1874 1875 1861 2145 2147 2148 2103 2149 +574 1861 1875 337 336 2148 2150 346 2106 2151 +575 243 244 1876 1862 253 2152 2153 2108 2154 +576 1862 1876 1877 1863 2153 2155 2156 2111 2157 +577 1863 1877 1878 1864 2156 2158 2159 2114 2160 +578 1864 1878 1879 1865 2159 2161 2162 2117 2163 +579 1865 1879 1880 1866 2162 2164 2165 2120 2166 +580 1866 1880 1881 1867 2165 2167 2168 2123 2169 +581 1867 1881 1882 1868 2168 2170 2171 2126 2172 +582 1868 1882 1883 1869 2171 2173 2174 2129 2175 +583 1869 1883 1884 1870 2174 2176 2177 2132 2178 +584 1870 1884 1885 1871 2177 2179 2180 2135 2181 +585 1871 1885 1886 1872 2180 2182 2183 2138 2184 +586 1872 1886 1887 1873 2183 2185 2186 2141 2187 +587 1873 1887 1888 1874 2186 2188 2189 2144 2190 +588 1874 1888 1889 1875 2189 2191 2192 2147 2193 +589 1875 1889 338 337 2192 2194 347 2150 2195 +590 244 245 1890 1876 254 2196 2197 2152 2198 +591 1876 1890 1891 1877 2197 2199 2200 2155 2201 +592 1877 1891 1892 1878 2200 2202 2203 2158 2204 +593 1878 1892 1893 1879 2203 2205 2206 2161 2207 +594 1879 1893 1894 1880 2206 2208 2209 2164 2210 +595 1880 1894 1895 1881 2209 2211 2212 2167 2213 +596 1881 1895 1896 1882 2212 2214 2215 2170 2216 +597 1882 1896 1897 1883 2215 2217 2218 2173 2219 +598 1883 1897 1898 1884 2218 2220 2221 2176 2222 +599 1884 1898 1899 1885 2221 2223 2224 2179 2225 +600 1885 1899 1900 1886 2224 2226 2227 2182 2228 +601 1886 1900 1901 1887 2227 2229 2230 2185 2231 +602 1887 1901 1902 1888 2230 2232 2233 2188 2234 +603 1888 1902 1903 1889 2233 2235 2236 2191 2237 +604 1889 1903 339 338 2236 2238 348 2194 2239 +605 245 246 1904 1890 255 2240 2241 2196 2242 +606 1890 1904 1905 1891 2241 2243 2244 2199 2245 +607 1891 1905 1906 1892 2244 2246 2247 2202 2248 +608 1892 1906 1907 1893 2247 2249 2250 2205 2251 +609 1893 1907 1908 1894 2250 2252 2253 2208 2254 +610 1894 1908 1909 1895 2253 2255 2256 2211 2257 +611 1895 1909 1910 1896 2256 2258 2259 2214 2260 +612 1896 1910 1911 1897 2259 2261 2262 2217 2263 +613 1897 1911 1912 1898 2262 2264 2265 2220 2266 +614 1898 1912 1913 1899 2265 2267 2268 2223 2269 +615 1899 1913 1914 1900 2268 2270 2271 2226 2272 +616 1900 1914 1915 1901 2271 2273 2274 2229 2275 +617 1901 1915 1916 1902 2274 2276 2277 2232 2278 +618 1902 1916 1917 1903 2277 2279 2280 2235 2281 +619 1903 1917 340 339 2280 2282 349 2238 2283 +620 246 247 1918 1904 256 2284 2285 2240 2286 +621 1904 1918 1919 1905 2285 2287 2288 2243 2289 +622 1905 1919 1920 1906 2288 2290 2291 2246 2292 +623 1906 1920 1921 1907 2291 2293 2294 2249 2295 +624 1907 1921 1922 1908 2294 2296 2297 2252 2298 +625 1908 1922 1923 1909 2297 2299 2300 2255 2301 +626 1909 1923 1924 1910 2300 2302 2303 2258 2304 +627 1910 1924 1925 1911 2303 2305 2306 2261 2307 +628 1911 1925 1926 1912 2306 2308 2309 2264 2310 +629 1912 1926 1927 1913 2309 2311 2312 2267 2313 +630 1913 1927 1928 1914 2312 2314 2315 2270 2316 +631 1914 1928 1929 1915 2315 2317 2318 2273 2319 +632 1915 1929 1930 1916 2318 2320 2321 2276 2322 +633 1916 1930 1931 1917 2321 2323 2324 2279 2325 +634 1917 1931 341 340 2324 2326 350 2282 2327 +635 247 1 12 1918 257 26 2328 2284 2329 +636 1918 12 13 1919 2328 27 2330 2287 2331 +637 1919 13 14 1920 2330 28 2332 2290 2333 +638 1920 14 15 1921 2332 29 2334 2293 2335 +639 1921 15 16 1922 2334 30 2336 2296 2337 +640 1922 16 17 1923 2336 31 2338 2299 2339 +641 1923 17 18 1924 2338 32 2340 2302 2341 +642 1924 18 19 1925 2340 33 2342 2305 2343 +643 1925 19 20 1926 2342 34 2344 2308 2345 +644 1926 20 21 1927 2344 35 2346 2311 2347 +645 1927 21 22 1928 2346 36 2348 2314 2349 +646 1928 22 23 1929 2348 37 2350 2317 2351 +647 1929 23 24 1930 2350 38 2352 2320 2353 +648 1930 24 25 1931 2352 39 2354 2323 2355 +649 1931 25 8 341 2354 40 351 2326 2356 +2 5 10 285 +650 9 352 2357 275 366 2609 2610 294 2611 +651 275 2357 2358 274 2610 2612 2613 293 2614 +652 274 2358 2359 273 2613 2615 2616 292 2617 +653 273 2359 2360 272 2616 2618 2619 291 2620 +654 272 2360 2361 271 2619 2621 2622 290 2623 +655 271 2361 2362 270 2622 2624 2625 289 2626 +656 270 2362 2363 269 2625 2627 2628 288 2629 +657 269 2363 2364 268 2628 2630 2631 287 2632 +658 268 2364 2365 267 2631 2633 2634 286 2635 +659 267 2365 2366 266 2634 2636 2637 285 2638 +660 266 2366 2367 265 2637 2639 2640 284 2641 +661 265 2367 2368 264 2640 2642 2643 283 2644 +662 264 2368 2369 263 2643 2645 2646 282 2647 +663 263 2369 2370 262 2646 2648 2649 281 2650 +664 262 2370 2371 261 2649 2651 2652 280 2653 +665 261 2371 2372 260 2652 2654 2655 279 2656 +666 260 2372 2373 259 2655 2657 2658 278 2659 +667 259 2373 2374 258 2658 2660 2661 277 2662 +668 258 2374 173 11 2661 2663 187 276 2664 +669 352 353 2375 2357 367 2665 2666 2609 2667 +670 2357 2375 2376 2358 2666 2668 2669 2612 2670 +671 2358 2376 2377 2359 2669 2671 2672 2615 2673 +672 2359 2377 2378 2360 2672 2674 2675 2618 2676 +673 2360 2378 2379 2361 2675 2677 2678 2621 2679 +674 2361 2379 2380 2362 2678 2680 2681 2624 2682 +675 2362 2380 2381 2363 2681 2683 2684 2627 2685 +676 2363 2381 2382 2364 2684 2686 2687 2630 2688 +677 2364 2382 2383 2365 2687 2689 2690 2633 2691 +678 2365 2383 2384 2366 2690 2692 2693 2636 2694 +679 2366 2384 2385 2367 2693 2695 2696 2639 2697 +680 2367 2385 2386 2368 2696 2698 2699 2642 2700 +681 2368 2386 2387 2369 2699 2701 2702 2645 2703 +682 2369 2387 2388 2370 2702 2704 2705 2648 2706 +683 2370 2388 2389 2371 2705 2707 2708 2651 2709 +684 2371 2389 2390 2372 2708 2710 2711 2654 2712 +685 2372 2390 2391 2373 2711 2713 2714 2657 2715 +686 2373 2391 2392 2374 2714 2716 2717 2660 2718 +687 2374 2392 174 173 2717 2719 188 2663 2720 +688 353 354 2393 2375 368 2721 2722 2665 2723 +689 2375 2393 2394 2376 2722 2724 2725 2668 2726 +690 2376 2394 2395 2377 2725 2727 2728 2671 2729 +691 2377 2395 2396 2378 2728 2730 2731 2674 2732 +692 2378 2396 2397 2379 2731 2733 2734 2677 2735 +693 2379 2397 2398 2380 2734 2736 2737 2680 2738 +694 2380 2398 2399 2381 2737 2739 2740 2683 2741 +695 2381 2399 2400 2382 2740 2742 2743 2686 2744 +696 2382 2400 2401 2383 2743 2745 2746 2689 2747 +697 2383 2401 2402 2384 2746 2748 2749 2692 2750 +698 2384 2402 2403 2385 2749 2751 2752 2695 2753 +699 2385 2403 2404 2386 2752 2754 2755 2698 2756 +700 2386 2404 2405 2387 2755 2757 2758 2701 2759 +701 2387 2405 2406 2388 2758 2760 2761 2704 2762 +702 2388 2406 2407 2389 2761 2763 2764 2707 2765 +703 2389 2407 2408 2390 2764 2766 2767 2710 2768 +704 2390 2408 2409 2391 2767 2769 2770 2713 2771 +705 2391 2409 2410 2392 2770 2772 2773 2716 2774 +706 2392 2410 175 174 2773 2775 189 2719 2776 +707 354 355 2411 2393 369 2777 2778 2721 2779 +708 2393 2411 2412 2394 2778 2780 2781 2724 2782 +709 2394 2412 2413 2395 2781 2783 2784 2727 2785 +710 2395 2413 2414 2396 2784 2786 2787 2730 2788 +711 2396 2414 2415 2397 2787 2789 2790 2733 2791 +712 2397 2415 2416 2398 2790 2792 2793 2736 2794 +713 2398 2416 2417 2399 2793 2795 2796 2739 2797 +714 2399 2417 2418 2400 2796 2798 2799 2742 2800 +715 2400 2418 2419 2401 2799 2801 2802 2745 2803 +716 2401 2419 2420 2402 2802 2804 2805 2748 2806 +717 2402 2420 2421 2403 2805 2807 2808 2751 2809 +718 2403 2421 2422 2404 2808 2810 2811 2754 2812 +719 2404 2422 2423 2405 2811 2813 2814 2757 2815 +720 2405 2423 2424 2406 2814 2816 2817 2760 2818 +721 2406 2424 2425 2407 2817 2819 2820 2763 2821 +722 2407 2425 2426 2408 2820 2822 2823 2766 2824 +723 2408 2426 2427 2409 2823 2825 2826 2769 2827 +724 2409 2427 2428 2410 2826 2828 2829 2772 2830 +725 2410 2428 176 175 2829 2831 190 2775 2832 +726 355 356 2429 2411 370 2833 2834 2777 2835 +727 2411 2429 2430 2412 2834 2836 2837 2780 2838 +728 2412 2430 2431 2413 2837 2839 2840 2783 2841 +729 2413 2431 2432 2414 2840 2842 2843 2786 2844 +730 2414 2432 2433 2415 2843 2845 2846 2789 2847 +731 2415 2433 2434 2416 2846 2848 2849 2792 2850 +732 2416 2434 2435 2417 2849 2851 2852 2795 2853 +733 2417 2435 2436 2418 2852 2854 2855 2798 2856 +734 2418 2436 2437 2419 2855 2857 2858 2801 2859 +735 2419 2437 2438 2420 2858 2860 2861 2804 2862 +736 2420 2438 2439 2421 2861 2863 2864 2807 2865 +737 2421 2439 2440 2422 2864 2866 2867 2810 2868 +738 2422 2440 2441 2423 2867 2869 2870 2813 2871 +739 2423 2441 2442 2424 2870 2872 2873 2816 2874 +740 2424 2442 2443 2425 2873 2875 2876 2819 2877 +741 2425 2443 2444 2426 2876 2878 2879 2822 2880 +742 2426 2444 2445 2427 2879 2881 2882 2825 2883 +743 2427 2445 2446 2428 2882 2884 2885 2828 2886 +744 2428 2446 177 176 2885 2887 191 2831 2888 +745 356 357 2447 2429 371 2889 2890 2833 2891 +746 2429 2447 2448 2430 2890 2892 2893 2836 2894 +747 2430 2448 2449 2431 2893 2895 2896 2839 2897 +748 2431 2449 2450 2432 2896 2898 2899 2842 2900 +749 2432 2450 2451 2433 2899 2901 2902 2845 2903 +750 2433 2451 2452 2434 2902 2904 2905 2848 2906 +751 2434 2452 2453 2435 2905 2907 2908 2851 2909 +752 2435 2453 2454 2436 2908 2910 2911 2854 2912 +753 2436 2454 2455 2437 2911 2913 2914 2857 2915 +754 2437 2455 2456 2438 2914 2916 2917 2860 2918 +755 2438 2456 2457 2439 2917 2919 2920 2863 2921 +756 2439 2457 2458 2440 2920 2922 2923 2866 2924 +757 2440 2458 2459 2441 2923 2925 2926 2869 2927 +758 2441 2459 2460 2442 2926 2928 2929 2872 2930 +759 2442 2460 2461 2443 2929 2931 2932 2875 2933 +760 2443 2461 2462 2444 2932 2934 2935 2878 2936 +761 2444 2462 2463 2445 2935 2937 2938 2881 2939 +762 2445 2463 2464 2446 2938 2940 2941 2884 2942 +763 2446 2464 178 177 2941 2943 192 2887 2944 +764 357 358 2465 2447 372 2945 2946 2889 2947 +765 2447 2465 2466 2448 2946 2948 2949 2892 2950 +766 2448 2466 2467 2449 2949 2951 2952 2895 2953 +767 2449 2467 2468 2450 2952 2954 2955 2898 2956 +768 2450 2468 2469 2451 2955 2957 2958 2901 2959 +769 2451 2469 2470 2452 2958 2960 2961 2904 2962 +770 2452 2470 2471 2453 2961 2963 2964 2907 2965 +771 2453 2471 2472 2454 2964 2966 2967 2910 2968 +772 2454 2472 2473 2455 2967 2969 2970 2913 2971 +773 2455 2473 2474 2456 2970 2972 2973 2916 2974 +774 2456 2474 2475 2457 2973 2975 2976 2919 2977 +775 2457 2475 2476 2458 2976 2978 2979 2922 2980 +776 2458 2476 2477 2459 2979 2981 2982 2925 2983 +777 2459 2477 2478 2460 2982 2984 2985 2928 2986 +778 2460 2478 2479 2461 2985 2987 2988 2931 2989 +779 2461 2479 2480 2462 2988 2990 2991 2934 2992 +780 2462 2480 2481 2463 2991 2993 2994 2937 2995 +781 2463 2481 2482 2464 2994 2996 2997 2940 2998 +782 2464 2482 179 178 2997 2999 193 2943 3000 +783 358 359 2483 2465 373 3001 3002 2945 3003 +784 2465 2483 2484 2466 3002 3004 3005 2948 3006 +785 2466 2484 2485 2467 3005 3007 3008 2951 3009 +786 2467 2485 2486 2468 3008 3010 3011 2954 3012 +787 2468 2486 2487 2469 3011 3013 3014 2957 3015 +788 2469 2487 2488 2470 3014 3016 3017 2960 3018 +789 2470 2488 2489 2471 3017 3019 3020 2963 3021 +790 2471 2489 2490 2472 3020 3022 3023 2966 3024 +791 2472 2490 2491 2473 3023 3025 3026 2969 3027 +792 2473 2491 2492 2474 3026 3028 3029 2972 3030 +793 2474 2492 2493 2475 3029 3031 3032 2975 3033 +794 2475 2493 2494 2476 3032 3034 3035 2978 3036 +795 2476 2494 2495 2477 3035 3037 3038 2981 3039 +796 2477 2495 2496 2478 3038 3040 3041 2984 3042 +797 2478 2496 2497 2479 3041 3043 3044 2987 3045 +798 2479 2497 2498 2480 3044 3046 3047 2990 3048 +799 2480 2498 2499 2481 3047 3049 3050 2993 3051 +800 2481 2499 2500 2482 3050 3052 3053 2996 3054 +801 2482 2500 180 179 3053 3055 194 2999 3056 +802 359 360 2501 2483 374 3057 3058 3001 3059 +803 2483 2501 2502 2484 3058 3060 3061 3004 3062 +804 2484 2502 2503 2485 3061 3063 3064 3007 3065 +805 2485 2503 2504 2486 3064 3066 3067 3010 3068 +806 2486 2504 2505 2487 3067 3069 3070 3013 3071 +807 2487 2505 2506 2488 3070 3072 3073 3016 3074 +808 2488 2506 2507 2489 3073 3075 3076 3019 3077 +809 2489 2507 2508 2490 3076 3078 3079 3022 3080 +810 2490 2508 2509 2491 3079 3081 3082 3025 3083 +811 2491 2509 2510 2492 3082 3084 3085 3028 3086 +812 2492 2510 2511 2493 3085 3087 3088 3031 3089 +813 2493 2511 2512 2494 3088 3090 3091 3034 3092 +814 2494 2512 2513 2495 3091 3093 3094 3037 3095 +815 2495 2513 2514 2496 3094 3096 3097 3040 3098 +816 2496 2514 2515 2497 3097 3099 3100 3043 3101 +817 2497 2515 2516 2498 3100 3102 3103 3046 3104 +818 2498 2516 2517 2499 3103 3105 3106 3049 3107 +819 2499 2517 2518 2500 3106 3108 3109 3052 3110 +820 2500 2518 181 180 3109 3111 195 3055 3112 +821 360 361 2519 2501 375 3113 3114 3057 3115 +822 2501 2519 2520 2502 3114 3116 3117 3060 3118 +823 2502 2520 2521 2503 3117 3119 3120 3063 3121 +824 2503 2521 2522 2504 3120 3122 3123 3066 3124 +825 2504 2522 2523 2505 3123 3125 3126 3069 3127 +826 2505 2523 2524 2506 3126 3128 3129 3072 3130 +827 2506 2524 2525 2507 3129 3131 3132 3075 3133 +828 2507 2525 2526 2508 3132 3134 3135 3078 3136 +829 2508 2526 2527 2509 3135 3137 3138 3081 3139 +830 2509 2527 2528 2510 3138 3140 3141 3084 3142 +831 2510 2528 2529 2511 3141 3143 3144 3087 3145 +832 2511 2529 2530 2512 3144 3146 3147 3090 3148 +833 2512 2530 2531 2513 3147 3149 3150 3093 3151 +834 2513 2531 2532 2514 3150 3152 3153 3096 3154 +835 2514 2532 2533 2515 3153 3155 3156 3099 3157 +836 2515 2533 2534 2516 3156 3158 3159 3102 3160 +837 2516 2534 2535 2517 3159 3161 3162 3105 3163 +838 2517 2535 2536 2518 3162 3164 3165 3108 3166 +839 2518 2536 182 181 3165 3167 196 3111 3168 +840 361 362 2537 2519 376 3169 3170 3113 3171 +841 2519 2537 2538 2520 3170 3172 3173 3116 3174 +842 2520 2538 2539 2521 3173 3175 3176 3119 3177 +843 2521 2539 2540 2522 3176 3178 3179 3122 3180 +844 2522 2540 2541 2523 3179 3181 3182 3125 3183 +845 2523 2541 2542 2524 3182 3184 3185 3128 3186 +846 2524 2542 2543 2525 3185 3187 3188 3131 3189 +847 2525 2543 2544 2526 3188 3190 3191 3134 3192 +848 2526 2544 2545 2527 3191 3193 3194 3137 3195 +849 2527 2545 2546 2528 3194 3196 3197 3140 3198 +850 2528 2546 2547 2529 3197 3199 3200 3143 3201 +851 2529 2547 2548 2530 3200 3202 3203 3146 3204 +852 2530 2548 2549 2531 3203 3205 3206 3149 3207 +853 2531 2549 2550 2532 3206 3208 3209 3152 3210 +854 2532 2550 2551 2533 3209 3211 3212 3155 3213 +855 2533 2551 2552 2534 3212 3214 3215 3158 3216 +856 2534 2552 2553 2535 3215 3217 3218 3161 3219 +857 2535 2553 2554 2536 3218 3220 3221 3164 3222 +858 2536 2554 183 182 3221 3223 197 3167 3224 +859 362 363 2555 2537 377 3225 3226 3169 3227 +860 2537 2555 2556 2538 3226 3228 3229 3172 3230 +861 2538 2556 2557 2539 3229 3231 3232 3175 3233 +862 2539 2557 2558 2540 3232 3234 3235 3178 3236 +863 2540 2558 2559 2541 3235 3237 3238 3181 3239 +864 2541 2559 2560 2542 3238 3240 3241 3184 3242 +865 2542 2560 2561 2543 3241 3243 3244 3187 3245 +866 2543 2561 2562 2544 3244 3246 3247 3190 3248 +867 2544 2562 2563 2545 3247 3249 3250 3193 3251 +868 2545 2563 2564 2546 3250 3252 3253 3196 3254 +869 2546 2564 2565 2547 3253 3255 3256 3199 3257 +870 2547 2565 2566 2548 3256 3258 3259 3202 3260 +871 2548 2566 2567 2549 3259 3261 3262 3205 3263 +872 2549 2567 2568 2550 3262 3264 3265 3208 3266 +873 2550 2568 2569 2551 3265 3267 3268 3211 3269 +874 2551 2569 2570 2552 3268 3270 3271 3214 3272 +875 2552 2570 2571 2553 3271 3273 3274 3217 3275 +876 2553 2571 2572 2554 3274 3276 3277 3220 3278 +877 2554 2572 184 183 3277 3279 198 3223 3280 +878 363 364 2573 2555 378 3281 3282 3225 3283 +879 2555 2573 2574 2556 3282 3284 3285 3228 3286 +880 2556 2574 2575 2557 3285 3287 3288 3231 3289 +881 2557 2575 2576 2558 3288 3290 3291 3234 3292 +882 2558 2576 2577 2559 3291 3293 3294 3237 3295 +883 2559 2577 2578 2560 3294 3296 3297 3240 3298 +884 2560 2578 2579 2561 3297 3299 3300 3243 3301 +885 2561 2579 2580 2562 3300 3302 3303 3246 3304 +886 2562 2580 2581 2563 3303 3305 3306 3249 3307 +887 2563 2581 2582 2564 3306 3308 3309 3252 3310 +888 2564 2582 2583 2565 3309 3311 3312 3255 3313 +889 2565 2583 2584 2566 3312 3314 3315 3258 3316 +890 2566 2584 2585 2567 3315 3317 3318 3261 3319 +891 2567 2585 2586 2568 3318 3320 3321 3264 3322 +892 2568 2586 2587 2569 3321 3323 3324 3267 3325 +893 2569 2587 2588 2570 3324 3326 3327 3270 3328 +894 2570 2588 2589 2571 3327 3329 3330 3273 3331 +895 2571 2589 2590 2572 3330 3332 3333 3276 3334 +896 2572 2590 185 184 3333 3335 199 3279 3336 +897 364 365 2591 2573 379 3337 3338 3281 3339 +898 2573 2591 2592 2574 3338 3340 3341 3284 3342 +899 2574 2592 2593 2575 3341 3343 3344 3287 3345 +900 2575 2593 2594 2576 3344 3346 3347 3290 3348 +901 2576 2594 2595 2577 3347 3349 3350 3293 3351 +902 2577 2595 2596 2578 3350 3352 3353 3296 3354 +903 2578 2596 2597 2579 3353 3355 3356 3299 3357 +904 2579 2597 2598 2580 3356 3358 3359 3302 3360 +905 2580 2598 2599 2581 3359 3361 3362 3305 3363 +906 2581 2599 2600 2582 3362 3364 3365 3308 3366 +907 2582 2600 2601 2583 3365 3367 3368 3311 3369 +908 2583 2601 2602 2584 3368 3370 3371 3314 3372 +909 2584 2602 2603 2585 3371 3373 3374 3317 3375 +910 2585 2603 2604 2586 3374 3376 3377 3320 3378 +911 2586 2604 2605 2587 3377 3379 3380 3323 3381 +912 2587 2605 2606 2588 3380 3382 3383 3326 3384 +913 2588 2606 2607 2589 3383 3385 3386 3329 3387 +914 2589 2607 2608 2590 3386 3388 3389 3332 3390 +915 2590 2608 186 185 3389 3391 200 3335 3392 +916 365 7 219 2591 380 238 3393 3337 3394 +917 2591 219 218 2592 3393 237 3395 3340 3396 +918 2592 218 217 2593 3395 236 3397 3343 3398 +919 2593 217 216 2594 3397 235 3399 3346 3400 +920 2594 216 215 2595 3399 234 3401 3349 3402 +921 2595 215 214 2596 3401 233 3403 3352 3404 +922 2596 214 213 2597 3403 232 3405 3355 3406 +923 2597 213 212 2598 3405 231 3407 3358 3408 +924 2598 212 211 2599 3407 230 3409 3361 3410 +925 2599 211 210 2600 3409 229 3411 3364 3412 +926 2600 210 209 2601 3411 228 3413 3367 3414 +927 2601 209 208 2602 3413 227 3415 3370 3416 +928 2602 208 207 2603 3415 226 3417 3373 3418 +929 2603 207 206 2604 3417 225 3419 3376 3420 +930 2604 206 205 2605 3419 224 3421 3379 3422 +931 2605 205 204 2606 3421 223 3423 3382 3424 +932 2606 204 203 2607 3423 222 3425 3385 3426 +933 2607 203 202 2608 3425 221 3427 3388 3428 +934 2608 202 2 186 3427 220 201 3391 3429 +$EndElements diff --git a/dG3D/src/dG3DIPVariable.cpp b/dG3D/src/dG3DIPVariable.cpp index 865d5d0cb547302a9537a3ad3db20d2b11127bc6..c654d39e9209c23e11a68aa27e9c1f91057898ee 100644 --- a/dG3D/src/dG3DIPVariable.cpp +++ b/dG3D/src/dG3DIPVariable.cpp @@ -2007,9 +2007,6 @@ torchANNBasedDG3DIPVariable& torchANNBasedDG3DIPVariable::operator =(const IPVar _internalVars = psrc->_internalVars; _kinematicVariables = psrc->_kinematicVariables; _extraVariables = psrc->_extraVariables; // Include extra parameters at GP when using overloaded(=) @Mohib - - // @Mohib TODO: Remove b4 commit - //_latticeParams = psrc->_latticeParams; } #else Msg::Error("NOT COMPILED WITH TORCH"); @@ -2036,47 +2033,62 @@ double torchANNBasedDG3DIPVariable::get(const int comp) const { #if defined(HAVE_TORCH) auto Vars_a = _internalVars.accessor<float,3>(); - if (comp == IPField::USER0) + if (comp == IPField::USER0) { - if (_n > 1) return Vars_a[0][0][0]; + if (_extraVariables.size2() > 0) return _extraVariables(0,0); else return 0.; } else if (comp == IPField::USER1) { - if (_n > 2) return Vars_a[0][0][1]; + if (_extraVariables.size2() > 1) return _extraVariables(0,1); else return 0.; } else if (comp == IPField::USER2) + { + if (_extraVariables.size2() > 2) return _extraVariables(0,2); + else return 0.; + } + else if (comp == IPField::USER3) + { + if (_n > 1) return Vars_a[0][0][0]; + else return 0.; + } + else if (comp == IPField::USER4) + { + if (_n > 2) return Vars_a[0][0][1]; + else return 0.; + } + else if (comp == IPField::USER5) { if (_n > 3) return Vars_a[0][0][2]; else return 0.; } - else if (comp == IPField::USER3) + else if (comp == IPField::USER6) { if (_n > 4) return Vars_a[0][0][3]; else return 0.; } - else if (comp == IPField::USER4) + else if (comp == IPField::USER7) { if (_n > 5) return Vars_a[0][0][4]; else return 0.; } - else if (comp == IPField::USER5) + else if (comp == IPField::USER8) { if (_n > 6) return Vars_a[0][0][5]; else return 0.; } - else if (comp == IPField::USER6) + else if (comp == IPField::USER9) { if (_n > 7) return Vars_a[0][0][6]; else return 0.; } - else if (comp == IPField::USER7) + else if (comp == IPField::USER10) { if (_n > 8) return Vars_a[0][0][7]; else return 0.; } - else if (comp == IPField::USER8) + /*else if (comp == IPField::USER8) { if (_n > 9) return Vars_a[0][0][8]; else return 0.; @@ -2090,7 +2102,7 @@ double torchANNBasedDG3DIPVariable::get(const int comp) const { if (_n > 11) return Vars_a[0][0][10]; else return 0.; - } + }*/ else { return dG3DIPVariable::get(comp); @@ -2216,6 +2228,118 @@ void J2SmallStrainDG3DIPVariable::restart() return; } +AnisotropicPlasticityDG3DIPVariable::AnisotropicPlasticityDG3DIPVariable(const mlawAnisotropicPlasticity &anisoLaw, const bool createBodyForceHO, const bool oninter): dG3DIPVariable(createBodyForceHO, oninter) +{ + _ipv = new IPAnisotropicPlasticity(anisoLaw.getJ2IsotropicHardening()); +} +AnisotropicPlasticityDG3DIPVariable::AnisotropicPlasticityDG3DIPVariable(const AnisotropicPlasticityDG3DIPVariable &source) : dG3DIPVariable(source) +{ + _ipv = NULL; + if(source._ipv != NULL){ + _ipv = dynamic_cast<IPAnisotropicPlasticity*>(source._ipv->clone()); + } +} +AnisotropicPlasticityDG3DIPVariable& AnisotropicPlasticityDG3DIPVariable::operator=(const IPVariable &source) +{ + dG3DIPVariable::operator=(source); + const AnisotropicPlasticityDG3DIPVariable* src = dynamic_cast<const AnisotropicPlasticityDG3DIPVariable*>(&source); + if(src != NULL){ + if (src->_ipv != NULL){ + if (_ipv != NULL) { + _ipv->operator=(*dynamic_cast<const IPVariable*>(src->_ipv)); + } + else{ + _ipv = dynamic_cast<IPAnisotropicPlasticity*>(src->_ipv->clone()); + } + } + else{ + if (_ipv) { + delete _ipv; + _ipv = NULL; + } + } + + } + return *this; +} +double AnisotropicPlasticityDG3DIPVariable::get(const int comp) const +{ + if(comp == IPField::PLASTICSTRAIN) + { + return _ipv->_j2lepspbarre; + } + else if(comp == IPField::FP_XX) + { + return _ipv->_j2lepsp(0,0); + } + else if(comp == IPField::FP_XY) + { + return _ipv->_j2lepsp(0,1); + } + else if(comp == IPField::FP_XZ) + { + return _ipv->_j2lepsp(0,2); + } + else if(comp == IPField::FP_YX) + { + return _ipv->_j2lepsp(1,0); + } + else if(comp == IPField::FP_YY) + { + return _ipv->_j2lepsp(1,1); + } + else if(comp == IPField::FP_YZ) + { + return _ipv->_j2lepsp(1,2); + } + else if(comp == IPField::FP_ZX) + { + return _ipv->_j2lepsp(2,0); + } + else if(comp == IPField::FP_ZY) + { + return _ipv->_j2lepsp(2,1); + } + else if(comp == IPField::FP_ZZ) + { + return _ipv->_j2lepsp(2,2); + } + else if (comp == IPField::ISO_YIELD or + comp == IPField::ISO_YIELD_TENSILE or + comp == IPField::ISO_YIELD_COMPRESSION) + { + return _ipv->getConstRefToIPJ2IsotropicHardening().getR(); + } + else if (comp == IPField::ISO_YIELD_SHEAR) + { + return (_ipv->getConstRefToIPJ2IsotropicHardening().getR())/sqrt(3.); + } + else + { + //return dG3DIPVariable::get(comp); + double val = _ipv->get(comp); + if (val == 0.) + val = dG3DIPVariable::get(comp); + return val; + } +} +double AnisotropicPlasticityDG3DIPVariable::defoEnergy() const +{ + return getIPAnisotropicPlasticity()->defoEnergy(); +} +double AnisotropicPlasticityDG3DIPVariable::plasticEnergy() const +{ + return getIPAnisotropicPlasticity()->plasticEnergy(); +} + +void AnisotropicPlasticityDG3DIPVariable::restart() +{ + dG3DIPVariable::restart(); + restartManager::restart(_ipv); + return; +} + + J2LinearDG3DIPVariable::J2LinearDG3DIPVariable(const mlawJ2linear &_j2law, const bool createBodyForceHO, const bool oninter): dG3DIPVariable(createBodyForceHO, oninter) { _j2ipv = new IPJ2linear(_j2law.getJ2IsotropicHardening()); diff --git a/dG3D/src/dG3DIPVariable.h b/dG3D/src/dG3DIPVariable.h index 66de2a5087da8e525b9a1f56ad08479d987a3c25..e10d8958ea407e3dc25f400c285d0a13b965f104 100644 --- a/dG3D/src/dG3DIPVariable.h +++ b/dG3D/src/dG3DIPVariable.h @@ -41,6 +41,7 @@ #include "ipLinearElecMagTherMech.h" #include "ipLinearElecMagInductor.h" #include "mlawJ2linear.h" +#include "mlawAnisotropicPlasticity.h" #include "mlawJ2VMSmallStrain.h" #include "mlawJ2ThermoMechanics.h" #include "mlawLocalDamageJ2Hyper.h" @@ -2253,11 +2254,9 @@ class torchANNBasedDG3DIPVariable :public dG3DIPVariable fullMatrix<double> _kinematicVariables; // kinematic variable fullMatrix<double> restart_internalVars; // internal variable fullMatrix<double> _extraVariables; // variables other than kinematic and hidden needed at GP @Mohib - // @Mohib TODO: Remove b4 commit - //fullMatrix<double> _latticeParams; public: - //torchANNBasedDG3DIPVariable(const int n, const double initial_h, const bool createBodyForceHO, const bool oninter); + //torchANNBasedDG3DIPVariable(const int n, const double initial_h, const bool createBodyForceHO, const bool oninter); // Retundend init signature. Kept for legacy @Mohib // Overloading for handling additional params at GP @Mohib torchANNBasedDG3DIPVariable(const int n, const double initial_h, const bool createBodyForceHO, const bool oninter, const int extraInput=0, const std::vector<double> initialValue_Extra={}); torchANNBasedDG3DIPVariable(const torchANNBasedDG3DIPVariable &source); @@ -2422,6 +2421,48 @@ class J2SmallStrainDG3DIPVariable : public dG3DIPVariable // or store data in a virtual void restart(); }; +class AnisotropicPlasticityDG3DIPVariable : public dG3DIPVariable // or store data in a different way +{ + protected: + IPAnisotropicPlasticity *_ipv; + public: + AnisotropicPlasticityDG3DIPVariable(const mlawAnisotropicPlasticity &_anisoLaw, const bool createBodyForceHO, const bool oninter); + AnisotropicPlasticityDG3DIPVariable(const AnisotropicPlasticityDG3DIPVariable &source); + virtual AnisotropicPlasticityDG3DIPVariable& operator=(const IPVariable &source); + virtual ~AnisotropicPlasticityDG3DIPVariable(){if(_ipv!=NULL) {delete _ipv; _ipv=NULL;}}; + + virtual void setLocation(const IPVariable::LOCATION loc) { + dG3DIPVariable::setLocation(loc); + if (_ipv) + _ipv->setLocation(loc); + }; + + virtual IPVariable* getInternalData() {return _ipv;}; + virtual const IPVariable* getInternalData() const {return _ipv;}; + + /* specific function */ + IPAnisotropicPlasticity* getIPAnisotropicPlasticity(){return _ipv;} + const IPAnisotropicPlasticity* getIPAnisotropicPlasticity() const{return _ipv;} + virtual double get(const int i) const; + virtual double defoEnergy() const; + virtual double plasticEnergy() const; + virtual double damageEnergy() const {return _ipv->damageEnergy();}; + + virtual bool dissipationIsActive() const {return _ipv->dissipationIsActive();}; + virtual void blockDissipation(const bool fl){ _ipv->blockDissipation(fl);} + virtual bool dissipationIsBlocked() const { return _ipv->dissipationIsBlocked();} + + // for path following based on irreversibe energt + virtual double irreversibleEnergy() const {return _ipv->irreversibleEnergy();}; + virtual double& getRefToIrreversibleEnergy() {return _ipv->getRefToIrreversibleEnergy();}; + + virtual const STensor3& getConstRefToDIrreversibleEnergyDDeformationGradient() const {return _ipv->getConstRefToDIrreversibleEnergyDF();}; + virtual STensor3& getRefToDIrreversibleEnergyDDeformationGradient() {return _ipv->getRefToDIrreversibleEnergyDF();}; + + virtual IPVariable* clone() const {return new AnisotropicPlasticityDG3DIPVariable(*this);}; + virtual void restart(); +}; + class J2LinearDG3DIPVariable : public dG3DIPVariable // or store data in a different way { protected: diff --git a/dG3D/src/dG3DMaterialLaw.cpp b/dG3D/src/dG3DMaterialLaw.cpp index 4225095d4ad640f04b29b75fd1ddade5e2872a68..4fb932545352547d088a41636222ef281ab6f130 100644 --- a/dG3D/src/dG3DMaterialLaw.cpp +++ b/dG3D/src/dG3DMaterialLaw.cpp @@ -22,6 +22,7 @@ #include "mlawElecSMP.h" #include <iostream> #include <fstream> +#include <sstream> #include <iomanip> #include <vector> #include <string> @@ -1900,6 +1901,103 @@ double ANNBasedDG3DMaterialLaw::soundSpeed() const }; // +void ExtraVariablesAtGaussPoints::fill(const std::string fname) +{ + Msg::Info("read %s",fname.c_str()); + filled=true; + locations.clear(); + field.clear(); + + std::ifstream inputFile(fname.c_str()); + std::vector<double> numbers; + if (inputFile.is_open()) + { + std::string line; + while (std::getline(inputFile, line)) + { + std::stringstream ss(line); + std::string token; + numbers.clear(); + while (std::getline(ss, token, ';')) { + double num; + std::istringstream(token) >> num; + numbers.push_back(num); + } + int numberSize=numbers.size(); + //Msg::Info("Line of %d values",numberSize); + if(numberSize<4) + { + Msg::Error("Not enough numbers per line in %s",fname.c_str()); + Msg::Exit(0); + } + SVector3 pt(numbers[0],numbers[1],numbers[2]); + locations.push_back(pt); + std::vector<double> localfield=std::vector<double>(numbers.begin()+3,numbers.end()); + field.push_back(localfield); + } + } + else + { + Msg::Error("Unable to read %s",fname.c_str()); + Msg::Exit(0); + } + + inputFile.close(); +} + +const std::vector<double> &ExtraVariablesAtGaussPoints::getFieldAtClosestLocation(const SVector3 &gp) const +{ + std::vector<SVector3>::const_iterator it1min, it1= locations.begin(); + std::vector< std::vector<double> >::const_iterator it2min, it2 = field.begin(); + if (locations.size() == field.size()) { + double minimumdist = 1.e12; + SVector3 dist; + for (; it1 != locations.end() && it2 != field.end(); ++it1, ++it2) { + dist=gp; + dist-=*it1; + double norm=dist.norm(); + if(norm <minimumdist) + { + it1min=it1; + it2min=it2; + minimumdist=norm; + } + } + //Msg::Info("Values at Gauss point location: %f %f %f", (*it1min)[0],(*it1min)[1],(*it1min)[2]); + //std::vector<double>::const_iterator it3; + //for (it3=it2min->begin(); it3 != it2min->end(); ++it3) { + // Msg::Info("Element %f",*it3); + //} + } + else + { + Msg::Error("ExtraVariablesAtGaussPoints locations and field not of the same size"); + Msg::Exit(0); + } + return *it2min; +} + +void ExtraVariablesAtGaussPoints::print() const +{ + if (locations.size() == field.size()) { + std::vector<SVector3>::const_iterator it1 = locations.begin(); + std::vector< std::vector<double> >::const_iterator it2 = field.begin(); + for (; it1 != locations.end() && it2 != field.end(); ++it1, ++it2) { + Msg::Info("Values at Gauss point location: %f %f %f", (*it1)[0],(*it1)[1],(*it1)[2]); + std::vector<double>::const_iterator it3; + for (it3=it2->begin(); it3 != it2->end(); ++it3) { + Msg::Info("Element %f",*it3); + } + } + } + else + { + Msg::Error("ExtraVariablesAtGaussPoints locations and field not of the same size"); + Msg::Exit(0); + } +} + + torchANNBasedDG3DMaterialLaw::torchANNBasedDG3DMaterialLaw(const int num, const double rho, const int numberOfInput, const int numInternalVars, const char* nameTorch, const double EXXmean, const double EXXstd, const double EXYmean, const double EXYstd, const double EYYmean, const double EYYstd, const double EYZmean, const double EYZstd, const double EZZmean, @@ -1910,8 +2008,10 @@ torchANNBasedDG3DMaterialLaw::torchANNBasedDG3DMaterialLaw(const int num, const _EXXmean(EXXmean), _EXXstd(EXXstd), _EXYmean(EXYmean), _EXYstd(EXYstd), _EYYmean(EYYmean), _EYYstd(EYYstd), _EYZmean(EYZmean), _EYZstd(EYZstd), _EZZmean(EZZmean), _EZZstd(EZZstd), _EZXmean(EZXmean), _EZXstd(EZXstd), _SXXmean(SXXmean), _SXXstd(SXXstd), _SXYmean(SXYmean), _SXYstd(SXYstd), _SYYmean(SYYmean), _SYYstd(SYYstd), _SYZmean(SYZmean), _SYZstd(SYZstd), _SZZmean(SZZmean), _SZZstd(SZZstd), - _SZXmean(SZXmean), _SZXstd(SZXstd), _tangentByPerturbation(pert), _pertTol(tol), _kinematicInput(EGL), _NeedExtraNorm(false), - _numberOfExtraInput(0) + _SZXmean(SZXmean), _SZXstd(SZXstd), _tangentByPerturbation(pert), _pertTol(tol), _kinematicInput(EGL), _NeedExtraNorm(false), + _numberOfExtraInput(0), + _fileExtraInputsGp(""), _extraVariablesAtGaussPoints(), _time_arg(-1), _ctime(0.0) + { #if defined(HAVE_TORCH) try{ @@ -1971,7 +2071,6 @@ torchANNBasedDG3DMaterialLaw::torchANNBasedDG3DMaterialLaw(const int num, const } -// Modified to add _extra_inp, _latticeRadius & _latticeSize @Mohib. TODO: refractor latticeRadius and size to IPvariable torchANNBasedDG3DMaterialLaw::torchANNBasedDG3DMaterialLaw(const torchANNBasedDG3DMaterialLaw& src): dG3DMaterialLaw(src), _numberOfInput(src._numberOfInput), _numberOfInternalVariables(src._numberOfInternalVariables), _initialValue_h(src._initialValue_h), _EXXmean(src._EXXmean), _EXXstd(src._EXXstd), _EXYmean(src._EXYmean), _EXYstd(src._EXYstd), _EYYmean(src._EYYmean), _EYYstd(src._EYYstd), @@ -1980,7 +2079,8 @@ torchANNBasedDG3DMaterialLaw::torchANNBasedDG3DMaterialLaw(const torchANNBasedDG _SYZmean(src._SYZmean), _SYZstd(src._SYZstd), _SZZmean(src._SZZmean), _SZZstd(src._SZZstd), _SZXmean(src._SZXmean), _SZXstd(src._SZXstd), _tangentByPerturbation(src._tangentByPerturbation), _pertTol(src._pertTol), _kinematicInput(src._kinematicInput), _NeedExtraNorm(src._NeedExtraNorm), _numberOfExtraInput(src._numberOfExtraInput), _initialValue_ExtraInput(src._initialValue_ExtraInput), - _normParams_ExtraInput(src._normParams_ExtraInput) + _normParams_ExtraInput(src._normParams_ExtraInput), _fileExtraInputsGp(src._fileExtraInputsGp), + _extraVariablesAtGaussPoints(src._extraVariablesAtGaussPoints), _time_arg(src._time_arg), _ctime(src._ctime) { #if defined(HAVE_TORCH) module = src.module; @@ -2058,39 +2158,26 @@ void torchANNBasedDG3DMaterialLaw::setNumExtraInput(const int value){ _numberOfExtraInput = value; } +// Set the position of time in the extra input array @Mohib +void torchANNBasedDG3DMaterialLaw::setTimeArg(const int value){ + _time_arg = value; +} + // Set init values for extra inputs @Mohib void torchANNBasedDG3DMaterialLaw::setInitialExtraInput(const double value){ _initialValue_ExtraInput.push_back(value); } -// @Mohib TODO: Remove b4 commit -//void torchANNBasedDG3DMaterialLaw::setLatticeParameters(const double radius, const double size){ -// _latticeRadius = radius; -// _latticeSize = size; -//} - // Set normalization parameters for extra inputs @Mohib void torchANNBasedDG3DMaterialLaw::setNormExtraInp(const double mean, const double std){ _normParams_ExtraInput.push_back(mean); _normParams_ExtraInput.push_back(std); } -// @Mohib TODO: Remove b4 commit -//void torchANNBasedDG3DMaterialLaw::setExtraInp(const double mean, const double std){ -// _extra_inp.push_back(mean); -// _extra_inp.push_back(std); -//} - -//void torchANNBasedDG3DMaterialLaw::setInitTime(const double curr_t){ -// _pTime = curr_t; -// _cTime = curr_t; -//} - +// Update current time. and access it at GP using ctime (local scope). Necessary for surrogates that are time dependend such as MOAMMM lattices @Mohib void torchANNBasedDG3DMaterialLaw::setTime(const double ctime, const double dtime){ dG3DMaterialLaw::setTime(ctime,dtime); - // @Mohib TODO: remove b4 commit - // _pTime = _cTime; - // _cTime = ctime; + this->_ctime = ctime; } void torchANNBasedDG3DMaterialLaw::initLaws(const std::map<int,materialLaw*> &maplaw){ @@ -2107,12 +2194,6 @@ void torchANNBasedDG3DMaterialLaw::initLaws(const std::map<int,materialLaw*> &ma Extra1(0, i) = _initialValue_ExtraInput[i]; } - // @Mohib TODO: Remove b4 commit - // Extra1(0,0) = _latticeRadius; - // Extra1(0,1) = _latticeSize; - // //TODO: Remove hardcode @Mohib - // Extra1(0,2) = _cTime; - if (_tangentByPerturbation){ //TODO: Refractor this for Lattice @Mohib static fullMatrix<double> E1_plus(1,6), S_plus(1,6); @@ -2173,28 +2254,27 @@ void torchANNBasedDG3DMaterialLaw::createIPState(IPStateBase* &ips, bool hasBody // check interface element bool inter=true; const MInterfaceElement *iele = dynamic_cast<const MInterfaceElement*>(ele); + std::vector<double> value_ExtraInput=_initialValue_ExtraInput; + SPoint3 ptGlobal; + ele->pnt(GP->pt[0],GP->pt[1],GP->pt[2],ptGlobal); + SVector3 pt(ptGlobal); + for(int i=0; i<value_ExtraInput.size();i++) + { + if(_extraVariablesAtGaussPoints.isStored(i)) + { + value_ExtraInput[i]=_extraVariablesAtGaussPoints.returnFieldAtClosestLocation(i,pt); + } + } + //Msg::Info("value_ExtraInput %f %f %f", value_ExtraInput[0], value_ExtraInput[1],value_ExtraInput[2]); + if(iele==NULL) inter=false; - IPVariable* ipvi = new torchANNBasedDG3DIPVariable(_numberOfInternalVariables,_initialValue_h,hasBodyForce,inter, _numberOfExtraInput, _initialValue_ExtraInput); - IPVariable* ipv1 = new torchANNBasedDG3DIPVariable(_numberOfInternalVariables,_initialValue_h,hasBodyForce,inter, _numberOfExtraInput, _initialValue_ExtraInput); - IPVariable* ipv2 = new torchANNBasedDG3DIPVariable(_numberOfInternalVariables,_initialValue_h,hasBodyForce,inter, _numberOfExtraInput, _initialValue_ExtraInput); + IPVariable* ipvi = new torchANNBasedDG3DIPVariable(_numberOfInternalVariables,_initialValue_h,hasBodyForce,inter, _numberOfExtraInput, value_ExtraInput); + IPVariable* ipv1 = new torchANNBasedDG3DIPVariable(_numberOfInternalVariables,_initialValue_h,hasBodyForce,inter, _numberOfExtraInput, value_ExtraInput); + IPVariable* ipv2 = new torchANNBasedDG3DIPVariable(_numberOfInternalVariables,_initialValue_h,hasBodyForce,inter, _numberOfExtraInput, value_ExtraInput); if(ips != NULL) delete ips; ips = new IP3State(state_,ipvi,ipv1,ipv2); } -// Overloading for handeling extra parameters needed at GP @Mohib -//void torchANNBasedDG3DMaterialLaw::createIPState(IPStateBase* &ips, bool hasBodyForce, const bool* state_,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt, const bool extraInput) const -//{ -// // check interface element -// bool inter=true; -// const MInterfaceElement *iele = dynamic_cast<const MInterfaceElement*>(ele); -// if(iele==NULL) inter=false; -// IPVariable* ipvi = new torchANNBasedDG3DIPVariable(_numberOfInternalVariables,_initialValue_h,hasBodyForce,inter, _numberOfExtraInput, _initialValue_ExtraInput); -// IPVariable* ipv1 = new torchANNBasedDG3DIPVariable(_numberOfInternalVariables,_initialValue_h,hasBodyForce,inter, _numberOfExtraInput, _initialValue_ExtraInput); -// IPVariable* ipv2 = new torchANNBasedDG3DIPVariable(_numberOfInternalVariables,_initialValue_h,hasBodyForce,inter, _numberOfExtraInput, _initialValue_ExtraInput); -// if(ips != NULL) delete ips; -// ips = new IP3State(state_,ipvi,ipv1,ipv2); -//} - void torchANNBasedDG3DMaterialLaw::createIPVariable(IPVariable* &ipv, bool hasBodyForce, const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const { if(ipv !=NULL) delete ipv; @@ -2203,20 +2283,21 @@ void torchANNBasedDG3DMaterialLaw::createIPVariable(IPVariable* &ipv, bool hasBo if(iele == NULL){ inter=false; } - ipv = new torchANNBasedDG3DIPVariable(_numberOfInternalVariables,_initialValue_h,hasBodyForce,inter, _numberOfExtraInput, _initialValue_ExtraInput); + std::vector<double> value_ExtraInput=_initialValue_ExtraInput; + SPoint3 ptGlobal; + ele->pnt(GP->pt[0],GP->pt[1],GP->pt[2],ptGlobal); + SVector3 pt(ptGlobal); + for(int i=0; i<value_ExtraInput.size();i++) + { + if(_extraVariablesAtGaussPoints.isStored(i)) + { + value_ExtraInput[i]=_extraVariablesAtGaussPoints.returnFieldAtClosestLocation(i,pt); + } + } + //Msg::Info("value_ExtraInput %f %f %f", value_ExtraInput[0], value_ExtraInput[1],value_ExtraInput[2]); + ipv = new torchANNBasedDG3DIPVariable(_numberOfInternalVariables,_initialValue_h,hasBodyForce,inter, _numberOfExtraInput, value_ExtraInput); } -// Overloading for handling extra variables needed at GP @Mohib -//void torchANNBasedDG3DMaterialLaw::createIPVariable(IPVariable* &ipv, bool hasBodyForce, const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt, const bool extraInput) const -//{ -// if(ipv !=NULL) delete ipv; -// bool inter=true; -// const MInterfaceElement *iele = dynamic_cast<const MInterfaceElement*>(ele); -// if(iele == NULL){ -// inter=false; -// } -// ipv = new torchANNBasedDG3DIPVariable(_numberOfInternalVariables,_initialValue_h,hasBodyForce,inter, _numberOfExtraInput, _initialValue_ExtraInput); -//} void torchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const IPVariable* ipvp, const bool stiff, const bool checkfrac, const bool dTangent) { #if defined(HAVE_TORCH) @@ -2309,20 +2390,13 @@ void torchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const IPVariable* ipv } // Get extra inputs required for torch model @Mohib - fullMatrix<double>& Extra1 = ipvcur->getRefToExtraVariables(); - - // @Mohib TODO: remove b4 commit - //if(_numberOfExtraInput != 0){ - //fullMatrix<double>& Extra1 = ipvcur->getRefToExtraVariables(); - - - // fullMatrix<double> Extra1(1, _numberofExtraInput); - // Extra1(0, 0) = _latticeRadius; - // Extra1(0, 1) = _latticeSize; - // Extra1(0, 2) = _cTime; - //} - + fullMatrix<double>& Extra1 = ipvcur->getRefToExtraVariables(); + if(_time_arg != -1){ + // Set the current time @Mohib + Extra1(0, _time_arg) = _ctime; + } + //Msg::Info("value Extra1 %f %f %f", Extra1(0,0), Extra1(0,1),Extra1(0,2)); static fullMatrix<double> S(1,6), DSDE(6,6); const torch::Tensor& h0 = ipvprev->getConstRefToInternalVariables(); @@ -3220,6 +3294,144 @@ void J2SmallStrainDG3DMaterialLaw::stress(IPVariable* ipv, const IPVariable* ipv ipvcur->setRefToDGElasticTangentModuli(this->elasticStiffness); } +// +AnisotropicPlasticityDG3DMaterialLaw::AnisotropicPlasticityDG3DMaterialLaw(const int num, std::string lawType, const double rho, + double E, const double nu, const J2IsotropicHardening &_j2IH, + const double tol,const bool matrixBypert, const double tolPert) : + dG3DMaterialLaw(num,rho,true) +{ + fillElasticStiffness(E, nu, elasticStiffness); + if (lawType=="J2") + { + _anisoLaw = new mlawAnisotropicPlasticityJ2(num,E,nu,rho,_j2IH,tol,matrixBypert,tolPert); + } + else if (lawType == "Hill48") + { + _anisoLaw = new mlawAnisotropicPlasticityHill48(num,E,nu,rho,_j2IH,tol,matrixBypert,tolPert); + } + else + { + Msg::Error("law type %s has not been implemented !!!", lawType.c_str()); + } +} + +void AnisotropicPlasticityDG3DMaterialLaw::setStrainOrder(const int order){ + _anisoLaw->setStrainOrder(order); +}; + +void AnisotropicPlasticityDG3DMaterialLaw::setStressFormulation(int s) +{ + _anisoLaw->setStressFormulation(s); +}; + +void AnisotropicPlasticityDG3DMaterialLaw::setYieldParameters(const std::vector<double>& vals) +{ + _anisoLaw->setYieldParameters(vals); +} + +AnisotropicPlasticityDG3DMaterialLaw::AnisotropicPlasticityDG3DMaterialLaw(const AnisotropicPlasticityDG3DMaterialLaw &source) : + dG3DMaterialLaw(source) +{ + _anisoLaw = NULL; + if (source._anisoLaw != NULL) + { + _anisoLaw = dynamic_cast<mlawAnisotropicPlasticity*>(source._anisoLaw->clone()); + } +} +AnisotropicPlasticityDG3DMaterialLaw::~AnisotropicPlasticityDG3DMaterialLaw() +{ + if (_anisoLaw!=NULL) + { + delete _anisoLaw; + _anisoLaw = NULL; + } +} + + +void AnisotropicPlasticityDG3DMaterialLaw::createIPState(IPStateBase* &ips, bool hasBodyForce, const bool* state_,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const +{ + // check interface element + bool inter=true; + const MInterfaceElement *iele = dynamic_cast<const MInterfaceElement*>(ele); + if(iele==NULL) inter=false; + IPVariable* ipvi = new AnisotropicPlasticityDG3DIPVariable(*_anisoLaw,hasBodyForce,inter); + IPVariable* ipv1 = new AnisotropicPlasticityDG3DIPVariable(*_anisoLaw,hasBodyForce,inter); + IPVariable* ipv2 = new AnisotropicPlasticityDG3DIPVariable(*_anisoLaw,hasBodyForce,inter); + if(ips != NULL) delete ips; + ips = new IP3State(state_,ipvi,ipv1,ipv2); +} + +void AnisotropicPlasticityDG3DMaterialLaw::createIPVariable(IPVariable* &ipv, bool hasBodyForce, const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const +{ + if(ipv !=NULL) delete ipv; + bool inter=true; + const MInterfaceElement *iele = dynamic_cast<const MInterfaceElement*>(ele); + if(iele == NULL){ + inter=false; + } + ipv = new AnisotropicPlasticityDG3DIPVariable(*_anisoLaw,hasBodyForce,inter); +} + +void AnisotropicPlasticityDG3DMaterialLaw::checkInternalState(IPVariable* ipv, const IPVariable* ipvp) const{ + /* get ipvariable */ + AnisotropicPlasticityDG3DIPVariable* ipvcur; + const AnisotropicPlasticityDG3DIPVariable* ipvprev; + FractureCohesive3DIPVariable* ipvtmp = dynamic_cast<FractureCohesive3DIPVariable*>(ipv); + if(ipvtmp !=NULL) + { + + ipvcur = static_cast<AnisotropicPlasticityDG3DIPVariable*>(ipvtmp->getIPvBulk()); + const FractureCohesive3DIPVariable *ipvtmp2 = static_cast<const FractureCohesive3DIPVariable*>(ipvp); + ipvprev = static_cast<const AnisotropicPlasticityDG3DIPVariable*>(ipvtmp2->getIPvBulk()); + } + else + { + ipvcur = static_cast<AnisotropicPlasticityDG3DIPVariable*>(ipv); + ipvprev = static_cast<const AnisotropicPlasticityDG3DIPVariable*>(ipvp); + } + _anisoLaw->checkInternalState(ipvcur->getInternalData(), ipvprev->getInternalData()); + +}; + +void AnisotropicPlasticityDG3DMaterialLaw::stress(IPVariable* ipv, const IPVariable* ipvp, const bool stiff, const bool checkfrac, const bool dTangent) +{ + /* get ipvariable */ + AnisotropicPlasticityDG3DIPVariable* ipvcur; + const AnisotropicPlasticityDG3DIPVariable* ipvprev; + FractureCohesive3DIPVariable* ipvtmp = dynamic_cast<FractureCohesive3DIPVariable*>(ipv); + if(ipvtmp !=NULL) + { + + ipvcur = static_cast<AnisotropicPlasticityDG3DIPVariable*>(ipvtmp->getIPvBulk()); + const FractureCohesive3DIPVariable *ipvtmp2 = static_cast<const FractureCohesive3DIPVariable*>(ipvp); + ipvprev = static_cast<const AnisotropicPlasticityDG3DIPVariable*>(ipvtmp2->getIPvBulk()); + } + else + { + ipvcur = static_cast<AnisotropicPlasticityDG3DIPVariable*>(ipv); + ipvprev = static_cast<const AnisotropicPlasticityDG3DIPVariable*>(ipvp); + } + + /* strain xyz */ + const STensor3& F1 = ipvcur->getConstRefToDeformationGradient(); + const STensor3& F0 = ipvprev->getConstRefToDeformationGradient(); + + /* data for J2 law */ + IPAnisotropicPlasticity* q1 = ipvcur->getIPAnisotropicPlasticity(); + const IPAnisotropicPlasticity* q0 = ipvprev->getIPAnisotropicPlasticity(); + + STensor43& elasticL = ipvcur->getRefToElasticTangentModuli(); + //static STensor63 dCalgdeps; + + /* compute stress */ + _anisoLaw->constitutive(F0,F1,ipvcur->getRefToFirstPiolaKirchhoffStress(),q0,q1,ipvcur->getRefToTangentModuli(),stiff,&elasticL,dTangent,ipvcur->getPtrTodCmdFm()); + + ipvcur->setRefToDGElasticTangentModuli(this->elasticStiffness); +} +// + + + J2LinearDG3DMaterialLaw::J2LinearDG3DMaterialLaw(const int num,const double rho, double E,const double nu,const double sy0,const double h, const double tol, const bool matrixBypert, const double tolPert) : dG3DMaterialLaw(num,rho,true), @@ -3334,6 +3546,7 @@ void J2LinearDG3DMaterialLaw::stress(IPVariable* ipv, const IPVariable* ipvp, co ipvcur->setRefToDGElasticTangentModuli(this->elasticStiffness); } +// // @@ -4054,7 +4267,7 @@ void EOSDG3DMaterialLaw::createIPState(IPStateBase* &ips, bool hasBodyForce, con dG3DMaterialLaw *DG3Dit = dynamic_cast<dG3DMaterialLaw*>(maplaw.begin()->second); materialLaw::matname mlaw_dev = DG3Dit->getType(); - if(mlaw_dev == materialLaw::j2linear )//J2linear + if(mlaw_dev == materialLaw::J2 )//J2linear { J2LinearDG3DMaterialLaw *DG3DJ2linearit = dynamic_cast<J2LinearDG3DMaterialLaw*>(DG3Dit); bool inter=true; @@ -4098,7 +4311,7 @@ void EOSDG3DMaterialLaw::createIPVariable(IPVariable* &ipv, bool hasBodyForce, c dG3DMaterialLaw *DG3Dit = dynamic_cast<dG3DMaterialLaw*>(maplaw.begin()->second); matname mlaw_dev = DG3Dit->getType(); - if(mlaw_dev == materialLaw::j2linear)//J2linear + if(mlaw_dev == materialLaw::J2)//J2linear { J2LinearDG3DMaterialLaw *DG3DJ2linearit = dynamic_cast<J2LinearDG3DMaterialLaw*>(DG3Dit); bool inter=true; @@ -4150,7 +4363,7 @@ void EOSDG3DMaterialLaw::stress(IPVariable* ipv, const IPVariable* ipvp, const b STensor3 Fdot(0.); // STensor43 ViselasticStiff(0.); - if(mlaw_dev == materialLaw::j2linear) //J2linear + if(mlaw_dev == materialLaw::J2) //J2linear { J2LinearDG3DMaterialLaw *DG3DJ2linearit = dynamic_cast<J2LinearDG3DMaterialLaw*>(DG3Dit); IPJ2linear *J2linearipv = dynamic_cast<IPJ2linear*>(IPeosCUR->_IPV); diff --git a/dG3D/src/dG3DMaterialLaw.h b/dG3D/src/dG3DMaterialLaw.h index d7a115343c9e977626761559d7336e260df6f35c..98679f8d158fa6e96d613da3317af4f6a413ede8 100644 --- a/dG3D/src/dG3DMaterialLaw.h +++ b/dG3D/src/dG3DMaterialLaw.h @@ -467,6 +467,53 @@ class ANNBasedDG3DMaterialLaw : public dG3DMaterialLaw{ #endif //SWIG }; +class ExtraVariablesAtGaussPoints +{ + bool filled; + std::vector<SVector3> locations; + std::vector< std::vector<double> > field; + std::map <int,int> _storeExtraInputAtGp; //map between location in torch input and stored location in _extraVariablesAtGaussPoints + public: + ExtraVariablesAtGaussPoints():filled(false), field(), _storeExtraInputAtGp() {} + ExtraVariablesAtGaussPoints(const ExtraVariablesAtGaussPoints& src):filled(src.filled), locations(src.locations), field(src.field), + _storeExtraInputAtGp(src._storeExtraInputAtGp) {} + ExtraVariablesAtGaussPoints& operator = (const ExtraVariablesAtGaussPoints& src) + { + filled=src.filled; locations=src.locations; field=src.field; _storeExtraInputAtGp=src._storeExtraInputAtGp; + return *this; + } + ~ExtraVariablesAtGaussPoints(){} + void fill(const std::string fname); + const std::vector<double> &getFieldAtClosestLocation(const SVector3 &gp) const; + void print() const; + void fillExtraInputAtGp(int nb1, int nb2) + { + if(_storeExtraInputAtGp.find(nb1) == _storeExtraInputAtGp.end()) + _storeExtraInputAtGp[nb1]=nb2; + else + Msg::Error("ExtraVariablesAtGaussPoints::fillExtraInputAtGp already defined"); + } + bool isStored(int nb1) const + { + if(_storeExtraInputAtGp.find(nb1) == _storeExtraInputAtGp.end()) + return false; + else + return true; + } + double returnFieldAtClosestLocation(int nb1, const SVector3 &gp) const + { + if(!isStored(nb1)) + Msg::Error("ExtraVariablesAtGaussPoints::returnFieldAtClosestLocation field %d is not to be stored",nb1); + std::map <int,int>::const_iterator it=_storeExtraInputAtGp.find(nb1); + const std::vector<double> & field=getFieldAtClosestLocation(gp); + if(it->second>field.size()) + Msg::Error("ExtraVariablesAtGaussPoints::returnFieldAtClosestLocation field %d is not stored at location %d",nb1,it->second); + return field[it->second]; + } + +}; + + class torchANNBasedDG3DMaterialLaw : public dG3DMaterialLaw{ public: enum KinematicInput{EGL=1,U=2,smallStrain=3,EGLInc=4,UInc=5,smallStrainInc=6}; // EGL - Green Lagraneg strain, U-Biot strain, smallStrain=small strain; Inc for increments @@ -475,19 +522,14 @@ class torchANNBasedDG3DMaterialLaw : public dG3DMaterialLaw{ int _numberOfInput; int _numberOfInternalVariables; double _initialValue_h; + int _time_arg; // If one of the extra variables is time, store its position in the array. @Mohib bool _NeedExtraNorm; - int _numberOfExtraInput; // number of additional inputs other than 6 (or 3 for 2D) strain components @Mohib + int _numberOfExtraInput; // Number of additional inputs other than 6 (or 3 for 2D) strain components @Mohib std::vector<double> _initialValue_ExtraInput; // initial values for the extra inputs @Mohib std::vector<double> _normParams_ExtraInput; // Container for additional inputs, it is needed for normalization @Mohib - - // @Mohib TODO: Remove b4 commit Retundent - //std::vector<double> _extra_inp; - // Lattice Parameters for Optimizer IO @Mohib - // TODO: Read from ipvariable. - - // double _latticeRadius; - // double _pTime; - // double _cTime; + std::string _fileExtraInputsGp; + ExtraVariablesAtGaussPoints _extraVariablesAtGaussPoints; + double _ctime; // variable for storing current time @Mohib #if defined(HAVE_TORCH) torch::jit::script::Module module; @@ -550,20 +592,31 @@ class torchANNBasedDG3DMaterialLaw : public dG3DMaterialLaw{ void setInitialHValue(double initialValue_h) {_initialValue_h=initialValue_h;}; - // Setter for no of Extra Input Parameters @Mohib void setNumExtraInput(const int value); - // Setter for init values of Extra Input Parameters @Mohib + // Setter for storing time position (arg) in the extra array @Mohib + void setTimeArg(const int value); + // Setter for init values of Extra Inputs @Mohib void setInitialExtraInput(const double value); - // @Mohib TODO:Remove b4 commit - //// Setter for Lattice Parameters @Mohib - //void setLatticeParameters(const double radius, const double size); + // Setter for storing norm params of Extra Inputs @Mohib void setNormExtraInp(const double mean, const double std); - // @Mohib TODO:Remove b4 commit - // Setter for extra inputs, populates the _extra_inp vector with normalization parameters - //void setExtraInp(const double mean, const double std); - //void setInitTime(const double curr_t); + + + void setFileExtraInputsGp(const std::string fname) + { + _fileExtraInputsGp=fname; + _extraVariablesAtGaussPoints.fill(fname); + //_extraVariablesAtGaussPoints.print(); + //const std::vector<double> &rf=_extraVariablesAtGaussPoints.getFieldAtClosestLocation(SVector3(25,28.873,28.873)); + //double val=_extraVariablesAtGaussPoints.returnFieldAtClosestLocation(0,SVector3(25,28.873,28.873)); + //Msg::Info(" Field 0 at GP is %f",val); + } + + void fillExtraInputAtGp(int nb1, int nb2) + { + _extraVariablesAtGaussPoints.fillExtraInputAtGp(nb1,nb2); + } #ifndef SWIG torchANNBasedDG3DMaterialLaw(const torchANNBasedDG3DMaterialLaw& src); virtual ~torchANNBasedDG3DMaterialLaw(); @@ -663,6 +716,54 @@ class J2SmallStrainDG3DMaterialLaw : public dG3DMaterialLaw #endif // SWIG }; +class AnisotropicPlasticityDG3DMaterialLaw : public dG3DMaterialLaw +{ + protected: + mlawAnisotropicPlasticity* _anisoLaw; + + public: + + AnisotropicPlasticityDG3DMaterialLaw(const int num, std::string lawType, const double rho, + double E,const double nu,const J2IsotropicHardening &_j2IH,const double tol=1.e-6, + const bool matrixBypert=false, const double tolPert=1e-8); + void setStrainOrder(const int order); + void setStressFormulation(int s); + void setYieldParameters(const std::vector<double>& vals); + #ifndef SWIG + AnisotropicPlasticityDG3DMaterialLaw(const AnisotropicPlasticityDG3DMaterialLaw &source); + virtual ~AnisotropicPlasticityDG3DMaterialLaw(); + + // set the time of _anisoLaw + virtual void setTime(const double t,const double dtime){ + dG3DMaterialLaw::setTime(t,dtime); + _anisoLaw->setTime(t,dtime); + } + virtual materialLaw::matname getType() const {return _anisoLaw->getType();} + virtual void createIPState(IPStateBase* &ips, bool hasBodyForce, const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const; + virtual void createIPVariable(IPVariable* &ipv, bool hasBodyForce, const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const; + virtual void initLaws(const std::map<int,materialLaw*> &maplaw){} + virtual double soundSpeed() const{return _anisoLaw->soundSpeed();} // or change value ?? + virtual void stress(IPVariable*ipv, const IPVariable*ipvprev, const bool stiff=true, const bool checkfrac=true, const bool dTangent=false); + virtual const double bulkModulus() const {return _anisoLaw->bulkModulus();} + virtual double scaleFactor() const{return _anisoLaw->scaleFactor();} + virtual materialLaw* clone() const{return new AnisotropicPlasticityDG3DMaterialLaw(*this);}; + virtual void checkInternalState(IPVariable* ipv, const IPVariable* ipvprev) const; + virtual bool withEnergyDissipation() const {return _anisoLaw->withEnergyDissipation();}; + virtual void setMacroSolver(const nonLinearMechSolver* sv){ + dG3DMaterialLaw::setMacroSolver(sv); + _anisoLaw->setMacroSolver(sv); + }; + virtual const materialLaw *getConstNonLinearSolverMaterialLaw() const + { + return _anisoLaw; + } + virtual materialLaw *getNonLinearSolverMaterialLaw() + { + return _anisoLaw; + } + #endif // SWIG +}; + class J2LinearDG3DMaterialLaw : public dG3DMaterialLaw { friend class EOSDG3DMaterialLaw;