Hydraulic fracture with DFNFlowEngine

Asked by Liu Changdong on 2020-07-05

Hello Everyone:
I am a new novice in Yade. Now i want to model hydraulic fracture with DFNFlowEngine and JCFpmMat. The model 1 is a cube, and I will inject water in the center of the cube. But I don't see any cracks in the model, just the movement of the particles. Then
 i try the model 2, the model 2 a cube with a joint in the center. And when i inject water in the center, yade reports the following error like: Vh==NULL!! id=0 Point=3.07081 4.72667 8.26223 rad=0.533742
1 : Vh==NULL!! id=1 Point=2.93626 7.27644 5.58063 rad=0.533623
2 : Vh==NULL!! id=2 Point=8.7494 2.35821 3.8193 rad=0.533504
 My question is based on the following:
1) How can cracks caused by water pressure be seen in the cube
2)How to correctly inject water into joints
The script of model 1 I wrote is as follows:

==================
from yade import pack,plot,utils
import math

intR=0.1
DENS=2500
YOUNG=1800
FRICT=7
ALPHA=0.1
TENS=100
COH=1000
iterper=100

O.materials.append(JCFpmMat(type=1,density=DENS,young=YOUNG,poisson=ALPHA,frictionAngle=radians(FRICT),tensileStrength=TENS,cohesion=COH,label='mat1'))

mn,mx=Vector3(0,0,0),Vector3(1,1,.1)
walls=aabbWalls([mn,mx],thickness=0,material='mat1')
wallIds=O.bodies.append(walls)

sp=pack.randomDensePack(pack.inAlignedBox(mn,mx),spheresInCell=2000,radius=0.01,memoizeDb='/tmp/hftest.sqlite',returnSpherePack=True)
sp.toSimulation(color=(0,0,250),material='mat1')

O.engines=[
    ForceResetter(),
    InsertionSortCollider([Bo1_Sphere_Aabb()]),
    InteractionLoop(
      [Ig2_Sphere_Sphere_ScGeom(interactionDetectionFactor=intR)],
     [Ip2_JCFpmMat_JCFpmMat_JCFpmPhys(cohesiveTresholdIteration=1)],
     [Law2_ScGeom_JCFpmPhys_JointedCohesiveFrictionalPM(smoothJoint=True,label='interactionLaw', recordCracks=True, Key='identifier',neverErase=True),Law2_ScGeom_FrictPhys_CundallStrack()]
    ),
    DFNFlowEngine(dead=1,label="flow"),
    GlobalStiffnessTimeStepper(active=1,timeStepUpdateInterval=100,timestepSafetyCoefficient=0.5, defaultDt=utils.PWaveTimeStep()),
    NewtonIntegrator(damping=0.1),
]

flow.dead=0
flow.viscosity=10
flow.defTolerance=0.3
flow.meshUpdateInterval=1
flow.updateTriangulation=True
flow.breakControlledRemesh=True
flow.bndCondIsPressure=[0,0,0,0,0,0]
flow.boundaryUseMaxMin=[0,0,0,0,0,0]
flow.imposePressure(Vector3(0.5,0.5,0.05),30000000)
flow.useSolver=3
O.dt=0.1e-5
O.dynDt=False

=============

Can anyone help me with this? Or any tips or tricks.

Thank you

Question information

Language:
English Edit question
Status:
Expired
For:
Yade Edit question
Assignee:
No assignee Edit question
Last query:
2020-07-05
Last reply:
2020-07-20
mrhappy (mrhappy) said : #1

Hi,

I am very new as well and I am working on YADE to model hydraulic fractures. From you code, you are not imposing any 'water'. Rather you are imposing a pressure field (flow.imposePressure(Vector3(0.5,0.5,0.05),30000000)). To impose 'water' you should use flow.imposeFlux(Vector3(x,y,z),-flowRate) .

I am not sure on how to see cracks. What I do is keep track of which interfaces have broken and then use that information in the post processing.

Maybe someone more well-versed with YADE can correct me on this.

Liu Changdong (changdong) said : #2

Hi mrhappy:

Thank you very much for answering my questions. From the question [1] i know how to impose water. And i changed my script to simulate a simple example like oedometer.py with JCFpmMat and DFNFlowEngine, and it worded very well. But when I added a crack to the model the following problem occurred:

