yade-dev team mailing list archive
-
yade-dev team
-
Mailing list archive
-
Message #01470
[svn] r1864 - trunk/pkg/dem
Author: gladky_anton
Date: 2009-07-14 17:41:54 +0200 (Tue, 14 Jul 2009)
New Revision: 1864
Modified:
trunk/pkg/dem/RockPM.cpp
trunk/pkg/dem/RockPM.hpp
Log:
1. RockPM, first variant of "destruction mechanism"
Modified: trunk/pkg/dem/RockPM.cpp
===================================================================
--- trunk/pkg/dem/RockPM.cpp 2009-07-13 21:39:27 UTC (rev 1863)
+++ trunk/pkg/dem/RockPM.cpp 2009-07-14 15:41:54 UTC (rev 1864)
@@ -34,7 +34,20 @@
Dem3DofGeom* geom=static_cast<Dem3DofGeom*>(ig.get());
RpmPhys* phys=static_cast<RpmPhys*>(ip.get());
- Real displN=geom->displacementN();
+ Real displN=geom->displacementN();
+ const shared_ptr<Body>& body1=Body::byId(contact->getId1(),rootBody);
+ const shared_ptr<Body>& body2=Body::byId(contact->getId2(),rootBody);
+ assert(body1);
+ assert(body2);
+ const shared_ptr<RpmMat>& rbp1=YADE_PTR_CAST<RpmMat>(body1->physicalParameters);
+ const shared_ptr<RpmMat>& rbp2=YADE_PTR_CAST<RpmMat>(body2->physicalParameters);
+
+ //check, whether one of bodies is damaged
+ if ((rbp1->isDamaged) || (rbp2->isDamaged)) {
+ phys->isCohesive = false;
+ }
+
+
if(displN<=0){
/*Normal Interaction*/
phys->normalForce=phys->kn*displN*geom->normal;
@@ -43,14 +56,24 @@
if(trialFs.SquaredLength()>maxFsSq){ geom->slipToDisplacementTMax(sqrt(maxFsSq)); trialFs*=sqrt(maxFsSq/(trialFs.SquaredLength()));}
applyForceAtContactPoint(phys->normalForce+trialFs,geom->contactPoint,contact->getId1(),geom->se31.position,contact->getId2(),geom->se32.position,rootBody);
/*Normal Interaction_____*/
+
if ((phys->isCohesive)&&(displN<(-phys->lengthMaxCompression))) {
- LOG_WARN(displN<<"____"<<phys->normalForce);
+ //LOG_WARN(displN<<"__COMRESS!!!__");
+ phys->isCohesive = false;
+ rbp1->isDamaged=true;
+ rbp2->isDamaged=true;
}
} else {
if (phys->isCohesive) {
phys->normalForce=phys->kn*displN*geom->normal;
- //LOG_WARN(displN<<"____"<<phys->normalForce);
- applyForceAtContactPoint(phys->normalForce,geom->contactPoint,contact->getId1(),geom->se31.position,contact->getId2(),geom->se32.position,rootBody);
+ if (displN>(phys->lengthMaxTension)) {
+ //LOG_WARN(displN<<"__TENSION!!!__");
+ phys->isCohesive = false;
+ rbp1->isDamaged=true;
+ rbp2->isDamaged=true;
+ } else {
+ applyForceAtContactPoint(phys->normalForce,geom->contactPoint,contact->getId1(),geom->se31.position,contact->getId2(),geom->se32.position,rootBody);
+ }
return;
} else {
rootBody->interactions->requestErase(contact->getId1(),contact->getId2());
Modified: trunk/pkg/dem/RockPM.hpp
===================================================================
--- trunk/pkg/dem/RockPM.hpp 2009-07-13 21:39:27 UTC (rev 1863)
+++ trunk/pkg/dem/RockPM.hpp 2009-07-14 15:41:54 UTC (rev 1864)
@@ -47,11 +47,16 @@
class RpmMat: public BodyMacroParameters {
public:
int exampleNumber; //Number of "stone"
- bool initCohesive;
+ bool initCohesive, isDamaged;
Real stressCompressMax, stressTensionMax; //Parameters for damaging
- RpmMat(): exampleNumber(0.), initCohesive(false), stressCompressMax(0), stressTensionMax(0) {createIndex();};
- REGISTER_ATTRIBUTES(BodyMacroParameters, (exampleNumber) (initCohesive) (stressCompressMax) (stressTensionMax));
+ RpmMat(): exampleNumber(0.), initCohesive(false), isDamaged(false), stressCompressMax(0), stressTensionMax(0) {createIndex();};
+ REGISTER_ATTRIBUTES(BodyMacroParameters,
+ (exampleNumber)
+ (initCohesive)
+ (isDamaged)
+ (stressCompressMax)
+ (stressTensionMax));
REGISTER_CLASS_AND_BASE(RpmMat,BodyMacroParameters);
};
REGISTER_SERIALIZABLE(RpmMat);
Follow ups