Yade wrapper class reference

Bodies

Body

class yade.wrapper.Body(inherits Serializable)

A particle, basic element of simulation; interacts with other bodies.

Shape

digraph Shape {
        rankdir=RL;
        margin="0.2,0.05";
        "Shape" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Shape"];
        "DeformableElement" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.DeformableElement"];
        "DeformableElement" -> "Shape" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Box" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Box"];
        "Box" -> "Shape" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Facet" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Facet"];
        "Facet" -> "Shape" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Node" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Node"];
        "Node" -> "Shape" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Subdomain" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Subdomain"];
        "Subdomain" -> "Shape" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Sphere" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Sphere"];
        "Sphere" -> "Shape" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "ChainedCylinder" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.ChainedCylinder"];
        "ChainedCylinder" -> "Cylinder" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "GridConnection" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.GridConnection"];
        "GridConnection" -> "Sphere" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Clump" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Clump"];
        "Clump" -> "Shape" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "PotentialParticle" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.PotentialParticle"];
        "PotentialParticle" -> "Shape" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "DeformableCohesiveElement" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.DeformableCohesiveElement"];
        "DeformableCohesiveElement" -> "DeformableElement" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Tetra" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Tetra"];
        "Tetra" -> "Shape" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "FluidDomainBbox" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.FluidDomainBbox"];
        "FluidDomainBbox" -> "Shape" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "GridNode" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.GridNode"];
        "GridNode" -> "Sphere" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Lin4NodeTetra" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Lin4NodeTetra"];
        "Lin4NodeTetra" -> "DeformableElement" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Cylinder" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Cylinder"];
        "Cylinder" -> "Sphere" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Wall" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Wall"];
        "Wall" -> "Shape" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "LevelSet" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.LevelSet"];
        "LevelSet" -> "Shape" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Polyhedra" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Polyhedra"];
        "Polyhedra" -> "Shape" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "PFacet" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.PFacet"];
        "PFacet" -> "Shape" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Lin4NodeTetra_Lin4NodeTetra_InteractionElement" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Lin4NodeTetra_Lin4NodeTetra_InteractionElement"];
        "Lin4NodeTetra_Lin4NodeTetra_InteractionElement" -> "DeformableCohesiveElement" [arrowsize=0.5,style="setlinewidth(0.5)"];
}

Inheritance graph of Shape.

class yade.wrapper.Shape(inherits Serializable)

Geometry of a body

class yade.wrapper.Box(inherits Shape Serializable)
class yade.wrapper.ChainedCylinder(inherits Cylinder Sphere Shape Serializable)

Geometry of a deformable chained cylinder, using geometry Cylinder.

class yade.wrapper.Clump(inherits Shape Serializable)

Rigid aggregate of bodies

class yade.wrapper.Cylinder(inherits Sphere Shape Serializable)

Geometry of a cylinder, as Minkowski sum of line and sphere.

class yade.wrapper.DeformableCohesiveElement(inherits DeformableElement Shape Serializable)

Tetrahedral Deformable Element Composed of Nodes

property elementframe
class yade.wrapper.DeformableElement(inherits Shape Serializable)

Deformable aggregate of nodes

property elementframe
class yade.wrapper.Facet(inherits Shape Serializable)

Facet (triangular particle) geometry.

class yade.wrapper.FluidDomainBbox(inherits Shape Serializable)

The bounding box of a fluid grid from one OpenFOAM/YALES2 proc

class yade.wrapper.GridConnection(inherits Sphere Shape Serializable)

GridConnection shape (see [Effeindzourou2016], [Bourrier2013]). Component of a grid designed to link two GridNodes. It is highly recommended to use gridpfacet.gridConnection to generate correct GridConnections.

class yade.wrapper.GridNode(inherits Sphere Shape Serializable)

GridNode shape, component of a grid. To create a Grid, place the nodes first, they will define the spacial discretisation of it. It is highly recommended to use gridpfacet.gridNode to generate correct GridNodes. Note that the GridNodes should only be in an Interaction with other GridNodes. The Sphere-Grid contact is only handled by the GridConnections.

class yade.wrapper.LevelSet(inherits Shape Serializable)

A level set description of particle shape based on a discrete distance field and surface nodes [Duriez2021a] [Duriez2021b]. Visualization of corresponding bodies is currently absent from YADE 3D view and relies upon a VTKRecorder export with ``lsBodies’’ among recorders. File examples/levelSet/pvVisu.py provides a Python function dedicated for such a purpose.

class yade.wrapper.Lin4NodeTetra(inherits DeformableElement Shape Serializable)

Tetrahedral Deformable Element Composed of Nodes

property elementframe
class yade.wrapper.Lin4NodeTetra_Lin4NodeTetra_InteractionElement(inherits DeformableCohesiveElement DeformableElement Shape Serializable)

Tetrahedral Deformable Element Composed of Nodes

property elementframe
class yade.wrapper.Node(inherits Shape Serializable)

Geometry of node particle.

class yade.wrapper.PFacet(inherits Shape Serializable)

PFacet (particle facet) geometry (see [Effeindzourou2016], [Effeindzourou2015a]). It is highly recommended to use the helper functions in gridpfacet (e.g., gridpfacet.pfacetCreator1-4) to generate correct PFacet elements.

class yade.wrapper.Polyhedra(inherits Shape Serializable)

Polyhedral (convex) geometry.

class yade.wrapper.PotentialParticle(inherits Shape Serializable)

EXPERIMENTAL. Geometry of PotentialParticle.

class yade.wrapper.Sphere(inherits Shape Serializable)

Geometry of spherical particle.

class yade.wrapper.Subdomain(inherits Shape Serializable)

The bounding box of a mpi subdomain. Stores internals and provides optimized functions for communications between workers. This class may not be used directly. Instead, Subdomains are appended automatically to the scene bodies when using mpy.mpirun

class yade.wrapper.Tetra(inherits Shape Serializable)

Tetrahedron geometry.

class yade.wrapper.Wall(inherits Shape Serializable)

Object representing infinite plane aligned with the coordinate system (axis-aligned wall).

State

digraph State {
        rankdir=RL;
        margin="0.2,0.05";
        "State" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.State"];
        "PartialSatState" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.PartialSatState"];
        "PartialSatState" -> "State" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "JCFpmState" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.JCFpmState"];
        "JCFpmState" -> "State" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "ChainedState" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.ChainedState"];
        "ChainedState" -> "State" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "CpmState" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.CpmState"];
        "CpmState" -> "State" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "WireState" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.WireState"];
        "WireState" -> "State" [arrowsize=0.5,style="setlinewidth(0.5)"];
}

Inheritance graph of State.

class yade.wrapper.State(inherits Serializable)

State of a body (spatial configuration, internal variables).

class yade.wrapper.ChainedState(inherits State Serializable)

State of a chained bodies, containing information on connectivity in order to track contacts jumping over contiguous elements. Chains are 1D lists from which id of chained bodies are retrieved via rank and chainNumber.

class yade.wrapper.CpmState(inherits State Serializable)

State information about body use by cpm-model.

None of that is used for computation (at least not now), only for post-processing.

class yade.wrapper.JCFpmState(inherits State Serializable)

JCFpm state information about each body.

class yade.wrapper.PartialSatState(inherits State Serializable)

Hertz mindlin state information about each body. Only active if partially saturated clay model is active.

class yade.wrapper.WireState(inherits State Serializable)

Wire state information of each body.

None of that is used for computation (at least not now), only for post-processing.

Material

digraph Material {
        rankdir=RL;
        margin="0.2,0.05";
        "Material" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Material"];
        "DeformableElementMaterial" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.DeformableElementMaterial"];
        "DeformableElementMaterial" -> "Material" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "MortarMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.MortarMat"];
        "MortarMat" -> "FrictMat" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "FrictMatCDM" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.FrictMatCDM"];
        "FrictMatCDM" -> "FrictMat" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "ElastMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.ElastMat"];
        "ElastMat" -> "Material" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "PolyhedraMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.PolyhedraMat"];
        "PolyhedraMat" -> "FrictMat" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "ViscElMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.ViscElMat"];
        "ViscElMat" -> "FrictMat" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "LinIsoRayleighDampElastMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.LinIsoRayleighDampElastMat"];
        "LinIsoRayleighDampElastMat" -> "LinIsoElastMat" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "BubbleMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.BubbleMat"];
        "BubbleMat" -> "Material" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "LinIsoElastMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.LinIsoElastMat"];
        "LinIsoElastMat" -> "DeformableElementMaterial" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "InelastCohFrictMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.InelastCohFrictMat"];
        "InelastCohFrictMat" -> "FrictMat" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "CohFrictMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.CohFrictMat"];
        "CohFrictMat" -> "FrictMat" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "WireMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.WireMat"];
        "WireMat" -> "FrictMat" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "LinCohesiveStiffPropDampElastMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.LinCohesiveStiffPropDampElastMat"];
        "LinCohesiveStiffPropDampElastMat" -> "LinCohesiveElasticMaterial" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "CohesiveDeformableElementMaterial" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.CohesiveDeformableElementMaterial"];
        "CohesiveDeformableElementMaterial" -> "Material" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "CpmMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.CpmMat"];
        "CpmMat" -> "FrictMat" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "PartialSatMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.PartialSatMat"];
        "PartialSatMat" -> "FrictMat" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "ViscElCapMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.ViscElCapMat"];
        "ViscElCapMat" -> "ViscElMat" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "LinCohesiveElasticMaterial" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.LinCohesiveElasticMaterial"];
        "LinCohesiveElasticMaterial" -> "CohesiveDeformableElementMaterial" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "LudingMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.LudingMat"];
        "LudingMat" -> "Material" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "FrictViscoMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.FrictViscoMat"];
        "FrictViscoMat" -> "FrictMat" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "FrictMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.FrictMat"];
        "FrictMat" -> "ElastMat" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "JCFpmMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.JCFpmMat"];
        "JCFpmMat" -> "FrictMat" [arrowsize=0.5,style="setlinewidth(0.5)"];
}

Inheritance graph of Material.

class yade.wrapper.Material(inherits Serializable)

Material properties of a body.

class yade.wrapper.BubbleMat(inherits Material Serializable)

material for bubble interactions, for use with other Bubble classes

class yade.wrapper.CohFrictMat(inherits FrictMat ElastMat Material Serializable)

Material description extending FrictMat with cohesive properties and rotational stiffnesses. For use e.g. with Law2_ScGeom6D_CohFrictPhys_CohesionMoment.

class yade.wrapper.CohesiveDeformableElementMaterial(inherits Material Serializable)

Deformable Element Material.

class yade.wrapper.CpmMat(inherits FrictMat ElastMat Material Serializable)

Concrete material, for use with other Cpm classes.

Note

Density is initialized to 4800 kgm⁻³automatically, which gives approximate 2800 kgm⁻³ on 0.5 density packing.

Concrete Particle Model (CPM)

CpmMat is particle material, Ip2_CpmMat_CpmMat_CpmPhys averages two particles’ materials, creating CpmPhys, which is then used in interaction resultion by Law2_ScGeom_CpmPhys_Cpm. CpmState is associated to CpmMat and keeps state defined on particles rather than interactions (such as number of completely damaged interactions).

The model is contained in externally defined macro CPM_MATERIAL_MODEL, which features damage in tension, plasticity in shear and compression and rate-dependence. For commercial reasons, rate-dependence and compression-plasticity is not present in reduced version of the model, used when CPM_MATERIAL_MODEL is not defined. The full model will be described in detail in my (Václav Šmilauer) thesis along with calibration procedures (rigidity, poisson’s ratio, compressive/tensile strength ratio, fracture energy, behavior under confinement, rate-dependent behavior).

Even the public model is useful enough to run simulation on concrete samples, such as uniaxial tension-compression test.

class yade.wrapper.DeformableElementMaterial(inherits Material Serializable)

Deformable Element Material.

class yade.wrapper.ElastMat(inherits Material Serializable)

Purely elastic material. The material parameters may have different meanings depending on the IPhysFunctor used : true Young and Poisson in Ip2_FrictMat_FrictMat_MindlinPhys, or contact stiffnesses in Ip2_FrictMat_FrictMat_FrictPhys.

class yade.wrapper.FrictMat(inherits ElastMat Material Serializable)

Elastic material with contact friction. See also ElastMat.

class yade.wrapper.FrictMatCDM(inherits FrictMat ElastMat Material Serializable)

Material to be used for extended Hertz-Mindlin contact law. Normal direction: parameters for Conical Damage Model (Harkness et al. 2016, Suhr & Six 2017). Tangential direction: parameters for stress dependent interparticle friction coefficient (Suhr & Six 2016). Both models can be switched on/off separately.

class yade.wrapper.FrictViscoMat(inherits FrictMat ElastMat Material Serializable)

Material for use with the FrictViscoPM classes

class yade.wrapper.InelastCohFrictMat(inherits FrictMat ElastMat Material Serializable)
class yade.wrapper.JCFpmMat(inherits FrictMat ElastMat Material Serializable)

Possibly jointed, cohesive frictional material, for use with other JCFpm classes

class yade.wrapper.LinCohesiveElasticMaterial(inherits CohesiveDeformableElementMaterial Material Serializable)

Linear Isotropic Elastic material

class yade.wrapper.LinCohesiveStiffPropDampElastMat(inherits LinCohesiveElasticMaterial CohesiveDeformableElementMaterial Material Serializable)

Elastic material with Rayleigh Damping.

class yade.wrapper.LinIsoElastMat(inherits DeformableElementMaterial Material Serializable)

Linear Isotropic Elastic material

class yade.wrapper.LinIsoRayleighDampElastMat(inherits LinIsoElastMat DeformableElementMaterial Material Serializable)

Elastic material with Rayleigh Damping.

class yade.wrapper.LudingMat(inherits Material Serializable)

