Author: gladky_anton Date: 2009-07-24 17:30:47 +0200 (Fri, 24 Jul 2009) New Revision: 1885
Added: trunk/scripts/installOnUbuntu.sh Modified: trunk/pkg/dem/RockPM.cpp trunk/pkg/dem/RockPM.hpp Log: 1. RockPM update. Added simple "destruction mechanism" 2. Added scripts/installOnUbuntu.sh to make "oneButton-checkout+compile+install+doxygen+epydoc" script. Not tested yet. Requires corrections. Modified: trunk/pkg/dem/RockPM.cpp =================================================================== --- trunk/pkg/dem/RockPM.cpp 2009-07-24 03:18:08 UTC (rev 1884) +++ trunk/pkg/dem/RockPM.cpp 2009-07-24 15:30:47 UTC (rev 1885) @@ -34,35 +34,64 @@ Dem3DofGeom* geom=static_cast<Dem3DofGeom*>(ig.get()); RpmPhys* phys=static_cast<RpmPhys*>(ip.get()); - Real displN=geom->displacementN(); + Real displN=geom->displacementN(); + const Real& crossSection=phys->crossSection; + + Real& epsN=phys->epsN; + Vector3r& epsT=phys->epsT; + + Real& sigmaN=phys->sigmaN; + Vector3r& sigmaT=phys->sigmaT; + + const Real& E = phys->E; + const Real& G = phys->G; + + Real& Fn=phys->Fn; + Vector3r& Fs=phys->Fs; + + 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; - Real maxFsSq=phys->normalForce.SquaredLength()*pow(phys->tanFrictionAngle,2); - Vector3r trialFs=phys->ks*geom->displacementT(); - 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); + epsN=geom->strainN(); + epsT=geom->strainT(); + + + sigmaN=E*epsN; + Fn=sigmaN*crossSection; phys->normalForce=Fn*geom->normal; + + sigmaT=G*epsT; + + /*Check, whether the shear stress more, than normal force multiplicated to tanFrictionAngle*/ + + Real maxFsSq = phys->normalForce.SquaredLength()*phys->tanFrictionAngle*phys->tanFrictionAngle; + if(sigmaT.SquaredLength()>maxFsSq) { + sigmaT*=sqrt(maxFsSq/(sigmaT.SquaredLength())); + } + + Fs=sigmaT*crossSection; + phys->shearForce = Fs; + + applyForceAtContactPoint(phys->normalForce + phys->shearForce, geom->contactPoint, contact->getId1(), geom->se31.position, contact->getId2(), geom->se32.position, rootBody); /*Normal Interaction_____*/ - if ((phys->isCohesive)&&(displN<(-phys->lengthMaxCompression))) { //LOG_WARN(displN<<"__COMRESS!!!__"); phys->isCohesive = false; rbp1->isDamaged=true; rbp2->isDamaged=true; } + return; } else { if (phys->isCohesive) { if (displN>(phys->lengthMaxTension)) { @@ -70,20 +99,17 @@ phys->isCohesive = false; rbp1->isDamaged=true; rbp2->isDamaged=true; - return; + return; } else { phys->normalForce=phys->kn*displN*geom->normal; - Real maxFsSq=phys->normalForce.SquaredLength()*pow(phys->tanFrictionAngle,2); - Vector3r trialFs=phys->ks*geom->displacementT(); - 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); + 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()); return; } } - } @@ -101,26 +127,28 @@ const shared_ptr<BodyMacroParameters>& elast1=static_pointer_cast<BodyMacroParameters>(pp1); const shared_ptr<BodyMacroParameters>& elast2=static_pointer_cast<BodyMacroParameters>(pp2); - + long cohesiveThresholdIter=1000; + bool initCohesive = rpm1->initCohesive*rpm2->initCohesive; Real E12=2*elast1->young*elast2->young/(elast1->young+elast2->young); Real minRad=(contGeom->refR1<=0?contGeom->refR2:(contGeom->refR2<=0?contGeom->refR1:min(contGeom->refR1,contGeom->refR2))); Real S12=Mathr::PI*pow(minRad,2); + Real G_over_E = (rpm1->G_over_E + rpm2->G_over_E)/2; shared_ptr<RpmPhys> contPhys(new RpmPhys()); contPhys->E=E12; - contPhys->G=E12; + contPhys->G=E12*G_over_E; contPhys->tanFrictionAngle=tan(.5*(elast1->frictionAngle+elast2->frictionAngle)); contPhys->crossSection=S12; contPhys->kn=contPhys->E*contPhys->crossSection; contPhys->ks=contPhys->G*contPhys->crossSection; contPhys->lengthMaxCompression=S12*(0.5*(rpm1->stressCompressMax+rpm2->stressCompressMax))/(contPhys->kn); - contPhys->lengthMaxTension=S12*(0.5*(rpm1->stressTensionMax+rpm2->stressTensionMax))/(contPhys->kn); + contPhys->lengthMaxTension=S12*(0.5*(rpm1->stressCompressMax*rpm1->Brittleness+rpm2->stressCompressMax*rpm2->Brittleness))/(contPhys->kn); initDistance = contGeom->displacementN(); - if ((rpm1->exampleNumber==rpm2->exampleNumber)&&(initDistance<(contPhys->lengthMaxTension))&&(initCohesive)&&(OO.getCurrentIteration()==0)) { + if ((rpm1->exampleNumber==rpm2->exampleNumber)&&(initDistance<(contPhys->lengthMaxTension))&&(initCohesive)&&(OO.getCurrentIteration()<=cohesiveThresholdIter)) { contPhys->isCohesive=true; //LOG_WARN("InitDistance="<<initDistance<<" "<<rpm1->exampleNumber<<" "<<rpm2->exampleNumber<<" "<<OO.getCurrentIteration()); //LOG_WARN("lengthMaxCompression="<<contPhys->lengthMaxCompression); Modified: trunk/pkg/dem/RockPM.hpp =================================================================== --- trunk/pkg/dem/RockPM.hpp 2009-07-24 03:18:08 UTC (rev 1884) +++ trunk/pkg/dem/RockPM.hpp 2009-07-24 15:30:47 UTC (rev 1885) @@ -48,15 +48,16 @@ public: int exampleNumber; //Number of "stone" bool initCohesive, isDamaged; - Real stressCompressMax, stressTensionMax; //Parameters for damaging - - RpmMat(): exampleNumber(0.), initCohesive(false), isDamaged(false), stressCompressMax(0), stressTensionMax(0) {createIndex();}; + Real stressCompressMax, Brittleness, G_over_E; //Parameters for damaging + + RpmMat(): exampleNumber(0.), initCohesive(false), isDamaged(false), stressCompressMax(0), Brittleness(0), G_over_E(1) {createIndex();}; REGISTER_ATTRIBUTES(BodyMacroParameters, (exampleNumber) (initCohesive) (isDamaged) (stressCompressMax) - (stressTensionMax)); + (Brittleness) + (G_over_E)); REGISTER_CLASS_AND_BASE(RpmMat,BodyMacroParameters); }; REGISTER_SERIALIZABLE(RpmMat); @@ -65,7 +66,7 @@ class Ip2_RpmMat_RpmMat_RpmPhys: public InteractionPhysicsEngineUnit{ private: public: - Real sigmaT, initDistance; + Real initDistance; Ip2_RpmMat_RpmMat_RpmPhys(){ initDistance = 0; @@ -73,7 +74,6 @@ virtual void go(const shared_ptr<PhysicalParameters>& pp1, const shared_ptr<PhysicalParameters>& pp2, const shared_ptr<Interaction>& interaction); REGISTER_ATTRIBUTES(InteractionPhysicsEngineUnit, - (sigmaT) (initDistance) ); @@ -88,9 +88,13 @@ private: public: Real crossSection,E,G,tanFrictionAngle,lengthMaxCompression,lengthMaxTension; + Real omega, Fn, sigmaN, epsN; + Vector3r epsT, sigmaT, Fs; + + bool isCohesive; - RpmPhys(): NormalShearInteraction(),crossSection(0),E(0),G(0), tanFrictionAngle(0), lengthMaxCompression(0), lengthMaxTension(0), isCohesive(false) { createIndex();} + RpmPhys(): NormalShearInteraction(),crossSection(0),E(0),G(0), tanFrictionAngle(0), lengthMaxCompression(0), lengthMaxTension(0), isCohesive(false) { createIndex(); epsT=Vector3r::ZERO; omega=0; Fn=0; Fs=Vector3r::ZERO;} virtual ~RpmPhys(); REGISTER_ATTRIBUTES(NormalShearInteraction, Added: trunk/scripts/installOnUbuntu.sh =================================================================== --- trunk/scripts/installOnUbuntu.sh 2009-07-24 03:18:08 UTC (rev 1884) +++ trunk/scripts/installOnUbuntu.sh 2009-07-24 15:30:47 UTC (rev 1885) @@ -0,0 +1,22 @@ +#!/bin/bash +# This script works on Ubuntu 9.04, and possibly on new Debians. +# It "compiles and installs" the latest YADE SVN-version. +# The install is maximal: you will get almost all YADE functionality, even if you dont need it +# Please, copy this script to the empty directory and start it. +# + + +BASEDIR='./' +VERSION='trunk' +sudo aptitude install scons libqt3-mt-dev qt3-dev-tools freeglut3-dev libboost-date-time-dev libboost-filesystem-dev libboost-thread-dev libboost-regex-dev fakeroot dpkg-dev build-essential g++ libboost-iostreams-dev liblog4cxx10-dev python-dev libboost-python-dev ipython python-matplotlib libsqlite3-dev python-numeric python-tk gnuplot doxygen python-pygraphviz python-epydoc + +svn checkout https://svn.berlios.de/svnroot/repos/yade/trunk +mkdir $BASEDIR/build +mkdir $BASEDIR/data +cd $BASEDIR/trunk +scons PREFIX=$BASEDIR/../build optimize=1 -j2 openmp=True features=log4cxx,python,openGL,GTS version=$VERSION +scons doc +cd .. +$BASEDIR/build/bin/yade-$VERSION yade-epydoc.py + + Property changes on: trunk/scripts/installOnUbuntu.sh ___________________________________________________________________ Name: svn:executable + * _______________________________________________ Mailing list: https://launchpad.net/~yade-dev Post to : yade-...@lists.launchpad.net Unsubscribe : https://launchpad.net/~yade-dev More help : https://help.launchpad.net/ListHelp _______________________________________________ yade-dev mailing list yade-dev@lists.berlios.de https://lists.berlios.de/mailman/listinfo/yade-dev