Author: eudoxos Date: 2009-04-15 10:19:44 +0200 (Wed, 15 Apr 2009) New Revision: 1755
Modified: trunk/extra/Brefcom.cpp trunk/extra/Brefcom.hpp trunk/gui/py/yade-multi trunk/scripts/multi.py Log: 1. Add approximate viscosity equations to brefcom (not working) 2. Fixes in yade-multi Modified: trunk/extra/Brefcom.cpp =================================================================== --- trunk/extra/Brefcom.cpp 2009-04-10 11:36:17 UTC (rev 1754) +++ trunk/extra/Brefcom.cpp 2009-04-15 08:19:44 UTC (rev 1755) @@ -105,6 +105,7 @@ contPhys->dmgRateExp=dmgRateExp; contPhys->plTau=plTau; contPhys->plRateExp=plRateExp; + contPhys->viscApprox=viscApprox; interaction->interactionPhysics=contPhys; } @@ -156,6 +157,14 @@ } Real BrefcomContact::computeDmgOverstress(Real dt){ + if(viscApprox){ + Real prevDmgStrain=dmgStrain; + dmgStrain=max(0.,epsN*omega-dmgOverstress/E); + if(dmgStrain<=prevDmgStrain) dmgOverstress=0; // damage doesn't grow, no viscous response + else dmgOverstress=epsCrackOnset*E*pow(dmgTau*(dmgStrain-prevDmgStrain)/dt,dmgRateExp); + LOG_TRACE("dmgStrain="<<dmgStrain<<", dmgOverstress="<<dmgOverstress); + return dmgOverstress; + } if(dmgStrain>=epsN*omega){ // unloading, no viscous stress dmgStrain=epsN*omega; LOG_TRACE("Elastic/unloading, no viscous overstress"); @@ -174,7 +183,7 @@ if(sigmaTNorm<sigmaTYield) return 1.; Real c=undamagedCohesion*pow(plTau/(G*dt),plRateExp)*pow(sigmaTNorm-sigmaTYield,plRateExp-1.); Real beta=solveBeta(c,plRateExp); - LOG_DEBUG("scaling factor "<<1.-exp(beta)*(1-sigmaTYield/sigmaTNorm)); + //LOG_DEBUG("scaling factor "<<1.-exp(beta)*(1-sigmaTYield/sigmaTNorm)); return 1.-exp(beta)*(1-sigmaTYield/sigmaTNorm); } Modified: trunk/extra/Brefcom.hpp =================================================================== --- trunk/extra/Brefcom.hpp 2009-04-10 11:36:17 UTC (rev 1754) +++ trunk/extra/Brefcom.hpp 2009-04-15 08:19:44 UTC (rev 1755) @@ -72,14 +72,16 @@ dmgTau, //! exponent in the rate-dependent damage evolution dmgRateExp, - //! damage strain + //! damage strain (at previous or current step) dmgStrain, + //! damage viscous overstress (at previous step or at current step) + dmgOverstress, //! characteristic time for viscoplasticity (if non-positive, no rate-dependence for shear) plTau, //! exponent in the rate-dependent viscoplasticity - plRateExp, - //! coefficient that takes transversal strain into accound when calculating kappaDReduced - transStrainCoeff; + plRateExp; + //! whether to approximate viscosity with difference relation instead of iterating to find solution + bool viscApprox; /*! Up to now maximum normal strain (semi-norm), non-decreasing in time. */ Real kappaD; /*! Transversal strain (perpendicular to the contact axis) */ @@ -104,7 +106,7 @@ - BrefcomContact(): NormalShearInteraction(),E(0), G(0), tanFrictionAngle(0), undamagedCohesion(0), crossSection(0), xiShear(0), dmgTau(-1), dmgRateExp(0), dmgStrain(0), plTau(-1), plRateExp(0), epsPlSum(0.) { createIndex(); epsT=Vector3r::ZERO; kappaD=0; isCohesive=false; neverDamage=false; omega=0; Fn=0; Fs=Vector3r::ZERO; epsPlSum=0; } + BrefcomContact(): NormalShearInteraction(),E(0), G(0), tanFrictionAngle(0), undamagedCohesion(0), crossSection(0), xiShear(0), dmgTau(-1), dmgRateExp(0), dmgStrain(0), plTau(-1), plRateExp(0), epsPlSum(0.) { createIndex(); epsT=Vector3r::ZERO; kappaD=0; isCohesive=false; neverDamage=false; omega=0; Fn=0; Fs=Vector3r::ZERO; epsPlSum=0; viscApprox=false; dmgOverstress=0; dmgStrain=0; } // BrefcomContact(Real _E, Real _G, Real _tanFrictionAngle, Real _undamagedCohesion, Real _equilibriumDist, Real _crossSection, Real _epsCrackOnset, Real _epsFracture, Real _expBending, Real _xiShear, Real _tau=0, Real _expDmgRate=1): InteractionPhysics(), E(_E), G(_G), tanFrictionAngle(_tanFrictionAngle), undamagedCohesion(_undamagedCohesion), equilibriumDist(_equilibriumDist), crossSection(_crossSection), epsCrackOnset(_epsCrackOnset), epsFracture(_epsFracture), expBending(_expBending), xiShear(_xiShear), tau(_tau), expDmgRate(_expDmgRate) { epsT=Vector3r::ZERO; kappaD=0; isCohesive=false; neverDamage=false; omega=0; Fn=0; Fs=Vector3r::ZERO; /*TRVAR5(epsCrackOnset,epsFracture,Kn,crossSection,equilibriumDist); */ } virtual ~BrefcomContact(); @@ -121,9 +123,10 @@ (dmgTau) (dmgRateExp) (dmgStrain) + (dmgOverstress) (plTau) (plRateExp) - (transStrainCoeff) + (viscApprox) (cummBetaIter) (cummBetaCount) @@ -225,6 +228,7 @@ */ Real sigmaT, epsCrackOnset, relDuctility, G_over_E, tau, expDmgRate, omegaThreshold, dmgTau, dmgRateExp, plTau, plRateExp; + bool viscApprox; //! Should new contacts be cohesive? They will before this iter#, they will not be afterwards. If 0, they will never be. If negative, they will always be created as cohesive. long cohesiveThresholdIter; //! Create contacts that don't receive any damage (BrefcomContact::neverDamage=true); defaults to false @@ -233,7 +237,7 @@ BrefcomMakeContact(){ // init to signaling_NaN to force crash if not initialized (better than unknowingly using garbage values) sigmaT=epsCrackOnset=relDuctility=G_over_E=std::numeric_limits<Real>::signaling_NaN(); - neverDamage=false; + neverDamage=viscApprox=false; cohesiveThresholdIter=-1; dmgTau=-1; dmgRateExp=0; plTau=-1; plRateExp=-1; omegaThreshold=0.999; @@ -251,6 +255,7 @@ (dmgRateExp) (plTau) (plRateExp) + (viscApprox) (omegaThreshold) ); Modified: trunk/gui/py/yade-multi =================================================================== --- trunk/gui/py/yade-multi 2009-04-10 11:36:17 UTC (rev 1754) +++ trunk/gui/py/yade-multi 2009-04-15 08:19:44 UTC (rev 1755) @@ -82,7 +82,7 @@ print "Will run `%s' on `%s' with nice value %d, output redirected to `%s', %d jobs at a time."%(executable,simul,nice,logFormat,maxJobs) -ll=['']+open(table,'r').readlines() +ll=[re.sub('\s*#.*','',l) for l in ['']+open(table,'r').readlines()] # remove comments availableLines=[i for i in range(len(ll)) if not re.match(r'^\s*(#.*)?$',ll[i][:-1]) and i>1] # read actual data Modified: trunk/scripts/multi.py =================================================================== --- trunk/scripts/multi.py 2009-04-10 11:36:17 UTC (rev 1754) +++ trunk/scripts/multi.py 2009-04-15 08:19:44 UTC (rev 1755) @@ -2,8 +2,8 @@ # see http://yade.wikia.com/wiki/ScriptParametricStudy#scripts.2Fmulti.py for explanations # ## read parameters from table here -from yade import utils -utils.readParamsFromTable(gravity=-9.81,density=2400,initialSpeed=20,noTableOk=True) +from yade import utils, plot +utils.readParamsFromTable(gravity=-9.81,density=2400,initialSpeed=10,noTableOk=True) print gravity,density,initialSpeed o=Omega() @@ -22,8 +22,9 @@ [InteractingSphere2InteractingSphere4SpheresContactGeometry(),InteractingBox2InteractingSphere4SpheresContactGeometry()], [SimpleElasticRelationships(),], [ef2_Spheres_Elastic_ElasticLaw(),] - ) + ), GravityEngine(gravity=(0,0,gravity)), ## here we use the 'gravity' parameter + PeriodicPythonRunner(iterPeriod=100,command='myAddPlotData()',label='plotDataCollector'), NewtonsDampedLaw(damping=0.4) ] o.bodies.append(utils.box([0,50,0],extents=[1,50,1],dynamic=False,color=[1,0,0],young=30e9,poisson=.3,density=density)) ## here we use the density parameter @@ -33,11 +34,16 @@ o.dt=.8*utils.PWaveTimeStep() ## o.saveTmp('initial') +def myAddPlotData(): + s=O.bodies[1] + plot.addData({'t':O.time,'y_sph':s.phys.pos[1],'z_sph':s.phys.pos[2]}) +plot.plots={'y_sph':('z_sph',)} # run 30000 iterations -o.run(30000,True) +o.run(20000,True) # write some results to a common file # (we rely on the fact that 2 processes will not write results at exactly the same time) # 'a' means to open for appending file('multi.out','a').write('%s %g %g %g %g\n'%(o.tags['description'],gravity,density,initialSpeed,o.bodies[1].phys.pos[1])) +print 'gnuplot',plot.saveGnuplot(O.tags['id']) _______________________________________________ Mailing list: https://launchpad.net/~yade-dev Post to : yade-dev@lists.launchpad.net Unsubscribe : https://launchpad.net/~yade-dev More help : https://help.launchpad.net/ListHelp