Question #703024 on Yade changed: https://answers.launchpad.net/yade/+question/703024
Status: Answered => Open Ziyu Wang is still having a problem: Hi Robert, In fact, I think there may be a misunderstanding between us, or I misunderstood your meaning(Sorry for that..) My description in 1# is to add the Thermalengine and related parameters on the basis of the fluid-solid coupling code I wrote myself. The parameter values refer to the examples, but do not involve the modification of the example script. I'll put the fluid solid coupling code that was successfully run before below. I don't know if it's what you need.. Best wishes. ###### from yade import pack, ymport, plot, utils, export, timing import numpy as np import sys Sy=4e6 damp=0.4 key='_triax_base_' young=66.2e9 name='JCFPM_triax' poisson=0.522 name='cylinder' preStress=-90e6 strainRate = -10 OUT=str(Sy)+'_JCFPM_triax' r1=0.005 r2=0.008 nw=24 nh=15 rParticle=0.000731723 bcCoeff = 5 width = 0.025 height = 0.05 A=0.25*3.14*width*width allx,ally,allz,r=np.genfromtxt('packing-cylinder.spheres', unpack=True) mnx=min(allx)*1.01 #same as aabbExtrema, get the xyz of the lowest corner, multiply by factor to reduce it to let the wall surround all the spheres. mny=min(ally)*1.01 mnz=min(allz)*0.99 mxx=max(allx)*1.01 #same as aabbExtrema, get the xyz of the top corner, multiply by factor to increase it to let the wall surround all the spheres. mxy=max(ally)*1.01 mxz=max(allz)*1.01 O.materials.append(JCFpmMat(type=1,density=2640,young=young,poisson=poisson,tensileStrength=8e6,cohesion=40e6,frictionAngle=radians(25),label='sphere')) O.materials.append(JCFpmMat(type=1,label='wall1',young=young,poisson=poisson,frictionAngle=radians(25))) O.materials.append(JCFpmMat(type=1,frictionAngle=0,density=0,label='wall2')) mn,mx=Vector3(mnx,mny,mnz),Vector3(mxx,mxy,mxz) walls=aabbWalls([mn,mx],thickness=0,material='wall2') wallIds=O.bodies.append(walls) spheres=O.bodies.append(ymport.text('packing-'+name+'.spheres',scale=1,shift=Vector3(0,0,0),material='sphere',color=(0.25,0.25,0.25))) bot = [O.bodies[s] for s in spheres if O.bodies[s].state.pos[2]<rParticle*bcCoeff] top = [O.bodies[s] for s in spheres if O.bodies[s].state.pos[2]>height-rParticle*bcCoeff] vel = strainRate*(height-rParticle*2*bcCoeff) for s in bot: s.shape.color = (1,0,0) s.state.blockedDOFs = 'xyzXYZ' #s.state.vel = (0,0,-vel) for s in top: s.shape.color = Vector3(0,1,0) s.state.blockedDOFs = 'xyzXYZ' s.state.vel = (0,0,vel) facets = [] rCyl2 = .5*width / cos(pi/float(nw)) for r in range(nw): for h in range(nh): v1 = Vector3( rCyl2*cos(2*pi*(r+0)/float(nw)), rCyl2*sin(2*pi*(r+0)/float(nw)), height*(h+0)/float(nh) ) v2 = Vector3( rCyl2*cos(2*pi*(r+1)/float(nw)), rCyl2*sin(2*pi*(r+1)/float(nw)), height*(h+0)/float(nh) ) v3 = Vector3( rCyl2*cos(2*pi*(r+1)/float(nw)), rCyl2*sin(2*pi*(r+1)/float(nw)), height*(h+1)/float(nh) ) v4 = Vector3( rCyl2*cos(2*pi*(r+0)/float(nw)), rCyl2*sin(2*pi*(r+0)/float(nw)), height*(h+1)/float(nh) ) f1 = facet((v1,v2,v3),color=(0,0,1),material='wall1') f2 = facet((v1,v3,v4),color=(0,0,1),material='wall1') facets.extend((f1,f2)) O.bodies.append(facets) mass = O.bodies[7].state.mass for f in facets: f.state.mass = mass f.state.blockedDOFs = 'XYZz' def lateral(): elatTot=0.0 nTot=0 for b in O.bodies: x=b.state.refPos[0] y=b.state.refPos[1] d=sqrt(pow(x,2)+pow(y,2)) if d > r1 and d < r2: b.shape.color=(0.6,0.5,0.15) xnew=b.state.pos[0] ynew=b.state.pos[1] dnew=sqrt(pow(xnew,2)+pow(ynew,2)) elat=(dnew-d)/d elatTot+=elat nTot+=1 elat_avg=elatTot/nTot return elat_avg def bodyByPos(x,y,z): cBody = O.bodies[1] cDist = Vector3(100,100,100) for b in O.bodies: if isinstance(b.shape, Sphere): dist = b.state.pos - Vector3(x,y,z) if np.linalg.norm(dist) < np.linalg.norm(cDist): cDist = dist cBody = b return cBody bodyOfInterest = bodyByPos(0.0125,0.0125,0.025) def addForces(): for f in facets: n = f.shape.normal a = f.shape.area O.forces.addF(f.id,preStress*a*n) def stopIfDamaged(maxEps=0.001): extremum = max(abs(s) for s in plot.data['s']) s = abs(plot.data['s'][-1]) e = abs(plot.data['e'][-1]) if O.iter < 1000 or e < maxEps: return if abs(s)/abs(extremum) < 0.5 : print('Simulation finished') presentcohesive_count = 0 for i in O.interactions: if hasattr(i.phys, 'isCohesive'): if i.phys.isCohesive == True: presentcohesive_count+=1 print('the number of cohesive bond now is:',presentcohesive_count) print('Max stress and strain:',extremum,e) O.wait() O.dt=.003*utils.PWaveTimeStep() newton=NewtonIntegrator(damping=damp) O.engines=[ ForceResetter(), InsertionSortCollider([Bo1_Sphere_Aabb(aabbEnlargeFactor=1.5,label='is2aabb'),Bo1_Facet_Aabb(),Bo1_Box_Aabb()]), InteractionLoop( [Ig2_Sphere_Sphere_ScGeom(interactionDetectionFactor=1.5,label='ss2sc'),Ig2_Facet_Sphere_ScGeom(),Ig2_Box_Sphere_ScGeom()], [Ip2_JCFpmMat_JCFpmMat_JCFpmPhys()], [Law2_ScGeom_JCFpmPhys_JointedCohesiveFrictionalPM(recordCracks=True,Key=OUT+'_Crack',label='interactionLaw')] ), PyRunner(iterPeriod=1,command="addForces()"), FlowEngine(dead=1,label="flow"), #ThermalEngine(dead=1,label='thermal'), newton, PyRunner(command='plotAddData()',iterPeriod=1000), PyRunner(iterPeriod=1000,command='stopIfDamaged()'), ] def plotAddData(): elat_avg=lateral() Qin = flow.getBoundaryFlux(4) perm = abs(Qin) * flow.viscosity * height / (A * Sy) f1 = sum(O.forces.f(b.id)[2] for b in top) f2 = sum(O.forces.f(b.id)[2] for b in bot) f = .5*(f2-f1) s = f/(pi*.25*width*width) e = (top[0].state.displ()[2] - bot[0].state.displ()[2]) / (height-rParticle*2*bcCoeff) plot.addData( elateral = elat_avg, i = O.iter, s = -s, e = -e, tc = interactionLaw.nbTensCracks, sc = interactionLaw.nbShearCracks, permeability = perm ) plot.saveDataTxt(OUT) O.step() ss2sc.interactionDetectionFactor=-1 is2aabb.aabbEnlargeFactor=-1 cohesiveCount = 0 for i in O.interactions: if hasattr(i.phys, 'isCohesive'): if i.phys.isCohesive == True: cohesiveCount+=1 print('the origin total number of cohesive bond is:',cohesiveCount) flow.debug=False flow.permeabilityMap = False flow.defTolerance=-1 flow.meshUpdateInterval=1000 flow.fluidBulkModulus=2.2e9 flow.useSolver=4 flow.permeabilityFactor=1 flow.viscosity= 0.001 flow.decoupleForces = False flow.bndCondIsPressure=[1,1,1,1,1,1] flow.bndCondValue=[0,0,0,0,0,Sy] flow.dead=0 flow.emulateAction() plot.plots = { 'e':('s',), 'elateral':('s'),} plot.plot() O.run() ########## By the way,the packing file is generated by the method in #2.Thanks again! -- You received this question notification because your team yade-users is an answer contact for Yade. _______________________________________________ Mailing list: https://launchpad.net/~yade-users Post to : yade-users@lists.launchpad.net Unsubscribe : https://launchpad.net/~yade-users More help : https://help.launchpad.net/ListHelp