Material for simple Luding`s model of contact [Luding2008] ,[Singh2013]_ .

class yade.wrapper.MortarMat(inherits FrictMat ElastMat Material Serializable)

Material for mortar interface, used in Ip2_MortarMat_MortarMat_MortarPhys and Law2_ScGeom_MortarPhys_Lourenco. Default values according to

class yade.wrapper.PartialSatMat(inherits FrictMat ElastMat Material Serializable)

Material used for PartialSatClayEngine. Necessary for the custom PartialSatState.

class yade.wrapper.PolyhedraMat(inherits FrictMat ElastMat Material Serializable)

Elastic material with Coulomb friction.

class yade.wrapper.ViscElCapMat(inherits ViscElMat FrictMat ElastMat Material Serializable)

Material for extended viscoelastic model of contact with capillary parameters.

class yade.wrapper.ViscElMat(inherits FrictMat ElastMat Material Serializable)

Material for simple viscoelastic model of contact from analytical solution of a pair spheres interaction problem [Pournin2001] .

class yade.wrapper.WireMat(inherits FrictMat ElastMat Material Serializable)

Material for use with the Wire classes. In conjunction with the corresponding functors it can be used to model steel wire meshes [Thoeni2014], geotextiles [Cheng2016] and more.

Bound

digraph Bound {
        rankdir=RL;
        margin="0.2,0.05";
        "Bound" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Bound"];
        "Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Aabb"];
        "Aabb" -> "Bound" [arrowsize=0.5,style="setlinewidth(0.5)"];
}

Inheritance graph of Bound.

class yade.wrapper.Bound(inherits Serializable)

Object bounding part of space taken by associated body; might be larger, used to optimalize collision detection

class yade.wrapper.Aabb(inherits Bound Serializable)

Axis-aligned bounding box, for use with InsertionSortCollider. (This class is quasi-redundant since min,max are already contained in Bound itself. That might change at some point, though.)

Interactions

Interaction

class yade.wrapper.Interaction(inherits Serializable)

Interaction between pair of bodies.

IGeom

digraph IGeom {
        rankdir=RL;
        margin="0.2,0.05";
        "IGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.IGeom"];
        "CylScGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.CylScGeom"];
        "CylScGeom" -> "ScGeom" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "ScGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.ScGeom"];
        "ScGeom" -> "GenericSpheresContact" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "GridCoGridCoGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.GridCoGridCoGeom"];
        "GridCoGridCoGeom" -> "ScGeom" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "CylScGeom6D" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.CylScGeom6D"];
        "CylScGeom6D" -> "ScGeom6D" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "ChCylGeom6D" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.ChCylGeom6D"];
        "ChCylGeom6D" -> "ScGeom6D" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.L6Geom"];
        "L6Geom" -> "L3Geom" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "ScGeom6D" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.ScGeom6D"];
        "ScGeom6D" -> "ScGeom" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "GridNodeGeom6D" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.GridNodeGeom6D"];
        "GridNodeGeom6D" -> "ScGeom6D" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "ScGridCoGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.ScGridCoGeom"];
        "ScGridCoGeom" -> "ScGeom6D" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "PolyhedraGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.PolyhedraGeom"];
        "PolyhedraGeom" -> "IGeom" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "L3Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.L3Geom"];
        "L3Geom" -> "GenericSpheresContact" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "TTetraSimpleGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.TTetraSimpleGeom"];
        "TTetraSimpleGeom" -> "IGeom" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "GenericSpheresContact" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.GenericSpheresContact"];
        "GenericSpheresContact" -> "IGeom" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "TTetraGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.TTetraGeom"];
        "TTetraGeom" -> "IGeom" [arrowsize=0.5,style="setlinewidth(0.5)"];
}

Inheritance graph of IGeom.

class yade.wrapper.IGeom(inherits Serializable)

Geometrical configuration of interaction

class yade.wrapper.ChCylGeom6D(inherits ScGeom6D ScGeom GenericSpheresContact IGeom Serializable)

Test

class yade.wrapper.CylScGeom(inherits ScGeom GenericSpheresContact IGeom Serializable)

Geometry of a cylinder-sphere contact.

class yade.wrapper.CylScGeom6D(inherits ScGeom6D ScGeom GenericSpheresContact IGeom Serializable)

Class representing geometry of two bodies in contact. The contact has 6 DOFs (normal, 2×shear, twist, 2xbending) and uses ScGeom incremental algorithm for updating shear.

class yade.wrapper.GenericSpheresContact(inherits IGeom Serializable)

Class uniting ScGeom and L3Geom, for the purposes of GlobalStiffnessTimeStepper. (It might be removed in the future). Do not use this class directly.

class yade.wrapper.GridCoGridCoGeom(inherits ScGeom GenericSpheresContact IGeom Serializable)

Geometry of a GridConnection-GridConnection contact.

class yade.wrapper.GridNodeGeom6D(inherits ScGeom6D ScGeom GenericSpheresContact IGeom Serializable)

Geometry of a GridNode-GridNode contact. Inherits almost everything from ScGeom6D.

class yade.wrapper.L3Geom(inherits GenericSpheresContact IGeom Serializable)

Geometry of contact given in local coordinates with 3 degress of freedom: normal and two in shear plane. [experimental]

class yade.wrapper.L6Geom(inherits L3Geom GenericSpheresContact IGeom Serializable)

Geometric of contact in local coordinates with 6 degrees of freedom. [experimental]

class yade.wrapper.PolyhedraGeom(inherits IGeom Serializable)

Geometry of interaction between 2 Polyhedra, including volumetric characteristics

class yade.wrapper.ScGeom(inherits GenericSpheresContact IGeom Serializable)

Class representing geometry of a contact point between two bodies. It is more general than sphere-sphere contact even though it is primarily focused on spheres contact interactions (reason for the ‘Sc’ naming); it is also used for representing contacts of a Sphere with non-spherical bodies (Facet, Plane, Box, ChainedCylinder), or between two non-spherical bodies (ChainedCylinder). The contact has 3 DOFs (normal and 2×shear) and uses incremental algorithm for updating shear.

We use symbols \(\vec{x}\), \(\vec{v}\), \(\vec{\omega}\) respectively for position, linear and angular velocities (all in global coordinates) and \(r\) for particles radii; subscripted with 1 or 2 to distinguish 2 spheres in contact. Then we define branch length and unit contact normal

\[l=||\vec{x}_2-\vec{x}_1||, \vec{n}=\frac{\vec{x}_2-\vec{x}_1}{||\vec{x}_2-\vec{x}_1||}\]

The relative velocity of the spheres is then

\[\vec{v}_{12}=\frac{r_1+r_2}{l}(\vec{v}_2-\vec{v}_1) -(r_2 \vec{\omega}_2 + r_1\vec{\omega}_1)\times\vec{n}\]

where the fraction multiplying translational velocities is to make the definition objective and avoid ratcheting effects (see Ig2_Sphere_Sphere_ScGeom.avoidGranularRatcheting). The shear component is

\[\vec{v}_{12}^s=\vec{v}_{12}-(\vec{n}\cdot\vec{v}_{12})\vec{n}.\]

Tangential displacement increment over last step then reads

\[\Delta\vec{x}_{12}^s=\Delta t \vec{v}_{12}^s.\]
class yade.wrapper.ScGeom6D(inherits ScGeom GenericSpheresContact IGeom Serializable)

Class representing geometry of two bodies in contact. The contact has 6 DOFs (normal, 2×shear, twist, 2xbending) and uses ScGeom incremental algorithm for updating shear.

class yade.wrapper.ScGridCoGeom(inherits ScGeom6D ScGeom GenericSpheresContact IGeom Serializable)

Geometry of a GridConnection-Sphere contact.

class yade.wrapper.TTetraGeom(inherits IGeom Serializable)

Geometry of interaction between 2 tetrahedra, including volumetric characteristics

class yade.wrapper.TTetraSimpleGeom(inherits IGeom Serializable)

EXPERIMENTAL. Geometry of interaction between 2 tetrahedra

IPhys

digraph IPhys {
        rankdir=RL;
        margin="0.2,0.05";
        "IPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.IPhys"];
        "NormShearPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.NormShearPhys"];
        "NormShearPhys" -> "NormPhys" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "CpmPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.CpmPhys"];
        "CpmPhys" -> "NormShearPhys" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "ViscElPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.ViscElPhys"];
        "ViscElPhys" -> "FrictPhys" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "FrictPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.FrictPhys"];
        "FrictPhys" -> "NormShearPhys" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "FrictViscoPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.FrictViscoPhys"];
        "FrictViscoPhys" -> "FrictPhys" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "LudingPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.LudingPhys"];
        "LudingPhys" -> "FrictPhys" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "CohFrictPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.CohFrictPhys"];
        "CohFrictPhys" -> "RotStiffFrictPhys" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "KnKsPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.KnKsPhys"];
        "KnKsPhys" -> "FrictPhys" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "NormPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.NormPhys"];
        "NormPhys" -> "IPhys" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "BubblePhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.BubblePhys"];
        "BubblePhys" -> "IPhys" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "InelastCohFrictPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.InelastCohFrictPhys"];
        "InelastCohFrictPhys" -> "RotStiffFrictPhys" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "MindlinPhysCDM" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.MindlinPhysCDM"];
        "MindlinPhysCDM" -> "MindlinPhys" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "ViscoFrictPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.ViscoFrictPhys"];
        "ViscoFrictPhys" -> "FrictPhys" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "MindlinCapillaryPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.MindlinCapillaryPhys"];
        "MindlinCapillaryPhys" -> "MindlinPhys" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "ViscElCapPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.ViscElCapPhys"];
        "ViscElCapPhys" -> "ViscElPhys" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "LubricationPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.LubricationPhys"];
        "LubricationPhys" -> "ViscElPhys" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "JCFpmPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.JCFpmPhys"];
        "JCFpmPhys" -> "NormShearPhys" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "WirePhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.WirePhys"];
        "WirePhys" -> "FrictPhys" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "MortarPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.MortarPhys"];
        "MortarPhys" -> "FrictPhys" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "MindlinPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.MindlinPhys"];
        "MindlinPhys" -> "RotStiffFrictPhys" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "CapillaryPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.CapillaryPhys"];
        "CapillaryPhys" -> "FrictPhys" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "PolyhedraPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.PolyhedraPhys"];
        "PolyhedraPhys" -> "FrictPhys" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "RotStiffFrictPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.RotStiffFrictPhys"];
        "RotStiffFrictPhys" -> "FrictPhys" [arrowsize=0.5,style="setlinewidth(0.5)"];
}

Inheritance graph of IPhys.

class yade.wrapper.IPhys(inherits Serializable)

Physical (material) properties of interaction.

class yade.wrapper.BubblePhys(inherits IPhys Serializable)

Physics of bubble-bubble interactions, for use with BubbleMat

class yade.wrapper.CapillaryPhys(inherits FrictPhys NormShearPhys NormPhys IPhys Serializable)

Physics (of interaction) for Law2_ScGeom_CapillaryPhys_Capillarity.

class yade.wrapper.CohFrictPhys(inherits RotStiffFrictPhys FrictPhys NormShearPhys NormPhys IPhys Serializable)

An interaction physics that extends RotStiffFrictPhys adding a breakable cohesive nature. Used e.g. by Law2_ScGeom6D_CohFrictPhys_CohesionMoment.

class yade.wrapper.CpmPhys(inherits NormShearPhys NormPhys IPhys Serializable)

Representation of a single interaction of the Cpm type: storage for relevant parameters.

Evolution of the contact is governed by Law2_ScGeom_CpmPhys_Cpm, that includes damage effects and chages of parameters inside CpmPhys. See cpm-model for details.

class yade.wrapper.FrictPhys(inherits NormShearPhys NormPhys IPhys Serializable)

The simple linear elastic-plastic interaction with friction angle, like in the traditional [CundallStrack1979]

class yade.wrapper.FrictViscoPhys(inherits FrictPhys NormShearPhys NormPhys IPhys Serializable)

Representation of a single interaction of the FrictViscoPM type, storage for relevant parameters

class yade.wrapper.InelastCohFrictPhys(inherits RotStiffFrictPhys FrictPhys NormShearPhys NormPhys IPhys Serializable)
class yade.wrapper.JCFpmPhys(inherits NormShearPhys NormPhys IPhys Serializable)

Representation of a single interaction of the JCFpm type, storage for relevant parameters

class yade.wrapper.KnKsPhys(inherits FrictPhys NormShearPhys NormPhys IPhys Serializable)

EXPERIMENTAL. IPhys for PotentialParticle.

class yade.wrapper.LubricationPhys(inherits ViscElPhys FrictPhys NormShearPhys NormPhys IPhys Serializable)

IPhys class for Lubrication w/o FlowEngine. Used by Law2_ScGeom_ImplicitLubricationPhys.

class yade.wrapper.LudingPhys(inherits FrictPhys NormShearPhys NormPhys IPhys Serializable)

IPhys created from LudingMat, for use with Law2_ScGeom_LudingPhys_Basic.

class yade.wrapper.MindlinCapillaryPhys(inherits MindlinPhys RotStiffFrictPhys FrictPhys NormShearPhys NormPhys IPhys Serializable)

Adds capillary physics to Mindlin’s interaction physics.

class yade.wrapper.MindlinPhys(inherits RotStiffFrictPhys FrictPhys NormShearPhys NormPhys IPhys Serializable)

Representation of an interaction of the Hertz-Mindlin type.

class yade.wrapper.MindlinPhysCDM(inherits MindlinPhys RotStiffFrictPhys FrictPhys NormShearPhys NormPhys IPhys Serializable)

Representation of an interaction of an extended Hertz-Mindlin type. Normal direction: parameters for Conical Damage Model (Harkness et al. 2016, Suhr & Six 2017). Tangential direction: parameters for stress dependent interparticle friction coefficient (Suhr & Six 2016). Both models can be switched on/off separately, see FrictMatCDM.

class yade.wrapper.MortarPhys(inherits FrictPhys NormShearPhys NormPhys IPhys Serializable)

IPhys class containing parameters of MortarMat. Used by Law2_ScGeom_MortarPhys_Lourenco.

class yade.wrapper.NormPhys(inherits IPhys Serializable)

Abstract class for interactions that have normal stiffness.

class yade.wrapper.NormShearPhys(inherits NormPhys IPhys Serializable)

Abstract class for interactions that have shear stiffnesses, in addition to normal stiffness. This class is used in the PFC3d-style stiffness timestepper.

class yade.wrapper.PolyhedraPhys(inherits FrictPhys NormShearPhys NormPhys IPhys Serializable)

Simple elastic material with friction for volumetric constitutive laws

class yade.wrapper.RotStiffFrictPhys(inherits FrictPhys NormShearPhys NormPhys IPhys Serializable)

Version of FrictPhys with a rotational stiffness

class yade.wrapper.ViscElCapPhys(inherits ViscElPhys FrictPhys NormShearPhys NormPhys IPhys Serializable)

IPhys created from ViscElCapMat, for use with Law2_ScGeom_ViscElCapPhys_Basic.

class yade.wrapper.ViscElPhys(inherits FrictPhys NormShearPhys NormPhys IPhys Serializable)

IPhys created from ViscElMat, for use with Law2_ScGeom_ViscElPhys_Basic.

class yade.wrapper.ViscoFrictPhys(inherits FrictPhys NormShearPhys NormPhys IPhys Serializable)

Temporary version of FrictPhys for compatibility reasons

class yade.wrapper.WirePhys(inherits FrictPhys NormShearPhys NormPhys IPhys Serializable)

Representation of a single interaction of the WirePM type, storage for relevant parameters

Global engines

GlobalEngine

digraph GlobalEngine {
        rankdir=RL;
        margin="0.2,0.05";
        "GlobalEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.GlobalEngine"];
        "ForceResetter" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.ForceResetter"];
        "ForceResetter" -> "GlobalEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "HydrodynamicsLawLBM" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.HydrodynamicsLawLBM"];
        "HydrodynamicsLawLBM" -> "GlobalEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "TimeStepper" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.TimeStepper"];
        "TimeStepper" -> "GlobalEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "NewtonIntegrator" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.NewtonIntegrator"];
        "NewtonIntegrator" -> "GlobalEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "TetraVolumetricLaw" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.TetraVolumetricLaw"];
        "TetraVolumetricLaw" -> "GlobalEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "RungeKuttaCashKarp54Integrator" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.RungeKuttaCashKarp54Integrator"];
        "RungeKuttaCashKarp54Integrator" -> "Integrator" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_ScGeom_CapillaryPhys_Capillarity" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_ScGeom_CapillaryPhys_Capillarity"];
        "Law2_ScGeom_CapillaryPhys_Capillarity" -> "GlobalEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "BoxFactory" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.BoxFactory"];
        "BoxFactory" -> "SpheresFactory" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "FieldApplier" [shape="box",fontsize=8,style="setlinewidth(0.5),filled,dashed",fillcolor=grey,height=0.2,URL="yade.wrapper.html#inheritancegraphfieldapplier"];
        "FieldApplier" -> "GlobalEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "FacetTopologyAnalyzer" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.FacetTopologyAnalyzer"];
        "FacetTopologyAnalyzer" -> "GlobalEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "InteractionLoop" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.InteractionLoop"];
        "InteractionLoop" -> "GlobalEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "FEInternalForceEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.FEInternalForceEngine"];
        "FEInternalForceEngine" -> "GlobalEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "ElasticContactLaw" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.ElasticContactLaw"];
        "ElasticContactLaw" -> "GlobalEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Integrator" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Integrator"];
        "Integrator" -> "TimeStepper" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "BoundaryController" [shape="box",fontsize=8,style="setlinewidth(0.5),filled,dashed",fillcolor=grey,height=0.2,URL="yade.wrapper.html#inheritancegraphboundarycontroller"];
        "BoundaryController" -> "GlobalEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "FoamCoupling" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.FoamCoupling"];
        "FoamCoupling" -> "GlobalEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "CircularFactory" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.CircularFactory"];
        "CircularFactory" -> "SpheresFactory" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "GlobalStiffnessTimeStepper" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.GlobalStiffnessTimeStepper"];
        "GlobalStiffnessTimeStepper" -> "TimeStepper" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "MicroMacroAnalyser" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.MicroMacroAnalyser"];
        "MicroMacroAnalyser" -> "GlobalEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "CohesiveFrictionalContactLaw" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.CohesiveFrictionalContactLaw"];
        "CohesiveFrictionalContactLaw" -> "GlobalEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "PeriodicEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),filled,dashed",fillcolor=grey,height=0.2,URL="yade.wrapper.html#inheritancegraphperiodicengine"];
        "PeriodicEngine" -> "GlobalEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "TesselationWrapper" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.TesselationWrapper"];
        "TesselationWrapper" -> "GlobalEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Collider" [shape="box",fontsize=8,style="setlinewidth(0.5),filled,dashed",fillcolor=grey,height=0.2,URL="yade.wrapper.html#inheritancegraphcollider"];
        "Collider" -> "GlobalEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "SpheresFactory" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.SpheresFactory"];
        "SpheresFactory" -> "GlobalEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
}

Inheritance graph of GlobalEngine, gray dashed classes are discussed in their own sections: FieldApplier, BoundaryController, PeriodicEngine, Collider.

class yade.wrapper.GlobalEngine(inherits Engine Serializable)

Engine that will generally affect the whole simulation (contrary to PartialEngine).

class yade.wrapper.BoxFactory(inherits SpheresFactory GlobalEngine Engine Serializable)

Box geometry of the SpheresFactory region, given by extents and center

class yade.wrapper.CircularFactory(inherits SpheresFactory GlobalEngine Engine Serializable)

Circular geometry of the SpheresFactory region. It can be disk (given by radius and center), or cylinder (given by radius, length and center).

class yade.wrapper.CohesiveFrictionalContactLaw(inherits GlobalEngine Engine Serializable)

[DEPRECATED] Loop over interactions applying Law2_ScGeom6D_CohFrictPhys_CohesionMoment on all interactions.

Note

Use InteractionLoop and Law2_ScGeom6D_CohFrictPhys_CohesionMoment instead of this class for performance reasons.

class yade.wrapper.ElasticContactLaw(inherits GlobalEngine Engine Serializable)

[DEPRECATED] Loop over interactions applying Law2_ScGeom_FrictPhys_CundallStrack on all interactions.

Note

Use InteractionLoop and Law2_ScGeom_FrictPhys_CundallStrack instead of this class for performance reasons.

class yade.wrapper.FEInternalForceEngine(inherits GlobalEngine Engine Serializable)

Unified dispatcher for handling Finite Element internal force loop at every step, for parallel performance reasons.

Special constructor

Constructs from 3 lists of Ig2, Ip2, Law functors respectively; they will be passed to interal dispatchers, which you might retrieve.

class yade.wrapper.FacetTopologyAnalyzer(inherits GlobalEngine Engine Serializable)

Initializer for filling adjacency geometry data for facets.

Common vertices and common edges are identified and mutual angle between facet faces is written to Facet instances. If facets don’t move with respect to each other, this must be done only at the beginng.

class yade.wrapper.FoamCoupling(inherits GlobalEngine Engine Serializable)
An engine for coupling Yade with the finite volume fluid solver OpenFOAM in parallel.

Requirements : Yade compiled with MPI libs, OpenFOAM-6 (openfoam is not required for compilation).Yade is executed under MPI environment with OpenFOAM simultaneously, and using MPI communication routines data is exchanged between the solvers.

  1. Yade broadcasts the particle data -> position, velocity, ang-velocity, radius to all the foam processes as in castParticle

  1. In each foam process, particle is searched.Yade keeps a vector(cpp) of the rank of the openfoam process containing that particular particle (FoamCoupling::procList), using updateProcList

3. In simple lagrangian point force coupling Yade recieves the particle hydrodynamic force and torque from the openfoam process, the sender is identified from the vector FoamCoupling::procList. In the case of Gaussian interpolation, contribution from every process is summed using function sumHydroForce . 4. The interval (substepping) is set automatically (FoamCoupling::dataExchangeInterval) based on dtfoam/dtYade, calculated in function exchangeDeltaT

class yade.wrapper.ForceResetter(inherits GlobalEngine Engine Serializable)

Reset all forces stored in Scene::forces (O.forces in python). Typically, this is the first engine to be run at every step. In addition, reset those energies that should be reset, if energy tracing is enabled.

class yade.wrapper.GlobalStiffnessTimeStepper(inherits TimeStepper GlobalEngine Engine Serializable)

An engine assigning the time-step as a fraction of the minimum eigen-period in the problem. The derivation is detailed in the chapter on DEM formulation. The viscEl option enables to evaluate the timestep in a similar way for the visco-elastic contact law Law2_ScGeom_ViscElPhys_Basic, more detail in GlobalStiffnessTimestepper::viscEl.

class yade.wrapper.HydrodynamicsLawLBM(inherits GlobalEngine Engine Serializable)

Engine to simulate fluid flow (with the lattice Boltzmann method) with a coupling with the discrete element method. If you use this Engine, please cite and refer to F. Lominé et al. International Journal For Numerical and Analytical Method in Geomechanics, 2012, doi: 10.1002/nag.1109

class yade.wrapper.Integrator(inherits TimeStepper GlobalEngine Engine Serializable)

Integration Engine Interface.

class yade.wrapper.InteractionLoop(inherits GlobalEngine Engine Serializable)

Unified dispatcher for handling interaction loop at every step, for parallel performance reasons.

Special constructor

Constructs from 3 lists of Ig2, Ip2, Law2 functors respectively; they will be passed to internal dispatchers, which you might retrieve as geomDispatcher, physDispatcher, lawDispatcher respectively.

class yade.wrapper.Law2_ScGeom_CapillaryPhys_Capillarity(inherits GlobalEngine Engine Serializable)

This law allows one to take into account capillary forces/effects between spheres coming from the presence of interparticular liquid bridges (menisci).

The control parameter is the capillary pressure (or suction) Uc = Ugas - Uliquid. Liquid bridges properties (volume V, extent over interacting grains delta1 and delta2) are computed as a result of the defined capillary pressure and of the interacting geometry (spheres radii and interparticular distance).

References: in english [Scholtes2009b]; more detailed, but in french [Scholtes2009d].

The law needs ascii files M(r=i) with i=R1/R2 to work (see https://yade-dem.org/wiki/CapillaryTriaxialTest). These ASCII files contain a set of results from the resolution of the Laplace-Young equation for different configurations of the interacting geometry, assuming a null wetting angle.

In order to allow capillary forces between distant spheres, it is necessary to enlarge the bounding boxes using Bo1_Sphere_Aabb::aabbEnlargeFactor and make the Ig2 define define distant interactions via interactionDetectionFactor. It is also necessary to disable interactions removal by the constitutive law (Law2). The only combinations of laws supported are currently capillary law + Law2_ScGeom_FrictPhys_CundallStrack and capillary law + Law2_ScGeom_MindlinPhys_Mindlin (and the other variants of Hertz-Mindlin).

See CapillaryPhys-example.py for an example script.

class yade.wrapper.MicroMacroAnalyser(inherits GlobalEngine Engine Serializable)

compute fabric tensor, local porosity, local deformation, and other micromechanicaly defined quantities based on triangulation/tesselation of the packing.

class yade.wrapper.NewtonIntegrator(inherits GlobalEngine Engine Serializable)

Engine integrating newtonian motion equations.

class yade.wrapper.RungeKuttaCashKarp54Integrator(inherits Integrator TimeStepper GlobalEngine Engine Serializable)

RungeKuttaCashKarp54Integrator engine.

class yade.wrapper.SpheresFactory(inherits GlobalEngine Engine Serializable)

Engine for spitting spheres based on mass flow rate, particle size distribution etc. Initial velocity of particles is given by vMin, vMax, the massFlowRate determines how many particles to generate at each step. When goalMass is attained or positive maxParticles is reached, the engine does not produce particles anymore. Geometry of the region should be defined in a derived engine by overridden SpheresFactory::pickRandomPosition().

A sample script for this engine is in scripts/spheresFactory.py.

class yade.wrapper.TesselationWrapper(inherits GlobalEngine Engine Serializable)

Handle the triangulation of spheres in a scene, build tesselation on request, and give access to computed quantities (see also the dedicated section in user manual). The calculation of microstrain is explained in [Catalano2014a]

See example usage in script example/tesselationWrapper/tesselationWrapper.py.

Below is an output of the defToVtk function visualized with paraview (in this case Yade’s TesselationWrapper was used to process experimental data obtained on sand by Edward Ando at Grenoble University, 3SR lab.)

_images/localstrain.png
class yade.wrapper.TetraVolumetricLaw(inherits GlobalEngine Engine Serializable)

Calculate physical response of 2 tetrahedra in interaction, based on penetration configuration given by TTetraGeom.

class yade.wrapper.TimeStepper(inherits GlobalEngine Engine Serializable)

Engine defining time-step (fundamental class)

PeriodicEngine

digraph PeriodicEngine {
        rankdir=RL;
        margin="0.2,0.05";
        "PeriodicEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.PeriodicEngine"];
        "ResetRandomPosition" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.ResetRandomPosition"];
        "ResetRandomPosition" -> "PeriodicEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "SplitPolyTauMax" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.SplitPolyTauMax"];
        "SplitPolyTauMax" -> "PolyhedraSplitter" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "VTKRecorder" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.VTKRecorder"];
        "VTKRecorder" -> "PeriodicEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "PDFEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.PDFEngine"];
        "PDFEngine" -> "PeriodicEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "SplitPolyMohrCoulomb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.SplitPolyMohrCoulomb"];
        "SplitPolyMohrCoulomb" -> "PolyhedraSplitter" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "DomainLimiter" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.DomainLimiter"];
        "DomainLimiter" -> "PeriodicEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Recorder" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Recorder"];
        "Recorder" -> "PeriodicEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "ForceRecorder" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.ForceRecorder"];
        "ForceRecorder" -> "Recorder" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "LubricationPDFEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.LubricationPDFEngine"];
        "LubricationPDFEngine" -> "PDFEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "MeasureCapStress" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.MeasureCapStress"];
        "MeasureCapStress" -> "PeriodicEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "PotentialParticleVTKRecorder" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.PotentialParticleVTKRecorder"];
        "PotentialParticleVTKRecorder" -> "PeriodicEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "TriaxialStateRecorder" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.TriaxialStateRecorder"];
        "TriaxialStateRecorder" -> "Recorder" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "CpmStateUpdater" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.CpmStateUpdater"];
        "CpmStateUpdater" -> "PeriodicEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "PyRunner" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.PyRunner"];
        "PyRunner" -> "PeriodicEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "TorqueRecorder" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.TorqueRecorder"];
        "TorqueRecorder" -> "Recorder" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "CapillaryStressRecorder" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.CapillaryStressRecorder"];
        "CapillaryStressRecorder" -> "Recorder" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "SnapshotEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.SnapshotEngine"];
        "SnapshotEngine" -> "PeriodicEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "PolyhedraSplitter" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.PolyhedraSplitter"];
        "PolyhedraSplitter" -> "PeriodicEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
}

Inheritance graph of PeriodicEngine.

class yade.wrapper.PeriodicEngine(inherits GlobalEngine Engine Serializable)

Run Engine::action with given fixed periodicity real time (=wall clock time, computation time), virtual time (simulation time), iteration number), by setting any of those criteria (virtPeriod, realPeriod, iterPeriod) to a positive value. They are all negative (inactive) by default.

The number of times this engine is activated can be limited by setting nDo>0. If the number of activations will have been already reached, no action will be called even if an active period has elapsed.

If initRun is set (false by default), the engine will run when called for the first time; otherwise it will only start counting period (realLast, etc, interval variables) from that point, but without actually running, and will run only once a period has elapsed since the initial run.

This class should not be used directly; rather, derive your own engine which you want to be run periodically.

Derived engines should override Engine::action(), which will be called periodically. If the derived Engine overrides also Engine::isActivated, it should also take in account return value from PeriodicEngine::isActivated, since otherwise the periodicity will not be functional.

Example with PyRunner, which derives from PeriodicEngine; likely to be encountered in python scripts:

PyRunner(realPeriod=5,iterPeriod=10000,command='print O.iter')  

will print iteration number every 10000 iterations or every 5 seconds of wall clock time, whichever comes first since it was last run.

class yade.wrapper.CapillaryStressRecorder(inherits Recorder PeriodicEngine GlobalEngine Engine Serializable)

Records information from capillary meniscii on samples submitted to triaxial compressions. Classical sign convention (tension positiv) is used for capillary stresses. -> New formalism needs to be tested!!!

class yade.wrapper.CpmStateUpdater(inherits PeriodicEngine GlobalEngine Engine Serializable)

Update CpmState of bodies based on state variables in CpmPhys of interactions with this bod. In particular, bodies’ colors and CpmState::normDmg depending on average damage of their interactions and number of interactions that were already fully broken and have disappeared is updated. This engine contains its own loop (2 loops, more precisely) over all bodies and should be run periodically to update colors during the simulation, if desired.

class yade.wrapper.DomainLimiter(inherits PeriodicEngine GlobalEngine Engine Serializable)

Delete particles that are out of axis-aligned box given by lo and hi.

class yade.wrapper.ForceRecorder(inherits Recorder PeriodicEngine GlobalEngine Engine Serializable)

Engine saves the resultant force affecting to bodies, listed in ids. For instance, can be useful for defining the forces, which affects to _buldozer_ during its work.

class yade.wrapper.LubricationPDFEngine(inherits PDFEngine PeriodicEngine GlobalEngine Engine Serializable)

Implementation of PDFEngine for Lubrication law

class yade.wrapper.MeasureCapStress(inherits PeriodicEngine GlobalEngine Engine Serializable)

Post-processing engine giving the capillary stress tensor (the fluids mixture contribution to the total stress in unsaturated, i.e. triphasic, conditions) according to the \(\mu\)UNSAT expression detailled in [Duriez2017c]. Although this expression differs in nature from the one of utils.getCapillaryStress (consideration of distributed integrals herein, vs resultant capillary force therein), both are equivalent [Duriez2016b], [Duriez2017], [Duriez2017c]. The REV volume \(V\) entering the expression is automatically measured, from the Cell for periodic conditions, or from utils.aabbExtrema function otherwise.

class yade.wrapper.PDFEngine(inherits PeriodicEngine GlobalEngine Engine Serializable)

Base class for spectrums calculations. Compute Probability Density Functions of normalStress, shearStress, distance, velocity and interactions in spherical coordinates and write result to a file. Column name format is: Data(theta, phi). Convention used: x: phi = 0, y: theta = 0, z: phi = pi/2

class yade.wrapper.PolyhedraSplitter(inherits PeriodicEngine GlobalEngine Engine Serializable)

Engine that splits polyhedras.

Warning

PolyhedraSplitter returns different results depending on CGAL version! For details see https://gitlab.com/yade-dev/trunk/issues/45

class yade.wrapper.PotentialParticleVTKRecorder(inherits PeriodicEngine GlobalEngine Engine Serializable)

Engine recording potential blocks as surfaces into files with given periodicity.

class yade.wrapper.PyRunner(inherits PeriodicEngine GlobalEngine Engine Serializable)

Execute a python command periodically, with defined (and adjustable) periodicity. See PeriodicEngine documentation for details.

class yade.wrapper.Recorder(inherits PeriodicEngine GlobalEngine Engine Serializable)

Engine periodically storing some data to (one) external file. In addition PeriodicEngine, it handles opening the file as needed. See PeriodicEngine for controlling periodicity.

class yade.wrapper.ResetRandomPosition(inherits PeriodicEngine GlobalEngine Engine Serializable)

Creates spheres during simulation, placing them at random positions. Every time called, one new sphere will be created and inserted in the simulation.

class yade.wrapper.SnapshotEngine(inherits PeriodicEngine GlobalEngine Engine Serializable)

Periodically save snapshots of GLView(s) as .png files. Files are named fileBase + counter + ‘.png’ (counter is left-padded by 0s, i.e. snap00004.png).

class yade.wrapper.SplitPolyMohrCoulomb(inherits PolyhedraSplitter PeriodicEngine GlobalEngine Engine Serializable)

Split polyhedra according to Mohr-Coulomb criterion.

class yade.wrapper.SplitPolyTauMax(inherits PolyhedraSplitter PeriodicEngine GlobalEngine Engine Serializable)

Split polyhedra along TauMax.

class yade.wrapper.TorqueRecorder(inherits Recorder PeriodicEngine GlobalEngine Engine Serializable)

Engine saves the total torque according to the given axis and ZeroPoint, the force is taken from bodies, listed in ids For instance, can be useful for defining the torque, which affects on ball mill during its work.

class yade.wrapper.TriaxialStateRecorder(inherits Recorder PeriodicEngine GlobalEngine Engine Serializable)

Engine recording triaxial variables (see the variables list in the first line of the output file). This recorder needs TriaxialCompressionEngine or ThreeDTriaxialEngine present in the simulation).

class yade.wrapper.VTKRecorder(inherits PeriodicEngine GlobalEngine Engine Serializable)

Engine recording snapshots of simulation into series of *.vtu files, readable by VTK-based postprocessing programs such as Paraview. Both bodies (depending on their shapes) and interactions can be recorded, with various vector/scalar quantities that are defined on them.

PeriodicEngine.initRun is initialized to True automatically.

BoundaryController

digraph BoundaryController {
        rankdir=RL;
        margin="0.2,0.05";
        "BoundaryController" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.BoundaryController"];
        "TriaxialCompressionEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.TriaxialCompressionEngine"];
        "TriaxialCompressionEngine" -> "TriaxialStressController" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Peri3dController" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Peri3dController"];
        "Peri3dController" -> "BoundaryController" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "KinemSimpleShearBox" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.KinemSimpleShearBox"];
        "KinemSimpleShearBox" -> "BoundaryController" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "KinemCTDEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.KinemCTDEngine"];
        "KinemCTDEngine" -> "KinemSimpleShearBox" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "ThreeDTriaxialEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.ThreeDTriaxialEngine"];
        "ThreeDTriaxialEngine" -> "TriaxialStressController" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "TriaxialStressController" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.TriaxialStressController"];
        "TriaxialStressController" -> "BoundaryController" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "UniaxialStrainer" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.UniaxialStrainer"];
        "UniaxialStrainer" -> "BoundaryController" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "PeriTriaxController" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.PeriTriaxController"];
        "PeriTriaxController" -> "BoundaryController" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "KinemCNSEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.KinemCNSEngine"];
        "KinemCNSEngine" -> "KinemSimpleShearBox" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "KinemCNLEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.KinemCNLEngine"];
        "KinemCNLEngine" -> "KinemSimpleShearBox" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Disp2DPropLoadEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Disp2DPropLoadEngine"];
        "Disp2DPropLoadEngine" -> "BoundaryController" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "KinemCNDEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.KinemCNDEngine"];
        "KinemCNDEngine" -> "KinemSimpleShearBox" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "PeriIsoCompressor" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.PeriIsoCompressor"];
        "PeriIsoCompressor" -> "BoundaryController" [arrowsize=0.5,style="setlinewidth(0.5)"];
}

Inheritance graph of BoundaryController.

class yade.wrapper.BoundaryController(inherits GlobalEngine Engine Serializable)

Base for engines controlling boundary conditions of simulations. Not to be used directly.

class yade.wrapper.Disp2DPropLoadEngine(inherits BoundaryController GlobalEngine Engine Serializable)

Disturbs a simple shear sample in a given displacement direction

This engine allows one to apply, on a simple shear sample, a loading controlled by du/dgamma = cste, which is equivalent to du + cste’ * dgamma = 0 (proportionnal path loadings). To do so, the upper plate of the simple shear box is moved in a given direction (corresponding to a given du/dgamma), whereas lateral plates are moved so that the box remains closed. This engine can easily be used to perform directionnal probes, with a python script launching successivly the same .xml which contains this engine, after having modified the direction of loading (see theta attribute). That’s why this Engine contains a saveData procedure which can save data on the state of the sample at the end of the loading (in case of successive loadings - for successive directions - through a python script, each line would correspond to one direction of loading).

class yade.wrapper.KinemCNDEngine(inherits KinemSimpleShearBox BoundaryController GlobalEngine Engine Serializable)

To apply a Constant Normal Displacement (CND) shear for a parallelogram box

This engine, designed for simulations implying a simple shear box (SimpleShear Preprocessor or scripts/simpleShear.py), allows one to perform a constant normal displacement shear, by translating horizontally the upper plate, while the lateral ones rotate so that they always keep contact with the lower and upper walls.

class yade.wrapper.KinemCNLEngine(inherits KinemSimpleShearBox BoundaryController GlobalEngine Engine Serializable)

To apply a constant normal stress shear (i.e. Constant Normal Load : CNL) for a parallelogram box (simple shear box : SimpleShear Preprocessor or scripts/simpleShear.py)

This engine allows one to translate horizontally the upper plate while the lateral ones rotate so that they always keep contact with the lower and upper walls.

In fact the upper plate can move not only horizontally but also vertically, so that the normal stress acting on it remains constant (this constant value is not chosen by the user but is the one that exists at the beginning of the simulation)

The right vertical displacements which will be allowed are computed from the rigidity Kn of the sample over the wall (so to cancel a deltaSigma, a normal dplt deltaSigma*S/(Kn) is set)

The movement is moreover controlled by the user via a shearSpeed which will be the speed of the upper wall, and by a maximum value of horizontal displacement gammalim, after which the shear stops.

Note

Not only the positions of walls are updated but also their speeds, which is all but useless considering the fact that in the contact laws these velocities of bodies are used to compute values of tangential relative displacements.

Warning

Because of this last point, if you want to use later saves of simulations executed with this Engine, but without that stopMovement was executed, your boxes will keep their speeds => you will have to cancel them ‘by hand’ in the .xml.

class yade.wrapper.KinemCNSEngine(inherits KinemSimpleShearBox BoundaryController GlobalEngine Engine Serializable)

To apply a Constant Normal Stifness (CNS) shear for a parallelogram box (simple shear)

This engine, useable in simulations implying one deformable parallelepipedic box, allows one to translate horizontally the upper plate while the lateral ones rotate so that they always keep contact with the lower and upper walls. The upper plate can move not only horizontally but also vertically, so that the normal rigidity defined by DeltaF(upper plate)/DeltaU(upper plate) = constant (= KnC defined by the user).

The movement is moreover controlled by the user via a shearSpeed which is the horizontal speed of the upper wall, and by a maximum value of horizontal displacement gammalim (of the upper plate), after which the shear stops.

Note

not only the positions of walls are updated but also their speeds, which is all but useless considering the fact that in the contact laws these velocities of bodies are used to compute values of tangential relative displacements.

Warning

But, because of this last point, if you want to use later saves of simulations executed with this Engine, but without that stopMovement was executed, your boxes will keep their speeds => you will have to cancel them by hand in the .xml

class yade.wrapper.KinemCTDEngine(inherits KinemSimpleShearBox BoundaryController GlobalEngine Engine Serializable)

To compress a simple shear sample by moving the upper box in a vertical way only, so that the tangential displacement (defined by the horizontal gap between the upper and lower boxes) remains constant (thus, the CTD = Constant Tangential Displacement). The lateral boxes move also to keep always contact. All that until this box is submitted to a given stress (targetSigma). Moreover saves are executed at each value of stresses stored in the vector sigma_save, and at targetSigma

class yade.wrapper.KinemSimpleShearBox(inherits BoundaryController GlobalEngine Engine Serializable)

This class is supposed to be a mother class for all Engines performing loadings on the simple shear box of SimpleShear. It is not intended to be used by itself, but its declaration and implentation will thus contain all what is useful for all these Engines. The script simpleShear.py illustrates the use of the various corresponding Engines.

class yade.wrapper.Peri3dController(inherits BoundaryController GlobalEngine Engine Serializable)

Class for controlling independently all 6 components of “engineering” stress and strain of periodic Cell. goal are the goal values, while stressMask determines which components prescribe stress and which prescribe strain.

If the strain is prescribed, appropriate strain rate is directly applied. If the stress is prescribed, the strain predictor is used: from stress values in two previous steps the value of strain rate is prescribed so as the value of stress in the next step is as close as possible to the ideal one. Current algorithm is extremly simple and probably will be changed in future, but is roboust enough and mostly works fine.

Stress error (difference between actual and ideal stress) is evaluated in current and previous steps (\(\mathrm{d}\sigma_i,\mathrm{d}\sigma_{i-1}\)). Linear extrapolation is used to estimate error in the next step

\[\mathrm{d}\sigma_{i+1}=2\mathrm{d}\sigma_i - \mathrm{d}\sigma_{i-1}\]

According to this error, the strain rate is modified by mod parameter

\[\begin{split}\mathrm{d}\sigma_{i+1}\left\{\begin{array}{c} >0 \rightarrow \dot{\varepsilon}_{i+1} = \dot{\varepsilon}_i - \max(\mathrm{abs}(\dot{\boldsymbol{\varepsilon}}_i))\cdot\mathrm{mod} \\ <0 \rightarrow \dot{\varepsilon}_{i+1} = \dot{\varepsilon}_i + \max(\mathrm{abs}(\dot{\boldsymbol{\varepsilon}}_i))\cdot\mathrm{mod} \end{array}\right.\end{split}\]

According to this fact, the prescribed stress will (almost) never have exact prescribed value, but the difference would be very small (and decreasing for increasing nSteps. This approach works good if one of the dominant strain rates is prescribed. If all stresses are prescribed or if all goal strains is prescribed as zero, a good estimation is needed for the first step, therefore the compliance matrix is estimated (from user defined estimations of macroscopic material parameters youngEstimation and poissonEstimation) and respective strain rates is computed form prescribed stress rates and compliance matrix (the estimation of compliance matrix could be computed autamatically avoiding user inputs of this kind).

The simulation on rotated periodic cell is also supported. Firstly, the polar decomposition is performed on cell’s transformation matrix trsf \(\mathcal{T}=\mat{U}\mat{P}\), where \(\mat{U}\) is orthogonal (unitary) matrix representing rotation and \(\mat{P}\) is a positive semi-definite Hermitian matrix representing strain. A logarithm of \(\mat{P}\) should be used to obtain realistic values at higher strain values (not implemented yet). A prescribed strain increment in global coordinates \(\mathrm{d}t\cdot\dot{\boldsymbol{\varepsilon}}\) is properly rotated to cell’s local coordinates and added to \(\mat{P}\)

\[\mat{P}_{i+1}=\mat{P}+\mat{U}^{\mathsf{T}}\mathrm{d}t\cdot\dot{\boldsymbol{\varepsilon}}\mat{U}\]

The new value of trsf is computed at \(\mat{T}_{i+1}=\mat{UP}_{i+1}\). From current and next trsf the cell’s velocity gradient velGrad is computed (according to its definition) as

\[\mat{V} = (\mat{T}_{i+1}\mat{T}^{-1}-\mat{I})/\mathrm{d}t\]

Current implementation allow user to define independent loading “path” for each prescribed component. i.e. define the prescribed value as a function of time (or progress or steps). See Paths.

Examples examples/test/peri3dController_example1.py and examples/test/peri3dController_triaxialCompression.py explain usage and inputs of Peri3dController, examples/test/peri3dController_shear.py is an example of using shear components and also simulation on rotated cell.

class yade.wrapper.PeriIsoCompressor(inherits BoundaryController GlobalEngine Engine Serializable)

Compress/decompress cloud of spheres by controlling periodic cell size until it reaches prescribed average stress, then moving to next stress value in given stress series.

class yade.wrapper.PeriTriaxController(inherits BoundaryController GlobalEngine Engine Serializable)

Engine for independently controlling stress or strain in periodic simulations.

PeriTriaxController.goal contains absolute values for the controlled quantity, and PeriTriaxController.stressMask determines meaning of those values (0 for strain, 1 for stress): e.g. ( 1<<0 | 1<<2 ) = 1 | 4 = 5 means that goal[0] and goal[2] are stress values, and goal[1] is strain.

See scripts/test/periodic-triax.py for a simple example.

class yade.wrapper.ThreeDTriaxialEngine(inherits TriaxialStressController BoundaryController GlobalEngine Engine Serializable)

The engine perform a triaxial compression with a control in direction ‘i’ in stress (if stressControl_i) else in strain.

For a stress control the imposed stress is specified by ‘sigma_i’ with a ‘max_veli’ depending on ‘strainRatei’. To obtain the same strain rate in stress control than in strain control you need to set ‘wallDamping = 0.8’. For a strain control the imposed strain is specified by ‘strainRatei’. With this engine you can also perform internal compaction by growing the size of particles by using TriaxialStressController::controlInternalStress. For that, just switch on ‘internalCompaction=1’ and fix sigma_iso=value of mean pressure that you want at the end of the internal compaction.

Warning

This engine is deprecated, please switch to TriaxialStressController if you expect long term support.

class yade.wrapper.TriaxialCompressionEngine(inherits TriaxialStressController BoundaryController GlobalEngine Engine Serializable)

The engine is a state machine with the following states; transitions my be automatic, see below.

  1. STATE_ISO_COMPACTION: isotropic compaction (compression) until the prescribed mean pressue sigmaIsoCompaction is reached and the packing is stable. The compaction happens either by straining the walls (!internalCompaction) or by growing size of grains (internalCompaction).

  2. STATE_ISO_UNLOADING: isotropic unloading from the previously reached state, until the mean pressure sigmaLateralConfinement is reached (and stabilizes).

    Note

    this state will be skipped if sigmaLateralConfinement == sigmaIsoCompaction.

  3. STATE_TRIAX_LOADING: confined uniaxial compression: constant sigmaLateralConfinement is kept at lateral walls (left, right, front, back), while top and bottom walls load the packing in their axis (by straining), until the value of epsilonMax (deformation along the loading axis) is reached. At this point, the simulation is stopped.

  4. STATE_FIXED_POROSITY_COMPACTION: isotropic compaction (compression) until a chosen porosity value (parameter:fixedPorosity). The six walls move with a chosen translation speed (parameter StrainRate).

  5. STATE_TRIAX_LIMBO: currently unused, since simulation is hard-stopped in the previous state.

Transition from COMPACTION to UNLOADING is done automatically if autoUnload==true;

Transition from (UNLOADING to LOADING) or from (COMPACTION to LOADING: if UNLOADING is skipped) is done automatically if autoCompressionActivation=true; Both autoUnload and autoCompressionActivation are true by default.

Note

Most of the algorithms used have been developed initialy for simulations reported in [Chareyre2002a] and [Chareyre2005]. They have been ported to Yade in a second step and used in e.g. [Kozicki2008],[Scholtes2009b]_,[Jerier2010b].

Warning

This engine is deprecated, please switch to TriaxialStressController if you expect long term support.

class yade.wrapper.TriaxialStressController(inherits BoundaryController GlobalEngine Engine Serializable)

An engine maintaining constant stresses or constant strain rates on some boundaries of a parallepipedic packing. The stress/strain control is defined for each axis using TriaxialStressController::stressMask (a bitMask) and target values are defined by goal1,goal2, and goal3. The sign conventions of continuum mechanics are used for strains and stresses (positive traction).

Note

The algorithms used have been developed initialy for simulations reported in [Chareyre2002a] and [Chareyre2005]. They have been ported to Yade in a second step and used in e.g. [Kozicki2008],[Scholtes2009b]_,[Jerier2010b].

class yade.wrapper.UniaxialStrainer(inherits BoundaryController GlobalEngine Engine Serializable)

Axial displacing two groups of bodies in the opposite direction with given strain rate.

Collider

digraph Collider {
        rankdir=RL;
        margin="0.2,0.05";
        "Collider" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Collider"];
        "FlatGridCollider" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.FlatGridCollider"];
        "FlatGridCollider" -> "Collider" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "SpatialQuickSortCollider" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.SpatialQuickSortCollider"];
        "SpatialQuickSortCollider" -> "Collider" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "GeneralIntegratorInsertionSortCollider" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.GeneralIntegratorInsertionSortCollider"];
        "GeneralIntegratorInsertionSortCollider" -> "InsertionSortCollider" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "InsertionSortCollider" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.InsertionSortCollider"];
        "InsertionSortCollider" -> "Collider" [arrowsize=0.5,style="setlinewidth(0.5)"];
}

Inheritance graph of Collider.

class yade.wrapper.Collider(inherits GlobalEngine Engine Serializable)

Abstract class for finding spatial collisions between bodies.

Special constructor

Derived colliders (unless they override pyHandleCustomCtorArgs) can be given list of BoundFunctors which is used to initialize the internal boundDispatcher instance.

class yade.wrapper.FlatGridCollider(inherits Collider GlobalEngine Engine Serializable)

Non-optimized grid collider, storing grid as dense flat array. Each body is assigned to (possibly multiple) cells, which are arranged in regular grid between aabbMin and aabbMax, with cell size step (same in all directions). Bodies outsize (aabbMin, aabbMax) are handled gracefully, assigned to closest cells (this will create spurious potential interactions). verletDist determines how much is each body enlarged to avoid collision detection at every step.

Note

This collider keeps all cells in linear memory array, therefore will be memory-inefficient for sparse simulations.

Warning

objects Body::bound are not used, BoundFunctors are not used either: assigning cells to bodies is hard-coded internally. Currently handles Shapes are: Sphere.

Note

Periodic boundary is not handled (yet).

class yade.wrapper.GeneralIntegratorInsertionSortCollider(inherits InsertionSortCollider Collider GlobalEngine Engine Serializable)

This class is the adaptive version of the InsertionSortCollider and changes the NewtonIntegrator dependency of the collider algorithms to the Integrator interface which is more general.

class yade.wrapper.InsertionSortCollider(inherits Collider GlobalEngine Engine Serializable)

Collider with O(n log(n)) complexity, using Aabb for bounds.

At the initial step, Bodies’ bounds (along sortAxis) are first std::sort’ed along this (sortAxis) axis, then collided. The initial sort has \(O(n^2)\) complexity, see Colliders’ performance for some information (There are scripts in examples/collider-perf for measurements).

Insertion sort is used for sorting the bound list that is already pre-sorted from last iteration, where each inversion calls checkOverlap which then handles either overlap (by creating interaction if necessary) or its absence (by deleting interaction if it is only potential).

Bodies without bounding volume (such as clumps) are handled gracefully and never collide. Deleted bodies are handled gracefully as well.

This collider handles periodic boundary conditions. There are some limitations, notably:

  1. No body can have Aabb larger than cell’s half size in that respective dimension. You get exception if it does and gets in interaction. One way to explicitly by-pass this restriction is offered by allowBiggerThanPeriod, which can be turned on to insert a floor in the form of a very large box for instance (see examples/periodicSandPile.py).

  2. No body can travel more than cell’s distance in one step; this would mean that the simulation is numerically exploding, and it is only detected in some cases.

Stride can be used to avoid running collider at every step by enlarging the particle’s bounds, tracking their displacements and only re-run if they might have gone out of that bounds (see Verlet list for brief description and background) . This requires cooperation from NewtonIntegrator as well as BoundDispatcher, which will be found among engines automatically (exception is thrown if they are not found).

If you wish to use strides, set verletDist (length by which bounds will be enlarged in all directions) to some value, e.g. 0.05 × typical particle radius. This parameter expresses the tradeoff between many potential interactions (running collider rarely, but with longer exact interaction resolution phase) and few potential interactions (running collider more frequently, but with less exact resolutions of interactions); it depends mainly on packing density and particle radius distribution.

If targetInterv is >1, not all particles will have their bound enlarged by verletDist; instead, they will have bounds increased by a length in order to trigger a new colliding after targetInterv iteration, assuming they move at almost constant velocity. Ideally in this method, all particles would reach their bounds at the sime iteration. This is of course not the case as soon as velocities fluctuate in time. Bound::sweepLength is tuned on the basis of the displacement recorded between the last two runs of the collider. In this situation, verletDist defines the maximum sweep length.

class yade.wrapper.SpatialQuickSortCollider(inherits Collider GlobalEngine Engine Serializable)

Collider using quicksort along axes at each step, using Aabb bounds.

Its performance is lower than that of InsertionSortCollider (see Colliders’ performance), but the algorithm is simple enought to make it good for checking other collider’s correctness.

FieldApplier

digraph FieldApplier {
        rankdir=RL;
        margin="0.2,0.05";
        "FieldApplier" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.FieldApplier"];
        "HdapsGravityEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.HdapsGravityEngine"];
        "HdapsGravityEngine" -> "GravityEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "GravityEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.GravityEngine"];
        "GravityEngine" -> "FieldApplier" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "AxialGravityEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.AxialGravityEngine"];
        "AxialGravityEngine" -> "FieldApplier" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "CentralConstantAccelerationEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.CentralConstantAccelerationEngine"];
        "CentralConstantAccelerationEngine" -> "FieldApplier" [arrowsize=0.5,style="setlinewidth(0.5)"];
}

Inheritance graph of FieldApplier.

class yade.wrapper.FieldApplier(inherits GlobalEngine Engine Serializable)

Base for engines applying force files on particles. Not to be used directly.

class yade.wrapper.AxialGravityEngine(inherits FieldApplier GlobalEngine Engine Serializable)

Apply acceleration (independent of distance) directed towards an axis.

class yade.wrapper.CentralConstantAccelerationEngine(inherits FieldApplier GlobalEngine Engine Serializable)

Engine applying constant acceleration to all bodies, towards a central body. Ignoring the distance between them.

class yade.wrapper.GravityEngine(inherits FieldApplier GlobalEngine Engine Serializable)

Engine applying constant acceleration to all bodies. DEPRECATED, use Newton::gravity unless you need energy tracking or selective gravity application using groupMask).

class yade.wrapper.HdapsGravityEngine(inherits GravityEngine FieldApplier GlobalEngine Engine Serializable)

Read accelerometer in Thinkpad laptops (HDAPS and accordingly set gravity within the simulation. This code draws from hdaps-gl . See scripts/test/hdaps.py for an example.

Partial engines

digraph PartialEngine {
        rankdir=RL;
        margin="0.2,0.05";
        "PartialEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.PartialEngine"];
        "InterpolatingHelixEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.InterpolatingHelixEngine"];
        "InterpolatingHelixEngine" -> "HelixEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "ForceEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.ForceEngine"];
        "ForceEngine" -> "PartialEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "PeriodicFlowEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.PeriodicFlowEngine"];
        "PeriodicFlowEngine" -> "FlowEngine_PeriodicInfo" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "StepDisplacer" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.StepDisplacer"];
        "StepDisplacer" -> "PartialEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "ThermalEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.ThermalEngine"];
        "ThermalEngine" -> "PartialEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "InterpolatingDirectedForceEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.InterpolatingDirectedForceEngine"];
        "InterpolatingDirectedForceEngine" -> "ForceEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "LinearDragEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.LinearDragEngine"];
        "LinearDragEngine" -> "PartialEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "HarmonicForceEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.HarmonicForceEngine"];
        "HarmonicForceEngine" -> "PartialEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "HarmonicMotionEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.HarmonicMotionEngine"];
        "HarmonicMotionEngine" -> "KinematicEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "PartialSatClayEngineT" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.PartialSatClayEngineT"];
        "PartialSatClayEngineT" -> "PartialEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "BicyclePedalEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.BicyclePedalEngine"];
        "BicyclePedalEngine" -> "KinematicEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "TwoPhaseFlowEngineT" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.TwoPhaseFlowEngineT"];
        "TwoPhaseFlowEngineT" -> "PartialEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "TranslationEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.TranslationEngine"];
        "TranslationEngine" -> "KinematicEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "ServoPIDController" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.ServoPIDController"];
        "ServoPIDController" -> "TranslationEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "HelixEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.HelixEngine"];
        "HelixEngine" -> "RotationEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "RadialForceEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.RadialForceEngine"];
        "RadialForceEngine" -> "PartialEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "HydroForceEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.HydroForceEngine"];
        "HydroForceEngine" -> "PartialEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "CombinedKinematicEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.CombinedKinematicEngine"];
        "CombinedKinematicEngine" -> "PartialEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "FlowEngine_PeriodicInfo" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.FlowEngine_PeriodicInfo"];
        "FlowEngine_PeriodicInfo" -> "PartialEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "FlowEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.FlowEngine"];
        "FlowEngine" -> "FlowEngineT" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "KinematicEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.KinematicEngine"];
        "KinematicEngine" -> "PartialEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "LawTester" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.LawTester"];
        "LawTester" -> "PartialEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "HarmonicRotationEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.HarmonicRotationEngine"];
        "HarmonicRotationEngine" -> "RotationEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "PartialSatClayEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.PartialSatClayEngine"];
        "PartialSatClayEngine" -> "PartialSatClayEngineT" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "RotationEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.RotationEngine"];
        "RotationEngine" -> "KinematicEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "FlowEngineT" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.FlowEngineT"];
        "FlowEngineT" -> "PartialEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "TorqueEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.TorqueEngine"];
        "TorqueEngine" -> "PartialEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "DragEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.DragEngine"];
        "DragEngine" -> "PartialEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "UnsaturatedEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.UnsaturatedEngine"];
        "UnsaturatedEngine" -> "TwoPhaseFlowEngine" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "TwoPhaseFlowEngine" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.TwoPhaseFlowEngine"];
        "TwoPhaseFlowEngine" -> "TwoPhaseFlowEngineT" [arrowsize=0.5,style="setlinewidth(0.5)"];
}

Inheritance graph of PartialEngine.

class yade.wrapper.PartialEngine(inherits Engine Serializable)

Engine affecting only particular bodies in the simulation, namely those defined in ids attribute. See also GlobalEngine.

class yade.wrapper.BicyclePedalEngine(inherits KinematicEngine PartialEngine Engine Serializable)

Engine applying the linear motion of bicycle pedal e.g. moving points around the axis without rotation

class yade.wrapper.CombinedKinematicEngine(inherits PartialEngine Engine Serializable)

Engine for applying combined displacements on pre-defined bodies. Constructed using + operator on regular KinematicEngines. The ids operated on are those of the first engine in the combination (assigned automatically).

class yade.wrapper.DragEngine(inherits PartialEngine Engine Serializable)

Apply drag force on some particles at each step, decelerating them proportionally to their linear velocities. The applied force reads

\[F_{d}=-\frac{\vec{v}}{|\vec{v}|}\frac{1}{2}\rho|\vec{v}|^2 C_d A\]

where \(\rho\) is the medium density (density), \(v\) is particle’s velocity, \(A\) is particle projected area (disc), \(C_d\) is the drag coefficient (0.47 for Sphere),

Note

Drag force is only applied to spherical particles, listed in ids.

class yade.wrapper.FlowEngine(inherits FlowEngineT PartialEngine Engine Serializable)

An engine to solve flow problem in saturated granular media. Model description can be found in [Chareyre2012a] and [Catalano2014a]. See the example script FluidCouplingPFV/oedometer.py. More documentation to come.

class yade.wrapper.FlowEngineT(inherits PartialEngine Engine Serializable)

A generic engine from wich more specialized engines can inherit. It is defined for the sole purpose of inserting the right data classes CellInfo and VertexInfo in the triangulation, and it should not be used directly. Instead, look for specialized engines, e.g. FlowEngine, PeriodicFlowEngine, or DFNFlowEngine.

class yade.wrapper.FlowEngine_PeriodicInfo(inherits PartialEngine Engine Serializable)

A generic engine from wich more specialized engines can inherit. It is defined for the sole purpose of inserting the right data classes CellInfo and VertexInfo in the triangulation, and it should not be used directly. Instead, look for specialized engines, e.g. FlowEngine, PeriodicFlowEngine, or DFNFlowEngine.

class yade.wrapper.ForceEngine(inherits PartialEngine Engine Serializable)

Apply contact force on some particles at each step.

class yade.wrapper.HarmonicForceEngine(inherits PartialEngine Engine Serializable)

This engine adds a harmonic (sinusoidal) force to a set of bodies. It is identical to HarmonicMotionEngine except a force amplitude is prescribed instead of motion, see also the dynamics of harmonic motion

class yade.wrapper.HarmonicMotionEngine(inherits KinematicEngine PartialEngine Engine Serializable)

This engine implements the harmonic oscillation of bodies. See also HarmonicForceEngine that applies a harmonic force, see also the dynamics of harmonic motion

class yade.wrapper.HarmonicRotationEngine(inherits RotationEngine KinematicEngine PartialEngine Engine Serializable)

This engine implements the harmonic-rotation oscillation of bodies, see also the dynamics of harmonic motion ; please, set dynamic=False for bodies, droven by this engine, otherwise amplitude will be 2x more, than awaited.

class yade.wrapper.HelixEngine(inherits RotationEngine KinematicEngine PartialEngine Engine Serializable)

Engine applying both rotation and translation, along the same axis, whence the name HelixEngine

class yade.wrapper.HydroForceEngine(inherits PartialEngine Engine Serializable)
Engine performing a coupling of the DEM with a volume-averaged 1D fluid resolution to simulate steady uniform unidirectional fluid flow. It has been developed and used to model steady uniform gravity-driven turbulent bedload transport [Maurin2015b] [Maurin2016] [Maurin2018], but can be also used in its current state for laminar or pressure-driven configurations. The fundamentals of the model can be found in [Maurin2015b] and [Maurin2015PhD], and in more details in [Maurin2018_VANSbasis], [Maurin2018_VANSfluidResol] and [Maurin2018_VANSvalidations].

The engine can be decomposed in three different parts: (i) It applies the fluid force on the particles imposed by the fluid velocity profiles and fluid properties, (ii) It evaluates averaged solid depth profiles necessary for the fluid force application and for the fluid resolution, (iii) It solve the volume-averaged 1D fluid momentum balance.

The three different functions are detailed below:

(i) Fluid force on particles Apply to each particles, buoyancy, drag and lift force due to a 1D fluid flow and can apply lubrication force between two particles. The applied drag force reads

\(F_{d}=\frac{1}{2} C_d A\rho^f|\vec{v_f - v}| \vec{v_f - v}\)

where \(\rho\) is the fluid density (densFluid), \(v\) is particle’s velocity, \(v_f\) is the velocity of the fluid at the particle center (taken from the fluid velocity profile vxFluid), \(A = \pi d^2/4\) is particle projected area (disc), \(C_d\) is the drag coefficient. The formulation of the drag coefficient depends on the local particle reynolds number and the solid volume fraction. The formulation of the drag is [Dallavalle1948] [RevilBaudard2013] with a correction of Richardson-Zaki [Richardson1954] to take into account the hindrance effect. This law is classical in sediment transport. The possibly activated lubrication force (with parameter:yref:lubrication<HydroForceEngine.lubrication> put to True) reads: \(F_{lubrication} = \frac{6 \pi \eta^f v_rel^n}{\delta^n + \epsilon_r}\), with \(\eta^f\) the fluid dynamic viscosity viscoDyn, \(v_rel^n\) the normal relative velocity of the two particles, \(\delta^n\) the distance between the two particles surface, and \(\epsilon_r\) the roughness scale of the particle (roughnessPartScale).

It is possible to activate a fluctuation of the drag force for each particle which account for the turbulent fluctuation of the fluid velocity (velFluct). Three simple discrete random walk model have been implemented for the turbulent velocity fluctuation. The main one (turbulentFluctuations) takes as input the Reynolds stress tensor \(R^f_{xz}\) as a function of the depth, and allows to recover the main property of the fluctuations by imposing \(<u_x'u_z'> (z) = <R^f_{xz}>(z)/\rho^f\). It requires as input \(<R^f_{xz}>(z)\) called ReynoldStresses in the code.

The formulation of the lift is taken from [Wiberg1985] and is such that :

\(F_{L}=\frac{1}{2} C_L A\rho^f((v_f - v)^2_{top} - (v_f - v)^2_{bottom})\)

Where the subscript top and bottom means evaluated at the top (respectively the bottom) of the sphere considered. This formulation of the lift account for the difference of pressure at the top and the bottom of the particle inside a turbulent shear flow. As this formulation is controversial when approaching the threshold of motion [Schmeeckle2007] it is possible to desactivate it with the variable lift. The buoyancy is taken into account through the buoyant weight :

\(F_{buoyancy}= - \rho^f V^p g\)

, where g is the gravity vector along the vertical, and \(V^p\) is the volume of the particle. In the case where the fluid flow is steady and uniform, the buoyancy reduces to its wall-normal component (see [Maurin2018] for a full explanation), and one should put steadyFlow to true in order to kill the streamwise component.

(ii) Averaged solid depth profiles The function averageProfile evaluates the volume averaged depth profiles (1D) of particle velocity, particle solid volume fraction and particle drag force. It uses a volume-weighting average following [Maurin2015PhD]_[Maurin2015b]_, i.e. the average of a variable \(A^p\) associated to particles at a given discretized wall-normal position \(z\) is given by:

\(\left< A \right>^s(z) = \displaystyle \frac{\displaystyle \sum_{p|z^p\in[z-dz/2,z+dz/2]} A^p(t) V^p_z}{\displaystyle \sum_{p|z^p\in[z-dz/2,z+dz/2]} V^p_z}\)

Where the sums are over the particles contained inside the slice between the wall-normal position \(z-dz/2\) and \(z+dz/2\), and \(V^p\) represents the part of the volume of the given particle effectively contained inside the slice. For more details, see [Maurin2015PhD].

(iii) 1D volume-average fluid resolution The fluid resolution is based on the resolution of the 1D volume-averaged fluid momentum balance. It assumes by definition (unidirectional) that the fluid flow is steady and uniform. It is the same fluid resolution as [RevilBaudard2013]. Details can be found in this paper and in [Maurin2015PhD] [Maurin2015b].

The three different component can be used independently, e.g. applying a fluid force due to an imposed fluid profile or solving the fluid momentum balance for a given concentration of particles.

class yade.wrapper.InterpolatingDirectedForceEngine(inherits ForceEngine PartialEngine Engine Serializable)

Engine for applying force of varying magnitude but constant direction on subscribed bodies. times and magnitudes must have the same length, direction (normalized automatically) gives the orientation.

As usual with interpolating engines: the first magnitude is used before the first time point, last magnitude is used after the last time point. Wrap specifies whether time wraps around the last time point to the first time point.

class yade.wrapper.InterpolatingHelixEngine(inherits HelixEngine RotationEngine KinematicEngine PartialEngine Engine Serializable)

Engine applying spiral motion, finding current angular velocity by linearly interpolating in times and velocities and translation by using slope parameter.

The interpolation assumes the margin value before the first time point and last value after the last time point. If wrap is specified, time will wrap around the last times value to the first one (note that no interpolation between last and first values is done).

class yade.wrapper.KinematicEngine(inherits PartialEngine Engine Serializable)

Abstract engine for applying prescribed displacement.

Note

Derived classes should override the apply with given list of ids (not action with PartialEngine.ids), so that they work when combined together; velocity and angular velocity of all subscribed bodies is reset before the apply method is called, it should therefore only increment those quantities.

class yade.wrapper.LawTester(inherits PartialEngine Engine Serializable)

Prescribe and apply deformations of an interaction in terms of local mutual displacements and rotations. The loading path is specified either using path (as sequence of 6-vectors containing generalized displacements \(u_x\), \(u_y\), \(u_z\), \(\phi_x\), \(\phi_y\), \(\phi_z\)) or disPath (\(u_x\), \(u_y\), \(u_z\)) and rotPath (\(\phi_x\), \(\phi_y\), \(\phi_z\)). Time function with time values (step numbers) corresponding to points on loading path is given by pathSteps. Loading values are linearly interpolated between given loading path points, and starting zero-value (the initial configuration) is assumed for both path and pathSteps. hooks can specify python code to run when respective point on the path is reached; when the path is finished, doneHook will be run.

LawTester should be placed between InteractionLoop and NewtonIntegrator in the simulation loop, since it controls motion via setting linear/angular velocities on particles; those velocities are integrated by NewtonIntegrator to yield an actual position change, which in turn causes IGeom to be updated (and contact law applied) when InteractionLoop is executed. Constitutive law generating forces on particles will not affect prescribed particle motion, since both particles have all DoFs blocked when first used with LawTester.

LawTester uses, as much as possible, IGeom to provide useful data (such as local coordinate system), but is able to compute those independently if absent in the respective IGeom:

IGeom

#DoFs

LawTester support level

L3Geom

3

full

L6Geom

6

full

ScGeom

3

emulate local coordinate system

ScGeom6D

6

emulate local coordinate system

Depending on IGeom, 3 (\(u_x\), \(u_y\), \(u_z\)) or 6 (\(u_x\), \(u_y\), \(u_z\), \(\phi_x\), \(\phi_y\), \(\phi_z\)) degrees of freedom (DoFs) are controlled with LawTester, by prescribing linear and angular velocities of both particles in contact. All DoFs controlled with LawTester are orthogonal (fully decoupled) and are controlled independently.

When 3 DoFs are controlled, rotWeight controls whether local shear is applied by moving particle on arc around the other one, or by rotating without changing position; although such rotation induces mutual rotation on the interaction, it is ignored with IGeom with only 3 DoFs. When 6 DoFs are controlled, only arc-displacement is applied for shear, since otherwise mutual rotation would occur.

idWeight distributes prescribed motion between both particles (resulting local deformation is the same if id1 is moved towards id2 or id2 towards id1). This is true only for \(u_x\), \(u_y\), \(u_z\), \(\phi_x\) however ; bending rotations \(\phi_y\), \(\phi_z\) are nevertheless always distributed regardless of idWeight to both spheres in inverse proportion to their radii, so that there is no shear induced.

LawTester knows current contact deformation from 2 sources: from its own internal data (which are used for prescribing the displacement at every step), which can be accessed in uTest, and from IGeom itself (depending on which data it provides), which is stored in uGeom. These two values should be identical (disregarding numerical percision), and it is a way to test whether IGeom and related functors compute what they are supposed to compute.

LawTester-operated interactions can be rendered with GlExtra_LawTester renderer.

See scripts/test/law-test.py for an example.

class yade.wrapper.LinearDragEngine(inherits PartialEngine Engine Serializable)

Apply viscous resistance or linear drag on some particles at each step, decelerating them proportionally to their linear velocities. The applied force reads

\[F_{d}=-b{\vec{v}}\]

where \(b\) is the linear drag, \(\vec{v}\) is particle’s velocity.

\[b=6\pi\nu r \]

where \(\nu\) is the medium viscosity, \(r\) is the Stokes radius of the particle (but in this case we accept it equal to sphere radius for simplification),

Note

linear drag is only applied to spherical particles, listed in ids.

class yade.wrapper.PartialSatClayEngine(inherits PartialSatClayEngineT PartialEngine Engine Serializable)

Engine designed to simulate the partial saturation of clay and associated swelling.

class yade.wrapper.PartialSatClayEngineT(inherits PartialEngine Engine Serializable)

A generic engine from wich more specialized engines can inherit. It is defined for the sole purpose of inserting the right data classes CellInfo and VertexInfo in the triangulation, and it should not be used directly. Instead, look for specialized engines, e.g. FlowEngine, PeriodicFlowEngine, or DFNFlowEngine.

class yade.wrapper.PeriodicFlowEngine(inherits FlowEngine_PeriodicInfo PartialEngine Engine Serializable)

A variant of FlowEngine implementing periodic boundary conditions. The API is very similar.

class yade.wrapper.RadialForceEngine(inherits PartialEngine Engine Serializable)

Apply force of given magnitude directed away from spatial axis.

class yade.wrapper.RotationEngine(inherits KinematicEngine PartialEngine Engine Serializable)

Engine applying rotation (by setting angular velocity) to subscribed bodies. If rotateAroundZero is set, then each body is also displaced around zeroPoint.

class yade.wrapper.ServoPIDController(inherits TranslationEngine KinematicEngine PartialEngine Engine Serializable)

PIDController servo-engine for applying prescribed force on bodies. http://en.wikipedia.org/wiki/PID_controller

class yade.wrapper.StepDisplacer(inherits PartialEngine Engine Serializable)

Apply generalized displacement (displacement or rotation) stepwise on subscribed bodies. Could be used for purposes of contact law tests (by moving one sphere compared to another), but in this case, see rather LawTester

class yade.wrapper.ThermalEngine(inherits PartialEngine Engine Serializable)

An engine typically used in combination with FlowEngine to simulate thermal-hydraulic-mechanical processes. Framework description and demonstration presented within the following paper [Caulk2019a] :Caulk, R.A. and Chareyre, B. (2019) An open framework for the simulation of thermal-hydraulic-mechanical processes in discrete element systems. Thermal Process Engineering: Proceedings of DEM8 International Conference for Discrete Element Methods, Enschede Netherlands, July 2019.

class yade.wrapper.TorqueEngine(inherits PartialEngine Engine Serializable)

Apply given torque (momentum) value at every subscribed particle, at every step.

class yade.wrapper.TranslationEngine(inherits KinematicEngine PartialEngine Engine Serializable)

Engine applying translation motion (by setting linear velocity) to subscribed bodies.

class yade.wrapper.TwoPhaseFlowEngine(inherits TwoPhaseFlowEngineT PartialEngine Engine Serializable)

documentation here

class yade.wrapper.TwoPhaseFlowEngineT(inherits PartialEngine Engine Serializable)

A generic engine from wich more specialized engines can inherit. It is defined for the sole purpose of inserting the right data classes CellInfo and VertexInfo in the triangulation, and it should not be used directly. Instead, look for specialized engines, e.g. FlowEngine, PeriodicFlowEngine, or DFNFlowEngine.

class yade.wrapper.UnsaturatedEngine(inherits TwoPhaseFlowEngine TwoPhaseFlowEngineT PartialEngine Engine Serializable)

Preliminary version engine of a drainage model for unsaturated soils. Note:Air reservoir is on the top; water reservoir is on the bottom.(deprecated engine, use TwoPhaseFlowEngine instead)

Dispatchers

digraph Dispatcher {
        rankdir=RL;
        margin="0.2,0.05";
        "Dispatcher" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Dispatcher"];
        "GlShapeDispatcher" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.GlShapeDispatcher"];
        "GlShapeDispatcher" -> "Dispatcher" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "IGeomDispatcher" [shape="box",fontsize=8,style="setlinewidth(0.5),filled,dashed",fillcolor=grey,height=0.2,URL="yade.wrapper.html#yade.wrapper.IGeomDispatcher"];
        "IGeomDispatcher" -> "Dispatcher" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "GlStateDispatcher" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.GlStateDispatcher"];
        "GlStateDispatcher" -> "Dispatcher" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "IPhysDispatcher" [shape="box",fontsize=8,style="setlinewidth(0.5),filled,dashed",fillcolor=grey,height=0.2,URL="yade.wrapper.html#yade.wrapper.IPhysDispatcher"];
        "IPhysDispatcher" -> "Dispatcher" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "LawDispatcher" [shape="box",fontsize=8,style="setlinewidth(0.5),filled,dashed",fillcolor=grey,height=0.2,URL="yade.wrapper.html#yade.wrapper.LawDispatcher"];
        "LawDispatcher" -> "Dispatcher" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "GlBoundDispatcher" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.GlBoundDispatcher"];
        "GlBoundDispatcher" -> "Dispatcher" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "InternalForceDispatcher" [shape="box",fontsize=8,style="setlinewidth(0.5),filled,dashed",fillcolor=grey,height=0.2,URL="yade.wrapper.html#yade.wrapper.InternalForceDispatcher"];
        "InternalForceDispatcher" -> "Dispatcher" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "BoundDispatcher" [shape="box",fontsize=8,style="setlinewidth(0.5),filled,dashed",fillcolor=grey,height=0.2,URL="yade.wrapper.html#yade.wrapper.BoundDispatcher"];
        "BoundDispatcher" -> "Dispatcher" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "GlIGeomDispatcher" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.GlIGeomDispatcher"];
        "GlIGeomDispatcher" -> "Dispatcher" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "GlIPhysDispatcher" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.GlIPhysDispatcher"];
        "GlIPhysDispatcher" -> "Dispatcher" [arrowsize=0.5,style="setlinewidth(0.5)"];
}

Inheritance graph of Dispatcher, gray dashed classes are discussed in their own sections: IGeomDispatcher, IPhysDispatcher, LawDispatcher, InternalForceDispatcher, BoundDispatcher.

class yade.wrapper.Dispatcher(inherits Engine Serializable)

Engine dispatching control to its associated functors, based on types of argument it receives. This abstract base class provides no functionality in itself.

class yade.wrapper.GlBoundDispatcher(inherits Dispatcher Engine Serializable)

Dispatcher calling functors based on received argument type(s).

class yade.wrapper.GlIGeomDispatcher(inherits Dispatcher Engine Serializable)

Dispatcher calling functors based on received argument type(s).

class yade.wrapper.GlIPhysDispatcher(inherits Dispatcher Engine Serializable)

Dispatcher calling functors based on received argument type(s).

class yade.wrapper.GlShapeDispatcher(inherits Dispatcher Engine Serializable)

Dispatcher calling functors based on received argument type(s).

class yade.wrapper.GlStateDispatcher(inherits Dispatcher Engine Serializable)

Dispatcher calling functors based on received argument type(s).

Functors

digraph Functor {
        rankdir=RL;
        margin="0.2,0.05";
        "Functor" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Functor"];
        "GlBoundFunctor" [shape="box",fontsize=8,style="setlinewidth(0.5),filled,dashed",fillcolor=grey,height=0.2,URL="yade.wrapper.html#inheritancegraphglboundfunctor"];
        "GlBoundFunctor" -> "Functor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "GlIGeomFunctor" [shape="box",fontsize=8,style="setlinewidth(0.5),filled,dashed",fillcolor=grey,height=0.2,URL="yade.wrapper.html#inheritancegraphgligeomfunctor"];
        "GlIGeomFunctor" -> "Functor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "InternalForceFunctor" [shape="box",fontsize=8,style="setlinewidth(0.5),filled,dashed",fillcolor=grey,height=0.2,URL="yade.wrapper.html#inheritancegraphinternalforcefunctor"];
        "InternalForceFunctor" -> "Functor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "GlStateFunctor" [shape="box",fontsize=8,style="setlinewidth(0.5),filled,dashed",fillcolor=grey,height=0.2,URL="yade.wrapper.html#yade.wrapper.GlStateFunctor"];
        "GlStateFunctor" -> "Functor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "IPhysFunctor" [shape="box",fontsize=8,style="setlinewidth(0.5),filled,dashed",fillcolor=grey,height=0.2,URL="yade.wrapper.html#inheritancegraphiphysfunctor"];
        "IPhysFunctor" -> "Functor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "GlIPhysFunctor" [shape="box",fontsize=8,style="setlinewidth(0.5),filled,dashed",fillcolor=grey,height=0.2,URL="yade.wrapper.html#inheritancegraphgliphysfunctor"];
        "GlIPhysFunctor" -> "Functor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "GlShapeFunctor" [shape="box",fontsize=8,style="setlinewidth(0.5),filled,dashed",fillcolor=grey,height=0.2,URL="yade.wrapper.html#inheritancegraphglshapefunctor"];
        "GlShapeFunctor" -> "Functor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "BoundFunctor" [shape="box",fontsize=8,style="setlinewidth(0.5),filled,dashed",fillcolor=grey,height=0.2,URL="yade.wrapper.html#inheritancegraphboundfunctor"];
        "BoundFunctor" -> "Functor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "IGeomFunctor" [shape="box",fontsize=8,style="setlinewidth(0.5),filled,dashed",fillcolor=grey,height=0.2,URL="yade.wrapper.html#inheritancegraphigeomfunctor"];
        "IGeomFunctor" -> "Functor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "LawFunctor" [shape="box",fontsize=8,style="setlinewidth(0.5),filled,dashed",fillcolor=grey,height=0.2,URL="yade.wrapper.html#inheritancegraphlawfunctor"];
        "LawFunctor" -> "Functor" [arrowsize=0.5,style="setlinewidth(0.5)"];
}

Inheritance graph of Functor, gray dashed classes are discussed in their own sections: GlBoundFunctor, GlIGeomFunctor, InternalForceFunctor, GlStateFunctor, IPhysFunctor, GlIPhysFunctor, GlShapeFunctor, BoundFunctor, IGeomFunctor, LawFunctor.

class yade.wrapper.Functor(inherits Serializable)

Function-like object that is called by Dispatcher, if types of arguments match those the Functor declares to accept.

Bounding volume creation

BoundFunctor

digraph BoundFunctor {
        rankdir=RL;
        margin="0.2,0.05";
        "BoundFunctor" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.BoundFunctor"];
        "Bo1_Cylinder_Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Bo1_Cylinder_Aabb"];
        "Bo1_Cylinder_Aabb" -> "BoundFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Bo1_Box_Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Bo1_Box_Aabb"];
        "Bo1_Box_Aabb" -> "BoundFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Bo1_Tetra_Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Bo1_Tetra_Aabb"];
        "Bo1_Tetra_Aabb" -> "BoundFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Bo1_Polyhedra_Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Bo1_Polyhedra_Aabb"];
        "Bo1_Polyhedra_Aabb" -> "BoundFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Bo1_FluidDomainBbox_Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Bo1_FluidDomainBbox_Aabb"];
        "Bo1_FluidDomainBbox_Aabb" -> "BoundFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Bo1_LevelSet_Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Bo1_LevelSet_Aabb"];
        "Bo1_LevelSet_Aabb" -> "BoundFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Bo1_GridConnection_Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Bo1_GridConnection_Aabb"];
        "Bo1_GridConnection_Aabb" -> "BoundFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Bo1_ChainedCylinder_Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Bo1_ChainedCylinder_Aabb"];
        "Bo1_ChainedCylinder_Aabb" -> "BoundFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Bo1_PFacet_Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Bo1_PFacet_Aabb"];
        "Bo1_PFacet_Aabb" -> "BoundFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Bo1_Subdomain_Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Bo1_Subdomain_Aabb"];
        "Bo1_Subdomain_Aabb" -> "BoundFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "PotentialParticle2AABB" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.PotentialParticle2AABB"];
        "PotentialParticle2AABB" -> "BoundFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Bo1_Node_Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Bo1_Node_Aabb"];
        "Bo1_Node_Aabb" -> "BoundFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Bo1_Sphere_Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Bo1_Sphere_Aabb"];
        "Bo1_Sphere_Aabb" -> "BoundFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Bo1_DeformableElement_Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Bo1_DeformableElement_Aabb"];
        "Bo1_DeformableElement_Aabb" -> "BoundFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Bo1_Facet_Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Bo1_Facet_Aabb"];
        "Bo1_Facet_Aabb" -> "BoundFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Bo1_Wall_Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Bo1_Wall_Aabb"];
        "Bo1_Wall_Aabb" -> "BoundFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
}

Inheritance graph of BoundFunctor.

class yade.wrapper.BoundFunctor(inherits Functor Serializable)

Functor for creating/updating Body::bound.

class yade.wrapper.Bo1_Box_Aabb(inherits BoundFunctor Functor Serializable)

Create/update an Aabb of a Box.

class yade.wrapper.Bo1_ChainedCylinder_Aabb(inherits BoundFunctor Functor Serializable)

Functor creating Aabb from ChainedCylinder.

class yade.wrapper.Bo1_Cylinder_Aabb(inherits BoundFunctor Functor Serializable)

Functor creating Aabb from Cylinder.

class yade.wrapper.Bo1_DeformableElement_Aabb(inherits BoundFunctor Functor Serializable)

Functor creating Aabb from DeformableElement.

class yade.wrapper.Bo1_Facet_Aabb(inherits BoundFunctor Functor Serializable)

Creates/updates an Aabb of a Facet.

class yade.wrapper.Bo1_FluidDomainBbox_Aabb(inherits BoundFunctor Functor Serializable)

creates/updates an Aabb of a FluidDomainBbox.

class yade.wrapper.Bo1_GridConnection_Aabb(inherits BoundFunctor Functor Serializable)

Functor creating Aabb from a GridConnection.

class yade.wrapper.Bo1_LevelSet_Aabb(inherits BoundFunctor Functor Serializable)

Creates/updates an Aabb of a LevelSet

class yade.wrapper.Bo1_Node_Aabb(inherits BoundFunctor Functor Serializable)

Functor creating Aabb from Node.

class yade.wrapper.Bo1_PFacet_Aabb(inherits BoundFunctor Functor Serializable)

Functor creating Aabb from a PFacet.

class yade.wrapper.Bo1_Polyhedra_Aabb(inherits BoundFunctor Functor Serializable)

Create/update Aabb of a Polyhedra

class yade.wrapper.Bo1_Sphere_Aabb(inherits BoundFunctor Functor Serializable)

Functor creating Aabb from Sphere.

class yade.wrapper.Bo1_Subdomain_Aabb(inherits BoundFunctor Functor Serializable)

Creates/updates an Aabb of a Facet.

class yade.wrapper.Bo1_Tetra_Aabb(inherits BoundFunctor Functor Serializable)

Create/update Aabb of a Tetra

class yade.wrapper.Bo1_Wall_Aabb(inherits BoundFunctor Functor Serializable)

Creates/updates an Aabb of a Wall

class yade.wrapper.PotentialParticle2AABB(inherits BoundFunctor Functor Serializable)

EXPERIMENTAL. Functor creating Aabb from PotentialParticle.

BoundDispatcher

class yade.wrapper.BoundDispatcher(inherits Dispatcher Engine Serializable)

Dispatcher calling functors based on received argument type(s).

Interaction Geometry creation

IGeomFunctor

digraph IGeomFunctor {
        rankdir=RL;
        margin="0.2,0.05";
        "IGeomFunctor" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.IGeomFunctor"];
        "Ig2_Sphere_PFacet_ScGridCoGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_Sphere_PFacet_ScGridCoGeom"];
        "Ig2_Sphere_PFacet_ScGridCoGeom" -> "Ig2_Sphere_GridConnection_ScGridCoGeom" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_Box_Sphere_ScGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_Box_Sphere_ScGeom"];
        "Ig2_Box_Sphere_ScGeom" -> "IGeomFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_LevelSet_LevelSet_ScGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_LevelSet_LevelSet_ScGeom"];
        "Ig2_LevelSet_LevelSet_ScGeom" -> "IGeomFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_Wall_Sphere_ScGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_Wall_Sphere_ScGeom"];
        "Ig2_Wall_Sphere_ScGeom" -> "IGeomFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_Polyhedra_Polyhedra_PolyhedraGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_Polyhedra_Polyhedra_PolyhedraGeom"];
        "Ig2_Polyhedra_Polyhedra_PolyhedraGeom" -> "IGeomFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_Wall_LevelSet_ScGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_Wall_LevelSet_ScGeom"];
        "Ig2_Wall_LevelSet_ScGeom" -> "IGeomFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_Sphere_Polyhedra_ScGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_Sphere_Polyhedra_ScGeom"];
        "Ig2_Sphere_Polyhedra_ScGeom" -> "IGeomFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_Tetra_Tetra_TTetraSimpleGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_Tetra_Tetra_TTetraSimpleGeom"];
        "Ig2_Tetra_Tetra_TTetraSimpleGeom" -> "IGeomFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_Facet_Polyhedra_PolyhedraGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_Facet_Polyhedra_PolyhedraGeom"];
        "Ig2_Facet_Polyhedra_PolyhedraGeom" -> "IGeomFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_Polyhedra_Polyhedra_ScGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_Polyhedra_Polyhedra_ScGeom"];
        "Ig2_Polyhedra_Polyhedra_ScGeom" -> "IGeomFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_Sphere_Sphere_L3Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_Sphere_Sphere_L3Geom"];
        "Ig2_Sphere_Sphere_L3Geom" -> "IGeomFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_Sphere_ChainedCylinder_CylScGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_Sphere_ChainedCylinder_CylScGeom"];
        "Ig2_Sphere_ChainedCylinder_CylScGeom" -> "IGeomFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_GridConnection_GridConnection_GridCoGridCoGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_GridConnection_GridConnection_GridCoGridCoGeom"];
        "Ig2_GridConnection_GridConnection_GridCoGridCoGeom" -> "IGeomFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_Polyhedra_Polyhedra_PolyhedraGeomOrScGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_Polyhedra_Polyhedra_PolyhedraGeomOrScGeom"];
        "Ig2_Polyhedra_Polyhedra_PolyhedraGeomOrScGeom" -> "IGeomFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_Facet_Sphere_ScGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_Facet_Sphere_ScGeom"];
        "Ig2_Facet_Sphere_ScGeom" -> "IGeomFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_PP_PP_ScGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_PP_PP_ScGeom"];
        "Ig2_PP_PP_ScGeom" -> "IGeomFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_PFacet_PFacet_ScGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_PFacet_PFacet_ScGeom"];
        "Ig2_PFacet_PFacet_ScGeom" -> "Ig2_Sphere_PFacet_ScGridCoGeom" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_ChainedCylinder_ChainedCylinder_ScGeom6D" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_ChainedCylinder_ChainedCylinder_ScGeom6D"];
        "Ig2_ChainedCylinder_ChainedCylinder_ScGeom6D" -> "IGeomFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_Wall_PFacet_ScGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_Wall_PFacet_ScGeom"];
        "Ig2_Wall_PFacet_ScGeom" -> "Ig2_Wall_Sphere_ScGeom" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_Box_Sphere_ScGeom6D" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_Box_Sphere_ScGeom6D"];
        "Ig2_Box_Sphere_ScGeom6D" -> "Ig2_Box_Sphere_ScGeom" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_Sphere_GridConnection_ScGridCoGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_Sphere_GridConnection_ScGridCoGeom"];
        "Ig2_Sphere_GridConnection_ScGridCoGeom" -> "IGeomFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_Tetra_Tetra_TTetraGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_Tetra_Tetra_TTetraGeom"];
        "Ig2_Tetra_Tetra_TTetraGeom" -> "IGeomFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_Box_LevelSet_ScGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_Box_LevelSet_ScGeom"];
        "Ig2_Box_LevelSet_ScGeom" -> "IGeomFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_Sphere_Sphere_ScGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_Sphere_Sphere_ScGeom"];
        "Ig2_Sphere_Sphere_ScGeom" -> "IGeomFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_GridConnection_PFacet_ScGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_GridConnection_PFacet_ScGeom"];
        "Ig2_GridConnection_PFacet_ScGeom" -> "Ig2_Sphere_GridConnection_ScGridCoGeom" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_Sphere_ChainedCylinder_CylScGeom6D" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_Sphere_ChainedCylinder_CylScGeom6D"];
        "Ig2_Sphere_ChainedCylinder_CylScGeom6D" -> "Ig2_Sphere_ChainedCylinder_CylScGeom" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_Wall_Sphere_L3Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_Wall_Sphere_L3Geom"];
        "Ig2_Wall_Sphere_L3Geom" -> "Ig2_Sphere_Sphere_L3Geom" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_Wall_Polyhedra_PolyhedraGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_Wall_Polyhedra_PolyhedraGeom"];
        "Ig2_Wall_Polyhedra_PolyhedraGeom" -> "IGeomFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_Sphere_Sphere_ScGeom6D" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_Sphere_Sphere_ScGeom6D"];
        "Ig2_Sphere_Sphere_ScGeom6D" -> "Ig2_Sphere_Sphere_ScGeom" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_GridNode_GridNode_GridNodeGeom6D" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_GridNode_GridNode_GridNodeGeom6D"];
        "Ig2_GridNode_GridNode_GridNodeGeom6D" -> "Ig2_Sphere_Sphere_ScGeom" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_Sphere_Sphere_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_Sphere_Sphere_L6Geom"];
        "Ig2_Sphere_Sphere_L6Geom" -> "Ig2_Sphere_Sphere_L3Geom" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_Facet_Sphere_ScGeom6D" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_Facet_Sphere_ScGeom6D"];
        "Ig2_Facet_Sphere_ScGeom6D" -> "Ig2_Facet_Sphere_ScGeom" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ig2_Facet_Sphere_L3Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ig2_Facet_Sphere_L3Geom"];
        "Ig2_Facet_Sphere_L3Geom" -> "Ig2_Sphere_Sphere_L3Geom" [arrowsize=0.5,style="setlinewidth(0.5)"];
}

Inheritance graph of IGeomFunctor.

class yade.wrapper.IGeomFunctor(inherits Functor Serializable)

Functor for creating/updating Interaction::geom objects.

class yade.wrapper.Ig2_Box_LevelSet_ScGeom(inherits IGeomFunctor Functor Serializable)

Creates or updates a ScGeom instance representing the intersection of one LevelSet body with one Box body. Normal is given by the box geometry while overlap and contact points are defined likewise to Ig2_LevelSet_LevelSet_ScGeom. Restricted to the case of Boxes for which local and global axes coincide, and with non zero thickness, and assuming the center of the level set body never enters into the box (ie excluding big overlaps). You may prefer using Ig2_Wall_LevelSet_ScGeom.

class yade.wrapper.Ig2_Box_Sphere_ScGeom(inherits IGeomFunctor Functor Serializable)

Create an interaction geometry ScGeom from Box and Sphere, representing the box with a projected virtual sphere of same radius.

class yade.wrapper.Ig2_Box_Sphere_ScGeom6D(inherits Ig2_Box_Sphere_ScGeom IGeomFunctor Functor Serializable)

Create an interaction geometry ScGeom6D from Box and Sphere, representing the box with a projected virtual sphere of same radius.

class yade.wrapper.Ig2_ChainedCylinder_ChainedCylinder_ScGeom6D(inherits IGeomFunctor Functor Serializable)

Create/update a ScGeom instance representing connexion between chained cylinders.

class yade.wrapper.Ig2_Facet_Polyhedra_PolyhedraGeom(inherits IGeomFunctor Functor Serializable)

Create/update geometry of collision between Facet and Polyhedra

class yade.wrapper.Ig2_Facet_Sphere_L3Geom(inherits Ig2_Sphere_Sphere_L3Geom IGeomFunctor Functor Serializable)

Incrementally compute L3Geom for contact between Facet and Sphere. Uses attributes of Ig2_Sphere_Sphere_L3Geom.

class yade.wrapper.Ig2_Facet_Sphere_ScGeom(inherits IGeomFunctor Functor Serializable)

Create/update a ScGeom instance representing intersection of Facet and Sphere. The equivalent radius for the Facet (ScGeom.refR1) is chosen as twice the Sphere’s one.

class yade.wrapper.Ig2_Facet_Sphere_ScGeom6D(inherits Ig2_Facet_Sphere_ScGeom IGeomFunctor Functor Serializable)

Create an interaction geometry ScGeom6D from Facet and Sphere, representing the Facet with a projected virtual sphere of same radius.

class yade.wrapper.Ig2_GridConnection_GridConnection_GridCoGridCoGeom(inherits IGeomFunctor Functor Serializable)

Create/update a GridCoGridCoGeom instance representing the geometry of a contact point between two GridConnection , including relative rotations.

class yade.wrapper.Ig2_GridConnection_PFacet_ScGeom(inherits Ig2_Sphere_GridConnection_ScGridCoGeom IGeomFunctor Functor Serializable)

Create/update a ScGeom instance representing intersection of Facet and GridConnection.

class yade.wrapper.Ig2_GridNode_GridNode_GridNodeGeom6D(inherits Ig2_Sphere_Sphere_ScGeom IGeomFunctor Functor Serializable)

Create/update a GridNodeGeom6D instance representing the geometry of a contact point between two GridNode, including relative rotations.

class yade.wrapper.Ig2_LevelSet_LevelSet_ScGeom(inherits IGeomFunctor Functor Serializable)

Creates or updates a ScGeom instance representing the contact of two (convex) LevelSet-shaped bodies after executing a master-slave algorithm that combines distance function \(\phi\) (LevelSet.distField) with surface nodes \(\vec{N}\) (LevelSet.surfNodes) [Duriez2021a] [Duriez2021b]. Denoting \(S\), resp. \(B\), the smallest, resp. biggest, contacting body, \(\vec{N_c}\) the surface node of \(S\) with the greatest penetration depth into \(B\) (its current position), \(u_n\) the corresponding overlap, \(\vec{C}\) the contact point and \(\vec{n}\) the contact normal, we have:

  • \(u_n = - \phi_B(\vec{N_c})\)

  • \(\vec{n} = \pm \vec{\nabla} \phi_S(\vec{N_c})\) chosen to be oriented from 1 to 2

  • \(\vec{C} = \vec{N_c} - \dfrac{u_n}{2} \vec{n}\)

Note

in case the two LevelSet grids no longer overlap for a previously existing interaction, the above workflow does not apply and \(u_n\) is assigned an infinite tensile value that should insure interaction removal in the same DEM iteration (for sure with Law2_ScGeom_FrictPhys_CundallStrack).

class yade.wrapper.Ig2_PFacet_PFacet_ScGeom(inherits Ig2_Sphere_PFacet_ScGridCoGeom Ig2_Sphere_GridConnection_ScGridCoGeom IGeomFunctor Functor Serializable)

Create/update a ScGridCoGeom instance representing intersection of Facet and Sphere.

class yade.wrapper.Ig2_PP_PP_ScGeom(inherits IGeomFunctor Functor Serializable)

EXPERIMENTAL. IGeom functor for PotentialParticle - PotentialParticle pair

class yade.wrapper.Ig2_Polyhedra_Polyhedra_PolyhedraGeom(inherits IGeomFunctor Functor Serializable)

Create/update geometry of collision between 2 Polyhedras

class yade.wrapper.Ig2_Polyhedra_Polyhedra_PolyhedraGeomOrScGeom(inherits IGeomFunctor Functor Serializable)

EXPERIMENTAL. A hacky helper Ig2 functor combining two Polyhedra shapes to give, according to the settings, either ScGeom or PolyhedraGeom, through appropriate use of either Ig2_Polyhedra_Polyhedra_ScGeom (through ig2scGeom attribute) or Ig2_Polyhedra_Polyhedra_PolyhedraGeom (ig2polyhedraGeom attribute).

class yade.wrapper.Ig2_Polyhedra_Polyhedra_ScGeom(inherits IGeomFunctor Functor Serializable)

EXPERIMENTAL. Ig2 functor creating ScGeom from two Polyhedra shapes. The radii are computed as a distance of contact point (computed using Ig2_Polyhedra_Polyhedra_PolyhedraGeom) and center of particle. Tested only for face-face contacts (like brick wall).

class yade.wrapper.Ig2_Sphere_ChainedCylinder_CylScGeom(inherits IGeomFunctor Functor Serializable)

Create/update a ScGeom instance representing intersection of two Spheres.

class yade.wrapper.Ig2_Sphere_ChainedCylinder_CylScGeom6D(inherits Ig2_Sphere_ChainedCylinder_CylScGeom IGeomFunctor Functor Serializable)

Create/update a ScGeom6D instance representing the geometry of a contact point between two Spheres, including relative rotations.

class yade.wrapper.Ig2_Sphere_GridConnection_ScGridCoGeom(inherits IGeomFunctor Functor Serializable)

Create/update a ScGridCoGeom6D instance representing the geometry of a contact point between a GricConnection and a Sphere including relative rotations.

class yade.wrapper.Ig2_Sphere_PFacet_ScGridCoGeom(inherits Ig2_Sphere_GridConnection_ScGridCoGeom IGeomFunctor Functor Serializable)

Create/update a ScGridCoGeom instance representing intersection of PFacet and Sphere.

class yade.wrapper.Ig2_Sphere_Polyhedra_ScGeom(inherits IGeomFunctor Functor Serializable)

Create/update geometry of collision between Sphere and Polyhedra

class yade.wrapper.Ig2_Sphere_Sphere_L3Geom(inherits IGeomFunctor Functor Serializable)

Functor for computing incrementally configuration of 2 Spheres stored in L3Geom; the configuration is positioned in global space by local origin \(\vec{c}\) (contact point) and rotation matrix \(\mat{T}\) (orthonormal transformation matrix), and its degrees of freedom are local displacement \(\vec{u}\) (in one normal and two shear directions); with Ig2_Sphere_Sphere_L6Geom and L6Geom, there is additionally \(\vec{\phi}\). The first row of \(\mat{T}\), i.e. local \(x\)-axis, is the contact normal noted \(\vec{n}\) for brevity. Additionally, quasi-constant values of \(\vec{u}_0\) (and \(\vec{\phi}_0\)) are stored as shifted origins of \(\vec{u}\) (and \(\vec{\phi}\)); therefore, current value of displacement is always \(\curr{\vec{u}}-\vec{u}_0\).

Suppose two spheres with radii \(r_i\), positions \(\vec{x}_i\), velocities \(\vec{v}_i\), angular velocities \(\vec{\omega}_i\).

When there is not yet contact, it will be created if \(u_N=|\curr{\vec{x}}_2-\curr{\vec{x}}_1|-|f_d|(r_1+r2)<0\), where \(f_d\) is distFactor (sometimes also called ``interaction radius’’). If \(f_d>0\), then \(\vec{u}_{0x}\) will be initalized to \(u_N\), otherwise to 0. In another words, contact will be created if spheres enlarged by \(|f_d|\) touch, and the ``equilibrium distance’’ (where \(\vec{u}_x-\vec{u}-{0x}\) is zero) will be set to the current distance if \(f_d\) is positive, and to the geometrically-touching distance if negative.

Local axes (rows of \(\mat{T}\)) are initially defined as follows:

  • local \(x\)-axis is \(\vec{n}=\vec{x}_l=\normalized{\vec{x}_2-\vec{x}_1}\);

  • local \(y\)-axis positioned arbitrarily, but in a deterministic manner: aligned with the \(xz\) plane (if \(\vec{n}_y<\vec{n}_z\)) or \(xy\) plane (otherwise);

  • local \(z\)-axis \(\vec{z}_l=\vec{x}_l\times\vec{y}_l\).

If there has already been contact between the two spheres, it is updated to keep track of rigid motion of the contact (one that does not change mutual configuration of spheres) and mutual configuration changes. Rigid motion transforms local coordinate system and can be decomposed in rigid translation (affecting \(\vec{c}\)), and rigid rotation (affecting \(\mat{T}\)), which can be split in rotation \(\vec{o}_r\) perpendicular to the normal and rotation \(\vec{o}_t\) (``twist’’) parallel with the normal:

\[\pprev{\vec{o}_r}=\prev{\vec{n}}\times\curr{\vec{n}}.\]

Since velocities are known at previous midstep (\(t-\Dt/2\)), we consider mid-step normal

\[\pprev{\vec{n}}=\frac{\prev{\vec{n}}+\curr{\vec{n}}}{2}.\]

For the sake of numerical stability, \(\pprev{\vec{n}}\) is re-normalized after being computed, unless prohibited by approxMask. If approxMask has the appropriate bit set, the mid-normal is not compute, and we simply use \(\pprev{\vec{n}}\approx\prev{\vec{n}}\).

Rigid rotation parallel with the normal is

\[\pprev{\vec{o}_t}=\pprev{\vec{n}}\left(\pprev{\vec{n}}\cdot\frac{\pprev{\vec{\omega}}_1+\pprev{\vec{\omega}}_2}{2}\right)\Dt.\]

Branch vectors \(\vec{b}_1\), \(\vec{b}_2\) (connecting \(\curr{\vec{x}}_1\), \(\curr{\vec{x}}_2\) with \(\curr{\vec{c}}\) are computed depending on noRatch (see here).

\begin{align*} \vec{b}_1&=\begin{cases} r_1 \curr{\vec{n}} & \mbox{with }\texttt{noRatch} \\ \curr{\vec{c}}-\curr{\vec{x}}_1 & \mbox{otherwise} \end{cases} \\ \vec{b}_2&=\begin{cases} -r_2\curr{\vec{n}} & \mbox{with }\texttt{noRatch} \\ \curr{\vec{c}}-\curr{\vec{x}}_2 & \mbox{otherwise} \end{cases} \\ \end{align*}

Relative velocity at \(\curr{\vec{c}}\) can be computed as

\[\pprev{\vec{v}_r}=(\pprev{\vec{\tilde{v}}_2}+\vec{\omega}_2\times\vec{b}_2)-(\vec{v}_1+\vec{\omega}_1\times\vec{b}_1)\]

where \(\vec{\tilde{v}}_2\) is \(\vec{v}_2\) without mean-field velocity gradient in periodic boundary conditions (see Cell.homoDeform). In the numerial implementation, the normal part of incident velocity is removed (since it is computed directly) with \(\pprev{\vec{v}_{r2}}=\pprev{\vec{v}_r}-(\pprev{\vec{n}}\cdot\pprev{\vec{v}_r})\pprev{\vec{n}}\).

Any vector \(\vec{a}\) expressed in global coordinates transforms during one timestep as

\[\curr{\vec{a}}=\prev{\vec{a}}+\pprev{\vec{v}_r}\Dt-\prev{\vec{a}}\times\pprev{\vec{o}_r}-\prev{\vec{a}}\times{\pprev{\vec{t}_r}}\]

where the increments have the meaning of relative shear, rigid rotation normal to \(\vec{n}\) and rigid rotation parallel with \(\vec{n}\). Local coordinate system orientation, rotation matrix \(\mat{T}\), is updated by rows, i.e.

\[\begin{split}\curr{\mat{T}}=\begin{pmatrix} \curr{\vec{n}_x}{\hspace{12mm}}\curr{\vec{n}_y}{\hspace{12mm}}\curr{\vec{n}_z} \\ {\prev{\mat{T}_{1,\bullet}}-\prev{\mat{T}_{1,\bullet}}\times\pprev{\vec{o}_r}-\prev{\mat{T}_{1,\bullet}}\times\pprev{\vec{o}_t}} \\ {\prev{\mat{T}_{2,\bullet}}-\prev{\mat{T}_{2,\bullet}}\times\pprev{\vec{o}_r}-\prev{\mat{T}_{,\bullet}}\times\pprev{\vec{o}_t}} \\ \end{pmatrix}\end{split}\]

This matrix is re-normalized (unless prevented by approxMask) and mid-step transformation is computed using quaternion spherical interpolation as

\[\pprev{\mat{T}}=\mathrm{Slerp}\,\left(\prev{\mat{T}};\curr{\mat{T}};t=1/2\right).\]

Depending on approxMask, this computation can be avoided by approximating \(\pprev{\mat{T}}=\prev{\mat{T}}\).

Finally, current displacement is evaluated as

\[\curr{\vec{u}}=\prev{u}+\pprev{\mat{T}}\pprev{\vec{v}_r}\Dt.\]

For the normal component, non-incremental evaluation is preferred, giving

\[\curr{\vec{u}_x}=|\curr{\vec{x}_2}-\curr{\vec{x}_1}|-(r_1+r_2)\]

If this functor is called for L6Geom, local rotation is updated as

\[\curr{\vec{\phi}}=\prev{\vec{\phi}}+\pprev{\mat{T}}\Dt(\vec{\omega}_2-\vec{\omega}_1)\]
class yade.wrapper.Ig2_Sphere_Sphere_L6Geom(inherits Ig2_Sphere_Sphere_L3Geom IGeomFunctor Functor Serializable)

Incrementally compute L6Geom for contact of 2 spheres.

class yade.wrapper.Ig2_Sphere_Sphere_ScGeom(inherits IGeomFunctor Functor Serializable)

Create/update a ScGeom instance representing the geometry of a contact point between two Spheres s.

class yade.wrapper.Ig2_Sphere_Sphere_ScGeom6D(inherits Ig2_Sphere_Sphere_ScGeom IGeomFunctor Functor Serializable)

Create/update a ScGeom6D instance representing the geometry of a contact point between two Spheres, including relative rotations.

class yade.wrapper.Ig2_Tetra_Tetra_TTetraGeom(inherits IGeomFunctor Functor Serializable)

Create/update geometry of collision between 2 tetrahedra (TTetraGeom instance)

class yade.wrapper.Ig2_Tetra_Tetra_TTetraSimpleGeom(inherits IGeomFunctor Functor Serializable)

EXPERIMANTAL. Create/update geometry of collision between 2 tetrahedra (TTetraSimpleGeom instance)

class yade.wrapper.Ig2_Wall_LevelSet_ScGeom(inherits IGeomFunctor Functor Serializable)

Creates or updates a ScGeom instance representing the intersection of one LevelSet body with one Wall body, where overlap is chosen to occur on the opposite wall side than the LevelSet body’s center. Contact normal is given by the wall normal while overlap and contact points are defined likewise to Ig2_LevelSet_LevelSet_ScGeom.

class yade.wrapper.Ig2_Wall_PFacet_ScGeom(inherits Ig2_Wall_Sphere_ScGeom IGeomFunctor Functor Serializable)

Create/update a ScGeom instance representing intersection of Wall and PFacet.

class yade.wrapper.Ig2_Wall_Polyhedra_PolyhedraGeom(inherits IGeomFunctor Functor Serializable)

Create/update geometry of collision between Wall and Polyhedra

class yade.wrapper.Ig2_Wall_Sphere_L3Geom(inherits Ig2_Sphere_Sphere_L3Geom IGeomFunctor Functor Serializable)

Incrementally compute L3Geom for contact between Wall and Sphere. Uses attributes of Ig2_Sphere_Sphere_L3Geom.

class yade.wrapper.Ig2_Wall_Sphere_ScGeom(inherits IGeomFunctor Functor Serializable)

Create/update a ScGeom instance representing intersection of Wall and Sphere. The equivalent radius for the Wall (ScGeom.refR1) is chosen equal to the Sphere’s radius.

IGeomDispatcher

class yade.wrapper.IGeomDispatcher(inherits Dispatcher Engine Serializable)

Dispatcher calling functors based on received argument type(s).

Interaction Physics creation

IPhysFunctor

digraph IPhysFunctor {
        rankdir=RL;
        margin="0.2,0.05";
        "IPhysFunctor" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.IPhysFunctor"];
        "Ip2_ViscElCapMat_ViscElCapMat_ViscElCapPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ip2_ViscElCapMat_ViscElCapMat_ViscElCapPhys"];
        "Ip2_ViscElCapMat_ViscElCapMat_ViscElCapPhys" -> "Ip2_ViscElMat_ViscElMat_ViscElPhys" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ip2_FrictMat_FrictViscoMat_FrictViscoPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ip2_FrictMat_FrictViscoMat_FrictViscoPhys"];
        "Ip2_FrictMat_FrictViscoMat_FrictViscoPhys" -> "IPhysFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ip2_WireMat_WireMat_WirePhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ip2_WireMat_WireMat_WirePhys"];
        "Ip2_WireMat_WireMat_WirePhys" -> "IPhysFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ip2_LudingMat_LudingMat_LudingPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ip2_LudingMat_LudingMat_LudingPhys"];
        "Ip2_LudingMat_LudingMat_LudingPhys" -> "IPhysFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ip2_FrictMat_FrictMat_ViscoFrictPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ip2_FrictMat_FrictMat_ViscoFrictPhys"];
        "Ip2_FrictMat_FrictMat_ViscoFrictPhys" -> "Ip2_FrictMat_FrictMat_FrictPhys" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ip2_FrictMat_FrictMat_MindlinCapillaryPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ip2_FrictMat_FrictMat_MindlinCapillaryPhys"];
        "Ip2_FrictMat_FrictMat_MindlinCapillaryPhys" -> "IPhysFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ip2_FrictMat_FrictMat_FrictPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ip2_FrictMat_FrictMat_FrictPhys"];
        "Ip2_FrictMat_FrictMat_FrictPhys" -> "IPhysFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ip2_2xInelastCohFrictMat_InelastCohFrictPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ip2_2xInelastCohFrictMat_InelastCohFrictPhys"];
        "Ip2_2xInelastCohFrictMat_InelastCohFrictPhys" -> "IPhysFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ip2_FrictMatCDM_FrictMatCDM_MindlinPhysCDM" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ip2_FrictMatCDM_FrictMatCDM_MindlinPhysCDM"];
        "Ip2_FrictMatCDM_FrictMatCDM_MindlinPhysCDM" -> "IPhysFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ip2_CohFrictMat_CohFrictMat_CohFrictPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ip2_CohFrictMat_CohFrictMat_CohFrictPhys"];
        "Ip2_CohFrictMat_CohFrictMat_CohFrictPhys" -> "IPhysFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ip2_PolyhedraMat_PolyhedraMat_PolyhedraPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ip2_PolyhedraMat_PolyhedraMat_PolyhedraPhys"];
        "Ip2_PolyhedraMat_PolyhedraMat_PolyhedraPhys" -> "IPhysFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ip2_FrictViscoMat_FrictViscoMat_FrictViscoPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ip2_FrictViscoMat_FrictViscoMat_FrictViscoPhys"];
        "Ip2_FrictViscoMat_FrictViscoMat_FrictViscoPhys" -> "IPhysFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ip2_FrictMat_FrictMat_CapillaryPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ip2_FrictMat_FrictMat_CapillaryPhys"];
        "Ip2_FrictMat_FrictMat_CapillaryPhys" -> "IPhysFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ip2_FrictMat_FrictMat_MindlinPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ip2_FrictMat_FrictMat_MindlinPhys"];
        "Ip2_FrictMat_FrictMat_MindlinPhys" -> "IPhysFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ip2_FrictMat_FrictMatCDM_MindlinPhysCDM" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ip2_FrictMat_FrictMatCDM_MindlinPhysCDM"];
        "Ip2_FrictMat_FrictMatCDM_MindlinPhysCDM" -> "IPhysFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ip2_CpmMat_CpmMat_CpmPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ip2_CpmMat_CpmMat_CpmPhys"];
        "Ip2_CpmMat_CpmMat_CpmPhys" -> "IPhysFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ip2_FrictMat_CpmMat_FrictPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ip2_FrictMat_CpmMat_FrictPhys"];
        "Ip2_FrictMat_CpmMat_FrictPhys" -> "IPhysFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ip2_ElastMat_ElastMat_NormPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ip2_ElastMat_ElastMat_NormPhys"];
        "Ip2_ElastMat_ElastMat_NormPhys" -> "IPhysFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ip2_ElastMat_ElastMat_NormShearPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ip2_ElastMat_ElastMat_NormShearPhys"];
        "Ip2_ElastMat_ElastMat_NormShearPhys" -> "IPhysFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ip2_ViscElMat_ViscElMat_ViscElPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ip2_ViscElMat_ViscElMat_ViscElPhys"];
        "Ip2_ViscElMat_ViscElMat_ViscElPhys" -> "IPhysFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ip2_BubbleMat_BubbleMat_BubblePhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ip2_BubbleMat_BubbleMat_BubblePhys"];
        "Ip2_BubbleMat_BubbleMat_BubblePhys" -> "IPhysFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ip2_FrictMat_FrictMat_LubricationPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ip2_FrictMat_FrictMat_LubricationPhys"];
        "Ip2_FrictMat_FrictMat_LubricationPhys" -> "IPhysFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ip2_JCFpmMat_JCFpmMat_JCFpmPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ip2_JCFpmMat_JCFpmMat_JCFpmPhys"];
        "Ip2_JCFpmMat_JCFpmMat_JCFpmPhys" -> "IPhysFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ip2_MortarMat_MortarMat_MortarPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ip2_MortarMat_MortarMat_MortarPhys"];
        "Ip2_MortarMat_MortarMat_MortarPhys" -> "IPhysFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ip2_FrictMat_PolyhedraMat_FrictPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ip2_FrictMat_PolyhedraMat_FrictPhys"];
        "Ip2_FrictMat_PolyhedraMat_FrictPhys" -> "IPhysFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ip2_PartialSatMat_PartialSatMat_MindlinPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ip2_PartialSatMat_PartialSatMat_MindlinPhys"];
        "Ip2_PartialSatMat_PartialSatMat_MindlinPhys" -> "IPhysFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Ip2_FrictMat_FrictMat_KnKsPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Ip2_FrictMat_FrictMat_KnKsPhys"];
        "Ip2_FrictMat_FrictMat_KnKsPhys" -> "IPhysFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
}

Inheritance graph of IPhysFunctor.

class yade.wrapper.IPhysFunctor(inherits Functor Serializable)

Functor for creating/updating Interaction::phys objects from bodies’ material properties.

class yade.wrapper.Ip2_2xInelastCohFrictMat_InelastCohFrictPhys(inherits IPhysFunctor Functor Serializable)

Generates cohesive-frictional interactions with moments. Used in the contact law Law2_ScGeom6D_InelastCohFrictPhys_CohesionMoment.

class yade.wrapper.Ip2_BubbleMat_BubbleMat_BubblePhys(inherits IPhysFunctor Functor Serializable)

Generates bubble interactions.Used in the contact law Law2_ScGeom_BubblePhys_Bubble.

class yade.wrapper.Ip2_CohFrictMat_CohFrictMat_CohFrictPhys(inherits IPhysFunctor Functor Serializable)

Generates cohesive-frictional interactions with moments, used in the contact law Law2_ScGeom6D_CohFrictPhys_CohesionMoment. The normal/shear stiffness and friction definitions are the same as in Ip2_FrictMat_FrictMat_FrictPhys, check the documentation there for details.

Adhesions related to the normal and the shear components are calculated from CohFrictMat::normalCohesion (\(C_n\)) and CohFrictMat::shearCohesion (\(C_s\)). For particles of size \(R_1\),\(R_2\) the adhesion will be \(a_i=C_i min(R_1,R_2)^2\), \(i=n,s\).

Twist and rolling stiffnesses are proportional to the shear stiffness through dimensionless factors alphaKtw and alphaKr, such that the rotational stiffnesses are defined by \(k_s \alpha_i R_1 R_2\), \(i=tw\,r\)

class yade.wrapper.Ip2_CpmMat_CpmMat_CpmPhys(inherits IPhysFunctor Functor Serializable)

Convert 2 CpmMat instances to CpmPhys with corresponding parameters. Uses simple (arithmetic) averages if material are different. Simple copy of parameters is performed if the material is shared between both particles. See cpm-model for detals.

class yade.wrapper.Ip2_ElastMat_ElastMat_NormPhys(inherits IPhysFunctor Functor Serializable)

Create a NormPhys from two ElastMats. TODO. EXPERIMENTAL

class yade.wrapper.Ip2_ElastMat_ElastMat_NormShearPhys(inherits IPhysFunctor Functor Serializable)

Create a NormShearPhys from two ElastMats. TODO. EXPERIMENTAL

class yade.wrapper.Ip2_FrictMatCDM_FrictMatCDM_MindlinPhysCDM(inherits IPhysFunctor Functor Serializable)

Create a MindlinPhysCDM from two FrictMatCDMsExts.

class yade.wrapper.Ip2_FrictMat_CpmMat_FrictPhys(inherits IPhysFunctor Functor Serializable)

Convert CpmMat instance and FrictMat instance to FrictPhys with corresponding parameters (young, poisson, frictionAngle). Uses simple (arithmetic) averages if material parameters are different.

class yade.wrapper.Ip2_FrictMat_FrictMatCDM_MindlinPhysCDM(inherits IPhysFunctor Functor Serializable)

Create a MindlinPhysCDM from one FrictMat and one FrictMatCDM instance.

class yade.wrapper.Ip2_FrictMat_FrictMat_CapillaryPhys(inherits IPhysFunctor Functor Serializable)

RelationShips to use with Law2_ScGeom_CapillaryPhys_Capillarity.

In these RelationShips all the interaction attributes are computed.

Warning

as in the others Ip2 functors, most of the attributes are computed only once, when the interaction is new.

class yade.wrapper.Ip2_FrictMat_FrictMat_FrictPhys(inherits IPhysFunctor Functor Serializable)

Create a FrictPhys from two FrictMats. The compliance of one sphere under point load is defined here as \(1/(E.D)\), with \(E\) the stiffness of the sphere and \(D\) its diameter. The compliance of the contact itself is taken as the sum of compliances from each sphere, i.e. \(1/(E_1.D_1)+1/(E_2.D_2)\) in the general case, or \(2/(E.D)\) in the special case of equal sizes and equal stiffness. Note that summing compliances is equivalent to summing the harmonic average of stiffnesses. This reasoning is applied in both the normal and the tangential directions (as in e.g. [Scholtes2009a]), hence the general form of the contact stiffness:

\(k = \frac{E_1D_1*E_2D_2}{E_1D_1+E_2D_2}=\frac{k_1*k_2}{k_1+k_2}\), with \(k_i=E_iD_i\).

In the above equation \(E_i\) is taken equal to FrictMat::young of sphere \(i\) for the normal stiffness, and FrictMat::young \(\times\) ElastMat::poisson for the shear stiffness. In the case of a contact between a ViscElMat and a FrictMat, be sure to set FrictMat::young and FrictMat::poisson, otherwise the default value will be used.

The contact friction is defined according to Ip2_FrictMat_FrictMat_FrictPhys::frictAngle (minimum of the two materials by default).

class yade.wrapper.Ip2_FrictMat_FrictMat_KnKsPhys(inherits IPhysFunctor Functor Serializable)

EXPERIMENTAL. Ip2 functor for KnKsPhys

class yade.wrapper.Ip2_FrictMat_FrictMat_LubricationPhys(inherits IPhysFunctor Functor Serializable)

Ip2 creating LubricationPhys from two Material instances.

class yade.wrapper.Ip2_FrictMat_FrictMat_MindlinCapillaryPhys(inherits IPhysFunctor Functor Serializable)

RelationShips to use with Law2_ScGeom_CapillaryPhys_Capillarity

In these RelationShips all the interaction attributes are computed.

Warning

as in the others Ip2 functors, most of the attributes are computed only once, when the interaction is new.

class yade.wrapper.Ip2_FrictMat_FrictMat_MindlinPhys(inherits IPhysFunctor Functor Serializable)

Calculate some physical parameters needed to obtain the normal and shear stiffnesses according to the Hertz-Mindlin formulation (as implemented in PFC). The viscous damping coefficients \(c_n\), \(c_s\) can be specified either using viscous damping ratios (\(\beta_n\), \(\beta_s\)) or coefficients of restitution (\(e_n\), \(e_s\)).

# If the viscous damping ratio \(\beta_n\) (\(\beta_s\)) is given, it is assigned directly to MindlinPhys.betan (MindlinPhys.betas) and the viscous damping coefficient is calculated as \(c_n=2 \cdot \beta_n \cdot \sqrt{m_{bar} \cdot k_n}\) (\(c_s=2 \cdot \beta_s \cdot \sqrt{m_{bar} \cdot k_s}\)), where \(k_n\) (\(k_s\)) the tangential normal (shear) stiffness. Replacing \(k_n=3/2 \cdot k_{no} \cdot {u_{N}}^{0.5}\) (\(k_s=k_{so} \cdot {u_{N}}^{0.5}\)) and \(k_{no}=4/3 \cdot E \cdot \sqrt{R}\) (\(k_{so}=2 \cdot \sqrt{4 \cdot R} \cdot G/(2-\nu)\)), we get \(c_n=2 \cdot \beta_n \cdot \sqrt{m_{bar}} \cdot \sqrt{2 \cdot E \cdot \sqrt{R}}\cdot {u_{N}}^{0.25}\) (\(c_s=2 \cdot \beta_s \cdot \sqrt{m_{bar}} \cdot \sqrt{4 \cdot \sqrt{R} \cdot G/(2-\nu)} \cdot {u_N}^{0.25}\)), where \(m_{bar}\), \(R\), \(E\), \(G\) the effective mass and mean radius, elastic and shear moduli of the interacting particles.

# If the coefficient of restitution \(e_n\) is given instead, the normal viscous damping ratio is computed using \(\beta_n=-(\log e_n)/\sqrt{\pi^2+(\log e_n)^2}\). The shear coefficient of restitution is considered as \(e_s=e_n\) and the viscous damping coefficient is calculated as \(c_n=c_s=\alpha \cdot \sqrt{m_{bar}} \cdot {u_{N}}^{0.25}\), where \(\alpha=2 \cdot \sqrt{5/6} \cdot \beta_n \cdot \sqrt{2 \cdot E \cdot \sqrt{R}}\), i.e. \(c_n=c_s=2 \cdot \sqrt{5/6} \cdot \beta_n \cdot \sqrt{m_{bar}} \cdot \sqrt{2 \cdot E \cdot \sqrt{R}} \cdot {u_{N}}^{0.25}\).

In both cases, the viscous forces are calculated as \(F_{n,viscous}=c_n \cdot v_n\) (\(F_{s,viscous}=c_s \cdot v_s\)), where \(v_n\) (\(v_s\)) the normal (shear) component of the relative velocity. The following rules apply:

# If \(\beta_n\) and \(\beta_s\) are used, then MindlinPhys.alpha =0; if \(e_n\) is defined instead, then MindlinPhys.betan = MindlinPhys.betan =0.0.

# It is an error (exception) to specify both \(e_n\) and \(\beta_n\) (\(e_s\) and \(\beta_s\)).

# If neither \(e_n\) nor \(\beta_n\) is given, zero value for MindlinPhys.betan is used; there will be no viscous effects.

# If neither \(e_s\) nor \(\beta_s\) is given, the value of MindlinPhys.betan is used for MindlinPhys.betas as well.

# To consider different viscous coefficients in the normal and shear contact directions, use \(\beta_n\), \(\beta_s\), instead of \(e_n\).

The \(e_n\), \(\beta_n\), \(e_s\), \(\beta_s\) are MatchMaker objects; they can be constructed from float values to always return constant values. See scripts/examples/spheresFactory.py for an example of specifying \(e_n\) based on combination of parameters, for different materials in contact.

class yade.wrapper.Ip2_FrictMat_FrictMat_ViscoFrictPhys(inherits Ip2_FrictMat_FrictMat_FrictPhys IPhysFunctor Functor Serializable)

Create a FrictPhys from two FrictMats. The compliance of one sphere under symetric point loads is defined here as 1/(E.r), with E the stiffness of the sphere and r its radius, and corresponds to a compliance 1/(2.E.r)=1/(E.D) from each contact point. The compliance of the contact itself will be the sum of compliances from each sphere, i.e. 1/(E.D1)+1/(E.D2) in the general case, or 1/(E.r) in the special case of equal sizes. Note that summing compliances corresponds to an harmonic average of stiffnesss, which is how kn is actually computed in the Ip2_FrictMat_FrictMat_FrictPhys functor.

The shear stiffness ks of one sphere is defined via the material parameter ElastMat::poisson, as ks=poisson*kn, and the resulting shear stiffness of the interaction will be also an harmonic average.

class yade.wrapper.Ip2_FrictMat_FrictViscoMat_FrictViscoPhys(inherits IPhysFunctor Functor Serializable)

Converts a FrictMat and FrictViscoMat instance to FrictViscoPhys with corresponding parameters. Basically this functor corresponds to Ip2_FrictMat_FrictMat_FrictPhys with the only difference that damping in normal direction can be considered.

class yade.wrapper.Ip2_FrictMat_PolyhedraMat_FrictPhys(inherits IPhysFunctor Functor Serializable)
class yade.wrapper.Ip2_FrictViscoMat_FrictViscoMat_FrictViscoPhys(inherits IPhysFunctor Functor Serializable)

Converts 2 FrictViscoMat instances to FrictViscoPhys with corresponding parameters. Basically this functor corresponds to Ip2_FrictMat_FrictMat_FrictPhys with the only difference that damping in normal direction can be considered.

class yade.wrapper.Ip2_JCFpmMat_JCFpmMat_JCFpmPhys(inherits IPhysFunctor Functor Serializable)

Converts 2 JCFpmMat instances to one JCFpmPhys instance, with corresponding parameters. See JCFpmMat and [Duriez2016] for details

class yade.wrapper.Ip2_LudingMat_LudingMat_LudingPhys(inherits IPhysFunctor Functor Serializable)

Convert 2 instances of LudingMat to LudingPhys using the rule of consecutive connection.

class yade.wrapper.Ip2_MortarMat_MortarMat_MortarPhys(inherits IPhysFunctor Functor Serializable)

Ip2 creating MortarPhys from two MortarMat instances.

class yade.wrapper.Ip2_PartialSatMat_PartialSatMat_MindlinPhys(inherits IPhysFunctor Functor Serializable)

PartialSat variant of HertzMindlin

Calculate some physical parameters needed to obtain the normal and shear stiffnesses according to the Hertz-Mindlin formulation (as implemented in PFC).

Viscous parameters can be specified either using coefficients of restitution (\(e_n\), \(e_s\)) or viscous damping ratio (\(\beta_n\), \(\beta_s\)). The following rules apply: #. If the \(\beta_n\) (\(\beta_s\)) ratio is given, it is assigned to MindlinPhys.betan (MindlinPhys.betas) directly. #. If \(e_n\) is given, MindlinPhys.betan is computed using \(\beta_n=-(\log e_n)/\sqrt{\pi^2+(\log e_n)^2}\). The same applies to \(e_s\), MindlinPhys.betas. #. It is an error (exception) to specify both \(e_n\) and \(\beta_n\) (\(e_s\) and \(\beta_s\)). #. If neither \(e_n\) nor \(\beta_n\) is given, zero value for MindlinPhys.betan is used; there will be no viscous effects. #.If neither \(e_s\) nor \(\beta_s\) is given, the value of MindlinPhys.betan is used for MindlinPhys.betas as well.

The \(e_n\), \(\beta_n\), \(e_s\), \(\beta_s\) are MatchMaker objects; they can be constructed from float values to always return constant value.

See scripts/test/shots.py for an example of specifying \(e_n\) based on combination of parameters.

class yade.wrapper.Ip2_PolyhedraMat_PolyhedraMat_PolyhedraPhys(inherits IPhysFunctor Functor Serializable)

Computes the interaction properties from the material properties of the two interacting bodies 1,2. Contact friction angle is taken as the minimum of the two frictionAngle, and contact stiffnesses kn and ks obey \(1/k_n = 1/Y_1 + 1/Y_2\) and \(1/k_s = 1/(Y_1 P_1) + 1/(Y_2 P_2)\), with \(Y_i\) and \(P_i\) corresponding to young and poisson for 1 and 2. The unit system to interpret these equations and quantities depend on Law2_PolyhedraGeom_PolyhedraPhys_Volumetric.volumePower.

class yade.wrapper.Ip2_ViscElCapMat_ViscElCapMat_ViscElCapPhys(inherits Ip2_ViscElMat_ViscElMat_ViscElPhys IPhysFunctor Functor Serializable)

Convert 2 instances of ViscElCapMat to ViscElCapPhys using the rule of consecutive connection.

class yade.wrapper.Ip2_ViscElMat_ViscElMat_ViscElPhys(inherits IPhysFunctor Functor Serializable)

Convert 2 instances of ViscElMat to ViscElPhys using the rule of consecutive connection.

class yade.wrapper.Ip2_WireMat_WireMat_WirePhys(inherits IPhysFunctor Functor Serializable)

Converts 2 WireMat instances to WirePhys with corresponding parameters.

IPhysDispatcher

class yade.wrapper.IPhysDispatcher(inherits Dispatcher Engine Serializable)

Dispatcher calling functors based on received argument type(s).

Constitutive laws

LawFunctor

digraph LawFunctor {
        rankdir=RL;
        margin="0.2,0.05";
        "LawFunctor" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.LawFunctor"];
        "Law2_ChCylGeom6D_CohFrictPhys_CohesionMoment" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_ChCylGeom6D_CohFrictPhys_CohesionMoment"];
        "Law2_ChCylGeom6D_CohFrictPhys_CohesionMoment" -> "LawFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_ScGeom_MindlinPhysCDM_HertzMindlinCDM" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_ScGeom_MindlinPhysCDM_HertzMindlinCDM"];
        "Law2_ScGeom_MindlinPhysCDM_HertzMindlinCDM" -> "LawFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_PolyhedraGeom_PolyhedraPhys_Volumetric" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_PolyhedraGeom_PolyhedraPhys_Volumetric"];
        "Law2_PolyhedraGeom_PolyhedraPhys_Volumetric" -> "LawFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_GridCoGridCoGeom_FrictPhys_CundallStrack" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_GridCoGridCoGeom_FrictPhys_CundallStrack"];
        "Law2_GridCoGridCoGeom_FrictPhys_CundallStrack" -> "Law2_ScGeom_FrictPhys_CundallStrack" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_ScGeom6D_InelastCohFrictPhys_CohesionMoment" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_ScGeom6D_InelastCohFrictPhys_CohesionMoment"];
        "Law2_ScGeom6D_InelastCohFrictPhys_CohesionMoment" -> "LawFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_CylScGeom_FrictPhys_CundallStrack" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_CylScGeom_FrictPhys_CundallStrack"];
        "Law2_CylScGeom_FrictPhys_CundallStrack" -> "LawFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_ScGeom_PotentialLubricationPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_ScGeom_PotentialLubricationPhys"];
        "Law2_ScGeom_PotentialLubricationPhys" -> "Law2_ScGeom_ImplicitLubricationPhys" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_L3Geom_FrictPhys_ElPerfPl" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_L3Geom_FrictPhys_ElPerfPl"];
        "Law2_L3Geom_FrictPhys_ElPerfPl" -> "LawFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_ScGeom_CpmPhys_Cpm" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_ScGeom_CpmPhys_Cpm"];
        "Law2_ScGeom_CpmPhys_Cpm" -> "LawFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_ScGeom_ViscElPhys_Basic" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_ScGeom_ViscElPhys_Basic"];
        "Law2_ScGeom_ViscElPhys_Basic" -> "LawFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_ScGeom_ImplicitLubricationPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_ScGeom_ImplicitLubricationPhys"];
        "Law2_ScGeom_ImplicitLubricationPhys" -> "Law2_ScGeom_VirtualLubricationPhys" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_ScGeom6D_CohFrictPhys_CohesionMoment" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_ScGeom6D_CohFrictPhys_CohesionMoment"];
        "Law2_ScGeom6D_CohFrictPhys_CohesionMoment" -> "LawFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_ScGeom_WirePhys_WirePM" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_ScGeom_WirePhys_WirePM"];
        "Law2_ScGeom_WirePhys_WirePM" -> "LawFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_L6Geom_FrictPhys_Linear" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_L6Geom_FrictPhys_Linear"];
        "Law2_L6Geom_FrictPhys_Linear" -> "Law2_L3Geom_FrictPhys_ElPerfPl" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_ScGeom_MindlinPhys_MindlinDeresiewitz" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_ScGeom_MindlinPhys_MindlinDeresiewitz"];
        "Law2_ScGeom_MindlinPhys_MindlinDeresiewitz" -> "LawFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_ScGeom_BubblePhys_Bubble" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_ScGeom_BubblePhys_Bubble"];
        "Law2_ScGeom_BubblePhys_Bubble" -> "LawFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_ScGeom_VirtualLubricationPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_ScGeom_VirtualLubricationPhys"];
        "Law2_ScGeom_VirtualLubricationPhys" -> "LawFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_TTetraSimpleGeom_NormPhys_Simple" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_TTetraSimpleGeom_NormPhys_Simple"];
        "Law2_TTetraSimpleGeom_NormPhys_Simple" -> "LawFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_ScGeom_LudingPhys_Basic" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_ScGeom_LudingPhys_Basic"];
        "Law2_ScGeom_LudingPhys_Basic" -> "LawFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_ScGeom_FrictViscoPhys_CundallStrackVisco" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_ScGeom_FrictViscoPhys_CundallStrackVisco"];
        "Law2_ScGeom_FrictViscoPhys_CundallStrackVisco" -> "LawFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_ScGeom_MindlinPhys_HertzWithLinearShear" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_ScGeom_MindlinPhys_HertzWithLinearShear"];
        "Law2_ScGeom_MindlinPhys_HertzWithLinearShear" -> "LawFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_ScGeom_MortarPhys_Lourenco" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_ScGeom_MortarPhys_Lourenco"];
        "Law2_ScGeom_MortarPhys_Lourenco" -> "LawFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_ScGeom_JCFpmPhys_JointedCohesiveFrictionalPM" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_ScGeom_JCFpmPhys_JointedCohesiveFrictionalPM"];
        "Law2_ScGeom_JCFpmPhys_JointedCohesiveFrictionalPM" -> "LawFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_ScGeom_FrictPhys_CundallStrack" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_ScGeom_FrictPhys_CundallStrack"];
        "Law2_ScGeom_FrictPhys_CundallStrack" -> "LawFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_ScGeom_ViscElCapPhys_Basic" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_ScGeom_ViscElCapPhys_Basic"];
        "Law2_ScGeom_ViscElCapPhys_Basic" -> "LawFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_ScGridCoGeom_CohFrictPhys_CundallStrack" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_ScGridCoGeom_CohFrictPhys_CundallStrack"];
        "Law2_ScGridCoGeom_CohFrictPhys_CundallStrack" -> "LawFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_ScGeom_ViscoFrictPhys_CundallStrack" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_ScGeom_ViscoFrictPhys_CundallStrack"];
        "Law2_ScGeom_ViscoFrictPhys_CundallStrack" -> "Law2_ScGeom_FrictPhys_CundallStrack" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_SCG_KnKsPhys_KnKsLaw" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_SCG_KnKsPhys_KnKsLaw"];
        "Law2_SCG_KnKsPhys_KnKsLaw" -> "LawFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_CylScGeom6D_CohFrictPhys_CohesionMoment" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_CylScGeom6D_CohFrictPhys_CohesionMoment"];
        "Law2_CylScGeom6D_CohFrictPhys_CohesionMoment" -> "LawFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_ScGridCoGeom_FrictPhys_CundallStrack" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_ScGridCoGeom_FrictPhys_CundallStrack"];
        "Law2_ScGridCoGeom_FrictPhys_CundallStrack" -> "LawFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Law2_ScGeom_MindlinPhys_Mindlin" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Law2_ScGeom_MindlinPhys_Mindlin"];
        "Law2_ScGeom_MindlinPhys_Mindlin" -> "LawFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
}

Inheritance graph of LawFunctor.

class yade.wrapper.LawFunctor(inherits Functor Serializable)

Functor for applying constitutive laws on interactions.

class yade.wrapper.Law2_ChCylGeom6D_CohFrictPhys_CohesionMoment(inherits LawFunctor Functor Serializable)

Law for linear compression, and Mohr-Coulomb plasticity surface without cohesion. This law implements the classical linear elastic-plastic law from [CundallStrack1979] (see also [Pfc3dManual30]). The normal force is (with the convention of positive tensile forces) \(F_n=\min(k_n u_n, 0)\). The shear force is \(F_s=k_s u_s\), the plasticity condition defines the maximum value of the shear force : \(F_s^{\max}=F_n\tan(\phi)\), with \(\phi\) the friction angle.

Note

This law is well tested in the context of triaxial simulation, and has been used for a number of published results (see e.g. [Scholtes2009b] and other papers from the same authors). It is generalised by Law2_ScGeom6D_CohFrictPhys_CohesionMoment, which adds cohesion and moments at contact.

class yade.wrapper.Law2_CylScGeom6D_CohFrictPhys_CohesionMoment(inherits LawFunctor Functor Serializable)

This law generalises Law2_CylScGeom_FrictPhys_CundallStrack by adding cohesion and moments at contact.

class yade.wrapper.Law2_CylScGeom_FrictPhys_CundallStrack(inherits LawFunctor Functor Serializable)

Law for linear compression, and Mohr-Coulomb plasticity surface without cohesion. This law implements the classical linear elastic-plastic law from [CundallStrack1979] (see also [Pfc3dManual30]). The normal force is (with the convention of positive tensile forces) \(F_n=\min(k_n u_n, 0)\). The shear force is \(F_s=k_s u_s\), the plasticity condition defines the maximum value of the shear force : \(F_s^{\max}=F_n\tan(\phi)\), with \(\phi\) the friction angle.

Note

This law uses ScGeom.

Note

This law is well tested in the context of triaxial simulation, and has been used for a number of published results (see e.g. [Scholtes2009b] and other papers from the same authors). It is generalised by Law2_ScGeom6D_CohFrictPhys_CohesionMoment, which adds cohesion and moments at contact.

class yade.wrapper.Law2_GridCoGridCoGeom_FrictPhys_CundallStrack(inherits Law2_ScGeom_FrictPhys_CundallStrack LawFunctor Functor Serializable)

Frictional elastic contact law between two gridConnection . See Law2_ScGeom_FrictPhys_CundallStrack for more details.

class yade.wrapper.Law2_L3Geom_FrictPhys_ElPerfPl(inherits LawFunctor Functor Serializable)

Basic law for testing L3Geom; it bears no cohesion (unless noBreak is True), and plastic slip obeys the Mohr-Coulomb criterion (unless noSlip is True).

class yade.wrapper.Law2_L6Geom_FrictPhys_Linear(inherits Law2_L3Geom_FrictPhys_ElPerfPl LawFunctor Functor Serializable)

Basic law for testing L6Geom – linear in both normal and shear sense, without slip or breakage.

class yade.wrapper.Law2_PolyhedraGeom_PolyhedraPhys_Volumetric(inherits LawFunctor Functor Serializable)

Calculate physical response of 2 Polyhedra in interaction, based on penetration configuration given by PolyhedraGeom. Normal force is proportional to the volume of intersection

class yade.wrapper.Law2_SCG_KnKsPhys_KnKsLaw(inherits LawFunctor Functor Serializable)

Law for linear compression, without cohesion and Mohr-Coulomb plasticity surface.

Note

This law uses ScGeom; there is also functionally equivalent Law2_Dem3DofGeom_FrictPhys_Basic, which uses Dem3DofGeom (sphere-box interactions are not implemented for the latest).

class yade.wrapper.Law2_ScGeom6D_CohFrictPhys_CohesionMoment(inherits LawFunctor Functor Serializable)

Law for linear traction-compression-bending-twisting, with cohesion+friction and Mohr-Coulomb plasticity surface. This law adds adhesion and moments to Law2_ScGeom_FrictPhys_CundallStrack.

The normal force is (with the convention of positive tensile forces) \(F_n=min(k_n*(u_n-u_n^p), a_n)\), with \(a_n\) the normal adhesion and \(u_n^p\) the plastic part of normal displacement. The shear force is \(F_s=k_s*u_s\), the plasticity condition defines the maximum value of the shear force, by default \(F_s^{max}=F_n*tan(\phi)+a_s\), with \(\phi\) the friction angle and \(a_s\) the shear adhesion. If CohFrictPhys::cohesionDisablesFriction is True, friction is ignored as long as adhesion is active, and the maximum shear force is only \(F_s^{max}=a_s\).

If the maximum tensile or maximum shear force is reached and CohFrictPhys::fragile =True (default), the cohesive link is broken, and \(a_n, a_s\) are set back to zero. If a tensile force is present, the contact is lost, else the shear strength is \(F_s^{max}=F_n*tan(\phi)\). If CohFrictPhys::fragile =False, the behaviour is perfectly plastic, and the shear strength is kept constant.

If Law2_ScGeom6D_CohFrictPhys_CohesionMoment::momentRotationLaw =True, bending and twisting moments are computed using a linear law with moduli respectively \(k_t\) and \(k_r\), so that the moments are : \(M_b=k_b*\Theta_b\) and \(M_t=k_t*\Theta_t\), with \(\Theta_{b,t}\) the relative rotations between interacting bodies (details can be found in [Bourrier2013]). The maximum value of moments can be defined and takes the form of rolling friction. Cohesive -type moment may also be included in the future.

Creep at contact is implemented in this law, as defined in [Hassan2010]. If activated, there is a viscous behaviour of the shear and twisting components, and the evolution of the elastic parts of shear displacement and relative twist is given by \(du_{s,e}/dt=-F_s/\nu_s\) and \(d\Theta_{t,e}/dt=-M_t/\nu_t\).

class yade.wrapper.Law2_ScGeom6D_InelastCohFrictPhys_CohesionMoment(inherits LawFunctor Functor Serializable)

This law is currently under developpement. Final version and documentation will come before the end of 2014.

class yade.wrapper.Law2_ScGeom_BubblePhys_Bubble(inherits LawFunctor Functor Serializable)

Constitutive law for Bubble model.

class yade.wrapper.Law2_ScGeom_CpmPhys_Cpm(inherits LawFunctor Functor Serializable)

Constitutive law for the cpm-model.

class yade.wrapper.Law2_ScGeom_FrictPhys_CundallStrack(inherits LawFunctor Functor Serializable)

Law for linear compression, and Mohr-Coulomb plasticity surface without cohesion. This law implements the classical linear elastic-plastic law from [CundallStrack1979] (see also [Pfc3dManual30]). The normal force is (with the convention of positive tensile forces) \(F_n=\min(k_n u_n, 0)\). The shear force is \(F_s=k_s u_s\), the plasticity condition defines the maximum value of the shear force : \(F_s^{\max}=F_n\tan(\phi)\), with \(\phi\) the friction angle.

This law is well tested in the context of triaxial simulation, and has been used for a number of published results (see e.g. [Scholtes2009b] and other papers from the same authors). It is generalised by Law2_ScGeom6D_CohFrictPhys_CohesionMoment, which adds cohesion and moments at contact.

class yade.wrapper.Law2_ScGeom_FrictViscoPhys_CundallStrackVisco(inherits LawFunctor Functor Serializable)

Constitutive law for the FrictViscoPM. Corresponds to Law2_ScGeom_FrictPhys_CundallStrack with the only difference that viscous damping in normal direction can be considered.

class yade.wrapper.Law2_ScGeom_ImplicitLubricationPhys(inherits Law2_ScGeom_VirtualLubricationPhys LawFunctor Functor Serializable)

Material law for lubrication and contact between two spheres, solved using implicit method. The full description of this contact law is available in [Chevremont2020] . Several resolution methods are available. Iterative exact, solving the 2nd order polynomia. Other resolutions methods are numerical (Newton-Rafson and Dichotomy) with a variable change \(\delta=\log(u)\), solved in dimentionless coordinates.

class yade.wrapper.Law2_ScGeom_JCFpmPhys_JointedCohesiveFrictionalPM(inherits LawFunctor Functor Serializable)

Interaction law for cohesive frictional material, e.g. rock, possibly presenting joint surfaces, that can be mechanically described with a smooth contact logic [Ivars2011] (implemented in Yade in [Scholtes2012]). See examples/jointedCohesiveFrictionalPM for script examples. Joint surface definitions (through stl meshes or direct definition with gts module) are illustrated there.

class yade.wrapper.Law2_ScGeom_LudingPhys_Basic(inherits LawFunctor Functor Serializable)

Linear viscoelastic model operating on ScGeom and LudingPhys. See [Luding2008] ,[Singh2013]_ for more details.

class yade.wrapper.Law2_ScGeom_MindlinPhysCDM_HertzMindlinCDM(inherits LawFunctor Functor Serializable)

Hertz-Mindlin model extended: Normal direction: conical damage model from Harkness et al. 2016./ Suhr & Six 2017. Tangential direction: stress dependent interparticle friction coefficient, Suhr & Six 2016. Both models can be switched on/off separately. In this version there is NO damping (neither viscous nor linear), NO adhesion and NO calc_energy, NO includeMoment, NO preventGranularRatcheting. NOT tested for periodic simulations.

class yade.wrapper.Law2_ScGeom_MindlinPhys_HertzWithLinearShear(inherits LawFunctor Functor Serializable)

Constitutive law for the Hertz formulation (using MindlinPhys.kno) and linear behavior in shear (using MindlinPhys.kso for stiffness and FrictPhys.tangensOfFrictionAngle).

Note

No viscosity or damping. If you need those, look at Law2_ScGeom_MindlinPhys_Mindlin, which also includes non-linear Mindlin shear.

class yade.wrapper.Law2_ScGeom_MindlinPhys_Mindlin(inherits LawFunctor Functor Serializable)

Constitutive law for the Hertz-Mindlin formulation. It includes non linear elasticity in the normal direction as predicted by Hertz for two non-conforming elastic contact bodies. In the shear direction, instead, it reseambles the simplified case without slip discussed in Mindlin’s paper, where a linear relationship between shear force and tangential displacement is provided. Finally, the Mohr-Coulomb criterion is employed to established the maximum friction force which can be developed at the contact. Moreover, it is also possible to include the effect of linear viscous damping through the definition of the parameters \(\beta_{n}\) and \(\beta_{s}\).

class yade.wrapper.Law2_ScGeom_MindlinPhys_MindlinDeresiewitz(inherits LawFunctor Functor Serializable)

Hertz-Mindlin contact law with partial slip solution, as described in [Thornton1991].

class yade.wrapper.Law2_ScGeom_MortarPhys_Lourenco(inherits LawFunctor Functor Serializable)

Material law for mortar layer according to [Lourenco1994]. The contact behaves elastic until brittle failure when reaching strength envelope. The envelope has three parts.

Tensile with condition \(\sigma_N-f_t\).

Shear part with Mohr-Coulomb condition \(|\sigma_T|+\sigma_N\tan\varphi-c\).

Compressive part with condition \(\sigma_N^2+A^2\sigma_T^2-f_c^2\)

The main idea is to begin simulation with this model and when the contact is broken, to use standard non-cohesive Law2_PolyhedraGeom_PolyhedraPhys_Volumetric.

class yade.wrapper.Law2_ScGeom_PotentialLubricationPhys(inherits Law2_ScGeom_ImplicitLubricationPhys Law2_ScGeom_VirtualLubricationPhys LawFunctor Functor Serializable)

Material law for lubrication + potential between two spheres. The potential model include contact. This material law will solve the system with lubrication and the provided potential.

class yade.wrapper.Law2_ScGeom_VirtualLubricationPhys(inherits LawFunctor Functor Serializable)

Virtual class for sheared lubrication functions. This don’t do any computation and shouldn’t be used directly!

class yade.wrapper.Law2_ScGeom_ViscElCapPhys_Basic(inherits LawFunctor Functor Serializable)

Extended version of Linear viscoelastic model with capillary parameters.

class yade.wrapper.Law2_ScGeom_ViscElPhys_Basic(inherits LawFunctor Functor Serializable)

Linear viscoelastic model operating on ScGeom and ViscElPhys. The contact law is visco-elastic in the normal direction, and visco-elastic frictional in the tangential direction. The normal contact is modelled as a spring of equivalent stiffness \(k_n\), placed in parallel with a viscous damper of equivalent viscosity \(c_n\). As for the tangential contact, it is made of a spring-dashpot system (in parallel with equivalent stiffness \(k_s\) and viscosity \(c_s\)) in serie with a slider of friction coefficient \(\mu = \tan \phi\).

The friction coefficient \(\mu = \tan \phi\) is always evaluated as \(\tan(\min(\phi_1,\phi_2))\), where \(\phi_1\) and \(\phi_2\) are respectively the friction angle of particle 1 and 2. For the other parameters, depending on the material input, the equivalent parameters of the contact (\(K_n\),\(C_n\),\(K_s\),\(C_s\),\(\phi\)) are evaluated differently. In the following, the quantities in parenthesis are the material constant which are precised for each particle. They are then associated to particle 1 and 2 (e.g. \(kn_1\),\(kn_2\),\(cn_1\)…), and should not be confused with the equivalent parameters of the contact (\(K_n\),\(C_n\),\(K_s\),\(C_s\),\(\phi\)).

  • If contact time (tc), normal and tangential restitution coefficient (en,et) are precised, the equivalent parameters are evaluated following the formulation of Pournin [Pournin2001].

  • If normal and tangential stiffnesses (kn, ks) and damping constant (cn,cs) of each particle are precised, the equivalent stiffnesses and damping constants of each contact made of two particles 1 and 2 is made \(A = 2\frac{a_1 a_2}{a_1 + a_2}\), where A is \(K_n\), \(K_s\), \(C_n\) and \(C_s\), and 1 and 2 refer to the value associated to particle 1 and 2.

  • Alternatively it is possible to precise the Young’s modulus (young) and Poisson’s ratio (poisson) instead of the normal and spring constant (kn and ks). In this case, the equivalent parameters are evaluated the same way as the previous case with \(kn_x = E_x d_x\), \(ks_x = v_x kn_x\), where \(E_x\), \(v_x\) and \(d_x\) are Young’s modulus, Poisson’s ratio and diameter of particle x.

  • If Young’s modulus (young), Poisson’s ratio (poisson), normal and tangential restitution coefficient (en,et)are precised, the equivalent stiffnesses are evaluated as previously: \(K_n = 2\frac{kn_1 kn_2}{kn_1 + kn_2}\), \(kn_x = E_x d_x\), \(K_s = 2(ks_1 ks_2)/(ks_1 + ks_2)\), \(ks_x = v kn_x\). The damping constant is computed at each contact in order to fulfill the normal restitution coefficient \(e_n = (en_1 + en_2)/2\). This is achieved resolving numerically equation 21 of [Schwager2007] (There is in fact a mistake in the article from equation 18 to 19, so that there is a change in sign). Be careful in this configuration the tangential restitution coefficient is set to 1 (no tangential damping). This formulation imposes directly the normal restitution coefficient of the collisions instead of the damping constant.

class yade.wrapper.Law2_ScGeom_ViscoFrictPhys_CundallStrack(inherits Law2_ScGeom_FrictPhys_CundallStrack LawFunctor Functor Serializable)

Law similar to Law2_ScGeom_FrictPhys_CundallStrack with the addition of shear creep at contacts.

class yade.wrapper.Law2_ScGeom_WirePhys_WirePM(inherits LawFunctor Functor Serializable)

Constitutive law for the wire model.

class yade.wrapper.Law2_ScGridCoGeom_CohFrictPhys_CundallStrack(inherits LawFunctor Functor Serializable)

Law between a cohesive frictional GridConnection and a cohesive frictional Sphere. Almost the same than Law2_ScGeom6D_CohFrictPhys_CohesionMoment, but THE ROTATIONAL MOMENTS ARE NOT COMPUTED.

class yade.wrapper.Law2_ScGridCoGeom_FrictPhys_CundallStrack(inherits LawFunctor Functor Serializable)

Law between a frictional GridConnection and a frictional Sphere. Almost the same than Law2_ScGeom_FrictPhys_CundallStrack, but the force is divided and applied on the two GridNodes only.

class yade.wrapper.Law2_TTetraSimpleGeom_NormPhys_Simple(inherits LawFunctor Functor Serializable)

EXPERIMENTAL. TODO

LawDispatcher

class yade.wrapper.LawDispatcher(inherits Dispatcher Engine Serializable)

Dispatcher calling functors based on received argument type(s).

Internal forces

InternalForceFunctor

digraph InternalForceFunctor {
        rankdir=RL;
        margin="0.2,0.05";
        "InternalForceFunctor" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.InternalForceFunctor"];
        "If2_2xLin4NodeTetra_LinCohesiveStiffPropDampElastMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.If2_2xLin4NodeTetra_LinCohesiveStiffPropDampElastMat"];
        "If2_2xLin4NodeTetra_LinCohesiveStiffPropDampElastMat" -> "InternalForceFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "If2_Lin4NodeTetra_LinIsoRayleighDampElast" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.If2_Lin4NodeTetra_LinIsoRayleighDampElast"];
        "If2_Lin4NodeTetra_LinIsoRayleighDampElast" -> "InternalForceFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
}

Inheritance graph of InternalForceFunctor.

class yade.wrapper.InternalForceFunctor(inherits Functor Serializable)

Functor for creating/updating Body::bound.

class yade.wrapper.If2_2xLin4NodeTetra_LinCohesiveStiffPropDampElastMat(inherits InternalForceFunctor Functor Serializable)

Apply internal forces of the tetrahedral element using lumped mass theory

class yade.wrapper.If2_Lin4NodeTetra_LinIsoRayleighDampElast(inherits InternalForceFunctor Functor Serializable)

Apply internal forces of the tetrahedral element using lumped mass theory

InternalForceDispatcher

class yade.wrapper.InternalForceDispatcher(inherits Dispatcher Engine Serializable)

Dispatcher calling functors based on received argument type(s).

Callbacks

digraph IntrCallback {
        rankdir=RL;
        margin="0.2,0.05";
        "IntrCallback" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.IntrCallback"];
        "SumIntrForcesCb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.SumIntrForcesCb"];
        "SumIntrForcesCb" -> "IntrCallback" [arrowsize=0.5,style="setlinewidth(0.5)"];
}

Inheritance graph of IntrCallback.

class yade.wrapper.IntrCallback(inherits Serializable)

Abstract callback object which will be called for every (real) Interaction after the interaction has been processed by InteractionLoop.

At the beginning of the interaction loop, stepInit is called, initializing the object; it returns either NULL (to deactivate the callback during this time step) or pointer to function, which will then be passed (1) pointer to the callback object itself and (2) pointer to Interaction.

Note

(NOT YET DONE) This functionality is accessible from python by passing 4th argument to InteractionLoop constructor, or by appending the callback object to InteractionLoop::callbacks.

class yade.wrapper.SumIntrForcesCb(inherits IntrCallback Serializable)

Callback summing magnitudes of forces over all interactions. IPhys of interactions must derive from NormShearPhys (responsability fo the user).

Preprocessors

digraph FileGenerator {
        rankdir=RL;
        margin="0.2,0.05";
        "FileGenerator" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.FileGenerator"];
        "SimpleShear" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.SimpleShear"];
        "SimpleShear" -> "FileGenerator" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "TriaxialTest" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.TriaxialTest"];
        "TriaxialTest" -> "FileGenerator" [arrowsize=0.5,style="setlinewidth(0.5)"];
}

Inheritance graph of FileGenerator.

class yade.wrapper.FileGenerator(inherits Serializable)

Base class for scene generators, preprocessors.

class yade.wrapper.SimpleShear(inherits FileGenerator Serializable)

Preprocessor for a simple shear box model. The packing initially conforms a gas-like, very loose, state (see utils.makeCloud function), but importing some existing packing from a text file can be also performed after little change in the source code. In its current state, the preprocessor carries out an oedometric compression, until a value of normal stress equal to 2 MPa (and a stable mechanical state). Others Engines such as KinemCNDEngine, KinemCNSEngine and KinemCNLEngine, could be used to apply resp. constant normal displacement, constant normal rigidity and constant normal stress paths using such a simple shear box.

class yade.wrapper.TriaxialTest(inherits FileGenerator Serializable)

Create a scene for triaxal test.

Introduction

Yade includes tools to simulate triaxial tests on particles assemblies. This pre-processor (and variants like e.g. CapillaryTriaxialTest) illustrate how to use them. It generates a scene which will - by default - go through the following steps :

  • generate random loose packings in a parallelepiped.

  • compress the packing isotropicaly, either squeezing the packing between moving rigid boxes or expanding the particles while boxes are fixed (depending on flag internalCompaction). The confining pressure in this stage is defined via sigmaIsoCompaction.

  • when the packing is dense and stable, simulate a loading path and get the mechanical response as a result.

The default loading path corresponds to a constant lateral stress (sigmaLateralConfinement) in 2 directions and constant strain rate on the third direction. This default loading path is performed when the flag autoCompressionActivation it True, otherwise the simulation stops after isotropic compression.

Different loading paths might be performed. In order to define them, the user can modify the flags found in engine TriaxialStressController at any point in the simulation (in c++). If TriaxialStressController.wall_X_activated is true boundary X is moved automatically to maintain the defined stress level sigmaN (see axis conventions below). If false the boundary is not controlled by the engine at all. In that case the user is free to prescribe fixed position, constant velocity, or more complex conditions.

Note

Axis conventions. Boundaries perpendicular to the x axis are called “left” and “right”, y corresponds to “top” and “bottom”, and axis z to “front” and “back”. In the default loading path, strain rate is assigned along y, and constant stresses are assigned on x and z.

Essential engines
  1. The TriaxialCompressionEngine is used for controlling the state of the sample and simulating loading paths. TriaxialCompressionEngine inherits from TriaxialStressController, which computes stress- and strain-like quantities in the packing and maintain a constant level of stress at each boundary. TriaxialCompressionEngine has few more members in order to impose constant strain rate and control the transition between isotropic compression and triaxial test. Transitions are defined by changing some flags of the TriaxialStressController, switching from/to imposed strain rate to/from imposed stress.

  2. The class TriaxialStateRecorder is used to write to a file the history of stresses and strains.

  3. TriaxialTest is using GlobalStiffnessTimeStepper to compute an appropriate \(\Dt\) for the numerical scheme.

Note

TriaxialStressController::ComputeUnbalancedForce returns a value that can be useful for evaluating the stability of the packing. It is defined as (mean force on particles)/(mean contact force), so that it tends to 0 in a stable packing. This parameter is checked by TriaxialCompressionEngine to switch from one stage of the simulation to the next one (e.g. stop isotropic confinment and start axial loading)

Frequently Asked Questions

  1. How is generated the packing? How to change particles sizes distribution? Why do I have a message “Exceeded 3000 tries to insert non-overlapping sphere?

    The initial positioning of spheres is done by generating random (x,y,z) in a box and checking if a sphere of radius R (R also randomly generated with respect to a uniform distribution between mean*(1-std_dev) and mean*(1+std_dev) can be inserted at this location without overlaping with others.

    If the sphere overlaps, new (x,y,z)’s are generated until a free position for the new sphere is found. This explains the message you have: after 3000 trial-and-error, the sphere couldn’t be placed, and the algorithm stops.

    You get the message above if you try to generate an initialy dense packing, which is not possible with this algorithm. It can only generate clouds. You should keep the default value of porosity (n~0.7), or even increase if it is still to low in some cases. The dense state will be obtained in the second step (compaction, see below).

  2. How is the compaction done, what are the parameters maxWallVelocity and finalMaxMultiplier?
    Compaction is done
    1. by moving rigid boxes or

    2. by increasing the sizes of the particles (decided using the option internalCompaction ⇒ size increase).

    Both algorithm needs numerical parameters to prevent instabilities. For instance, with the method (1) maxWallVelocity is the maximum wall velocity, with method (2) finalMaxMultiplier is the max value of the multiplier applied on sizes at each iteration (always something like 1.00001).

  3. During the simulation of triaxial compression test, the wall in one direction moves with an increment of strain while the stresses in other two directions are adjusted to sigma_iso. How the stresses in other directions are maintained constant to sigma_iso? What is the mechanism? Where is it implemented in Yade?

    The control of stress on a boundary is based on the total stiffness K of all contacts between the packing and this boundary. In short, at each step, displacement=stress_error/K. This algorithm is implemented in TriaxialStressController, and the control itself is in TriaxialStressController::ControlExternalStress. The control can be turned off independently for each boundary, using the flags wall_XXX_activated, with XXX∈{top, bottom, left, right, back, front}. The imposed sress is a unique value (sigma_iso) for all directions if TriaxialStressController.isAxisymetric, or 3 independent values sigma1, sigma2, sigma3.

  4. Which value of friction angle do you use during the compaction phase of the Triaxial Test?

    The friction during the compaction (whether you are using the expansion method or the compression one for the specimen generation) can be anything between 0 and the final value used during the Triaxial phase. Note that higher friction than the final one would result in volumetric collapse at the beginning of the test. The purpose of using a different value of friction during this phase is related to the fact that the final porosity you get at the end of the sample generation essentially depends on it as well as on the assumed Particle Size Distribution. Changing the initial value of friction will get to a different value of the final porosity.

  5. Which is the aim of the bool isRadiusControlIteration?

    This internal variable (updated automatically) is true each N timesteps (with N=radiusControlInterval). For other timesteps, there is no expansion. Cycling without expanding is just a way to speed up the simulation, based on the idea that 1% increase each 10 iterations needs less operations than 0.1% at each iteration, but will give similar results.

  6. How comes the unbalanced force reaches a low value only after many timesteps in the compaction phase?

    The value of unbalanced force (dimensionless) is expected to reach low value (i.e. identifying a static-equilibrium condition for the specimen) only at the end of the compaction phase. The code is not aiming at simulating a quasistatic isotropic compaction process, it is only giving a stable packing at the end of it.

Rendering

OpenGLRenderer

class yade.wrapper.OpenGLRenderer(inherits Serializable)

Class responsible for rendering scene on OpenGL devices.

GlShapeFunctor

digraph GlShapeFunctor {
        rankdir=RL;
        margin="0.2,0.05";
        "GlShapeFunctor" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.GlShapeFunctor"];
        "Gl1_Box" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Gl1_Box"];
        "Gl1_Box" -> "GlShapeFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Gl1_Facet" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Gl1_Facet"];
        "Gl1_Facet" -> "GlShapeFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Gl1_PFacet" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Gl1_PFacet"];
        "Gl1_PFacet" -> "GlShapeFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Gl1_Cylinder" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Gl1_Cylinder"];
        "Gl1_Cylinder" -> "GlShapeFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Gl1_Sphere" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Gl1_Sphere"];
        "Gl1_Sphere" -> "GlShapeFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Gl1_PotentialParticle" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Gl1_PotentialParticle"];
        "Gl1_PotentialParticle" -> "GlShapeFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Gl1_Wall" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Gl1_Wall"];
        "Gl1_Wall" -> "GlShapeFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Gl1_Tetra" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Gl1_Tetra"];
        "Gl1_Tetra" -> "GlShapeFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Gl1_DeformableElement" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Gl1_DeformableElement"];
        "Gl1_DeformableElement" -> "GlShapeFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Gl1_Polyhedra" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Gl1_Polyhedra"];
        "Gl1_Polyhedra" -> "GlShapeFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Gl1_GridConnection" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Gl1_GridConnection"];
        "Gl1_GridConnection" -> "GlShapeFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Gl1_Node" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Gl1_Node"];
        "Gl1_Node" -> "GlShapeFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Gl1_ChainedCylinder" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Gl1_ChainedCylinder"];
        "Gl1_ChainedCylinder" -> "Gl1_Cylinder" [arrowsize=0.5,style="setlinewidth(0.5)"];
}

Inheritance graph of GlShapeFunctor.

class yade.wrapper.GlShapeFunctor(inherits Functor Serializable)

Abstract functor for rendering Shape objects.

class yade.wrapper.Gl1_Box(inherits GlShapeFunctor Functor Serializable)

Renders Box object

class yade.wrapper.Gl1_ChainedCylinder(inherits Gl1_Cylinder GlShapeFunctor Functor Serializable)

Renders ChainedCylinder object including a shift for compensating flexion.

class yade.wrapper.Gl1_Cylinder(inherits GlShapeFunctor Functor Serializable)

Renders Cylinder object

wire(=false)  [static]

Only show wireframe (controlled by glutSlices and glutStacks.

glutNormalize(=true)  [static]

Fix normals for non-wire rendering

glutSlices(=8)  [static]

Number of sphere slices.

glutStacks(=4)  [static]

Number of sphere stacks.

class yade.wrapper.Gl1_DeformableElement(inherits GlShapeFunctor Functor Serializable)

Renders Node object

class yade.wrapper.Gl1_Facet(inherits GlShapeFunctor Functor Serializable)

Renders Facet object

normals(=false)  [static]

In wire mode, render normals of facets and edges; facet’s colors are disregarded in that case.

class yade.wrapper.Gl1_GridConnection(inherits GlShapeFunctor Functor Serializable)

Renders Cylinder object

wire(=false)  [static]

Only show wireframe (controlled by glutSlices and glutStacks.

glutNormalize(=true)  [static]

Fix normals for non-wire rendering

glutSlices(=8)  [static]

Number of cylinder slices.

glutStacks(=4)  [static]

Number of cylinder stacks.

class yade.wrapper.Gl1_Node(inherits GlShapeFunctor Functor Serializable)

Renders Node object

quality(=1.0)  [static]

Change discretization level of spheres. quality>1 for better image quality, at the price of more cpu/gpu usage, 0<quality<1 for faster rendering. If mono-color spheres are displayed (Gl1_Node::stripes = False), quality mutiplies Gl1_Node::glutSlices and Gl1_Node::glutStacks. If striped spheres are displayed (Gl1_Node::stripes = True), only integer increments are meaningfull : quality=1 and quality=1.9 will give the same result, quality=2 will give finer result.

wire(=false)  [static]

Only show wireframe (controlled by glutSlices and glutStacks.

stripes(=false)  [static]

In non-wire rendering, show stripes clearly showing particle rotation.

localSpecView(=true)  [static]

Compute specular light in local eye coordinate system.

glutSlices(=12)  [static]

Base number of sphere slices, multiplied by Gl1_Node::quality before use); not used with stripes (see glut{Solid,Wire}Sphere reference)

glutStacks(=6)  [static]

Base number of sphere stacks, multiplied by Gl1_Node::quality before use; not used with stripes (see glut{Solid,Wire}Sphere reference)

class yade.wrapper.Gl1_PFacet(inherits GlShapeFunctor Functor Serializable)

Renders Facet object

wire(=false)  [static]

Only show wireframe (controlled by glutSlices and glutStacks.

class yade.wrapper.Gl1_Polyhedra(inherits GlShapeFunctor Functor Serializable)

Renders Polyhedra object

wire(=false)  [static]

Only show wireframe

class yade.wrapper.Gl1_PotentialParticle(inherits GlShapeFunctor Functor Serializable)

Renders PotentialParticle object

sizeX(=20)  [static]

Number of divisions in the X direction for triangulation

sizeY(=20)  [static]

Number of divisions in the Y direction for triangulation

sizeZ(=20)  [static]

Number of divisions in the Z direction for triangulation

store(=true)  [static]

Whether to store computed triangulation or not

initialized(=false)  [static]

Whether the triangulation is initialized

aabbEnlargeFactor(=1.3)  [static]

Enlargement factor of the Marching Cubes drawing grid, used for displaying purposes. Try different value if the particles are not displayed properly

wire(=false)  [static]

Only show wireframe

class yade.wrapper.Gl1_Sphere(inherits GlShapeFunctor Functor Serializable)

Renders Sphere object

quality(=1.0)  [static]

Change discretization level of spheres. quality>1 for better image quality, at the price of more cpu/gpu usage, 0<quality<1 for faster rendering. If mono-color spheres are displayed (Gl1_Sphere::stripes = False), quality mutiplies Gl1_Sphere::glutSlices and Gl1_Sphere::glutStacks. If striped spheres are displayed (Gl1_Sphere::stripes = True), only integer increments are meaningfull : quality=1 and quality=1.9 will give the same result, quality=2 will give finer result.

wire(=false)  [static]

Only show wireframe (controlled by glutSlices and glutStacks.

stripes(=false)  [static]

In non-wire rendering, show stripes clearly showing particle rotation.

localSpecView(=true)  [static]

Compute specular light in local eye coordinate system.

glutSlices(=12)  [static]

Base number of sphere slices, multiplied by Gl1_Sphere::quality before use); not used with stripes (see glut{Solid,Wire}Sphere reference)

glutStacks(=6)  [static]

Base number of sphere stacks, multiplied by Gl1_Sphere::quality before use; not used with stripes (see glut{Solid,Wire}Sphere reference)

circleView(=false)  [static]

For 2D simulations : display tori instead of spheres, so they will appear like circles if the viewer is looking in the right direction. In this case, remember to disable perspective by pressing “t”-key in the viewer.

circleRelThickness(=0.2)  [static]

If Gl1_Sphere::circleView is enabled, this is the torus diameter relative to the sphere radius (i.e. the circle relative thickness).

circleAllowedRotationAxis(='z')  [static]

If Gl1_Sphere::circleView is enabled, this is the only axis (‘x’, ‘y’ or ‘z’) along which rotation is allowed for the 2D simulation. It allows right orientation of the tori to appear like circles in the viewer. For example, if circleAllowedRotationAxis=’x’ is set, blockedDOFs=”YZ” should also be set for all your particles.

class yade.wrapper.Gl1_Tetra(inherits GlShapeFunctor Functor Serializable)

Renders Tetra object

wire(=true)  [static]

TODO

class yade.wrapper.Gl1_Wall(inherits GlShapeFunctor Functor Serializable)

Renders Wall object

div(=20)  [static]

Number of divisions of the wall inside visible scene part.

GlStateFunctor

class yade.wrapper.GlStateFunctor(inherits Functor Serializable)

Abstract functor for rendering State objects.

GlBoundFunctor

digraph GlBoundFunctor {
        rankdir=RL;
        margin="0.2,0.05";
        "GlBoundFunctor" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.GlBoundFunctor"];
        "Gl1_Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Gl1_Aabb"];
        "Gl1_Aabb" -> "GlBoundFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
}

Inheritance graph of GlBoundFunctor.

class yade.wrapper.GlBoundFunctor(inherits Functor Serializable)

Abstract functor for rendering Bound objects.

class yade.wrapper.Gl1_Aabb(inherits GlBoundFunctor Functor Serializable)

Render Axis-aligned bounding box (Aabb).

GlIGeomFunctor

digraph GlIGeomFunctor {
        rankdir=RL;
        margin="0.2,0.05";
        "GlIGeomFunctor" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.GlIGeomFunctor"];
        "Gl1_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Gl1_L6Geom"];
        "Gl1_L6Geom" -> "Gl1_L3Geom" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Gl1_PolyhedraGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Gl1_PolyhedraGeom"];
        "Gl1_PolyhedraGeom" -> "GlIGeomFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Gl1_L3Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Gl1_L3Geom"];
        "Gl1_L3Geom" -> "GlIGeomFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
}

Inheritance graph of GlIGeomFunctor.

class yade.wrapper.GlIGeomFunctor(inherits Functor Serializable)

Abstract functor for rendering IGeom objects.

class yade.wrapper.Gl1_L3Geom(inherits GlIGeomFunctor Functor Serializable)

Render L3Geom geometry.

axesLabels(=false)  [static]

Whether to display labels for local axes (x,y,z)

axesScale(=1.)  [static]

Scale local axes, their reference length being half of the minimum radius.

axesWd(=1.)  [static]

Width of axes lines, in pixels; not drawn if non-positive

uPhiWd(=2.)  [static]

Width of lines for drawing displacements (and rotations for L6Geom); not drawn if non-positive.

uScale(=1.)  [static]

Scale local displacements (u - u0); 1 means the true scale, 0 disables drawing local displacements; negative values are permissible.

class yade.wrapper.Gl1_L6Geom(inherits Gl1_L3Geom GlIGeomFunctor Functor Serializable)

Render L6Geom geometry.

phiScale(=1.)  [static]

Scale local rotations (phi - phi0). The default scale is to draw \(\pi\) rotation with length equal to minimum radius.

class yade.wrapper.Gl1_PolyhedraGeom(inherits GlIGeomFunctor Functor Serializable)

Render PolyhedraGeom geometry.

GlIPhysFunctor

digraph GlIPhysFunctor {
        rankdir=RL;
        margin="0.2,0.05";
        "GlIPhysFunctor" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.GlIPhysFunctor"];
        "Gl1_NormPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Gl1_NormPhys"];
        "Gl1_NormPhys" -> "GlIPhysFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Gl1_CpmPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Gl1_CpmPhys"];
        "Gl1_CpmPhys" -> "GlIPhysFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
        "Gl1_PolyhedraPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="yade.wrapper.html#yade.wrapper.Gl1_PolyhedraPhys"];
        "Gl1_PolyhedraPhys" -> "GlIPhysFunctor" [arrowsize=0.5,style="setlinewidth(0.5)"];
}

Inheritance graph of GlIPhysFunctor.

class yade.wrapper.GlIPhysFunctor(inherits Functor Serializable)

Abstract functor for rendering IPhys objects.

class yade.wrapper.Gl1_CpmPhys(inherits GlIPhysFunctor Functor Serializable)

Render CpmPhys objects of interactions.

contactLine(=true)  [static]

Show contact line

dmgLabel(=true)  [static]

Numerically show contact damage parameter

dmgPlane(=false)  [static]

[what is this?]

epsT(=false)  [static]

Show shear strain

epsTAxes(=false)  [static]

Show axes of shear plane

normal(=false)  [static]

Show contact normal

colorStrainRatio(=-1)  [static]

If positive, set the interaction (wire) color based on \(\eps_N\) normalized by \(\eps_0\) x colorStrainRatio (\(\eps_0\) = CpmPhys.epsCrackOnset ). Otherwise, color based on the residual strength.

epsNLabel(=false)  [static]

Numerically show normal strain

class yade.wrapper.Gl1_NormPhys(inherits GlIPhysFunctor Functor Serializable)

Renders NormPhys objects as cylinders of which diameter and color depends on NormPhys.normalForce magnitude.

maxFn(=0)  [static]

Value of NormPhys.normalForce corresponding to maxRadius. This value will be increased (but not decreased ) automatically.

signFilter(=0)  [static]

If non-zero, only display contacts with negative (-1) or positive (+1) normal forces; if zero, all contacts will be displayed.

refRadius(=std::numeric_limits<Real>::infinity())  [static]

Reference (minimum) particle radius; used only if maxRadius is negative. This value will be decreased (but not increased ) automatically. (auto-updated)

maxRadius(=-1)  [static]

Cylinder radius corresponding to the maximum normal force. If negative, auto-updated refRadius will be used instead.

slices(=6)  [static]

Number of sphere slices; (see glutCylinder reference)

stacks(=1)  [static]

Number of sphere stacks; (see glutCylinder reference)

maxWeakFn(=NaN)  [static]

Value that divides contacts by their normal force into the ‘weak fabric’ and ‘strong fabric’. This value is set as side-effect by utils.fabricTensor.

weakFilter(=0)  [static]

If non-zero, only display contacts belonging to the ‘weak’ (-1) or ‘strong’ (+1) fabric.

weakScale(=1.)  [static]

If maxWeakFn is set, scale radius of the weak fabric by this amount (usually smaller than 1). If zero, 1 pixel line is displayed. Colors are not affected by this value.

class yade.wrapper.Gl1_PolyhedraPhys(inherits GlIPhysFunctor Functor Serializable)

Renders PolyhedraPhys objects as cylinders of which diameter and color depends on PolyhedraPhys::normForce magnitude.

maxFn(=0)  [static]

Value of NormPhys.normalForce corresponding to maxDiameter. This value will be increased (but not decreased ) automatically.

refRadius(=std::numeric_limits<Real>::infinity())  [static]

Reference (minimum) particle radius

signFilter(=0)  [static]

If non-zero, only display contacts with negative (-1) or positive (+1) normal forces; if zero, all contacts will be displayed.

maxRadius(=-1)  [static]

Cylinder radius corresponding to the maximum normal force.

slices(=6)  [static]

Number of sphere slices; (see glutCylinder reference)

stacks(=1)  [static]

Number of sphere stacks; (see glutCylinder reference)

Simulation data

Omega

class yade.wrapper.Omega

BodyContainer

class yade.wrapper.BodyContainer

InteractionContainer

class yade.wrapper.InteractionContainer

Access to interactions of simulation, by using

  1. id’s of both Bodies of the interactions, e.g. O.interactions[23,65]

  2. iteraction over the whole container:

    for i in O.interactions: print i.id1,i.id2
    

Note

Iteration silently skips interactions that are virtual i.e. not real.

property serializeSorted

ForceContainer

class yade.wrapper.ForceContainer

MaterialContainer

class yade.wrapper.MaterialContainer

Container for Materials. A material can be accessed using

  1. numerical index in range(0,len(cont)), like cont[2];

  2. textual label that was given to the material, like cont[‘steel’]. This entails traversing all materials and should not be used frequently.

Scene

class yade.wrapper.Scene(inherits Serializable)

Object comprising the whole simulation.

Cell

class yade.wrapper.Cell(inherits Serializable)

Parameters of periodic boundary conditions. Only applies if O.isPeriodic==True.

Other classes

class yade.wrapper.CundallStrackAdhesivePotential(inherits CundallStrackPotential GenericPotential Serializable)

CundallStrack model with adhesive part. Contact is created when \(u/a-\varepsilon < 0\) and released when \(u/a-\varepsilon > l_{adh}\), where \(l_{adh} = f_{adh}/k_n\). This lead to an hysteretic attractive part.

class yade.wrapper.MPIBodyContainer(inherits Serializable)

a dummy container to serialize and send.

class yade.wrapper.EnergyTracker(inherits Serializable)

Storage for tracing energies. Only to be used if O.trackEnergy is True.

class yade.wrapper.LinExponentialPotential(inherits CundallStrackPotential GenericPotential Serializable)

LinExponential Potential with only Cundall-and-Strack-like contact. The LinExponential potential formula is \(F(u) = \frac{k*(x_e-x_0)}{x_e}(u/a-x_0)\exp\left(\frac{-(u/a)}{x_e-x_0}\right)\). Where \(k\) is the slope at the origin, \(x_0\) is the position where the potential cross \(0\) and \(x_e\) is the position of the extremum.

class yade.wrapper.PhaseCluster(inherits Serializable)

Preliminary.

class yade.wrapper.GlExtra_OctreeCubes(inherits GlExtraDrawer Serializable)

Render boxed read from file

class yade.wrapper.GlExtraDrawer(inherits Serializable)

Performing arbitrary OpenGL drawing commands; called from OpenGLRenderer (see OpenGLRenderer.extraDrawers) once regular rendering routines will have finished.

This class itself does not render anything, derived classes should override the render method.

class yade.wrapper.FastMarchingMethod(inherits Serializable)

Executes a Fast Marching Method (FMM) to solve \(||\vec \nabla \phi|| = c\) for a discrete field \(\phi\) defined on grid, with phiIni serving as boundary condition. Typically, \(c=1\) (see speed) and \(\phi\) is a distance field. Note that the minimum search inherent to the FMM is not yet optimal in terms of execution speed and faster implementations of the FMM may be found elsewhere. See [Duriez2021b] for more details, where the class was coined DistFMM.

class yade.wrapper.Cell(inherits Serializable)

Parameters of periodic boundary conditions. Only applies if O.isPeriodic==True.

class yade.wrapper.ParallelEngine(inherits Engine Serializable)

Engine for running other Engine in parallel.

class yade.wrapper.LBMbody(inherits Serializable)

Body class for Lattice Boltzmann Method

class yade.wrapper.GenericPotential(inherits Serializable)

Generic class for potential representation in PotentialLubrication law. Don’t do anything. If set as potential, the result will be a lubrication-only simulation.

Link class for Lattice Boltzmann Method

class yade.wrapper.GlExtra_LawTester(inherits GlExtraDrawer Serializable)

Find an instance of LawTester and show visually its data.

class yade.wrapper.MatchMaker(inherits Serializable)

Class matching pair of ids to return pre-defined (for a pair of ids defined in matches) or derived value (computed using algo) of a scalar parameter. It can be called (id1, id2, val1=NaN, val2=NaN) in both python and c++.

Note

There is a converter from python number defined for this class, which creates a new MatchMaker returning the value of that number; instead of giving the object instance therefore, you can only pass the number value and it will be converted automatically.

class yade.wrapper.Engine(inherits Serializable)

Basic execution unit of simulation, called from the simulation loop (O.engines)

class yade.wrapper.Serializable
class yade.wrapper.RegularGrid(inherits Serializable)

A rectilinear (aka uniform or regular) grid, for LevelSet shapes or other purposes. A cubic regular grid extending from a min = (m,m,m) to a max at (M,M,M), with nGP = (n,n,n) ie a spacing = (M-m)/(n-1), can be conveniently obtained from RegularGrid(m,M,n)

class yade.wrapper.TimingDeltas
class yade.wrapper.CundallStrackPotential(inherits GenericPotential Serializable)

Potential with only Cundall-and-Strack-like contact.

class yade.wrapper.LBMnode(inherits Serializable)

Node class for Lattice Boltzmann Method