negative volume for an ordinary pore (temp warning, should still be safe)
negative volume for an ordinary pore (temp warning, should still be safe)
negative volume for an ordinary pore (temp warning, should still be safe)
negative volume for an ordinary pore (temp warning, should still be safe).

I try to reduce time step, but it does not work. My script is as followed:
Can you tell me how to keep track of broken interface.

=========================

from yade import pack
dimModele = 1.0
pred = pack.inAlignedBox((0,0,0),(dimModele,dimModele,dimModele))

# the packing of spheres :

def mat(): return JCFpmMat(type=1,young=1e8,poisson=0.3,frictionAngle=radians(30),density=3000,tensileStrength=1e6,cohesion=1e6,jointNormalStiffness=1e7,jointShearStiffness=1e7,jointCohesion=1e6,jointFrictionAngle=radians(20),jointDilationAngle=0.0)
nSpheres = 3000.0
poros=0.13
rMeanSpheres = dimModele * pow(3.0/4.0*(1-poros)/(pi*nSpheres),1.0/3.0)
print ''
print 'Creating a cubic sample of spheres (may take some time and cause warnings)'
print ''
sp = pack.randomDensePack(pred,radius=rMeanSpheres,rRelFuzz=0.3,memoizeDb='/tmp/gts-triax-packings.sqlite',returnSpherePack=True)
sp.toSimulation(color=(0.9,0.8,0.6),wire=False,material=mat)
print ''
print 'Sample created !'
for o in O.bodies:
    if isinstance(o.shape,Sphere):
        o.shape.radius*=0.8

# Definition of the facets for joint's geometry

import gts
# joint with ~ 31 deg. dip angle
v1 = gts.Vertex(1,0.5,0)
v2 = gts.Vertex(0,0.5,0)
v3 = gts.Vertex(0,0.5,1)
v4 = gts.Vertex(1,0.5,1)

e1 = gts.Edge(v1,v2)
e2 = gts.Edge(v2,v4)
e3 = gts.Edge(v4,v1)
f1 = gts.Face(e1,e2,e3)

e4 = gts.Edge(v4,v3)
e5 = gts.Edge(v3,v2)
f2 = gts.Face(e2,e4,e5)

s1 = gts.Surface()
s1.add(f1)
s1.add(f2)

facet = gtsSurface2Facets(s1,material=mat)
O.bodies.append(facet)

yade.qt.View()
yade.qt.Controller()

execfile('identifBis.py')
newton=NewtonIntegrator(damping=0.2)

O.engines=[
    ForceResetter(),
    InsertionSortCollider([Bo1_Sphere_Aabb(),Bo1_Box_Aabb()]),
    InteractionLoop(
     [Ig2_Sphere_Sphere_ScGeom(interactionDetectionFactor=0.1)],
     [Ip2_JCFpmMat_JCFpmMat_JCFpmPhys(cohesiveTresholdIteration=1)],
     [Law2_ScGeom_JCFpmPhys_JointedCohesiveFrictionalPM(smoothJoint=True,label='interactionLaw', recordCracks=True, Key='identifier',neverErase=True),Law2_ScGeom_FrictPhys_CundallStrack()]
    ),
    DFNFlowEngine(dead=1,label="flow"),#introduced as a dead engine for the moment, see 2nd section
    GlobalStiffnessTimeStepper(active=1,timeStepUpdateInterval=100,timestepSafetyCoefficient=0.8),
    #triax,
    newton
]

flow.dead=0
flow.BulkModulus=1
flow.viscosity=1
flow.defTolerance=0.3
flow.permeabilityFactor=1
flow.meshUpdateInterval=1
flow.updateTriangulation=True
flow.breakControlledRemesh=True
flow.bndCondIsPressure=[0,0,0,0,1,1]
flow.boundaryUseMaxMin=[1,1,1,1,1,1]
flow.bndCondValue=[0,0,0,0,0,1]
flow.useSolver=3
O.engines=O.engines+[PyRunner(iterPeriod=200,command='flow.saveVtk()')]
O.dt=0.1e-10
O.dynDt=False

========================

can anyone help me with this?

thank you!

[1] https://answers.launchpad.net/yade/+question/689826

Launchpad Janitor (janitor) said : #3

This question was expired because it remained in the 'Open' state without activity for the last 15 days.