New question #255780 on Yade:
https://answers.launchpad.net/yade/+question/255780
Hi there,
It's a while I'm working to derive a new constitutive law which gives the
properties of viscoelastic Burger's model.
I share here the first drafts of the model which is integrated in one header
and one implementation file.
It's a draft and I have not yet tested it. It's shared here to find the
possible errors.
Any comments and helps are highly appreciated.
Thanks
HEADER:
#pragma once
#include<yade/core/GlobalEngine.hpp>
#include<yade/pkg/common/Dispatching.hpp>
#include<yade/pkg/dem/ScGeom.hpp>
#include<boost/tuple/tuple.hpp>
#include<yade/pkg/dem/CohesiveFrictionalContactLaw.hpp>
#include<yade/pkg/dem/FrictPhys.hpp>
//********************** CohBurgersMat ****************************/
class CohBurgersMat : public CohFrictMat
{
public :
virtual ~CohBurgersMat ();
/// Serialization
YADE_CLASS_BASE_DOC_ATTRS_CTOR(CohBurgersMat,FrictMat,"",
((Real,Em,1e3,,"Stiffness of Maxwell's spring"))
((Real,Ek,1e3,,"Stiffness of Kelvin's spring"))
((Real,Cm,10,,"Viscosity of Maxwell's dashpot"))
((Real,Ck,10,,"Viscosity of Kelvin's dashpot"))
((Real,poissonRatio,0.5,,""))
createIndex();
);
/// Indexable
REGISTER_CLASS_INDEX(CohBurgersMat,CohFrictMat);
};
REGISTER_SERIALIZABLE(CohBurgersMat);
//********************** CohBurgersPhys ****************************/
class CohBurgersPhys : public CohFrictPhys
{
public :
virtual ~CohBurgerPhys() {};
void SetBreakingState() {cohesionBroken = true; normalAdhesion
= 0; shearAdhesion = 0;};
YADE_CLASS_BASE_DOC_ATTRS_CTOR(CohBurgerPhys,CohFrictPhys,"",
((bool,cohesionDisablesFriction,false,,"is shear strength the
sum of friction and adhesion or only adhesion?"))
((bool,cohesionBroken,true,,"is cohesion active? Set to false
at the creation of a cohesive contact, and set to true when a fragile contact
is broken"))
((bool,fragile,true,,"do cohesion disapear when contact
strength is exceeded?"))
((Real,BurEmn,NaN,,"Stiffness of Maxwell's spring(normal)"))
((Real,BurEkn,NaN,,"Stiffness of Kelvin's spring(normal)"))
((Real,BurCmn,NaN,,"Viscosity of Maxwell's dashpot(normal)"))
((Real,BurCkn,NaN,,"Viscosity of Kelvin's dashpot(normal)"))
((Real,BurEms,NaN,,"Stiffness of Maxwell's spring(shear)"))
((Real,BurEks,NaN,,"Stiffness of Kelvin's spring(shear)"))
((Real,BurCms,NaN,,"Viscosity of Maxwell's dashpot(shear)"))
((Real,BurCks,NaN,,"Viscosity of Kelvin's dashpot(shear)"))
((Real,poissonRatio,NaN,,""))
((Real,normalAdhesion,0,,"tensile strength"))
((Real,shearAdhesion,0,,"cohesive part of the shear strength (a
frictional term might be added depending on
:yref:`CohFrictPhys::cohesionDisablesFriction`)"))
,
createIndex();
);
/// Indexable
REGISTER_CLASS_INDEX(CohBurgerPhys,CohFrictPhys);
};
REGISTER_SERIALIZABLE(CohBurgerPhys);
//********************** Ip2_CohBurgersMat_CohBurgersMat_CohBurgersPhys
****************************/
class Ip2_CohBurgersMat_CohBurgersMat_CohBurgersPhys : public IPhysFunctor
{
public :
virtual void go( const shared_ptr<Material>& b1,
const shared_ptr<Material>& b2,
const shared_ptr<Interaction>&
interaction);
int cohesionDefinitionIteration;
YADE_CLASS_BASE_DOC_ATTRS_CTOR(Ip2_CohBurgersMat_CohBurgersMat_CohBurgersPhys,IPhysFunctor,
((bool,setCohesionNow,false,,"If true, assign cohesion to all
existing contacts in current time-step. The flag is turned false automatically,
so that assignment is done in the current timestep only."))
((bool,setCohesionOnNewContacts,false,,"If true, assign
cohesion at all new contacts. If false, only existing contacts can be cohesive
(also see :yref:`Ip2_CohFrictMat_CohFrictMat_CohFrictPhys::setCohesionNow`),
and new contacts are only frictional."))
,
cohesionDefinitionIteration = -1;
);
FUNCTOR2D(CohBurgersMat,CohBurgersMat);
};
REGISTER_SERIALIZABLE(Ip2_CohBurgersMat_CohBurgersMat_CohBurgersPhys);
//********************** Ip2_FrictMat_CohBurgersMat_CohFrictPhys
****************************/
class Ip2_FrictMat_CohBurgersMat_CohFrictPhys : public IPhysFunctor
{
public :
virtual void go( const shared_ptr<Material>& b1,
const shared_ptr<Material>& b2,
const shared_ptr<Interaction>&
interaction);
int cohesionDefinitionIteration;
YADE_CLASS_BASE_DOC_ATTRS_CTOR(Ip2_FrictMat_CohBurgersMat_CohFrictPhys,IPhysFunctor,
((bool,setCohesionNow,false,,"If true, assign cohesion to all
existing contacts in current time-step. The flag is turned false automatically,
so that assignment is done in the current timestep only."))
((bool,setCohesionOnNewContacts,false,,"If true, assign
cohesion at all new contacts. If false, only existing contacts can be cohesive
(also see :yref:`Ip2_CohFrictMat_CohFrictMat_CohFrictPhys::setCohesionNow`),
and new contacts are only frictional."))
,
cohesionDefinitionIteration = -1;
);
FUNCTOR2D(FrictMat,CohBurgersMat);
};
REGISTER_SERIALIZABLE(Ip2_FrictMat_CohBurgersMat_CohFrictPhys);
//******************** Law2_ScGeom_CohBurgersPhys_CohesiveBurgers
*************************/
class Law2_ScGeom_CohBurgersPhys_CohesiveBurgers: public LawFunctor{
public:
OpenMPAccumulator<Real> plasticDissipation;
Real normElastEnergy();
Real shearElastEnergy();
Real normalDisplacement();
Real shearDisplacement();
Real totalElastEnergy();
Real ((BurgEmn, 0.0, "Em in normal direction"))
Real ((BurgEkn, 0.0, "Ek in normal direction"))
Real ((BurgEms, 0.0, "Em in shear direction"))
Real ((BurgEks, 0.0, "Ek in shear direction"))
Real ((BurgCmn, 0.0, "Cm in normal direction"))
Real ((BurgCkn, 0.0, "Ck in normal direction"))
Real ((BurgCms, 0.0, "Cm in shear direction"))
Real ((BurgCks, 0.0, "Ck in shear direction"))
Real ((BurgPoi,0.0,"Poisson ratio"))
void initPlasticDissipation(Real initVal=0);
virtual bool go(shared_ptr<IGeom>& _geom, shared_ptr<IPhys>& _phys,
Interaction* I);
YADE_CLASS_BASE_DOC_ATTRS_CTOR_PY(Law2_ScGeom6D_CohBurgerPhys_CohesiveBurger,
((bool,neverErase,false,,))
,,
.def("normElastEnergy",&Law2_ScGeom6D_CohFrictPhys_CohesionMoment::normElastEnergy,"Compute
normal elastic energy.")
.def("shearElastEnergy",&Law2_ScGeom6D_CohFrictPhys_CohesionMoment::shearElastEnergy,"Compute
shear elastic energy.")
.def("normalDisplacement",&Law2_ScGeom6D_CohFrictPhys_CohesionMoment::normalDisplacement,"Compute
normal displacement.")
.def("shearDisplacement",&Law2_ScGeom6D_CohFrictPhys_CohesionMoment::shearDisplacement,"Compute
shear displacement.")
.def("elasticEnergy",&Law2_ScGeom6D_CohFrictPhys_CohesionMoment::totalElastEnergy,"Compute
total elastic energy.")
);
FUNCTOR2D(ScGeom,CohBurgersPhys);
DECLARE_LOGGER;
};
REGISTER_SERIALIZABLE(Law2_ScGeom_CohBurgersPhys_CohesiveBurgers);
--
You received this question notification because you are a member of
yade-users, which is an answer contact for Yade.
_______________________________________________
Mailing list: https://launchpad.net/~yade-users
Post to : [email protected]
Unsubscribe : https://launchpad.net/~yade-users
More help : https://help.launchpad.net/ListHelp