:mod:`woo.dem` =========================== .. inheritance-diagram:: woo.dem :parts: 2 .. automodule:: woo.dem :members: :undoc-members: :exclude-members: In2_Facet, PeriIsoCompressor, GridBoundDispatcher, PsdSphereGenerator, GridCollider, LawDispatcher, DynDt, FlowAnalysis, Shape, MatState, ConcreteMatState, StableCircularOrbit, Cone, Capsule, Contact, In2_Truss_ElastMat, ParticleGenerator, Cg2_Wall_Sphere_G3Geom, Cg2_Wall_Ellipsoid_L6Geom, HalfspaceBuoyancy, StackedBoxOutlet, Cp2_PelletMat_PelletPhys, HertzPhys, CPhysFunctor, ShapeClump, DemDataTagged, InsertionSortCollider, LayeredAxialBias, Grid1_Wall, VelocityAndReadForce, Bo1_Wall_Aabb, Facet, BoxInlet, Cg2_Sphere_Sphere_L6Geom, ArcShooter, Bo1_Cone_Aabb, Local6Dofs, ClusterMatState, Cg2_InfCylinder_Capsule_L6Geom, Law2_L6Geom_FrictPhys_IdealElPl, Law2_L6Geom_LudingPhys, BoxTraceTimeSetter, ConveyorInlet, FrictPhys, Cg2_InfCylinder_Sphere_L6Geom, DemData, PsdClumpGenerator, ConstantForce, Material, LawTester, HertzMat, IntraFunctor, MinMaxSphereGenerator, Cg2_Cone_Sphere_L6Geom, Bo1_Capsule_Aabb, ArcOutlet, ConcretePhys, ReadForce, Cg2_Facet_Ellipsoid_L6Geom, Law2_L6Geom_PelletPhys_Pellet, Law2_G3Geom_FrictPhys_IdealElPl, WeirdTriaxControl, RawShapeClump, Cp2_HertzMat_HertzPhys, LawFunctor, DetectSteadyState, ContactContainer, Grid1_InfCylinder, IceMat, SpatialBias, GridStore, Cg2_Rod_Sphere_L6Geom, MeshVolume, ContactHook, VariableAlignedRotation, Leapfrog, Cg2_Capsule_Capsule_L6Geom, Aabb, IdealElPlData, Rod, ClusterAnalysis, InletMatState, Cg2_Facet_Sphere_L6Geom, RadialForce, IntraForce, NonuniformAxisPlacementBias, Cp2_FrictMat_FrictPhys, Bo1_Sphere_Aabb, ElastMat, In2_Wall_ElastMat, Bound, BoxInlet2d, ParticleShooter, CombinedImpose, AxialGravity, Bo1_InfCylinder_Aabb, Law2_L6Geom_HertzPhys_DMT, Cg2_Sphere_Capsule_L6Geom, RawShape, ConcreteMat, PsdCapsuleGenerator, HarmonicOscillation, PelletCData, Cg2_Ellipsoid_Ellipsoid_L6Geom, CPhys, AnisoPorosityAnalyzer, BoundFunctor, G3GeomCData, LudingMat, Cp2_ConcreteMat_ConcretePhys, ForceResetter, Outlet, Suspicious, Grid1_Facet, ForcesToHdf5, CountContactsHook, Truss, AxialBias, IcePhys, Impose, G3Geom, L6Geom, Cg2_Facet_Facet_L6Geom, Bo1_Facet_Aabb, Law2_L6Geom_FrictPhys_LinEl6, InterpolatedMotion, Ellipsoid, BoundDispatcher, CylinderInlet, FrictMat, In2_Sphere_ElastMat, ContactLoop, CGeomDispatcher, GridBoundFunctor, Cg2_Wall_Sphere_L6Geom, Cg2_Any_Any_L6Geom__Base, Collider, CGeom, PelletMatState, PharmaCapsuleGenerator, AlignedHarmonicOscillations, ShapePack, Cg2_Wall_Capsule_L6Geom, AlignedMinMaxShooter, LudingMatState, Cg2_Sphere_Ellipsoid_L6Geom, VariableVelocity3d, VtkExport, ParticleContainer, Law2_L6Geom_ConcretePhys, BoxOutlet, Cp2_IceMat_IcePhys, Tracer, ClumpData, LudingPhys, POVRayExport, Cg2_Facet_InfCylinder_L6Geom, LawTesterStage, PelletAgglomerator, CGeomFunctor, AabbCollider, Bo1_Rod_Aabb, CPhysDispatcher, Particle, Cp2_FrictMat_FrictPhys_CrossAnisotropic, Cg2_Sphere_Sphere_G3Geom, Bo1_Ellipsoid_Aabb, PelletPhys, CircularOrbit, CData, Inlet, AabbTreeCollider, PsdAxialBias, PsdEllipsoidGenerator, GridBound, ArcInlet, Cg2_Wall_Facet_L6Geom, RandomInlet, Grid1_Sphere, Sphere, Wall, InfCylinder, DemField, PelletMat, Law2_L6Geom_IcePhys, NodalForcesToHdf5, TraceVisRep, Cg2_Facet_Capsule_L6Geom, SphereClumpGeom, Cp2_LudingMat_LudingPhys .. rst-class:: html-toggle .. rst-class:: emphasized Stress/strain control --------------------- TODO .. rst-class:: html-toggle .. rst-class:: emphasized PeriIsoCompressor +++++++++++++++++ :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.dem.PeriIsoCompressor` .. autoclass:: PeriIsoCompressor :members: :exclude-members: stresses, charLen, maxSpan, maxUnbalanced, globalUpdateInt, state, doneHook, keepProportions, currUnbalanced, avgStiffness, sigma, __init__, __getstate__, __setstate__ :special-members: .. attribute:: stresses (= []) Stresses that should be reached, one after another [type: vector] .. attribute:: charLen (= -1.0) Characteristic length, should be something like mean particle diameter (default -1=invalid value)) [type: Real] .. attribute:: maxSpan (= -1.0) Maximum body span in terms of bbox, to prevent periodic cell getting too small. [type: Real, read-only in python] .. attribute:: maxUnbalanced (= 0.0001) if actual unbalanced force is smaller than this number, the packing is considered stable, [type: Real] .. attribute:: globalUpdateInt (= 20) how often to recompute average stress, stiffness and unbalanced force [type: int] .. attribute:: state (= 0) Where are we at in the stress series [type: size_t] .. attribute:: doneHook (= '') Python command to be run when reaching the last specified stress [type: string] .. attribute:: keepProportions (= True) Exactly keep proportions of the cell (stress is controlled based on average, not its components [type: bool] .. attribute:: currUnbalanced (= nan) Current unbalanced force (updated internally) [type: Real, read-only in python] .. attribute:: avgStiffness (= nan) Value of average stiffness (updated internally) [type: Real, read-only in python] .. attribute:: sigma (= Vector3(nan,nan,nan)) Current value of average stress (update internally) [type: Vector3r, read-only in python] .. rst-class:: html-toggle .. rst-class:: emphasized WeirdTriaxControl +++++++++++++++++ :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.dem.WeirdTriaxControl` .. autoclass:: WeirdTriaxControl :members: :exclude-members: goal, stressMask, maxStrainRate, maxUnbalanced, absStressTol, relStressTol, maxStrainedStress, growDamping, relVol, globUpdate, doneHook, stress, strain, strainRate, currUnbalanced, prevGrow, mass, externalWork, gradVWorkIx, leapfrogChecked, __init__, __getstate__, __setstate__ :special-members: .. attribute:: goal (= Vector3(0,0,0)) Desired stress or strain values (depending on stressMask), strains defined as ``strain(i)=log(Fii)``. .. warning:: Strains are relative to the :obj:`woo.core.Scene.cell.refSize` (reference cell size), not the current one (e.g. at the moment when the new strain value is set). [type: Vector3r] .. attribute:: stressMask (= 0) mask determining strain/stress (0/1) meaning for goal components [type: int] .. attribute:: maxStrainRate (= Vector3(1,1,1)) Maximum strain rate of the periodic cell. [type: Vector3r] .. attribute:: maxUnbalanced (= 0.0001) maximum unbalanced force. [type: Real] .. attribute:: absStressTol (= 1000.0) Absolute stress tolerance [type: Real] .. attribute:: relStressTol (= 3e-05) Relative stress tolerance; if negative, it is relative to the largest stress value along all axes, where strain is prescribed. [type: Real] .. attribute:: maxStrainedStress (= nan) Current abs-maximum stress in strain-controlled directions; useda as reference when :obj:`relStressTol` is negative. [type: Real, read-only in python] .. attribute:: growDamping (= 0.25) Damping of cell resizing (0=perfect control, 1=no control at all). [type: Real] .. attribute:: relVol (= 1.0) For stress computation, use volume of the periodic cell multiplied by this constant. [type: Real] .. attribute:: globUpdate (= 5) How often to recompute average stress, stiffness and unbalaced force. [type: int] .. attribute:: doneHook (= '') python command to be run when the desired state is reached [type: string] .. attribute:: stress (= Matrix3(0,0,0, 0,0,0, 0,0,0)) Stress tensor [type: Matrix3r] .. attribute:: strain (= Vector3(0,0,0)) cell strain, updated automatically [type: Vector3r] .. attribute:: strainRate (= Vector3(0,0,0)) cell strain rate, updated automatically [type: Vector3r] .. attribute:: currUnbalanced (= nan) current unbalanced force (updated every globUpdate) [type: Real] .. attribute:: prevGrow (= Vector3(0,0,0)) previous cell grow [type: Vector3r] .. attribute:: mass (= nan) mass of the cell (user set); if not set, it will be computed as sum of masses of all particles. [type: Real] .. attribute:: externalWork (= 0.0) Work input from boundary controller. [type: Real] .. attribute:: gradVWorkIx (= -1) Index for work done by velocity gradient, if tracking energy [type: int, not saved, not accessible from python] .. attribute:: leapfrogChecked (= False) Whether we already checked that we come before :obj:`Leapfrog` (otherwise setting nextGradV will have no effect. [type: bool, not accessible from python] .. rst-class:: html-toggle .. rst-class:: emphasized Contacts -------- TODO .. rst-class:: html-toggle .. rst-class:: emphasized Contact +++++++ :obj:`~woo.core.Object` → :obj:`~woo.dem.Contact` .. autoclass:: Contact :members: :exclude-members: geom, phys, data, pA, pB, cellDist, color, stepCreated, minDist00Sq, stepLastSeen, linIx, __init__, __getstate__, __setstate__ :special-members: .. attribute:: geom (= None) Contact geometry [type: shared_ptr<:obj:`CGeom `>, read-only in python] .. attribute:: phys (= None) Physical properties of contact [type: shared_ptr<:obj:`CPhys `>, read-only in python] .. attribute:: data (= None) Optional data stored by the functor for its own use [type: shared_ptr<:obj:`CData `>, read-only in python] .. attribute:: pA First particle of the contact [type: weak_ptr<:obj:`Particle `>, read-only in python] .. attribute:: pB Second particle of the contact [type: weak_ptr<:obj:`Particle `>, read-only in python] .. attribute:: cellDist (= Vector3i(0,0,0)) Distace in the number of periodic cells by which pB must be shifted to get to the right relative position. [type: Vector3i, read-only in python] .. attribute:: color (= 0.0) (Normalized) color value for this contact [type: Real] .. attribute:: stepCreated (= -1) Step in which this contact was created by the collider, or step in which it was made real (if geom and phys exist). This number is NOT reset by Contact::reset(). If negative, it means the collider does not want to keep this contact around anymore (this happens if the contact is real but there is no overlap anymore). [type: int, read-only in python] .. attribute:: minDist00Sq (= -1.0) Minimum distance between nodes[0] of both shapes so that the contact can exist. Set in ContactLoop by geometry functor once, and is used to check for possible contact without having to call the functor. If negative, not used. Currently, only Sphere-Sphere contacts use this information. [type: Real, read-only in python] .. attribute:: stepLastSeen (= -1) [type: int, read-only in python] .. attribute:: linIx (= 0) Position in the linear view (ContactContainer) [type: size_t, not shown in the UI, read-only in python] .. rst-class:: html-toggle .. rst-class:: emphasized ContactLoop +++++++++++ :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.dem.ContactLoop` .. autoclass:: ContactLoop :members: :exclude-members: geoDisp, phyDisp, lawDisp, hook, alreadyWarnedNoCollider, evalStress, applyForces, updatePhys, dist00, stress, reorderEvery, prevVol, prevStress, gradVIx, __init__, __getstate__, __setstate__ :special-members: .. attribute:: geoDisp (= ) :obj:`CGeomDispatcher` object that is used for dispatch. [type: shared_ptr<:obj:`CGeomDispatcher `>, read-only in python] .. attribute:: phyDisp (= ) :obj:`CPhysDispatcher` object used for dispatch. [type: shared_ptr<:obj:`CPhysDispatcher `>, read-only in python] .. attribute:: lawDisp (= ) :obj:`LawDispatcher` object used for dispatch. [type: shared_ptr<:obj:`LawDispatcher `>, read-only in python] .. attribute:: hook (= None) :obj:`ContactHook` objects, empty by default. [type: shared_ptr<:obj:`ContactHook `>] .. attribute:: alreadyWarnedNoCollider (= False) Keep track of whether the user was already warned about missing collider. [type: bool, not shown in the UI] .. attribute:: evalStress (= False) Evaluate stress tensor, in periodic simluations; if energy tracking is enabled, increments *gradV* energy. [type: bool] .. attribute:: applyForces (= True) Apply forces directly; this avoids IntraForce engine, but will silently skip multinodal particles. [type: bool] .. attribute:: updatePhys (= 0) Call :obj:`CPhysFunctor` even for contacts which already have :obj:`Contact.phys` (to reflect changes in particle's material, for example). 'once' will update only once and then set this back to 'never'. [type: int, named enum, possible values are: **'never'** (0), **'always'** (1), **'once'** (2)] .. attribute:: dist00 (= True) Whether to apply the Contact.minDist00Sq optimization (for mesuring the speedup only) [type: bool] .. attribute:: stress (= Matrix3(0,0,0, 0,0,0, 0,0,0)) Stress value, used to compute *gradV* energy if *trackWork* is True. [type: Matrix3r, read-only in python] .. attribute:: reorderEvery (= 1000) Reorder contacts so that real ones are at the beginning in the linear sequence, making the OpenMP loop traversal (hopefully) less unbalanced. [type: int] .. attribute:: prevVol (= nan) Previous value of cell volume [type: Real, not accessible from python] .. attribute:: prevStress (= Matrix3(0,0,0, 0,0,0, 0,0,0)) Previous value of stress, used to compute mid-step stress [type: Matrix3r] .. attribute:: gradVIx (= -1) Cache energy index for gradV work [type: int, not saved, not accessible from python] .. rst-class:: html-toggle .. rst-class:: emphasized ContactHook +++++++++++ :obj:`~woo.core.Object` → :obj:`~woo.dem.ContactHook` .. graphviz:: digraph ContactHook { rankdir=LR; margin=.2; "ContactHook" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.ContactHook"]; "CountContactsHook" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.ContactHook"]; "ContactHook" -> "CountContactsHook" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: ContactHook :members: :exclude-members: mask, __init__, __getstate__, __setstate__ :special-members: .. attribute:: mask (= 0) Mask which must be matched by *both* particles in the contact. [type: int] .. rst-class:: html-toggle .. rst-class:: emphasized CountContactsHook """"""""""""""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.ContactHook` → :obj:`~woo.dem.CountContactsHook` .. autoclass:: CountContactsHook :members: :exclude-members: nNew, nDel, __init__, __getstate__, __setstate__ :special-members: .. attribute:: nNew Total number of new (real) contacts. [type: OpenMPAccumulator] .. attribute:: nDel Total number of deleted contacts. [type: OpenMPAccumulator] .. rst-class:: html-toggle .. rst-class:: emphasized Geometry ++++++++ TODO .. rst-class:: html-toggle .. rst-class:: emphasized CGeom """"" :obj:`~woo.core.Object` → :obj:`~woo.dem.CGeom` .. graphviz:: digraph CGeom { rankdir=LR; margin=.2; "CGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CGeom"]; "G3Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CGeom"]; "CGeom" -> "G3Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CGeom"]; "CGeom" -> "L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: CGeom :members: :exclude-members: node, __init__, __getstate__, __setstate__ :special-members: .. attribute:: node (= ) Local coordinates definition. [type: shared_ptr<:obj:`Node `>] .. rst-class:: html-toggle .. rst-class:: emphasized L6Geom """""" :obj:`~woo.core.Object` → :obj:`~woo.dem.CGeom` → :obj:`~woo.dem.L6Geom` .. autoclass:: L6Geom :members: :exclude-members: vel, angVel, uN, lens, contA, trsf, __init__, __getstate__, __setstate__ :special-members: .. attribute:: vel (= Vector3(0,0,0)) Relative displacement rate in local coordinates, defined by :obj:`CGeom.node` [type: Vector3r, unit: m/s] .. attribute:: angVel (= Vector3(0,0,0)) Relative rotation rate in local coordinates [type: Vector3r, unit: rad/s] .. attribute:: uN (= nan) Normal displacement, distace of separation of particles (mathematically equal to integral of vel[0], but given here for numerically more stable results, as this component can be usually computed directly). [type: Real] .. attribute:: lens (= Vector2(0,0)) Hint for Cp2 functor on how to distribute material stiffnesses according to lengths on both sides of the contact; their sum should be equal to the initial contact length. [type: Vector2r, unit: m] .. attribute:: contA (= nan) (Fictious) contact area, used by Cp2 functor to compute stiffness. [type: Real, unit: m²] .. attribute:: trsf (= Matrix3(1,0,0, 0,1,0, 0,0,1)) Transformation (rotation) from global to local coordinates; only used internally, and is synchronized with :obj:`woo.core.Node.ori` automatically. If the algorithm works with pure quaternions at some point (it is not stable now), can be removed safely. [type: Matrix3r] .. rst-class:: html-toggle .. rst-class:: emphasized G3Geom """""" :obj:`~woo.core.Object` → :obj:`~woo.dem.CGeom` → :obj:`~woo.dem.G3Geom` .. autoclass:: G3Geom :members: :exclude-members: uN, dShear, twistAxis, orthonormalAxis, normal, __init__, __getstate__, __setstate__ :special-members: .. attribute:: uN (= nan) Normal displacement, distace of separation of particles (mathematically equal to integral of vel[0], but given here for numerically more stable results, as this component can be usually computed directly). [type: Real] .. attribute:: dShear (= Vector3(0,0,0)) Shear displacement delta during last step. [type: Vector3r] .. attribute:: twistAxis (= Vector3(nan,nan,nan)) Axis of twisting rotation [type: Vector3r, read-only in python] .. attribute:: orthonormalAxis (= Vector3(nan,nan,nan)) Axis normal to twisting axis [type: Vector3r, read-only in python] .. attribute:: normal (= Vector3(nan,nan,nan)) Contact normal in global coordinates; G3Geom doesn't touch Contact.node.ori (which is identity), therefore orientation must be kep separately [type: Vector3r, read-only in python] .. rst-class:: html-toggle .. rst-class:: emphasized CGeomFunctor """""""""""" :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CGeomFunctor` .. graphviz:: digraph CGeomFunctor { rankdir=LR; margin=.2; "CGeomFunctor" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CGeomFunctor"]; "Cg2_Cone_Sphere_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CGeomFunctor"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Cone_Sphere_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Capsule_Capsule_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CGeomFunctor"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Capsule_Capsule_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Ellipsoid_Ellipsoid_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CGeomFunctor"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Ellipsoid_Ellipsoid_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Sphere_Sphere_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CGeomFunctor"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Sphere_Sphere_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Facet_Sphere_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CGeomFunctor"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Facet_Sphere_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Wall_Facet_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CGeomFunctor"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Wall_Facet_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Wall_Sphere_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CGeomFunctor"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Wall_Sphere_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Any_Any_L6Geom__Base" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CGeomFunctor"]; "CGeomFunctor" -> "Cg2_Any_Any_L6Geom__Base" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Facet_Ellipsoid_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CGeomFunctor"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Facet_Ellipsoid_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_InfCylinder_Capsule_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CGeomFunctor"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_InfCylinder_Capsule_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Facet_InfCylinder_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CGeomFunctor"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Facet_InfCylinder_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Wall_Sphere_G3Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CGeomFunctor"]; "CGeomFunctor" -> "Cg2_Wall_Sphere_G3Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Wall_Ellipsoid_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CGeomFunctor"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Wall_Ellipsoid_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Sphere_Sphere_G3Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CGeomFunctor"]; "CGeomFunctor" -> "Cg2_Sphere_Sphere_G3Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Wall_Capsule_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CGeomFunctor"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Wall_Capsule_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_InfCylinder_Sphere_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CGeomFunctor"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_InfCylinder_Sphere_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Sphere_Ellipsoid_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CGeomFunctor"]; "Cg2_Ellipsoid_Ellipsoid_L6Geom" -> "Cg2_Sphere_Ellipsoid_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Sphere_Capsule_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CGeomFunctor"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Sphere_Capsule_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Facet_Capsule_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CGeomFunctor"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Facet_Capsule_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Rod_Sphere_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CGeomFunctor"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Rod_Sphere_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Facet_Facet_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CGeomFunctor"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Facet_Facet_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: CGeomFunctor :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: Cg2_Sphere_Sphere_G3Geom %%%%%%%%%%%%%%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CGeomFunctor` → :obj:`~woo.dem.Cg2_Sphere_Sphere_G3Geom` .. autoclass:: Cg2_Sphere_Sphere_G3Geom :members: :exclude-members: noRatch, useAlpha, __init__, __getstate__, __setstate__ :special-members: .. attribute:: noRatch (= True) FIXME: document what it really does. [type: bool] .. attribute:: useAlpha (= True) Use alpha correction proposed by McNamara, see source code for details [type: bool] Cg2_Any_Any_L6Geom__Base %%%%%%%%%%%%%%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CGeomFunctor` → :obj:`~woo.dem.Cg2_Any_Any_L6Geom__Base` .. graphviz:: digraph Cg2_Any_Any_L6Geom__Base { rankdir=LR; margin=.2; "Cg2_Any_Any_L6Geom__Base" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Cg2_Any_Any_L6Geom__Base"]; "Cg2_Cone_Sphere_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Cg2_Any_Any_L6Geom__Base"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Cone_Sphere_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Capsule_Capsule_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Cg2_Any_Any_L6Geom__Base"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Capsule_Capsule_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Ellipsoid_Ellipsoid_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Cg2_Any_Any_L6Geom__Base"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Ellipsoid_Ellipsoid_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Sphere_Sphere_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Cg2_Any_Any_L6Geom__Base"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Sphere_Sphere_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Facet_Sphere_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Cg2_Any_Any_L6Geom__Base"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Facet_Sphere_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Wall_Facet_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Cg2_Any_Any_L6Geom__Base"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Wall_Facet_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Wall_Sphere_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Cg2_Any_Any_L6Geom__Base"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Wall_Sphere_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Facet_Ellipsoid_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Cg2_Any_Any_L6Geom__Base"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Facet_Ellipsoid_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_InfCylinder_Capsule_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Cg2_Any_Any_L6Geom__Base"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_InfCylinder_Capsule_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Facet_InfCylinder_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Cg2_Any_Any_L6Geom__Base"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Facet_InfCylinder_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Wall_Ellipsoid_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Cg2_Any_Any_L6Geom__Base"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Wall_Ellipsoid_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Wall_Capsule_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Cg2_Any_Any_L6Geom__Base"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Wall_Capsule_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_InfCylinder_Sphere_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Cg2_Any_Any_L6Geom__Base"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_InfCylinder_Sphere_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Sphere_Ellipsoid_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Cg2_Any_Any_L6Geom__Base"]; "Cg2_Ellipsoid_Ellipsoid_L6Geom" -> "Cg2_Sphere_Ellipsoid_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Sphere_Capsule_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Cg2_Any_Any_L6Geom__Base"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Sphere_Capsule_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Facet_Capsule_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Cg2_Any_Any_L6Geom__Base"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Facet_Capsule_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Rod_Sphere_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Cg2_Any_Any_L6Geom__Base"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Rod_Sphere_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cg2_Facet_Facet_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Cg2_Any_Any_L6Geom__Base"]; "Cg2_Any_Any_L6Geom__Base" -> "Cg2_Facet_Facet_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: Cg2_Any_Any_L6Geom__Base :members: :exclude-members: noRatch, iniLensTouch, trsfRenorm, approxMask, __init__, __getstate__, __setstate__ :special-members: .. attribute:: noRatch (= False) FIXME: document what it really does. [type: bool] .. attribute:: iniLensTouch (= True) Set :obj:`L6Geom.lens` to touch distance (e.g. radii sum for spheres). If *false*, :obj:`L6Geom.lens` is set to the initial contact distance (which is less than the touch distance, with overlap subtracted); this implies path-dependent :obj:`L6Geom.lens` and unpredictable stiffness. Do not set to *false* unless you know what you are doing. [type: bool] .. attribute:: trsfRenorm (= 100) How often to renormalize :obj:`trsf `; if non-positive, never renormalized (simulation might be unstable) [type: int] .. attribute:: approxMask (= 0) Selectively enable geometrical approximations (bitmask); add the values for approximations to be enabled. == =============================================================== 1 use previous normal instead of mid-step normal for computing tangent velocity 2 do not re-normalize average (mid-step) normal, if used. 4 use previous rotation instead of mid-step rotation to transform velocities 8 use current branches instead of mid-step branches to evaluate incident velocity (used without noRatch) == =============================================================== By default, the mask is zero, wherefore none of these approximations is used. [type: int, range: 0−15] Cg2_Facet_Capsule_L6Geom '''''''''''''''''''''''' :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CGeomFunctor` → :obj:`~woo.dem.Cg2_Any_Any_L6Geom__Base` → :obj:`~woo.dem.Cg2_Facet_Capsule_L6Geom` .. autoclass:: Cg2_Facet_Capsule_L6Geom :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: Cg2_Wall_Facet_L6Geom ''''''''''''''''''''' :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CGeomFunctor` → :obj:`~woo.dem.Cg2_Any_Any_L6Geom__Base` → :obj:`~woo.dem.Cg2_Wall_Facet_L6Geom` .. autoclass:: Cg2_Wall_Facet_L6Geom :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: Cg2_Facet_InfCylinder_L6Geom '''''''''''''''''''''''''''' :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CGeomFunctor` → :obj:`~woo.dem.Cg2_Any_Any_L6Geom__Base` → :obj:`~woo.dem.Cg2_Facet_InfCylinder_L6Geom` .. autoclass:: Cg2_Facet_InfCylinder_L6Geom :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: Cg2_Wall_Capsule_L6Geom ''''''''''''''''''''''' :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CGeomFunctor` → :obj:`~woo.dem.Cg2_Any_Any_L6Geom__Base` → :obj:`~woo.dem.Cg2_Wall_Capsule_L6Geom` .. autoclass:: Cg2_Wall_Capsule_L6Geom :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: Cg2_Wall_Sphere_L6Geom '''''''''''''''''''''' :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CGeomFunctor` → :obj:`~woo.dem.Cg2_Any_Any_L6Geom__Base` → :obj:`~woo.dem.Cg2_Wall_Sphere_L6Geom` .. autoclass:: Cg2_Wall_Sphere_L6Geom :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: Cg2_Facet_Facet_L6Geom '''''''''''''''''''''' :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CGeomFunctor` → :obj:`~woo.dem.Cg2_Any_Any_L6Geom__Base` → :obj:`~woo.dem.Cg2_Facet_Facet_L6Geom` .. autoclass:: Cg2_Facet_Facet_L6Geom :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: Cg2_Ellipsoid_Ellipsoid_L6Geom '''''''''''''''''''''''''''''' :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CGeomFunctor` → :obj:`~woo.dem.Cg2_Any_Any_L6Geom__Base` → :obj:`~woo.dem.Cg2_Ellipsoid_Ellipsoid_L6Geom` .. graphviz:: digraph Cg2_Ellipsoid_Ellipsoid_L6Geom { rankdir=LR; margin=.2; "Cg2_Ellipsoid_Ellipsoid_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Cg2_Ellipsoid_Ellipsoid_L6Geom"]; "Cg2_Sphere_Ellipsoid_L6Geom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Cg2_Ellipsoid_Ellipsoid_L6Geom"]; "Cg2_Ellipsoid_Ellipsoid_L6Geom" -> "Cg2_Sphere_Ellipsoid_L6Geom" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: Cg2_Ellipsoid_Ellipsoid_L6Geom :members: :exclude-members: brent, brentBits, __init__, __getstate__, __setstate__ :special-members: .. attribute:: brent (= True) Use Brent iteration for finding maximum of the Perram-Wertheim potential. If false, use Newton-Raphson (not yet implemented). [type: bool] .. attribute:: brentBits (= 32) Precision for the Brent method, as number of bits. [type: int] Cg2_Sphere_Ellipsoid_L6Geom ^^^^^^^^^^^^^^^^^^^^^^^^^^^ :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CGeomFunctor` → :obj:`~woo.dem.Cg2_Any_Any_L6Geom__Base` → :obj:`~woo.dem.Cg2_Ellipsoid_Ellipsoid_L6Geom` → :obj:`~woo.dem.Cg2_Sphere_Ellipsoid_L6Geom` .. autoclass:: Cg2_Sphere_Ellipsoid_L6Geom :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: Cg2_Sphere_Capsule_L6Geom ''''''''''''''''''''''''' :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CGeomFunctor` → :obj:`~woo.dem.Cg2_Any_Any_L6Geom__Base` → :obj:`~woo.dem.Cg2_Sphere_Capsule_L6Geom` .. autoclass:: Cg2_Sphere_Capsule_L6Geom :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: Cg2_Facet_Sphere_L6Geom ''''''''''''''''''''''' :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CGeomFunctor` → :obj:`~woo.dem.Cg2_Any_Any_L6Geom__Base` → :obj:`~woo.dem.Cg2_Facet_Sphere_L6Geom` .. autoclass:: Cg2_Facet_Sphere_L6Geom :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: Cg2_Capsule_Capsule_L6Geom '''''''''''''''''''''''''' :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CGeomFunctor` → :obj:`~woo.dem.Cg2_Any_Any_L6Geom__Base` → :obj:`~woo.dem.Cg2_Capsule_Capsule_L6Geom` .. autoclass:: Cg2_Capsule_Capsule_L6Geom :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: Cg2_Rod_Sphere_L6Geom ''''''''''''''''''''' :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CGeomFunctor` → :obj:`~woo.dem.Cg2_Any_Any_L6Geom__Base` → :obj:`~woo.dem.Cg2_Rod_Sphere_L6Geom` .. autoclass:: Cg2_Rod_Sphere_L6Geom :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: Cg2_Facet_Ellipsoid_L6Geom '''''''''''''''''''''''''' :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CGeomFunctor` → :obj:`~woo.dem.Cg2_Any_Any_L6Geom__Base` → :obj:`~woo.dem.Cg2_Facet_Ellipsoid_L6Geom` .. autoclass:: Cg2_Facet_Ellipsoid_L6Geom :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: Cg2_Cone_Sphere_L6Geom '''''''''''''''''''''' :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CGeomFunctor` → :obj:`~woo.dem.Cg2_Any_Any_L6Geom__Base` → :obj:`~woo.dem.Cg2_Cone_Sphere_L6Geom` .. autoclass:: Cg2_Cone_Sphere_L6Geom :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: Cg2_InfCylinder_Sphere_L6Geom ''''''''''''''''''''''''''''' :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CGeomFunctor` → :obj:`~woo.dem.Cg2_Any_Any_L6Geom__Base` → :obj:`~woo.dem.Cg2_InfCylinder_Sphere_L6Geom` .. autoclass:: Cg2_InfCylinder_Sphere_L6Geom :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: Cg2_InfCylinder_Capsule_L6Geom '''''''''''''''''''''''''''''' :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CGeomFunctor` → :obj:`~woo.dem.Cg2_Any_Any_L6Geom__Base` → :obj:`~woo.dem.Cg2_InfCylinder_Capsule_L6Geom` .. autoclass:: Cg2_InfCylinder_Capsule_L6Geom :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: Cg2_Sphere_Sphere_L6Geom '''''''''''''''''''''''' :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CGeomFunctor` → :obj:`~woo.dem.Cg2_Any_Any_L6Geom__Base` → :obj:`~woo.dem.Cg2_Sphere_Sphere_L6Geom` .. autoclass:: Cg2_Sphere_Sphere_L6Geom :members: :exclude-members: distFactor, __init__, __getstate__, __setstate__ :special-members: .. attribute:: distFactor (= -1.0) removed in `API 10103 `__, set :obj:`DemField.distFactor` instead. [type: Real, not shown in the UI, not dumped, **DEPRECATED**, raises ``ValueError`` when accessed] Cg2_Wall_Ellipsoid_L6Geom ''''''''''''''''''''''''' :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CGeomFunctor` → :obj:`~woo.dem.Cg2_Any_Any_L6Geom__Base` → :obj:`~woo.dem.Cg2_Wall_Ellipsoid_L6Geom` .. autoclass:: Cg2_Wall_Ellipsoid_L6Geom :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: Cg2_Wall_Sphere_G3Geom %%%%%%%%%%%%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CGeomFunctor` → :obj:`~woo.dem.Cg2_Wall_Sphere_G3Geom` .. autoclass:: Cg2_Wall_Sphere_G3Geom :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: .. rst-class:: html-toggle .. rst-class:: emphasized CGeomDispatcher """"""""""""""" :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.Dispatcher` → :obj:`~woo.dem.CGeomDispatcher` .. autoclass:: CGeomDispatcher :members: :exclude-members: functors, __init__, __getstate__, __setstate__ :special-members: .. attribute:: functors (= []) Functors active in the dispatch mechanism [overridden below]. [type: vector>] .. rst-class:: html-toggle .. rst-class:: emphasized Physical properties +++++++++++++++++++ TODO .. rst-class:: html-toggle .. rst-class:: emphasized CPhys """"" :obj:`~woo.core.Object` → :obj:`~woo.dem.CPhys` .. graphviz:: digraph CPhys { rankdir=LR; margin=.2; "CPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CPhys"]; "FrictPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CPhys"]; "CPhys" -> "FrictPhys" [arrowsize=0.5,style="setlinewidth(0.5)"] "HertzPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CPhys"]; "FrictPhys" -> "HertzPhys" [arrowsize=0.5,style="setlinewidth(0.5)"] "ConcretePhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CPhys"]; "FrictPhys" -> "ConcretePhys" [arrowsize=0.5,style="setlinewidth(0.5)"] "PelletPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CPhys"]; "FrictPhys" -> "PelletPhys" [arrowsize=0.5,style="setlinewidth(0.5)"] "IcePhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CPhys"]; "FrictPhys" -> "IcePhys" [arrowsize=0.5,style="setlinewidth(0.5)"] "LudingPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CPhys"]; "FrictPhys" -> "LudingPhys" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: CPhys :members: :exclude-members: force, torque, __init__, __getstate__, __setstate__ :special-members: .. attribute:: force (= Vector3(0,0,0)) Force applied on the first particle in the contact [type: Vector3r, unit: N] .. attribute:: torque (= Vector3(0,0,0)) Torque applied on the first particle in the contact [type: Vector3r, unit: N·m] .. rst-class:: html-toggle .. rst-class:: emphasized FrictPhys """"""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.CPhys` → :obj:`~woo.dem.FrictPhys` .. graphviz:: digraph FrictPhys { rankdir=LR; margin=.2; "FrictPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.FrictPhys"]; "HertzPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.FrictPhys"]; "FrictPhys" -> "HertzPhys" [arrowsize=0.5,style="setlinewidth(0.5)"] "ConcretePhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.FrictPhys"]; "FrictPhys" -> "ConcretePhys" [arrowsize=0.5,style="setlinewidth(0.5)"] "PelletPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.FrictPhys"]; "FrictPhys" -> "PelletPhys" [arrowsize=0.5,style="setlinewidth(0.5)"] "IcePhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.FrictPhys"]; "FrictPhys" -> "IcePhys" [arrowsize=0.5,style="setlinewidth(0.5)"] "LudingPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.FrictPhys"]; "FrictPhys" -> "LudingPhys" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: FrictPhys :members: :exclude-members: tanPhi, kn, kt, __init__, __getstate__, __setstate__ :special-members: .. attribute:: tanPhi (= nan) Tangent of friction angle [type: Real] .. attribute:: kn (= nan) Normal stiffness [type: Real] .. attribute:: kt (= nan) Tangent stiffness [type: Real] PelletPhys %%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.dem.CPhys` → :obj:`~woo.dem.FrictPhys` → :obj:`~woo.dem.PelletPhys` .. autoclass:: PelletPhys :members: :exclude-members: normPlastCoeff, ka, __init__, __getstate__, __setstate__ :special-members: .. attribute:: normPlastCoeff (= nan) Normal plasticity coefficient. [type: Real] .. attribute:: ka (= nan) Adhesive stiffness. [type: Real] LudingPhys %%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.dem.CPhys` → :obj:`~woo.dem.FrictPhys` → :obj:`~woo.dem.LudingPhys` .. autoclass:: LudingPhys :members: :exclude-members: kn1, kna, k2hat, deltaMax, deltaLim, kr, kw, viscN, viscT, viscR, viscW, dynDivStat, statR, statW, xiT, xiR, xiW, work, __init__, __getstate__, __setstate__ :special-members: .. attribute:: kn1 (= nan) Normal plastic (loading) stiffness. [type: Real] .. attribute:: kna (= nan) Normal adhesive stiffness. [type: Real] .. attribute:: k2hat (= nan) Maximum stiffness. [type: Real] .. attribute:: deltaMax (= 0.0) Historically maximum overlap value. [type: Real] .. attribute:: deltaLim (= nan) Upper limit for :obj:`deltaMax`. [type: Real] .. attribute:: kr (= nan) Roll stiffness. [type: Real] .. attribute:: kw (= nan) Twist stiffness. [type: Real] .. attribute:: viscN (= nan) Normal viscosity. [type: Real] .. attribute:: viscT (= nan) Tangent viscosity. [type: Real] .. attribute:: viscR (= nan) Roll viscosity. [type: Real] .. attribute:: viscW (= nan) Twist viscosity. [type: Real] .. attribute:: dynDivStat (= nan) Dynamic to static friction. [type: Real] .. attribute:: statR (= nan) Roll static friction. [type: Real] .. attribute:: statW (= nan) Twist static friction. [type: Real] .. attribute:: xiT (= Vector2(0,0)) Tangent elastic displacement. [type: Vector2r] .. attribute:: xiR (= Vector2(0,0)) Tangent elastic rotation. [type: Vector2r] .. attribute:: xiW (= 0.0) Twist elastic rotation. [type: Real] .. attribute:: work (= []) Per-contact dissipation (unallocated when energy tracking is not enabled). [type: vector] IcePhys %%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.dem.CPhys` → :obj:`~woo.dem.FrictPhys` → :obj:`~woo.dem.IcePhys` .. autoclass:: IcePhys :members: :exclude-members: kWR, brkNT, brkWR, mu, bonds, uN0, __init__, __getstate__, __setstate__ :special-members: .. attribute:: kWR (= Vector2(nan,nan)) Twisting and rolling stiffness. [type: Vector2r] .. attribute:: brkNT (= Vector2(nan,nan)) Limits of breakage in normal & tangential senses. [type: Vector2r, unit: N] .. attribute:: brkWR (= Vector2(nan,nan)) Limits of breakage in twisting & rolling senses. [type: Vector2r, unit: N·m] .. attribute:: mu (= nan) Kinetic (rolling) friction coefficient. [type: Real] .. attribute:: bonds (= 0) Bits specifying whether the contact is bonded (in 4 senses) and whether it is breakable (in 4 senses). [type: int, bit accessors: **bondN**, **bondT**, **bondW**, **bondR**, **brkN**, **brkT**, **brkW**, **brkR**] .. attribute:: uN0 (= 0.0) Initial value of normal overlap; set automatically by :obj:`Law_L6Geom_IcePhys` when :obj:`~Law_L6Geom_IcePhys.iniEqlb` is true (default). [type: Real] ConcretePhys %%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.dem.CPhys` → :obj:`~woo.dem.FrictPhys` → :obj:`~woo.dem.ConcretePhys` .. autoclass:: ConcretePhys :members: :exclude-members: E, G, coh0, epsCrackOnset, epsFracture, dmgTau, dmgRateExp, dmgStrain, dmgOverstress, plTau, plRateExp, isoPrestress, neverDamage, damLaw, isCohesive, epsT, omega, uN0, epsN, sigmaN, sigmaT, epsNPl, kappaD, relResidualStrength, __init__, __getstate__, __setstate__ :special-members: .. attribute:: E (= nan) normal modulus (stiffness / crossSection) [Pa] [type: Real] .. attribute:: G (= nan) shear modulus [Pa] [type: Real] .. attribute:: coh0 (= nan) virgin material cohesion [Pa] [type: Real] .. attribute:: epsCrackOnset (= nan) strain at which the material starts to behave non-linearly [type: Real] .. attribute:: epsFracture (= nan) strain at which the bond is fully broken [-] [type: Real] .. attribute:: dmgTau (= -1.0) characteristic time for damage (if non-positive, the law without rate-dependence is used) [type: Real] .. attribute:: dmgRateExp (= 0.0) exponent in the rate-dependent damage evolution [type: Real] .. attribute:: dmgStrain (= 0.0) damage strain (at previous or current step) [type: Real] .. attribute:: dmgOverstress (= 0.0) damage viscous overstress (at previous step or at current step) [type: Real] .. attribute:: plTau (= -1.0) characteristic time for viscoplasticity (if non-positive, no rate-dependence for shear) [type: Real] .. attribute:: plRateExp (= 0.0) exponent in the rate-dependent viscoplasticity [type: Real] .. attribute:: isoPrestress (= 0.0) "prestress" of this link (used to simulate isotropic stress) [type: Real] .. attribute:: neverDamage (= False) the damage evolution function will always return virgin state [type: bool] .. attribute:: damLaw (= 1) Law for softening part of uniaxial tension. 0 for linear, 1 for exponential (default) [type: int] .. attribute:: isCohesive (= False) if not cohesive, interaction is deleted when distance is greater than zero. [type: bool] .. attribute:: epsT (= Vector2(0,0)) Shear strain; updated incrementally from :obj:`L6Geom.vel`. [type: Vector2r, not saved, read-only in python] .. rubric:: ► Auto-computed .. attribute:: omega (= 0.0) Damage parameter [type: Real, not saved, read-only in python] .. attribute:: uN0 (= nan) Initial normal displacement (equilibrium state) [type: Real, read-only in python] .. attribute:: epsN (= 0.0) Normal strain [type: Real, not saved, read-only in python] .. attribute:: sigmaN (= 0.0) Normal force [type: Real, not saved, read-only in python] .. attribute:: sigmaT (= Vector2(0,0)) Tangential stress [type: Vector2r, not saved, read-only in python] .. attribute:: epsNPl (= 0.0) Normal plastic strain [type: Real, not saved, read-only in python] .. attribute:: kappaD (= 0.0) Value of the kappa function [type: Real, not saved, read-only in python] .. attribute:: relResidualStrength (= 1.0) Relative residual strength [type: Real, not saved, read-only in python] HertzPhys %%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.dem.CPhys` → :obj:`~woo.dem.FrictPhys` → :obj:`~woo.dem.HertzPhys` .. autoclass:: HertzPhys :members: :exclude-members: kt0, alpha_sqrtMK, R, K, gamma, alpha, contRad, __init__, __getstate__, __setstate__ :special-members: .. attribute:: kt0 (= 0.0) Constant for computing current normal stiffness. [type: Real] .. attribute:: alpha_sqrtMK (= 0.0) Value for computing damping coefficient -- see :cite:`Antypov2011`, eq (10). [type: Real] .. attribute:: R (= 0.0) Effective radius (for the Schwarz model) [type: Real] .. attribute:: K (= 0.0) Effective stiffness (for the Schwarz model) [type: Real] .. attribute:: gamma (= 0.0) Surface energy (for the Schwarz model) [type: Real] .. attribute:: alpha (= 0.0) COS alpha coefficient [type: Real] .. attribute:: contRad (= 0.0) Contact radius, used for storing previous value as the initial guess in the next step. [type: Real] .. rst-class:: html-toggle .. rst-class:: emphasized CPhysFunctor """""""""""" :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CPhysFunctor` .. graphviz:: digraph CPhysFunctor { rankdir=LR; margin=.2; "CPhysFunctor" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CPhysFunctor"]; "Cp2_PelletMat_PelletPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CPhysFunctor"]; "Cp2_FrictMat_FrictPhys" -> "Cp2_PelletMat_PelletPhys" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cp2_LudingMat_LudingPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CPhysFunctor"]; "Cp2_FrictMat_FrictPhys" -> "Cp2_LudingMat_LudingPhys" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cp2_HertzMat_HertzPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CPhysFunctor"]; "Cp2_FrictMat_FrictPhys" -> "Cp2_HertzMat_HertzPhys" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cp2_IceMat_IcePhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CPhysFunctor"]; "Cp2_FrictMat_FrictPhys" -> "Cp2_IceMat_IcePhys" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cp2_FrictMat_FrictPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CPhysFunctor"]; "CPhysFunctor" -> "Cp2_FrictMat_FrictPhys" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cp2_FrictMat_FrictPhys_CrossAnisotropic" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CPhysFunctor"]; "CPhysFunctor" -> "Cp2_FrictMat_FrictPhys_CrossAnisotropic" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cp2_ConcreteMat_ConcretePhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CPhysFunctor"]; "CPhysFunctor" -> "Cp2_ConcreteMat_ConcretePhys" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: CPhysFunctor :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: Cp2_FrictMat_FrictPhys_CrossAnisotropic %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CPhysFunctor` → :obj:`~woo.dem.Cp2_FrictMat_FrictPhys_CrossAnisotropic` .. autoclass:: Cp2_FrictMat_FrictPhys_CrossAnisotropic :members: :exclude-members: E1, E2, G1, G2, nu1, alpha, beta, xisoAxis, recomputeStep, __init__, __getstate__, __setstate__ :special-members: .. attribute:: E1 (= 1000000.0) In-plane normal modulus [type: Real, unit: Pa] .. attribute:: E2 (= 100000.0) Out-of-plane normal modulus [type: Real, unit: Pa] .. attribute:: G1 (= 10000.0) In-plane shear modulus [type: Real, unit: Pa] .. attribute:: G2 (= 10000.0) Out-of-plane shear modulus [type: Real, unit: Pa] .. attribute:: nu1 (= 0.4) Major Poisson's ratio; dependent value computed as \ :math:`\frac{E_1}{2G_1}-1`\ . [type: Real, read-only in python] .. attribute:: alpha (= 0.0) Strike angle for the local axes [type: Real, unit: rad, range: 0−6.28319] .. attribute:: beta (= 0.0) Dip angle for the local axes [type: Real, unit: rad, range: 0−1.5708] .. attribute:: xisoAxis (= Vector3(1,0,0)) Axis (normal) of the cross-anisotropy in global coordinates; computed from :obj:`alpha` and :obj:`beta` as :math:`\vec{n}=(\cos\alpha\sin\beta,-\sin\alpha\sin\beta,\cos\beta)`. [type: Vector3r, read-only in python] .. attribute:: recomputeStep (= -1) Keep track of updates to :obj:`alpha` and :obj:`beta`, so that stiffnesses of existing contacts are forced to be updated. [type: int] Cp2_ConcreteMat_ConcretePhys %%%%%%%%%%%%%%%%%%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CPhysFunctor` → :obj:`~woo.dem.Cp2_ConcreteMat_ConcretePhys` .. autoclass:: Cp2_ConcreteMat_ConcretePhys :members: :exclude-members: cohesiveThresholdStep, __init__, __getstate__, __setstate__ :special-members: .. attribute:: cohesiveThresholdStep (= 10) Should new contacts be cohesive? They will before this iter#, they will not be afterwards. If 0, they will never be. If negative, they will always be created as cohesive (10 by default). [type: long] Cp2_FrictMat_FrictPhys %%%%%%%%%%%%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CPhysFunctor` → :obj:`~woo.dem.Cp2_FrictMat_FrictPhys` .. graphviz:: digraph Cp2_FrictMat_FrictPhys { rankdir=LR; margin=.2; "Cp2_FrictMat_FrictPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Cp2_FrictMat_FrictPhys"]; "Cp2_PelletMat_PelletPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Cp2_FrictMat_FrictPhys"]; "Cp2_FrictMat_FrictPhys" -> "Cp2_PelletMat_PelletPhys" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cp2_LudingMat_LudingPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Cp2_FrictMat_FrictPhys"]; "Cp2_FrictMat_FrictPhys" -> "Cp2_LudingMat_LudingPhys" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cp2_HertzMat_HertzPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Cp2_FrictMat_FrictPhys"]; "Cp2_FrictMat_FrictPhys" -> "Cp2_HertzMat_HertzPhys" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cp2_IceMat_IcePhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Cp2_FrictMat_FrictPhys"]; "Cp2_FrictMat_FrictPhys" -> "Cp2_IceMat_IcePhys" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: Cp2_FrictMat_FrictPhys :members: :exclude-members: tanPhi, __init__, __getstate__, __setstate__ :special-members: .. attribute:: tanPhi (= None) Instance of :obj:`MatchMaker` determining how to compute contact friction angle. If ``None``, minimum value is used. [type: shared_ptr<:obj:`MatchMaker `>] Cp2_LudingMat_LudingPhys '''''''''''''''''''''''' :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CPhysFunctor` → :obj:`~woo.dem.Cp2_FrictMat_FrictPhys` → :obj:`~woo.dem.Cp2_LudingMat_LudingPhys` .. autoclass:: Cp2_LudingMat_LudingPhys :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: Cp2_IceMat_IcePhys '''''''''''''''''' :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CPhysFunctor` → :obj:`~woo.dem.Cp2_FrictMat_FrictPhys` → :obj:`~woo.dem.Cp2_IceMat_IcePhys` .. autoclass:: Cp2_IceMat_IcePhys :members: :exclude-members: bonds0, bonds1, step01, __init__, __getstate__, __setstate__ :special-members: .. attribute:: bonds0 (= 0) Bonding bits for new contacts, for the initial configuration. [type: int, bit accessors: **bondN**, **bondT**, **bondW**, **bondR**, **brkN**, **brkT**, **brkW**, **brkR**] .. attribute:: bonds1 (= 0) Bonding bits for new contacts, for contacts created after the initial configuration. [type: int, bit accessors: **bondN**, **bondT**, **bondW**, **bondR**, **brkN**, **brkT**, **brkW**, **brkR**] .. attribute:: step01 (= 3) :obj:`Step ` after which :obj:`bonds1` will be used instead of :obj:`bonds0` for new contacts. [type: int] Cp2_HertzMat_HertzPhys '''''''''''''''''''''' :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CPhysFunctor` → :obj:`~woo.dem.Cp2_FrictMat_FrictPhys` → :obj:`~woo.dem.Cp2_HertzMat_HertzPhys` .. autoclass:: Cp2_HertzMat_HertzPhys :members: :exclude-members: poisson, en, __init__, __getstate__, __setstate__ :special-members: .. attribute:: poisson (= 0.2) Poisson ratio for computing contact properties (not provided by the material class currently) [type: Real] .. attribute:: en (= nan) Normal coefficient of restitution (if outside the 0-1 range, there will be no damping, making ``en`` effectively equal to one). [type: Real] Cp2_PelletMat_PelletPhys '''''''''''''''''''''''' :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.CPhysFunctor` → :obj:`~woo.dem.Cp2_FrictMat_FrictPhys` → :obj:`~woo.dem.Cp2_PelletMat_PelletPhys` .. autoclass:: Cp2_PelletMat_PelletPhys :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: .. rst-class:: html-toggle .. rst-class:: emphasized CPhysDispatcher """"""""""""""" :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.Dispatcher` → :obj:`~woo.dem.CPhysDispatcher` .. autoclass:: CPhysDispatcher :members: :exclude-members: functors, __init__, __getstate__, __setstate__ :special-members: .. attribute:: functors (= []) Functors active in the dispatch mechanism [overridden below]. [type: vector>] .. rst-class:: html-toggle .. rst-class:: emphasized Contact law +++++++++++ TODO .. rst-class:: html-toggle .. rst-class:: emphasized CData """"" :obj:`~woo.core.Object` → :obj:`~woo.dem.CData` .. graphviz:: digraph CData { rankdir=LR; margin=.2; "CData" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CData"]; "IdealElPlData" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CData"]; "CData" -> "IdealElPlData" [arrowsize=0.5,style="setlinewidth(0.5)"] "G3GeomCData" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CData"]; "CData" -> "G3GeomCData" [arrowsize=0.5,style="setlinewidth(0.5)"] "PelletCData" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CData"]; "CData" -> "PelletCData" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: CData :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: .. rst-class:: html-toggle .. rst-class:: emphasized G3GeomCData """"""""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.CData` → :obj:`~woo.dem.G3GeomCData` .. autoclass:: G3GeomCData :members: :exclude-members: shearForce, __init__, __getstate__, __setstate__ :special-members: .. attribute:: shearForce (= Vector3(0,0,0)) Shear force in global coordinates [type: Vector3r] .. rst-class:: html-toggle .. rst-class:: emphasized PelletCData """"""""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.CData` → :obj:`~woo.dem.PelletCData` .. autoclass:: PelletCData :members: :exclude-members: uNPl, uN0, __init__, __getstate__, __setstate__ :special-members: .. attribute:: uNPl (= 0.0) Plastic displacement on the contact. [type: Real] .. attribute:: uN0 (= 0.0) Initial distance (defines equilibrium). [type: Real] .. rst-class:: html-toggle .. rst-class:: emphasized IdealElPlData """"""""""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.CData` → :obj:`~woo.dem.IdealElPlData` .. autoclass:: IdealElPlData :members: :exclude-members: uN0, __init__, __getstate__, __setstate__ :special-members: .. attribute:: uN0 (= 0.0) Reference (equilibrium) value for uN (normal displacement). [type: Real] .. rst-class:: html-toggle .. rst-class:: emphasized LawFunctor """""""""" :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.LawFunctor` .. graphviz:: digraph LawFunctor { rankdir=LR; margin=.2; "LawFunctor" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.LawFunctor"]; "Law2_L6Geom_LudingPhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.LawFunctor"]; "LawFunctor" -> "Law2_L6Geom_LudingPhys" [arrowsize=0.5,style="setlinewidth(0.5)"] "Law2_L6Geom_ConcretePhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.LawFunctor"]; "LawFunctor" -> "Law2_L6Geom_ConcretePhys" [arrowsize=0.5,style="setlinewidth(0.5)"] "Law2_L6Geom_IcePhys" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.LawFunctor"]; "LawFunctor" -> "Law2_L6Geom_IcePhys" [arrowsize=0.5,style="setlinewidth(0.5)"] "Law2_L6Geom_PelletPhys_Pellet" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.LawFunctor"]; "LawFunctor" -> "Law2_L6Geom_PelletPhys_Pellet" [arrowsize=0.5,style="setlinewidth(0.5)"] "Law2_L6Geom_HertzPhys_DMT" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.LawFunctor"]; "LawFunctor" -> "Law2_L6Geom_HertzPhys_DMT" [arrowsize=0.5,style="setlinewidth(0.5)"] "Law2_G3Geom_FrictPhys_IdealElPl" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.LawFunctor"]; "LawFunctor" -> "Law2_G3Geom_FrictPhys_IdealElPl" [arrowsize=0.5,style="setlinewidth(0.5)"] "Law2_L6Geom_FrictPhys_IdealElPl" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.LawFunctor"]; "LawFunctor" -> "Law2_L6Geom_FrictPhys_IdealElPl" [arrowsize=0.5,style="setlinewidth(0.5)"] "Law2_L6Geom_FrictPhys_LinEl6" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.LawFunctor"]; "LawFunctor" -> "Law2_L6Geom_FrictPhys_LinEl6" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: LawFunctor :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: Law2_L6Geom_IcePhys %%%%%%%%%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.LawFunctor` → :obj:`~woo.dem.Law2_L6Geom_IcePhys` .. autoclass:: Law2_L6Geom_IcePhys :members: :exclude-members: iniEqlb, elastIx, brokenIx, plastIx, __init__, __getstate__, __setstate__ :special-members: .. attribute:: iniEqlb (= True) Set the intial distance as equilibrium distance (saved in :obj:`IcePhys.uN0`, subtracted from L6Geom.uN); enabling during simulation will only affect newly created contacts). [type: bool] .. attribute:: elastIx (= -1) Index of elastic energy (cache). [type: int, read-only in python] .. attribute:: brokenIx (= -1) Index of energy which disappeared when contacts broke (cache). [type: int, read-only in python] .. attribute:: plastIx (= -1) Index of plastically dissipated energy (cache). [type: int, read-only in python] Law2_L6Geom_ConcretePhys %%%%%%%%%%%%%%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.LawFunctor` → :obj:`~woo.dem.Law2_L6Geom_ConcretePhys` .. autoclass:: Law2_L6Geom_ConcretePhys :members: :exclude-members: yieldSurfType, yieldLogSpeed, yieldEllipseShift, omegaThreshold, epsSoft, relKnSoft, elastPotIx, __init__, __getstate__, __setstate__ :special-members: .. attribute:: yieldSurfType (= 3) yield function: 0: mohr-coulomb (original); 1: parabolic; 2: logarithmic, 3: log+lin_tension, 4: elliptic, 5: elliptic+log [type: int, named enum, possible values are: **'linear'** (*'lin'*, *'MC'*, *'mc'*, *'Mohr-Coulomb'*; 0), **'para'** (*'parabolic'*; 1), **'log'** (*'logarithmic'*; 2), **'log+lin'** (*'logarithmic, linear tension'*, *'loglin'*; 3), **'elliptic'** (*'ell'*; 4), **'elliptic+logarithmic'** (*'ell+log'*; 5)] .. attribute:: yieldLogSpeed (= 0.1) scaling in the logarithmic yield surface (should be <1 for realistic results; >=0 for meaningful results) [type: Real] .. attribute:: yieldEllipseShift (= nan) horizontal scaling of the ellipse (shifts on the +x axis as interactions with +y are given) [type: Real] .. attribute:: omegaThreshold (= 1.0) damage after which the contact disappears (<1), since omega reaches 1 only for strain →+∞ [type: Real] .. attribute:: epsSoft (= -0.003) Strain at which softening in compression starts (non-negative to deactivate) [type: Real] .. attribute:: relKnSoft (= 0.3) Relative rigidity of the softening branch in compression (0=perfect elastic-plastic, <0 softening, >0 hardening) [type: Real] .. attribute:: elastPotIx (= -1) Index for elastic potential energy [type: int, not saved, not accessible from python] Law2_L6Geom_FrictPhys_LinEl6 %%%%%%%%%%%%%%%%%%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.LawFunctor` → :obj:`~woo.dem.Law2_L6Geom_FrictPhys_LinEl6` .. autoclass:: Law2_L6Geom_FrictPhys_LinEl6 :members: :exclude-members: charLen, elastPotIx, __init__, __getstate__, __setstate__ :special-members: .. attribute:: charLen (= -1.0) Characteristic length, which is equal to stiffnesses ratio kNormal/kTwist and kShear/kBend. Must be non-negative. [type: Real, unit: m] .. attribute:: elastPotIx (= -1) Index for elastic potential energy [type: int, not saved, not accessible from python] Law2_L6Geom_HertzPhys_DMT %%%%%%%%%%%%%%%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.LawFunctor` → :obj:`~woo.dem.Law2_L6Geom_HertzPhys_DMT` .. autoclass:: Law2_L6Geom_HertzPhys_DMT :members: :exclude-members: noAttraction, nCallsIters, avgIter, digits, plastIx, viscNIx, viscTIx, elastPotIx, dmtIx, __init__, __getstate__, __setstate__ :special-members: .. attribute:: noAttraction (= True) Avoid non-physical normal attraction which may result from viscous effects by making the normal force zero if there is attraction (:math:`F_n>0`). This condition is only applied to elastic and viscous part of the normal force. Adhesion, if present, is not limited. See :cite:`Antypov2011`, the 'Model choice' section (pg. 5), for discussion of this effect. .. note:: It is technically not possible to break the contact completely while there is still geometrical overlap, so only force is set to zero but the contact still exists. [type: bool] .. attribute:: nCallsIters Count number of calls of the functor and of iterations in the Halley solver (if used). [type: OpenMPArrayAccumulator, not shown in the UI, not dumped] .. attribute:: avgIter (= nan) Average number of Halley iterations per contact when using the Schwarz model (updated on-demand). [type: Real, read-only in python] .. attribute:: digits (= 26) Precision for Halley iteration with the Schwarz model, measured in binary digits; the maximum is the number of digits of the floating point type for given platform. Precision above 2/3 of the maximum will very likely have no effect on the result, but it will require extra (few) iterations before converging. [type: int, range: 1−53] .. attribute:: plastIx (= -1) Index of plastically dissipated energy. [type: int, not saved, not accessible from python] .. attribute:: viscNIx (= -1) Index of viscous dissipation in the normal sense. [type: int, not saved, not accessible from python] .. attribute:: viscTIx (= -1) Index of viscous dissipation in the tangent sense. [type: int, not saved, not accessible from python] .. attribute:: elastPotIx (= -1) Index for elastic potential energy. [type: int, not saved, not accessible from python] .. attribute:: dmtIx (= -1) Index for elastic energy of new/broken contacts. [type: int, not saved, not accessible from python] Law2_L6Geom_PelletPhys_Pellet %%%%%%%%%%%%%%%%%%%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.LawFunctor` → :obj:`~woo.dem.Law2_L6Geom_PelletPhys_Pellet` .. autoclass:: Law2_L6Geom_PelletPhys_Pellet :members: :exclude-members: thinRate, thinRelRMin, thinExp, thinRefRad, thinMinExp, thinRateExp, confSigma, confRefRad, confExp, iniEqlb, plastSplit, plastIx, normPlastIx, elastPotIx, __init__, __getstate__, __setstate__ :special-members: .. attribute:: thinRate (= 0.0) The amount of reducing particle radius (:math:`\theta_t`), relative to plastic deformation increment (non-positive to disable thinning) [type: Real] .. attribute:: thinRelRMin (= 0.7) Minimum radius reachable with sphere thinning at plastic deformation, relative to initial particle size (:math:`r_{\min}^{\mathrm{rel}}`) [type: Real] .. attribute:: thinExp (= -1.0) Exponent for reducing the rate of thinning as the minimum radius is being approached (:math:`\gamma_t`) [type: Real] .. attribute:: thinRefRad (= 0.0) Reference radius for thinning; if positive, :obj:`thinRateExp` and :obj:`thinMinExp` are in effect. [type: Real, unit: m] .. attribute:: thinMinExp (= 0.0) Multiply minimum radius :math:`r_0` by :math:`\left(\frac{r}{r_{\rm thinRefRad}}\right)^{\rm thinMinExp}` (size-dependent minimum radius). [type: Real] .. attribute:: thinRateExp (= 0.0) Multiply thinning rate :math:`\theta_t` (:obj:`thinRate`) by :math:`\left(\frac{r}{r_{\rm thinRefRad}}\right)^{\rm thinRateExp}` (size-dependent minimum radius). [type: Real] .. attribute:: confSigma (= 0.0) Confinement stress (acting on :obj:`contact area `). Negative values will make particles stick together. The strain-stress diagram is shifted vertically with this parameter. The value of confinement can be further scaled with :obj:`confRefRad`. .. note:: Energy computation might be incorrect with confinement (not yet checked). [type: Real] .. attribute:: confRefRad (= 0.0) If positive, scale the confining stress (:obj:`confSigma`) using the value of :math:`\left(\frac{A}{\pi r_{\rm ref}^2}\right)^{\beta_c}`; this allows to introduce confinement which varies depending on particle size. [type: Real, unit: m] .. attribute:: confExp (= 1.0) Dimensionless exponent to be used in conjunction with :obj:`confRefRad`. [type: Real] .. attribute:: iniEqlb (= False) Use the initial distance as equilibrium. [type: bool] .. attribute:: plastSplit (= False) Track energy dissipated in normal and tangential sliding separately [type: bool] .. attribute:: plastIx (= -1) Index of plastically dissipated energy [type: int, not saved, not accessible from python] .. attribute:: normPlastIx (= -1) Index of plastically dissipated energy in the normal sense [type: int, not saved, not accessible from python] .. attribute:: elastPotIx (= -1) Index for elastic potential energy [type: int, not saved, not accessible from python] Law2_G3Geom_FrictPhys_IdealElPl %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.LawFunctor` → :obj:`~woo.dem.Law2_G3Geom_FrictPhys_IdealElPl` .. autoclass:: Law2_G3Geom_FrictPhys_IdealElPl :members: :exclude-members: noSlip, noBreak, plastDissipIx, elastPotIx, watch, __init__, __getstate__, __setstate__ :special-members: .. attribute:: noSlip (= False) Disable plastic slipping [type: bool] .. attribute:: noBreak (= False) Disable removal of contacts when in tension. [type: bool] .. attribute:: plastDissipIx (= -1) Index of plastically dissipated energy [type: int, not saved, not accessible from python] .. attribute:: elastPotIx (= -1) Index for elastic potential energy [type: int, not saved, not accessible from python] .. attribute:: watch (= Vector2i(-1,-1)) Print debug information for this couple of IDs [type: Vector2i] Law2_L6Geom_FrictPhys_IdealElPl %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.LawFunctor` → :obj:`~woo.dem.Law2_L6Geom_FrictPhys_IdealElPl` .. autoclass:: Law2_L6Geom_FrictPhys_IdealElPl :members: :exclude-members: iniEqlb, relRollStiff, relTwistStiff, rollTanPhi, noSlip, noBreak, noFrict, plastDissipIx, elastPotIx, brokenIx, __init__, __getstate__, __setstate__ :special-members: .. attribute:: iniEqlb (= False) Consider the intial distance as equilibrium distance (saved in contact data, subtracted from L6Geom.uN); enabling during simulation will only affect newly created contacts; disabling will affect all contacts. [type: bool] .. attribute:: relRollStiff (= 0.0) Rolling stiffness relative to :obj:`FrictPhys.kn` × ``charLen`` (with w``charLen`` being the sum of :obj:`L6Geom.lens`). If non-positive, there is no rolling/twisting resistance. [type: Real] .. attribute:: relTwistStiff (= 0.0) Twisting stiffness relative to rolling stiffness (see :obj:`relRollStiff`). [type: Real] .. attribute:: rollTanPhi (= 0.0) Rolling friction angle -- the rolling force will not exceed Fn × rollTanPhi. This value is applied separately to twisting as well. If non-positive, there is no rolling/twisting resistance. [type: Real, range: 0−1.5708] .. attribute:: noSlip (= False) Disable plastic slipping [type: bool] .. attribute:: noBreak (= False) Disable removal of contacts when in tension. [type: bool] .. attribute:: noFrict (= False) Turn off friction computation, it will be always zero regardless of material parameters [type: bool] .. attribute:: plastDissipIx (= -1) Index of plastically dissipated energy [type: int, not saved, not accessible from python] .. attribute:: elastPotIx (= -1) Index for elastic potential energy [type: int, not saved, not accessible from python] .. attribute:: brokenIx (= -1) Index for energy lost in broken contacts with non-zero force [type: int, not saved, not accessible from python] Law2_L6Geom_LudingPhys %%%%%%%%%%%%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.LawFunctor` → :obj:`~woo.dem.Law2_L6Geom_LudingPhys` .. autoclass:: Law2_L6Geom_LudingPhys :members: :exclude-members: wImmediate, viscIx, plastIx, __init__, __getstate__, __setstate__ :special-members: .. attribute:: wImmediate (= True) Increment plastic & viscous work in :obj:`S.energy ` in every step rather than commiting the sum when contact dissolves. Note that :obj:`Particle.matState ` (if a :obj:`LudingMatState`) is always updated only when the contact dissolves. [type: bool] .. attribute:: viscIx (= -1) Index of viscous dissipation. [type: int, not saved, not accessible from python] .. attribute:: plastIx (= -1) Index of plastic dissipation. [type: int, not saved, not accessible from python] .. rst-class:: html-toggle .. rst-class:: emphasized LawDispatcher """"""""""""" :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.Dispatcher` → :obj:`~woo.dem.LawDispatcher` .. autoclass:: LawDispatcher :members: :exclude-members: functors, __init__, __getstate__, __setstate__ :special-members: .. attribute:: functors (= []) Functors active in the dispatch mechanism [overridden below]. [type: vector>] .. rst-class:: html-toggle .. rst-class:: emphasized Testing contact laws """""""""""""""""""" TODO LawTester %%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.dem.LawTester` .. autoclass:: LawTester :members: :exclude-members: ids, done, abWeight, f, k, smooF, u, smooU, v, smooV, fErrRel, fErrAbs, uErrRel, uErrAbs, vErrRel, vErrAbs, smoothErr, smooth, stage, stageT0, stages, maxStageSteps, __init__, __getstate__, __setstate__ :special-members: .. attribute:: ids (= Vector2i(5923313,0)) Ids of particles in contact [type: Vector2i] .. attribute:: done (= 'tester.dead=True') Python expression to run once all stages had finished. This is run *after* :obj:`LawTesterStage.done` of the last stage. [type: string] .. attribute:: abWeight (= 1.0) Float, usually ∈〈0,1〉, determining on how are displacements/rotations distributed between particles (0 for A, 1 for B); intermediate values will apply respective part to each of them. [type: Real] .. attribute:: f (= Vector6(0,0,0, 0,0,0)) Force on contact, NaN if contact is broken [type: Vector6r, read-only in python] .. attribute:: k (= Vector6(0,0,0, 0,0,0)) Tangent contact stiffness, NaN if there is no contact (or the contact model does not define it). Diagonal of the K matrix in df=Kdu. [type: Vector6r, read-only in python] .. attribute:: smooF (= Vector6(0,0,0, 0,0,0)) Smoothed value of generalized contact forces. [type: Vector6r, read-only in python] .. attribute:: u (= Vector6(0,0,0, 0,0,0)) Cumulative value of contact displacement, NaN if contact is broken [type: Vector6r, read-only in python] .. attribute:: smooU (= Vector6(0,0,0, 0,0,0)) Smoothed value of generalized contact displacements. [type: Vector6r, read-only in python] .. attribute:: v (= Vector6(0,0,0, 0,0,0)) Relative velocity on contact; NaN if the contact is broken [type: Vector6r, read-only in python] .. attribute:: smooV (= Vector6(0,0,0, 0,0,0)) Smoothed value of generalized contact relative velocity. [type: Vector6r, read-only in python] .. attribute:: fErrRel (= Vector6(inf,inf,inf, inf,inf,inf)) Relative error of contact force (with respect to smoothed value) [type: Vector6r, read-only in python] .. attribute:: fErrAbs (= Vector6(inf,inf,inf, inf,inf,inf)) Absolute error of contact force (with respect to smoothed value) [type: Vector6r, read-only in python] .. attribute:: uErrRel (= Vector6(inf,inf,inf, inf,inf,inf)) Relative error of contact displacement (with respect to smoothed value) [type: Vector6r, read-only in python] .. attribute:: uErrAbs (= Vector6(inf,inf,inf, inf,inf,inf)) Absolute error of contact displacement (with respect to smoothed value) [type: Vector6r, read-only in python] .. attribute:: vErrRel (= Vector6(inf,inf,inf, inf,inf,inf)) Relative error of contact velocity (with respect to smoothed value) [type: Vector6r, read-only in python] .. attribute:: vErrAbs (= Vector6(inf,inf,inf, inf,inf,inf)) Absolute error of contact velocity (with respect to smoothed value) [type: Vector6r, read-only in python] .. attribute:: smoothErr (= -1.0) Smoothing factor for computing errors; if negative, set to *smooth* automatically. [type: Real] .. attribute:: smooth (= 0.0001) Smoothing factor for computing *smoothF* [type: Real] .. attribute:: stage (= 0) Current stage to be finished [type: int, read-only in python] .. attribute:: stageT0 (= -1.0) Time at which this stage was entered [type: Real, read-only in python] .. attribute:: stages (= []) Stages to be reached during the testing [type: vector>] .. attribute:: maxStageSteps (= 100000) Throw error if stage takes this many steps [type: int, not shown in the UI] LawTesterStage %%%%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.dem.LawTesterStage` .. autoclass:: LawTesterStage :members: :exclude-members: values, whats, until, untilEvery, done, step, time, hadC, hasC, timeC0, bounces, __init__, __getstate__, __setstate__ :special-members: .. attribute:: values (= Vector6(0,0,0, 0,0,0)) Prescribed values during this step (DoF-ordering: x,y,z linear, x,y,z angular) [type: Vector6r] .. attribute:: whats (= Vector6i(0,0,0, 0,0,0)) Meaning of *values* components (DoF-odering). The constructor acceps this attribute specified as string of 6 characters, where each of them can be: ``.`` for imposing nothing, ``v`` for imposing velocity, ``i`` for imposing initial velocity only, ``f`` for imposing force. [type: Vector6i] .. attribute:: until (= '') Stage finishes when *until* (python expression) evaluates to True. Besides receiving global variables, several local variables are passed: `C` (contact object; `None` if contact does not exist), `pA` (first particle), `pB` (second particle), `scene` (current scene object), `tester` (`LawTester` object), `stage` (`LawTesterStage` object). [type: string] .. attribute:: untilEvery (= 1) Test the :obj:`until` expression only every *untilEvery* steps (this may make the execution faster) [type: int] .. attribute:: done (= '') Run this python command when the stage finishes [type: string] .. attribute:: step (= 0) Step in this stage [type: int] .. attribute:: time (= 0.0) Time in this stage [type: Real] .. attribute:: hadC (= False) Flag keeping track of whether there was a contact in this stage at all [type: bool] .. attribute:: hasC (= False) Flag keeping track of whether there was a contact in this stage at all [type: bool] .. attribute:: timeC0 (= nan) Time of creating of the last contact (NaN if there has never been one). [type: Real] .. attribute:: bounces (= 0) Number of sign changes of the normal relative velocity in this stage [type: int] .. rst-class:: html-toggle .. rst-class:: emphasized HalfspaceBuoyancy ----------------- :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.dem.HalfspaceBuoyancy` .. autoclass:: HalfspaceBuoyancy :members: :exclude-members: mask, liqRho, dragCoef, drag, surfPt, __init__, __getstate__, __setstate__ :special-members: .. attribute:: mask (= 5) Mask for particles Buoyancy is applied to. [type: uint] .. attribute:: liqRho (= 1000.0) Density of the medium. [type: Real] .. attribute:: dragCoef (= 0.47) Drag coefficient. [type: Real] .. attribute:: drag (= False) Flag for turning water drag on or off [type: bool] .. attribute:: surfPt (= Vector3(0,0,0)) Point on liquid surface; the surface is perpendicular to :obj:`woo.dem.DemField.gravity (which must not be zero). [type: Vector3r] .. rst-class:: html-toggle .. rst-class:: emphasized BoxTraceTimeSetter ------------------ :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.PeriodicEngine` → :obj:`~woo.dem.BoxTraceTimeSetter` .. autoclass:: BoxTraceTimeSetter :members: :exclude-members: node, box, glColor, __init__, __getstate__, __setstate__ :special-members: .. attribute:: node (= None) Optionally define local coordinate system for :obj:`box`. [type: shared_ptr<:obj:`Node `>] .. attribute:: box (= AlignedBox3((1.7976931348623157e308,1.7976931348623157e308,1.7976931348623157e308), (-1.7976931348623157e308,-1.7976931348623157e308,-1.7976931348623157e308))) Box volume; in local coordinates if :obj:`node` is given, global otherwise. [type: AlignedBox3r] .. attribute:: glColor (= 0.5) Color for rendering (NaN disables), mapped using the default colormap. [type: Real] .. rst-class:: html-toggle .. rst-class:: emphasized MeshVolume ---------- :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.PeriodicEngine` → :obj:`~woo.dem.MeshVolume` .. autoclass:: MeshVolume :members: :exclude-members: mask, reinit, nodes, vol, thickVol, __init__, __getstate__, __setstate__ :special-members: .. attribute:: mask (= 0) Mask for finding surface triangles [type: int] .. attribute:: reinit (= False) If true, recreate internal data from scratch [type: bool] .. attribute:: nodes (= NodeList[]) List of nodes, in the same order as the GTS surface structure. [type: vector>, not shown in the UI, not saved] .. attribute:: vol (= nan) Volume as computed when last run [type: Real] .. attribute:: thickVol (= nan) Volume of the inner side of the mesh: the mesh is defined by :obj:`facets' ` midplanes, but some facets may have non-zero :obj:`Facet.halfThick`. This number is the sum of (initial!) facet area times :obj:`Facet.halfThick`. To get the volume with this part subtracted, use :obj:`netVol`. [type: Real] .. rst-class:: html-toggle .. rst-class:: emphasized Motion integration ------------------ TODO .. rst-class:: html-toggle .. rst-class:: emphasized Leapfrog ++++++++ :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.dem.Leapfrog` .. autoclass:: Leapfrog :members: :exclude-members: IpLL4h, ImLL4hInv, LmL, deltaSpinVec, damping, reset, _forceResetChecked, maxVelocitySq, dontCollect, kinSplit, nonviscDampIx, gravWorkIx, kinEnergyIx, kinEnergyTransIx, kinEnergyRotIx, __init__, __getstate__, __setstate__ :special-members: .. attribute:: IpLL4h (= Matrix3(0,0,0, 0,0,0, 0,0,0)) :math:`I+\frac{\nnext{\tens{L}}+\pprev{\tens{L}}}{4}\Dt` [type: Matrix3r, not saved, read-only in python] .. attribute:: ImLL4hInv (= Matrix3(0,0,0, 0,0,0, 0,0,0)) :math:`\left(\tens{I}-\frac{\nnext{\tens{L}}-\pprev{\tens{L}}}{4}\Dt\right)^{-1}` [type: Matrix3r, not saved, read-only in python] .. attribute:: LmL (= Matrix3(0,0,0, 0,0,0, 0,0,0)) :math:`\nnext{\tens{L}}-\pprev{\tens{L}}` [type: Matrix3r, not saved, read-only in python] .. attribute:: deltaSpinVec (= Vector3(0,0,0)) :math:`-\frac{1}{2}\epsilon_{ijk}\frac{\pprev{\tens{L}}-{\pprev{\tens{L}}}^T}{2}+\frac{1}{2}\epsilon_{ijk}\frac{\nnext{\tens{L}}-{\nnext{\tens{L}}}^T}{2}`. [type: Vector3r, not saved, read-only in python] .. attribute:: damping (= 0.2) damping coefficient for non-viscous damping [type: Real] .. attribute:: reset (= False) Reset forces immediately after applying them. [type: bool] .. attribute:: _forceResetChecked (= False) Whether we already issued a warning for forces being (probably) not reset [type: bool, not shown in the UI] .. attribute:: maxVelocitySq (= nan) store square of max. velocity, for informative purposes; computed again at every step. [type: Real, read-only in python] .. attribute:: dontCollect (= False) Don't attempt to collect DEM nodes when there are none in the first step. [type: bool, not shown in the UI] .. attribute:: kinSplit (= False) Whether to separately track translational and rotational kinetic energy. [type: bool] .. attribute:: nonviscDampIx (= -1) Index of the energy dissipated using the non-viscous damping (:obj:`damping`). [type: int, not saved, not accessible from python] .. attribute:: gravWorkIx (= -1) Index for gravity work [type: int, not saved, not accessible from python] .. attribute:: kinEnergyIx (= -1) Index for kinetic energy in scene->energies. [type: int, not saved, not accessible from python] .. attribute:: kinEnergyTransIx (= -1) Index for translational kinetic energy in scene->energies. [type: int, not saved, not accessible from python] .. attribute:: kinEnergyRotIx (= -1) Index for rotational kinetic energy in scene->energies. [type: int, not saved, not accessible from python] .. rst-class:: html-toggle .. rst-class:: emphasized ForceResetter +++++++++++++ :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.dem.ForceResetter` .. autoclass:: ForceResetter :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: .. rst-class:: html-toggle .. rst-class:: emphasized DynDt +++++ :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.PeriodicEngine` → :obj:`~woo.dem.DynDt` .. autoclass:: DynDt :members: :exclude-members: maxRelInc, dryRun, dt, __init__, __getstate__, __setstate__ :special-members: .. attribute:: maxRelInc (= 0.0001) Maximum relative increment of timestep within one step, to void abrupt changes in timestep leading to numerical artefacts. [type: Real] .. attribute:: dryRun (= False) Only set :obj:`dt` to the value of timestep, don't apply it really. [type: bool] .. attribute:: dt (= nan) New timestep value which would be used if :obj:`dryRun` were not set. Unused when :obj:`dryRun` is false. [type: Real] .. rst-class:: html-toggle .. rst-class:: emphasized DemData +++++++ :obj:`~woo.core.Object` → :obj:`~woo.core.NodeData` → :obj:`~woo.dem.DemData` .. graphviz:: digraph DemData { rankdir=LR; margin=.2; "DemData" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.DemData"]; "ClumpData" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.DemData"]; "DemData" -> "ClumpData" [arrowsize=0.5,style="setlinewidth(0.5)"] "DemDataTagged" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.DemData"]; "DemData" -> "DemDataTagged" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: DemData :members: :exclude-members: vel, angVel, mass, inertia, force, torque, angMom, flags, linIx, parRef, impose, master, __init__, __getstate__, __setstate__ :special-members: .. attribute:: vel (= Vector3(0,0,0)) Linear velocity. [type: Vector3r, unit: m/s] .. attribute:: angVel (= Vector3(0,0,0)) Angular velocity; when set, :obj:`angMom` is reset (and updated from :obj:`angVel` in :obj:`Leapfrog`).. [type: Vector3r, unit: rad/s] .. attribute:: mass (= 0.0) Associated mass. [type: Real, unit: kg] .. attribute:: inertia (= Vector3(0,0,0)) Inertia along local (principal) axes [type: Vector3r, unit: kg·m²] .. attribute:: force (= Vector3(0,0,0)) Applied force [type: Vector3r, unit: N] .. attribute:: torque (= Vector3(0,0,0)) Applied torque [type: Vector3r, unit: N·m] .. attribute:: angMom (= Vector3(nan,nan,nan)) Angular momentum; used with the aspherical integrator. If NaN and aspherical integrator (:obj:`Leapfrog`) is used, the value is initialized to :obj:`inertia` × :obj:`angVel`. [type: Vector3r, unit: N·m·s] .. attribute:: flags (= 0) Bit flags storing blocked DOFs, clump status, ... [type: unsigned, read-only in python, bit accessors: **blockX**, **blockY**, **blockZ**, **blockRotX**, **blockRotY**, **blockRotZ**, **clumped**, **clump**, **energySkip**, **gravitySkip**, **tracerSkip**, **dampingSkip**] .. attribute:: linIx (= -1) Index within DemField.nodes (for efficient removal) [type: long, not shown in the UI, read-only in python] .. attribute:: parRef (= []) Back-reference for particles using this node; this is important for knowing when a node may be deleted (no particles referenced) and such. Should be kept consistent. [type: std::list, not shown in the UI, not saved, not accessible from python] .. attribute:: impose (= None) Impose arbitrary velocity, angular velocity, ... on the node; the functor is called from Leapfrog, after new position and velocity have been computed. [type: shared_ptr<:obj:`Impose `>] .. attribute:: master Master node; currently only used with clumps (since this is never set from python, it is safe to use weak_ptr). [type: weak_ptr<:obj:`Node `>, not shown in the UI, not accessible from python] .. rst-class:: html-toggle .. rst-class:: emphasized ClumpData """"""""" :obj:`~woo.core.Object` → :obj:`~woo.core.NodeData` → :obj:`~woo.dem.DemData` → :obj:`~woo.dem.ClumpData` .. autoclass:: ClumpData :members: :exclude-members: nodes, relPos, relOri, equivRad, __init__, __getstate__, __setstate__ :special-members: .. attribute:: nodes (= NodeList[]) Member nodes [type: vector>, not shown in the UI, read-only in python] .. attribute:: relPos (= []) Relative member's positions [type: vector, read-only in python] .. attribute:: relOri (= []) Relative member's orientations [type: vector, read-only in python] .. attribute:: equivRad (= nan) Equivalent radius, for PSD statistics (e.g. in :obj:`BoxOutlet`). [type: Real] .. rst-class:: html-toggle .. rst-class:: emphasized DemDataTagged """"""""""""" :obj:`~woo.core.Object` → :obj:`~woo.core.NodeData` → :obj:`~woo.dem.DemData` → :obj:`~woo.dem.DemDataTagged` .. autoclass:: DemDataTagged :members: :exclude-members: tag, __init__, __getstate__, __setstate__ :special-members: .. attribute:: tag (= -1) External identifier of th node (unused by Woo itself). [type: int] .. rst-class:: html-toggle .. rst-class:: emphasized Impose ++++++ :obj:`~woo.core.Object` → :obj:`~woo.dem.Impose` .. graphviz:: digraph Impose { rankdir=LR; margin=.2; "Impose" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Impose"]; "HarmonicOscillation" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Impose"]; "Impose" -> "HarmonicOscillation" [arrowsize=0.5,style="setlinewidth(0.5)"] "InterpolatedMotion" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Impose"]; "Impose" -> "InterpolatedMotion" [arrowsize=0.5,style="setlinewidth(0.5)"] "VelocityAndReadForce" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Impose"]; "Impose" -> "VelocityAndReadForce" [arrowsize=0.5,style="setlinewidth(0.5)"] "AlignedHarmonicOscillations" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Impose"]; "Impose" -> "AlignedHarmonicOscillations" [arrowsize=0.5,style="setlinewidth(0.5)"] "CombinedImpose" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Impose"]; "Impose" -> "CombinedImpose" [arrowsize=0.5,style="setlinewidth(0.5)"] "VariableVelocity3d" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Impose"]; "Impose" -> "VariableVelocity3d" [arrowsize=0.5,style="setlinewidth(0.5)"] "ReadForce" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Impose"]; "Impose" -> "ReadForce" [arrowsize=0.5,style="setlinewidth(0.5)"] "ConstantForce" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Impose"]; "Impose" -> "ConstantForce" [arrowsize=0.5,style="setlinewidth(0.5)"] "RadialForce" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Impose"]; "Impose" -> "RadialForce" [arrowsize=0.5,style="setlinewidth(0.5)"] "StableCircularOrbit" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Impose"]; "CircularOrbit" -> "StableCircularOrbit" [arrowsize=0.5,style="setlinewidth(0.5)"] "Local6Dofs" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Impose"]; "Impose" -> "Local6Dofs" [arrowsize=0.5,style="setlinewidth(0.5)"] "CircularOrbit" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Impose"]; "Impose" -> "CircularOrbit" [arrowsize=0.5,style="setlinewidth(0.5)"] "VariableAlignedRotation" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Impose"]; "Impose" -> "VariableAlignedRotation" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: Impose :members: :exclude-members: what, stepLast, timeLast, __init__, __getstate__, __setstate__ :special-members: .. attribute:: what (= 0) What values are to be imposed; this is set by the derived engine automatically depending on what is to be prescribed. [type: int, bit accessors: **vel**, **force**, **iniVel**, **readForce**] .. attribute:: stepLast (= -1) Step in which this imposition was last used; updated atomically by callers from c++ by calling isFirstStepRun. [type: long, read-only in python] .. attribute:: timeLast (= nan) Time in which this imposition was last used; updated automatically bu callers from c++ via ``isFirstStepRun``, just like :obj:`stepLast`. [type: Real, read-only in python] .. rst-class:: html-toggle .. rst-class:: emphasized CircularOrbit """"""""""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.Impose` → :obj:`~woo.dem.CircularOrbit` .. graphviz:: digraph CircularOrbit { rankdir=LR; margin=.2; "CircularOrbit" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CircularOrbit"]; "StableCircularOrbit" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.CircularOrbit"]; "CircularOrbit" -> "StableCircularOrbit" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: CircularOrbit :members: :exclude-members: node, rotate, omega, angle, __init__, __getstate__, __setstate__ :special-members: .. attribute:: node (= ) Local coordinate system. [type: shared_ptr<:obj:`Node `>] .. attribute:: rotate (= False) Impose rotational velocity so that orientation relative to the local z-axis is always the same. If false, angular velocity is left as-is. [type: bool] .. attribute:: omega (= nan) Orbiting angular velocity. [type: Real] .. attribute:: angle (= 0.0) Cumulative angle turned, incremented at every step. [type: Real] StableCircularOrbit %%%%%%%%%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.dem.Impose` → :obj:`~woo.dem.CircularOrbit` → :obj:`~woo.dem.StableCircularOrbit` .. autoclass:: StableCircularOrbit :members: :exclude-members: radius, __init__, __getstate__, __setstate__ :special-members: .. attribute:: radius (= nan) Radius, i.e. enforced distance from the rotation axis. [type: Real] .. rst-class:: html-toggle .. rst-class:: emphasized VariableVelocity3d """""""""""""""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.Impose` → :obj:`~woo.dem.VariableVelocity3d` .. autoclass:: VariableVelocity3d :members: :exclude-members: times, vels, angVels, ori, hooks, diff, wrap, t0, __init__, __getstate__, __setstate__ :special-members: .. attribute:: times (= []) Time values for :obj:`vels`. [type: vector] .. attribute:: vels (= []) Components of velocity, in local coordinates defined by :obj:`ori`. [type: vector] .. attribute:: angVels (= []) Components of angular velocity, in local coordinates defined by :obj:`ori`. If empty, angular velocity will not be imposed at all. .. note:: Only nodes which are using spherical integration can be prescribed angular velocity, since the aspherical integrator in :obj:`woo.dem.Leapfrog` uses :obj:`angular momentum ` rather than :obj:`angular velocity ` as input. This can be queried with :obj:`Node.dem.useAsphericalLeapfrog `. [type: vector] .. attribute:: ori (= Quaternion((1,0,0),0)) Orientation of coordinate axes (by default, impose velocity along global axes) [type: Quaternionr] .. attribute:: hooks (= []) Python hooks to be run when time points are reached (max Δt later than :obj:`times` items). Must be same length than :obj:`times`, or shorter; use empty string for not doing anything at that time point. [type: vector] .. attribute:: diff (= False) Prescribed velocity can be applied as total velocity value (with ``diff==False``) or as difference added to the actual nodal velocity (with ``diff==True``). [type: bool] .. attribute:: wrap (= False) Wrap time around the last time value (float modulo), if greater. [type: bool] .. attribute:: t0 (= 0.0) Time offset which is subtracted from t (before wrapping, if :obj:`wrap` is used). [type: Real] .. rst-class:: html-toggle .. rst-class:: emphasized AlignedHarmonicOscillations """"""""""""""""""""""""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.Impose` → :obj:`~woo.dem.AlignedHarmonicOscillations` .. autoclass:: AlignedHarmonicOscillations :members: :exclude-members: freqs, amps, __init__, __getstate__, __setstate__ :special-members: .. attribute:: freqs (= Vector3(nan,nan,nan)) Frequencies for individual axes. NaN value switches that axis off, the component will not be touched [type: Vector3r] .. attribute:: amps (= Vector3(0,0,0)) Amplitudes along individual axes. [type: Vector3r] .. rst-class:: html-toggle .. rst-class:: emphasized InterpolatedMotion """""""""""""""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.Impose` → :obj:`~woo.dem.InterpolatedMotion` .. autoclass:: InterpolatedMotion :members: :exclude-members: poss, oris, times, t0, __init__, __getstate__, __setstate__ :special-members: .. attribute:: poss (= []) Positions which will be interpolated between. [type: vector] .. attribute:: oris (= []) Orientations which will be interpolated between. [type: vector] .. attribute:: times (= []) Times at which given :obj:`positions ` and :obj:`orientations ` should be reached. [type: vector] .. attribute:: t0 (= 0.0) Time offset to add to all time points. [type: Real] .. rst-class:: html-toggle .. rst-class:: emphasized HarmonicOscillation """"""""""""""""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.Impose` → :obj:`~woo.dem.HarmonicOscillation` .. autoclass:: HarmonicOscillation :members: :exclude-members: freq, amp, dir, t0, perpFree, __init__, __getstate__, __setstate__ :special-members: .. attribute:: freq (= nan) Frequence of oscillation [type: Real] .. attribute:: amp (= nan) Amplitude of oscillation [type: Real] .. attribute:: dir (= Vector3(1,0,0)) Direcrtion of oscillation (normalized automatically) [type: Vector3r] .. attribute:: t0 (= 0.0) Time when the oscillator is in the center position (phase) [type: Real] .. attribute:: perpFree (= False) If true, only velocity in the *dir* sense will be prescribed, velocity in the perpendicular sense will be preserved. [type: bool] .. rst-class:: html-toggle .. rst-class:: emphasized CombinedImpose """""""""""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.Impose` → :obj:`~woo.dem.CombinedImpose` .. autoclass:: CombinedImpose :members: :exclude-members: imps, __init__, __getstate__, __setstate__ :special-members: .. attribute:: imps (= []) Impositions which are combined together, always called in this order. [type: vector>] .. rst-class:: html-toggle .. rst-class:: emphasized RadialForce """"""""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.Impose` → :obj:`~woo.dem.RadialForce` .. autoclass:: RadialForce :members: :exclude-members: nodeA, nodeB, F, __init__, __getstate__, __setstate__ :special-members: .. attribute:: nodeA (= None) First node defining the axis [type: shared_ptr<:obj:`Node `>] .. attribute:: nodeB (= None) Second node defining the axis [type: shared_ptr<:obj:`Node `>] .. attribute:: F (= 0.0) Magnitude of the force applied. Positive value means away from the axis given by *nodeA* and *nodeB*. [type: Real] .. rst-class:: html-toggle .. rst-class:: emphasized VariableAlignedRotation """"""""""""""""""""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.Impose` → :obj:`~woo.dem.VariableAlignedRotation` .. autoclass:: VariableAlignedRotation :members: :exclude-members: axis, timeAngVel, wrap, __init__, __getstate__, __setstate__ :special-members: .. attribute:: axis (= 0) Rotation axis. [type: int] .. attribute:: timeAngVel (= []) Angular velocity values in time. Time values must be increasing. [type: vector] .. attribute:: wrap (= False) Wrap time around the last time value (float modulo), if greater. [type: bool] .. rst-class:: html-toggle .. rst-class:: emphasized ReadForce """"""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.Impose` → :obj:`~woo.dem.ReadForce` .. autoclass:: ReadForce :members: :exclude-members: node, F, T, __init__, __getstate__, __setstate__ :special-members: .. attribute:: node (= None) Reference CS for forces and torque (they are recomputed as if acting on this point); if not given, everything is summed in global CS. [type: shared_ptr<:obj:`Node `>] .. attribute:: F Summary force [type: OpenMPAccumulator, not saved, read-only in python] .. attribute:: T Summary torque [type: OpenMPAccumulator, not saved, read-only in python] .. rst-class:: html-toggle .. rst-class:: emphasized ConstantForce """"""""""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.Impose` → :obj:`~woo.dem.ConstantForce` .. autoclass:: ConstantForce :members: :exclude-members: F, __init__, __getstate__, __setstate__ :special-members: .. attribute:: F (= Vector3(0,0,0)) Applied force (in global coordinates) [type: Vector3r] .. rst-class:: html-toggle .. rst-class:: emphasized Local6Dofs """""""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.Impose` → :obj:`~woo.dem.Local6Dofs` .. autoclass:: Local6Dofs :members: :exclude-members: ori, values, whats, __init__, __getstate__, __setstate__ :special-members: .. attribute:: ori (= Quaternion((1,0,0),0)) Local coordinates rotation [type: Quaternionr] .. attribute:: values (= Vector6(0,0,0, 0,0,0)) Imposed values; their meaning depends on the *whats* vector [type: Vector6r] .. attribute:: whats (= Vector6i(0,0,0, 0,0,0)) Meaning of *values* components: 0 for nothing imposed (i.e. zero force), 1 for velocity, 2 for force values [type: Vector6i] .. rst-class:: html-toggle .. rst-class:: emphasized VelocityAndReadForce """""""""""""""""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.Impose` → :obj:`~woo.dem.VelocityAndReadForce` .. autoclass:: VelocityAndReadForce :members: :exclude-members: dir, vel, latBlock, sumF, invF, dist, energyName, workIx, __init__, __getstate__, __setstate__ :special-members: .. attribute:: dir (= Vector3(1,0,0)) Direction (automatically normalized) for prescribed velocity and force readings. [type: Vector3r] .. attribute:: vel (= 0.0) Prescribed velocity magnitude. [type: Real] .. attribute:: latBlock (= True) Whether lateral velocity (perpendicular to :obj:`vel`) is set to zero, or left free. [type: bool] .. attribute:: sumF Summary force on nodes with this imposition, in the direction of :obj:`vel`. [type: OpenMPAccumulator, read-only in python] .. attribute:: invF (= False) Invert force value (so that it has the meaning of reactin rather than force exerted). [type: bool] .. attribute:: dist (= 0.0) Cumulative displacement of this imposition. [type: Real] .. attribute:: energyName (= '') If given, and :obj:`~woo.core.Scene.trackEnergy` is ``True``, cumulate work done by this imposition under this name [type: string] .. attribute:: workIx (= -1) Index for fast access to the energy. [type: int, not saved, not accessible from python] .. rst-class:: html-toggle .. rst-class:: emphasized Tracer ++++++ :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.PeriodicEngine` → :obj:`~woo.dem.Tracer` .. autoclass:: Tracer :members: :exclude-members: num, compress, compSkip, minDist, scalar, vecAxis, ordinalMod, matStateIx, matStateSmooth, nextReset, lineColor, modulo, rRange, noneColor, clumps, saveTime, glSmooth, glWidth, __init__, __getstate__, __setstate__ :special-members: .. attribute:: num (= 50) Number of positions to save (when creating new glyph) [type: int] .. attribute:: compress (= 2) Ratio by which history is compress when all data slots are filled; if 0, cycle and don't compress. [type: int] .. attribute:: compSkip (= 2) Number of leading points to skip during compression; if negative, the value of *compress* is used. [type: int] .. attribute:: minDist (= 0.0) Only add new point when last point is at least minDist away, or no point exists at all. [type: Real] .. attribute:: scalar (= 0) Scalars associated with history points (determine line color) [type: int, named enum, possible values are: **'none'** (*'-'*, *''*; 0), **'time'** (*'t'*; 1), **'trace time'** (*'reltime'*; 2), **'velocity'** (*'vel'*, *'v'*; 3), **'angular velocity'** (*'angVel'*, *'angvel'*; 4), **'signed |accel|'** (5), **'radius'** (*'rad'*, *'r'*; 6), **'number of contacts'** (*'numCon'*, *'ncon'*, *'numcon'*; 7), **'Shape.color'** (*'color'*; 8), **'kinetic energy'** (*'Ek'*; 9), **'ordinal (+ordinalMod)'** (*'ordinal'*, *'ord'*; 10), **'matState.getScalar'** (*'mat'*, *'material state'*; 11)] .. attribute:: vecAxis (= -1) Scalar to use for vector values. [type: int, named enum, possible values are: **'norm'** (-1), **'x'** (0), **'y'** (1), **'z'** (2)] .. attribute:: ordinalMod (= 5) Modulo value when :obj:`scalar` is :obj:`scalarOrdinal`. [type: int] .. attribute:: matStateIx (= 0) Index for getting :obj:`MatState` scalars. [type: int] .. attribute:: matStateSmooth (= 0.001) Smoothing coefficient for :obj:`MatState` scalars. [type: Real] .. attribute:: nextReset (= True) Reset all traces at the next step (scalar changed) [type: bool, not accessible from python] .. attribute:: lineColor (= ) Color range for coloring the trace line [type: shared_ptr<:obj:`ScalarRange `>, read-only in python] .. attribute:: modulo (= Vector2i(0,0)) Only add trace to nodes with ordinal number such that ``(i+modulo[1])%modulo[0]==0``. [type: Vector2i] .. attribute:: rRange (= Vector2(0,0)) If non-zero, only show traces of spheres of which radius falls into this range. (not applicable to clumps); traces of non-spheres are not shown in this case. [type: Vector2r] .. attribute:: noneColor (= Vector3(0.3,0.3,0.3)) Color for traces without scalars, when scalars are saved (e.g. for non-spheres when radius is saved [type: Vector3r] .. attribute:: clumps (= True) Also make traces for clumps (for the central node, not for clumped nodes [type: bool] .. attribute:: saveTime (= False) Save time values along with scalars (must be enabled before the trace starts collecting data). [type: bool] .. attribute:: glSmooth (= False) Render traced lines with GL_LINE_SMOOTH [type: bool] .. attribute:: glWidth (= 1) Width of trace lines in pixels [type: int, range: 1−10] .. rst-class:: html-toggle .. rst-class:: emphasized AxialGravity ++++++++++++ :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.dem.AxialGravity` .. autoclass:: AxialGravity :members: :exclude-members: axisPt, axisDir, accel, __init__, __getstate__, __setstate__ :special-members: .. attribute:: axisPt (= Vector3(0,0,0)) Point through which the axis is passing. [type: Vector3r] .. attribute:: axisDir (= Vector3(1,0,0)) direction of the gravity axis (will be normalized automatically) [type: Vector3r] .. attribute:: accel (= 0.0) Acceleration magnitude [kgms⁻²] [type: Real] .. rst-class:: html-toggle .. rst-class:: emphasized ClusterAnalysis --------------- :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.PeriodicEngine` → :obj:`~woo.dem.ClusterAnalysis` .. autoclass:: ClusterAnalysis :members: :exclude-members: box, mask, clustMin, lastLabels, maxConn, replMatState, glColor, __init__, __getstate__, __setstate__ :special-members: .. attribute:: box (= AlignedBox3((1.7976931348623157e308,1.7976931348623157e308,1.7976931348623157e308), (-1.7976931348623157e308,-1.7976931348623157e308,-1.7976931348623157e308))) Limit particles considered in the analysis to this box only. If not specified, analyze all particles in the simulation. [type: AlignedBox3r] .. attribute:: mask (= 0) Particles to consider in cluster analysis. If 0, consider all particles. [type: int] .. attribute:: clustMin (= 5) Minimum number of particles to mark them as clustered. [type: int] .. attribute:: lastLabels (= []) Next free labels to be used for respective connectivity level. [type: vector, read-only in python] .. attribute:: maxConn (= 0) Maximum connectivity (recursion) for cluster analysis. Only 0 is implemented so far. [type: int] .. attribute:: replMatState (= 0) What to do when an existing :obj:`MatState` is attached to a particle but it is not a :obj:`ClusterMatState`. [type: int, named enum, possible values are: **'always'** (*'yes'*, *'ok'*; 0), **'never'** (*'no'*; 1), **'error'** (2)] .. attribute:: glColor (= 0.4) Color for rendering the box (NaN to disable rendering) [type: Real] .. rst-class:: html-toggle .. rst-class:: emphasized Internal forces --------------- TODO .. rst-class:: html-toggle .. rst-class:: emphasized IntraForce ++++++++++ :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.Dispatcher` → :obj:`~woo.dem.IntraForce` .. autoclass:: IntraForce :members: :exclude-members: functors, __init__, __getstate__, __setstate__ :special-members: .. attribute:: functors (= []) Functors active in the dispatch mechanism [overridden below]. [type: vector>] .. rst-class:: html-toggle .. rst-class:: emphasized IntraFunctor ++++++++++++ :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.IntraFunctor` .. graphviz:: digraph IntraFunctor { rankdir=LR; margin=.2; "IntraFunctor" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.IntraFunctor"]; "In2_Facet" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.IntraFunctor"]; "IntraFunctor" -> "In2_Facet" [arrowsize=0.5,style="setlinewidth(0.5)"] "In2_Wall_ElastMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.IntraFunctor"]; "IntraFunctor" -> "In2_Wall_ElastMat" [arrowsize=0.5,style="setlinewidth(0.5)"] "woo.fem.In2_Membrane_FrictMat" [shape="box",fontsize=8,style="setlinewidth(0.5),filled",fillcolor=grey,height=0.2,URL="woo.fem.html#woo.fem.IntraFunctor"]; "woo.fem.In2_Membrane_ElastMat" -> "woo.fem.In2_Membrane_FrictMat" [arrowsize=0.5,style="setlinewidth(0.5)"] "woo.fem.In2_Membrane_ElastMat" [shape="box",fontsize=8,style="setlinewidth(0.5),filled",fillcolor=grey,height=0.2,URL="woo.fem.html#woo.fem.IntraFunctor"]; "In2_Facet" -> "woo.fem.In2_Membrane_ElastMat" [arrowsize=0.5,style="setlinewidth(0.5)"] "woo.fem.In2_Tet4_ElastMat" [shape="box",fontsize=8,style="setlinewidth(0.5),filled",fillcolor=grey,height=0.2,URL="woo.fem.html#woo.fem.IntraFunctor"]; "IntraFunctor" -> "woo.fem.In2_Tet4_ElastMat" [arrowsize=0.5,style="setlinewidth(0.5)"] "In2_Sphere_ElastMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.IntraFunctor"]; "IntraFunctor" -> "In2_Sphere_ElastMat" [arrowsize=0.5,style="setlinewidth(0.5)"] "In2_Truss_ElastMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.IntraFunctor"]; "IntraFunctor" -> "In2_Truss_ElastMat" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: IntraFunctor :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: .. rst-class:: html-toggle .. rst-class:: emphasized In2_Sphere_ElastMat """"""""""""""""""" :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.IntraFunctor` → :obj:`~woo.dem.In2_Sphere_ElastMat` .. autoclass:: In2_Sphere_ElastMat :members: :exclude-members: alreadyWarned_ContactLoopWithApplyForces, __init__, __getstate__, __setstate__ :special-members: .. attribute:: alreadyWarned_ContactLoopWithApplyForces (= False) Keep track of whether the warning on ContactLoop already applying forces was issued. [type: bool, not shown in the UI] .. rst-class:: html-toggle .. rst-class:: emphasized In2_Wall_ElastMat """"""""""""""""" :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.IntraFunctor` → :obj:`~woo.dem.In2_Wall_ElastMat` .. autoclass:: In2_Wall_ElastMat :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: .. rst-class:: html-toggle .. rst-class:: emphasized In2_Truss_ElastMat """""""""""""""""" :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.IntraFunctor` → :obj:`~woo.dem.In2_Truss_ElastMat` .. autoclass:: In2_Truss_ElastMat :members: :exclude-members: setL0, __init__, __getstate__, __setstate__ :special-members: .. attribute:: setL0 (= True) Automatically set equilibrium length of truss, when first encountered. [type: bool] .. rst-class:: html-toggle .. rst-class:: emphasized In2_Facet """"""""" :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.IntraFunctor` → :obj:`~woo.dem.In2_Facet` .. graphviz:: digraph In2_Facet { rankdir=LR; margin=.2; "In2_Facet" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.In2_Facet"]; "woo.fem.In2_Membrane_FrictMat" [shape="box",fontsize=8,style="setlinewidth(0.5),filled",fillcolor=grey,height=0.2,URL="woo.fem.html#woo.fem.In2_Facet"]; "woo.fem.In2_Membrane_ElastMat" -> "woo.fem.In2_Membrane_FrictMat" [arrowsize=0.5,style="setlinewidth(0.5)"] "woo.fem.In2_Membrane_ElastMat" [shape="box",fontsize=8,style="setlinewidth(0.5),filled",fillcolor=grey,height=0.2,URL="woo.fem.html#woo.fem.In2_Facet"]; "In2_Facet" -> "woo.fem.In2_Membrane_ElastMat" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: In2_Facet :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: .. rst-class:: html-toggle .. rst-class:: emphasized AnisoPorosityAnalyzer --------------------- :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.dem.AnisoPorosityAnalyzer` .. autoclass:: AnisoPorosityAnalyzer :members: :exclude-members: poro, div, initStep, initNum, rayIds, rayPts, __init__, __getstate__, __setstate__ :special-members: .. attribute:: poro (= Matrix3(0,0,0, 0,0,0, 0,0,0)) Store analysis result here [type: Matrix3r, read-only in python] .. attribute:: div (= 10) Fineness of division of interval (0…1) for \ :math:`u`\ ,\ :math:`v`\ ∈〈0…1〉, which are used for uniform distribution over the positive octant as \ :math:`\theta= rac{\pi}{2}u`\ , \ :math:`\phi=\arccos v`\ (see http://mathworld.wolfram.com/SpherePointPicking.html) [type: int] .. attribute:: initStep (= -1) Step in which internal data were last updated [type: long, not accessible from python] .. attribute:: initNum (= 18446744073709551615) Number of particles at last update [type: size_t, not accessible from python] .. attribute:: rayIds (= []) Particles intersected with ray when *oneRay* was last called from python. [type: vector, read-only in python] .. attribute:: rayPts (= []) Starting and ending points of segments intersecting particles. [type: vector, read-only in python] .. rst-class:: html-toggle .. rst-class:: emphasized Suspicious ---------- :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.PeriodicEngine` → :obj:`~woo.dem.Suspicious` .. autoclass:: Suspicious :members: :exclude-members: avgVel, avgForce, avgFn, avgFt, avgUn, relThreshold, errPar, errCon, __init__, __getstate__, __setstate__ :special-members: .. attribute:: avgVel (= nan) Average velocity norm. [type: Real, read-only in python] .. attribute:: avgForce (= nan) Average particle force norm. [type: Real, read-only in python] .. attribute:: avgFn (= nan) Average normal force norm. [type: Real, read-only in python] .. attribute:: avgFt (= nan) Average shear force norm. [type: Real, read-only in python] .. attribute:: avgUn (= nan) Average normal overlap. [type: Real, read-only in python] .. attribute:: relThreshold (= 100.0) Break on quantity this much larger than the average. [type: Real] .. attribute:: errPar (= _8ParticleList[]) Particle where there was some error (shown in OpenGL). [type: vector>] .. attribute:: errCon (= []) Contacts where there was some error (shown in OpenGL) [type: vector>] .. rst-class:: html-toggle .. rst-class:: emphasized ForcesToHdf5 ------------ :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.PeriodicEngine` → :obj:`~woo.dem.ForcesToHdf5` .. graphviz:: digraph ForcesToHdf5 { rankdir=LR; margin=.2; "ForcesToHdf5" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.ForcesToHdf5"]; "NodalForcesToHdf5" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.ForcesToHdf5"]; "ForcesToHdf5" -> "NodalForcesToHdf5" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: ForcesToHdf5 :members: :exclude-members: what, contMask, out, deflate, node, __init__, __getstate__, __setstate__ :special-members: .. attribute:: what (= 0) Select whether to export nodal forces (default) or contact forces. [type: int, named enum, possible values are: **'node'** (*'nodes'*, *'nodal'*; 0), **'contact'** (*'contacts'*; 1)] .. attribute:: contMask (= 2) Only export contacts where at least one particle matches this mask. If zero, match all contacts. If this :obj:`Contact.pA` has matching mask, inverts force sense; this has as result that (unless both particles match) the force is exported as it acts on the matching particle. [type: int] .. attribute:: out (= '') Name of the output file. [type: string] .. attribute:: deflate (= 9) Compression level for HDF5 chunked storage; valid values are 0 to 9 (will be clamped if outside). [type: int] .. attribute:: node (= None) Local coordinate system; if defined, contact forces, torques and positions will be fransfored to local coordinates. [type: shared_ptr<:obj:`Node `>] .. rst-class:: html-toggle .. rst-class:: emphasized NodalForcesToHdf5 +++++++++++++++++ :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.PeriodicEngine` → :obj:`~woo.dem.ForcesToHdf5` → :obj:`~woo.dem.NodalForcesToHdf5` .. autoclass:: NodalForcesToHdf5 :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: .. rst-class:: html-toggle .. rst-class:: emphasized Collision detection ------------------- TODO .. rst-class:: html-toggle .. rst-class:: emphasized Collider ++++++++ :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.dem.Collider` .. graphviz:: digraph Collider { rankdir=LR; margin=.2; "Collider" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Collider"]; "AabbTreeCollider" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Collider"]; "AabbCollider" -> "AabbTreeCollider" [arrowsize=0.5,style="setlinewidth(0.5)"] "GridCollider" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Collider"]; "Collider" -> "GridCollider" [arrowsize=0.5,style="setlinewidth(0.5)"] "InsertionSortCollider" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Collider"]; "AabbCollider" -> "InsertionSortCollider" [arrowsize=0.5,style="setlinewidth(0.5)"] "AabbCollider" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Collider"]; "Collider" -> "AabbCollider" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: Collider :members: :exclude-members: nFullRuns, __init__, __getstate__, __setstate__ :special-members: .. attribute:: nFullRuns (= 0) Cumulative number of full runs, when collision detection is needed. [type: int] .. rst-class:: html-toggle .. rst-class:: emphasized AabbCollider ++++++++++++ :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.dem.Collider` → :obj:`~woo.dem.AabbCollider` .. graphviz:: digraph AabbCollider { rankdir=LR; margin=.2; "AabbCollider" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.AabbCollider"]; "AabbTreeCollider" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.AabbCollider"]; "AabbCollider" -> "AabbTreeCollider" [arrowsize=0.5,style="setlinewidth(0.5)"] "InsertionSortCollider" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.AabbCollider"]; "AabbCollider" -> "InsertionSortCollider" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: AabbCollider :members: :exclude-members: boundDispatcher, verletDist, noBoundOk, __init__, __getstate__, __setstate__ :special-members: .. attribute:: boundDispatcher (= ) :obj:`BoundDispatcher` object that is used for creating :obj:`bounds ` on collider's request as necessary. [type: shared_ptr<:obj:`BoundDispatcher `>, read-only in python] .. attribute:: verletDist (= -0.05) Length by which to enlarge particle bounds, to avoid running collider at every step. Stride disabled if zero, and bounding boxes are updated at every step. Negative value will trigger automatic computation, so that the real value will be ``|verletDist|`` × minimum spherical particle radius and minimum :obj:`Inlet` radius (for particles which don't exist yet); if there is no minimum radius found, it will be set to 0.0 (with a warning) and disabled. [type: Real] .. attribute:: noBoundOk (= False) Allow particles without bounding box. This is currently only useful for testing :obj:`woo.fem.Tetra` which don't undergo any collisions. [type: bool] .. rst-class:: html-toggle .. rst-class:: emphasized AabbTreeCollider """""""""""""""" :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.dem.Collider` → :obj:`~woo.dem.AabbCollider` → :obj:`~woo.dem.AabbTreeCollider` .. autoclass:: AabbTreeCollider :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: .. rst-class:: html-toggle .. rst-class:: emphasized InsertionSortCollider """"""""""""""""""""" :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.dem.Collider` → :obj:`~woo.dem.AabbCollider` → :obj:`~woo.dem.InsertionSortCollider` .. autoclass:: InsertionSortCollider :members: :exclude-members: forceInitSort, sortAxis, sortThenCollide, maxVel2, numReinit, stepInvs, numInvs, ompTuneSort, sortChunks, paraPeri, periDbgNew, maxSortPass, periodic, __init__, __getstate__, __setstate__ :special-members: .. attribute:: forceInitSort (= False) When set to true, full sort will be run regardless of other conditions. This flag is then reset automatically to false [type: bool] .. attribute:: sortAxis (= 0) Axis for the initial contact detection. [type: int] .. attribute:: sortThenCollide (= False) Separate sorting and colliding phase; it is MUCH slower, but all interactions are processed at every step; this effectively makes the collider non-persistent, not remembering last state. (The default behavior relies on the fact that inversions during insertion sort are overlaps of bounding boxes that just started/ceased to exist, and only processes those; this makes the collider much more efficient.) [type: bool] .. attribute:: maxVel2 (= 0.0) Maximum encountered velocity of a particle, to compute bounding box shift. [type: Real, read-only in python] .. attribute:: numReinit (= 0) Cumulative number of bound array re-initialization. [type: int, read-only in python] .. attribute:: stepInvs (= Vector3i(0,0,0)) Number of inversions in insertion sort in the last step; always zero in the non-debug builds [type: Vector3i] .. attribute:: numInvs (= Vector3i(0,0,0)) Cumulative number of inversions in insertion sort; always zero in the non-debug builds [type: Vector3i] .. attribute:: ompTuneSort (= Vector3i(1,1000,0)) Fine-tuning for the OpenMP-parallellized partial insertion sort. The first number is the number of chunks per CPU (2 means each core will process 2 chunks sequentially, on average). The second number (if positive) is the lower bound on number of particles per chunk; the third number (if positive) is the limit of bounds per one chunk (15000 means that if there are e.g. 300k particles, bounds will be processed in 20 chunks, even if the number of chunks from the first number is smaller). [type: Vector3i] .. attribute:: sortChunks (= -1) Number of threads that were actually used during the last parallelized insertion sort. [type: int, read-only in python] .. attribute:: paraPeri (= False) (debugging only): enable/disable(default) parallel sort with periodic boundaries. [type: bool] .. attribute:: periDbgNew (= False) Compute periodic overlaps and periods twice (with the original and the new algorithm) compare the results and report discrepancies. [type: bool] .. attribute:: maxSortPass (= -100) If partial sort is not done after this many passes, give up. Usually more than a few passes (with non-parallelized insertion sort) already means a particle went crazy or the whole simulation is exploding. Negative value is relative to the number of cores as parallel insertion sort is done per chunks and more chunks mean more passes might be necessary. [type: int] .. attribute:: periodic (= False) Whether the collider is in periodic mode (read-only; for debugging) [type: bool, not saved, read-only in python] .. rst-class:: html-toggle .. rst-class:: emphasized GridCollider ++++++++++++ :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.dem.Collider` → :obj:`~woo.dem.GridCollider` .. autoclass:: GridCollider :members: :exclude-members: domain, minCellSize, dim, cellSize, gridPrev, gridCurr, gridOld, gridNew, color, renderCells, minOccup, occupancyRange, gridDense, exIniSize, exNumMaps, verletDist, verletSteps, complSetMinSize, useDiff, around, shrink, boundDispatcher, __init__, __getstate__, __setstate__ :special-members: .. rubric:: ► Grid geometry .. attribute:: domain (= AlignedBox3((0,0,0), (1,1,1))) Domain spanned by the grid. [type: AlignedBox3r] .. attribute:: minCellSize (= 1.0) Minimum cell size which will be used to compute :obj:`dim`. [type: Real] .. attribute:: dim (= Vector3i(-1,-1,-1)) Number of cells along each axis [type: Vector3i, read-only in python] .. attribute:: cellSize (= Vector3(nan,nan,nan)) Actual cell size [type: Vector3r, read-only in python] .. rubric:: ► Data .. attribute:: gridPrev (= None) Previous fully populated grid. [type: shared_ptr<:obj:`GridStore `>, not saved] .. attribute:: gridCurr (= None) Current fully populated grid. [type: shared_ptr<:obj:`GridStore `>, not saved] .. attribute:: gridOld (= None) Grid containing entries in :obj:`gridPrev` but not in :obj:`gridCurr`. [type: shared_ptr<:obj:`GridStore `>, not saved] .. attribute:: gridNew (= None) Grid containing entries in :obj:`gridCurr` but not in :obj:`gridPrev`. [type: shared_ptr<:obj:`GridStore `>, not saved] .. rubric:: ► Rendering .. attribute:: color (= Vector3(1,1,0)) Color for rendering the domain [type: Vector3r] .. attribute:: renderCells (= False) Render cells. [type: bool] .. attribute:: minOccup (= 0) Minimum occupancy for cell to be rendered (zero cells are never rendered). [type: int] .. attribute:: occupancyRange (= None) Range for coloring grids based on occupancy (automatically created) [type: shared_ptr<:obj:`ScalarRange `>] .. rubric:: ► Tunables .. attribute:: gridDense (= 6) Length of dense storage for new :obj:`GridStore` objects. [type: int] .. attribute:: exIniSize (= 6) :obj:`GridStore.exIniSize` for new grids. [type: int] .. attribute:: exNumMaps (= 100) :obj:`GridStore.exNumMaps` for new grids. [type: int] .. attribute:: verletDist (= 0.0) Length by which particle size is enalrged, to avoid running the collider at every timestep. [type: Real, unit: m] .. attribute:: verletSteps (= 0) If positive, enlarge boxes of some particle nodes (currently only spheres are supported) so that they will still be inside the box after *verletSteps* with their current velocity; :obj:`verletDist` is still used when velocity is too small. [type: int] .. attribute:: complSetMinSize (= -1) The value of *setMinSize* when calling :obj:`GridStore.computeRelativeComplements`. [type: int] .. attribute:: useDiff (= True) Create new contacts based on set complement of :obj:`gridPrev` with respect to :obj:`gridCurr` if both contain meaningful data and are compatible; if false, always traverse *gridCurr* and try adding all possible contacts (this should be much slower) [type: bool] .. attribute:: around (= False) If frue, particle in every cell is checked with particles in all cells around; this makes the grid storage substantially less loaded, as all particles can be shrunk by one half of the cell size. .. warning:: this feature is broken and will raise exception if enabled; the trade-off is not good, since many more cells need to be checked around every cell, and many more potential contacts are created. [type: bool] .. attribute:: shrink (= 0.0) The amount of shrinking for each particle (half of the minimum cell size if *around* is true, zero otherwise. [type: Real, not shown in the UI, read-only in python] .. attribute:: boundDispatcher (= ) Dispatches :obj:`GridBound` creation to :obj:`GridBoundFuctor` based on :obj:`Shape` type. [type: shared_ptr<:obj:`GridBoundDispatcher `>] .. rst-class:: html-toggle .. rst-class:: emphasized GridStore """"""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.GridStore` .. autoclass:: GridStore :members: :exclude-members: gridSize, cellLen, denseLock, exIniSize, exNumMaps, lo, cellSize, __init__, __getstate__, __setstate__ :special-members: .. attribute:: gridSize (= Vector3i(1,1,1)) Dimension of the grid. [type: Vector3i, read-only in python] .. attribute:: cellLen (= 4) Size of the dense storage in each cell [type: int, read-only in python] .. attribute:: denseLock (= True) Whether this grid supports per-cell dense storage locking for appending (must use protected_append) [type: bool, read-only in python] .. attribute:: exIniSize (= 4) Initial size of extension vectors, and step of their growth if needed. [type: int, read-only in python] .. attribute:: exNumMaps (= 10) Number of maps for extra items not fitting the dense storage (it affects how fine-grained is locking for those extra elements) [type: int, read-only in python] .. attribute:: lo (= Vector3(nan,nan,nan)) Lower corner of the domain. [type: Vector3r] .. attribute:: cellSize (= Vector3(nan,nan,nan)) Spatial size of the grid cell. [type: Vector3r] .. rst-class:: html-toggle .. rst-class:: emphasized Bound +++++ :obj:`~woo.core.Object` → :obj:`~woo.dem.Bound` .. graphviz:: digraph Bound { rankdir=LR; margin=.2; "Bound" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Bound"]; "GridBound" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Bound"]; "Bound" -> "GridBound" [arrowsize=0.5,style="setlinewidth(0.5)"] "Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Bound"]; "Bound" -> "Aabb" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: Bound :members: :exclude-members: box, __init__, __getstate__, __setstate__ :special-members: .. attribute:: box (= AlignedBox3((1.7976931348623157e308,1.7976931348623157e308,1.7976931348623157e308), (-1.7976931348623157e308,-1.7976931348623157e308,-1.7976931348623157e308))) Axis-aligned bounding box. [type: AlignedBox3r, unit: m, not saved, read-only in python] .. rst-class:: html-toggle .. rst-class:: emphasized GridBound """"""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.Bound` → :obj:`~woo.dem.GridBound` .. autoclass:: GridBound :members: :exclude-members: nodePlay, __init__, __getstate__, __setstate__ :special-members: .. attribute:: nodePlay (= []) Space in which respective nodes of the shapes may be without triggering new contact detection [type: vector, read-only in python] .. rst-class:: html-toggle .. rst-class:: emphasized Aabb """" :obj:`~woo.core.Object` → :obj:`~woo.dem.Bound` → :obj:`~woo.dem.Aabb` .. autoclass:: Aabb :members: :exclude-members: nodeLastPos, maxD2, maxRot, nodeLastOri, __init__, __getstate__, __setstate__ :special-members: .. attribute:: nodeLastPos (= []) Node positions when bbox was last updated. [type: vector, unit: m, read-only in python] .. attribute:: maxD2 (= 0.0) Maximum allowed squared distance for nodal displacements (i.e. how much was the bbox enlarged last time) [type: Real, unit: m², not shown in the UI, read-only in python] .. attribute:: maxRot (= nan) Maximum allowed rotation (in radians, without discriminating different angles) that does not yet invalidate the bbox. Functor sets to -1 (or other negative value) for particles where node rotation does not influence the box (such as spheres or facets); in that case, orientation difference is not computed at all. If it is left at NaN, it is an indication that the functor does not implemnt this behavior and an error will be raised in the collider. [type: Real, read-only in python] .. attribute:: nodeLastOri (= []) Node orientations when bbox was last updated. [type: vector, read-only in python] .. rst-class:: html-toggle .. rst-class:: emphasized BoundFunctor ++++++++++++ :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.BoundFunctor` .. graphviz:: digraph BoundFunctor { rankdir=LR; margin=.2; "BoundFunctor" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.BoundFunctor"]; "Bo1_Rod_Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.BoundFunctor"]; "BoundFunctor" -> "Bo1_Rod_Aabb" [arrowsize=0.5,style="setlinewidth(0.5)"] "Bo1_Capsule_Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.BoundFunctor"]; "BoundFunctor" -> "Bo1_Capsule_Aabb" [arrowsize=0.5,style="setlinewidth(0.5)"] "Bo1_Wall_Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.BoundFunctor"]; "BoundFunctor" -> "Bo1_Wall_Aabb" [arrowsize=0.5,style="setlinewidth(0.5)"] "woo.fem.Bo1_Tetra_Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),filled",fillcolor=grey,height=0.2,URL="woo.fem.html#woo.fem.BoundFunctor"]; "BoundFunctor" -> "woo.fem.Bo1_Tetra_Aabb" [arrowsize=0.5,style="setlinewidth(0.5)"] "Bo1_InfCylinder_Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.BoundFunctor"]; "BoundFunctor" -> "Bo1_InfCylinder_Aabb" [arrowsize=0.5,style="setlinewidth(0.5)"] "Bo1_Ellipsoid_Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.BoundFunctor"]; "Bo1_Sphere_Aabb" -> "Bo1_Ellipsoid_Aabb" [arrowsize=0.5,style="setlinewidth(0.5)"] "Bo1_Cone_Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.BoundFunctor"]; "BoundFunctor" -> "Bo1_Cone_Aabb" [arrowsize=0.5,style="setlinewidth(0.5)"] "Bo1_Sphere_Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.BoundFunctor"]; "BoundFunctor" -> "Bo1_Sphere_Aabb" [arrowsize=0.5,style="setlinewidth(0.5)"] "Bo1_Facet_Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.BoundFunctor"]; "BoundFunctor" -> "Bo1_Facet_Aabb" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: BoundFunctor :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: .. rst-class:: html-toggle .. rst-class:: emphasized Bo1_Rod_Aabb """""""""""" :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.BoundFunctor` → :obj:`~woo.dem.Bo1_Rod_Aabb` .. autoclass:: Bo1_Rod_Aabb :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: .. rst-class:: html-toggle .. rst-class:: emphasized Bo1_Facet_Aabb """""""""""""" :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.BoundFunctor` → :obj:`~woo.dem.Bo1_Facet_Aabb` .. autoclass:: Bo1_Facet_Aabb :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: .. rst-class:: html-toggle .. rst-class:: emphasized Bo1_InfCylinder_Aabb """""""""""""""""""" :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.BoundFunctor` → :obj:`~woo.dem.Bo1_InfCylinder_Aabb` .. autoclass:: Bo1_InfCylinder_Aabb :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: .. rst-class:: html-toggle .. rst-class:: emphasized Bo1_Sphere_Aabb """"""""""""""" :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.BoundFunctor` → :obj:`~woo.dem.Bo1_Sphere_Aabb` .. graphviz:: digraph Bo1_Sphere_Aabb { rankdir=LR; margin=.2; "Bo1_Sphere_Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Bo1_Sphere_Aabb"]; "Bo1_Ellipsoid_Aabb" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Bo1_Sphere_Aabb"]; "Bo1_Sphere_Aabb" -> "Bo1_Ellipsoid_Aabb" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: Bo1_Sphere_Aabb :members: :exclude-members: distFactor, __init__, __getstate__, __setstate__ :special-members: .. attribute:: distFactor (= -1.0) removed in `API 10103 `__, set :obj:`DemField.distFactor` instead. [type: Real, not shown in the UI, not dumped, **DEPRECATED**, raises ``ValueError`` when accessed] Bo1_Ellipsoid_Aabb %%%%%%%%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.BoundFunctor` → :obj:`~woo.dem.Bo1_Sphere_Aabb` → :obj:`~woo.dem.Bo1_Ellipsoid_Aabb` .. autoclass:: Bo1_Ellipsoid_Aabb :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: .. rst-class:: html-toggle .. rst-class:: emphasized Bo1_Capsule_Aabb """""""""""""""" :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.BoundFunctor` → :obj:`~woo.dem.Bo1_Capsule_Aabb` .. autoclass:: Bo1_Capsule_Aabb :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: .. rst-class:: html-toggle .. rst-class:: emphasized Bo1_Cone_Aabb """"""""""""" :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.BoundFunctor` → :obj:`~woo.dem.Bo1_Cone_Aabb` .. autoclass:: Bo1_Cone_Aabb :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: .. rst-class:: html-toggle .. rst-class:: emphasized Bo1_Wall_Aabb """"""""""""" :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.BoundFunctor` → :obj:`~woo.dem.Bo1_Wall_Aabb` .. autoclass:: Bo1_Wall_Aabb :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: .. rst-class:: html-toggle .. rst-class:: emphasized GridBoundFunctor ++++++++++++++++ :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.GridBoundFunctor` .. graphviz:: digraph GridBoundFunctor { rankdir=LR; margin=.2; "GridBoundFunctor" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.GridBoundFunctor"]; "Grid1_Wall" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.GridBoundFunctor"]; "GridBoundFunctor" -> "Grid1_Wall" [arrowsize=0.5,style="setlinewidth(0.5)"] "Grid1_Facet" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.GridBoundFunctor"]; "GridBoundFunctor" -> "Grid1_Facet" [arrowsize=0.5,style="setlinewidth(0.5)"] "Grid1_InfCylinder" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.GridBoundFunctor"]; "GridBoundFunctor" -> "Grid1_InfCylinder" [arrowsize=0.5,style="setlinewidth(0.5)"] "Grid1_Sphere" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.GridBoundFunctor"]; "GridBoundFunctor" -> "Grid1_Sphere" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: GridBoundFunctor :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: .. rst-class:: html-toggle .. rst-class:: emphasized Grid1_Sphere """""""""""" :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.GridBoundFunctor` → :obj:`~woo.dem.Grid1_Sphere` .. autoclass:: Grid1_Sphere :members: :exclude-members: distFactor, __init__, __getstate__, __setstate__ :special-members: .. attribute:: distFactor (= -1.0) removed in `API 10103 `__, set :obj:`DemField.distFactor` instead. [type: Real, not shown in the UI, not dumped, **DEPRECATED**, raises ``ValueError`` when accessed] .. rst-class:: html-toggle .. rst-class:: emphasized Grid1_Facet """"""""""" :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.GridBoundFunctor` → :obj:`~woo.dem.Grid1_Facet` .. autoclass:: Grid1_Facet :members: :exclude-members: movable, __init__, __getstate__, __setstate__ :special-members: .. attribute:: movable (= False) Set to allow movable facets (with grid enlarged by :obj:`GridCollider.verletDist`. If false and a moving facet is encountered, an exception is raised. [type: bool] .. rst-class:: html-toggle .. rst-class:: emphasized Grid1_InfCylinder """"""""""""""""" :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.GridBoundFunctor` → :obj:`~woo.dem.Grid1_InfCylinder` .. autoclass:: Grid1_InfCylinder :members: :exclude-members: movable, __init__, __getstate__, __setstate__ :special-members: .. attribute:: movable (= False) Set to allow movable cylinders (with grid enlarged by :obj:`GridCollider.verletDist`. If false and a moving cylinder is encountered, an exception is raised. [type: bool] .. rst-class:: html-toggle .. rst-class:: emphasized Grid1_Wall """""""""" :obj:`~woo.core.Object` → :obj:`~woo.core.Functor` → :obj:`~woo.dem.GridBoundFunctor` → :obj:`~woo.dem.Grid1_Wall` .. autoclass:: Grid1_Wall :members: :exclude-members: movable, __init__, __getstate__, __setstate__ :special-members: .. attribute:: movable (= False) Set to allow movable walls (with grid enlarged by :obj:`GridCollider.verletDist`. If false and a movable wall is encountered, an exception is raised. [type: bool] .. rst-class:: html-toggle .. rst-class:: emphasized BoundDispatcher +++++++++++++++ :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.Dispatcher` → :obj:`~woo.dem.BoundDispatcher` .. autoclass:: BoundDispatcher :members: :exclude-members: functors, __init__, __getstate__, __setstate__ :special-members: .. attribute:: functors (= []) Functors active in the dispatch mechanism [overridden below]. [type: vector>] .. rst-class:: html-toggle .. rst-class:: emphasized GridBoundDispatcher +++++++++++++++++++ :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.Dispatcher` → :obj:`~woo.dem.GridBoundDispatcher` .. autoclass:: GridBoundDispatcher :members: :exclude-members: functors, __init__, __getstate__, __setstate__ :special-members: .. attribute:: functors (= []) Functors active in the dispatch mechanism [overridden below]. [type: vector>] .. rst-class:: html-toggle .. rst-class:: emphasized Packings -------- TODO .. rst-class:: html-toggle .. rst-class:: emphasized ShapePack +++++++++ :obj:`~woo.core.Object` → :obj:`~woo.dem.ShapePack` .. autoclass:: ShapePack :members: :exclude-members: cellSize, movable, div, raws, userData, loadFrom, __init__, __getstate__, __setstate__ :special-members: .. attribute:: cellSize (= Vector3(0,0,0)) Positive components signify periodic boundary along the respective axis. [type: Vector3r] .. attribute:: movable (= False) Whether the packing is movable, i.e. should be automatically recentered after filtered with a predicate. [type: bool] .. attribute:: div (= 5) Default value for recomputing properties of clumps (relative to the smallest equivalent radius) [type: int] .. attribute:: raws (= []) Raw shapes of particles/clumps. [type: vector>] .. attribute:: userData (= '') String of arbitrary user data to be loaded/saved with the ShapePack. [type: string] .. attribute:: loadFrom (= '') If given when constructing the instance, the file is loaded immediately and the attribute is reset. [type: string] .. rst-class:: html-toggle .. rst-class:: emphasized RawShape ++++++++ :obj:`~woo.core.Object` → :obj:`~woo.dem.RawShape` .. autoclass:: RawShape :members: :exclude-members: className, center, radius, raw, __init__, __getstate__, __setstate__ :special-members: .. attribute:: className (= '') Name of the Shape subclass. [type: string] .. attribute:: center (= Vector3(0,0,0)) Center of the bounding sphere. [type: Vector3r] .. attribute:: radius (= 0.0) Radius of the bounding sphere. [type: Real] .. attribute:: raw (= []) Raw data for shape reconstruction; the size of the array is shape-specific. [type: vector] .. rst-class:: html-toggle .. rst-class:: emphasized ShapeClump ++++++++++ :obj:`~woo.core.Object` → :obj:`~woo.dem.ShapeClump` .. graphviz:: digraph ShapeClump { rankdir=LR; margin=.2; "ShapeClump" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.ShapeClump"]; "RawShapeClump" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.ShapeClump"]; "ShapeClump" -> "RawShapeClump" [arrowsize=0.5,style="setlinewidth(0.5)"] "SphereClumpGeom" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.ShapeClump"]; "ShapeClump" -> "SphereClumpGeom" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: ShapeClump :members: :exclude-members: scaleProb, pos, ori, volume, equivRad, inertia, div, clumped, __init__, __getstate__, __setstate__ :special-members: .. attribute:: scaleProb (= []) Used by particle generators: piecewise-linear function probability(equivRad) given as a sequence of x,y coordinates. If not given, constant function \ :math:`p(d)=1`\ is assumed. See the documentation of :obj:`woo.dem.PsdClumpGenerator` for details. [type: vector] .. attribute:: pos (= Vector3(0,0,0)) Centroid position (computed automatically) [type: Vector3r, not dumped, read-only in python] .. attribute:: ori (= Quaternion((1,0,0),0)) Principal axes orientation (computed automatically) [type: Quaternionr, not dumped, read-only in python] .. attribute:: volume (= nan) Volume (computed automatically) [type: Real, unit: m³, not dumped, read-only in python] .. attribute:: equivRad (= nan) Equivalent radius of the clump (computed automatically) -- mean of radii of gyration, i.e. \ :math:`\frac{1}{3}\sum \sqrt{I_{ii}/V}`\ . [type: Real, unit: m, not dumped, read-only in python] .. attribute:: inertia (= Vector3(nan,nan,nan)) Geometrical inertia (computed with unit density) [type: Vector3r, not dumped, read-only in python] .. attribute:: div (= 5) Sampling grid fineness, when computing volume and other properties, relative to the smallest sphere's radius. When zero or negative, assume spheres don't intersect and use a different algorithm (Steiner's theorem). [type: int, not dumped] .. attribute:: clumped (= True) Whether nodes of this shape are clumped together when the particle is created (so far, clumped shapes *only* are produced). [type: bool, read-only in python] .. rst-class:: html-toggle .. rst-class:: emphasized SphereClumpGeom """"""""""""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.ShapeClump` → :obj:`~woo.dem.SphereClumpGeom` .. autoclass:: SphereClumpGeom :members: :exclude-members: centers, radii, __init__, __getstate__, __setstate__ :special-members: .. attribute:: centers (= []) Centers of constituent spheres, in clump-local coordinates. [type: vector] .. attribute:: radii (= []) Radii of constituent spheres [type: vector] .. rst-class:: html-toggle .. rst-class:: emphasized RawShapeClump """"""""""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.ShapeClump` → :obj:`~woo.dem.RawShapeClump` .. autoclass:: RawShapeClump :members: :exclude-members: rawShapes, __init__, __getstate__, __setstate__ :special-members: .. attribute:: rawShapes (= []) Data for creating primitive shapes [type: vector>] .. rst-class:: html-toggle .. rst-class:: emphasized Export ------ TODO .. rst-class:: html-toggle .. rst-class:: emphasized VtkExport +++++++++ :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.PeriodicEngine` → :obj:`~woo.dem.VtkExport` .. autoclass:: VtkExport :members: :exclude-members: out, compress, ascii, multiblock, mask, what, sphereSphereOnly, infError, skipInvisible, savePos, clip, staticMeshBit, staticMeshDone, subdiv, ellLev, thickFacetDiv, cylCaps, rodSurf, nanValue, outFiles, outTimes, outSteps, mkDir, prevCellNum, __init__, __getstate__, __setstate__ :special-members: .. attribute:: out (= '') Filename prefix to write into; :obj:`woo.core.Scene.tags` written as {tagName} are expanded at the first run. [type: string] .. attribute:: compress (= True) Compress output XML files [type: bool] .. attribute:: ascii (= False) Store data as readable text in the XML file (sets `vtkXMLWriter `__ data mode to ``vtkXMLWriter::Ascii``, while the default is ``Appended`` [type: bool] .. attribute:: multiblock (= False) Write to multi-block VTK files, rather than separate files; currently borken, do not use. [type: bool] .. attribute:: mask (= 0) If non-zero, only particles matching the mask will be exported. [type: int] .. attribute:: what (= 47) Select data to be saved (e.g. VtkExport.spheres|VtkExport.mesh, or use VtkExport.all for everything) [type: int] .. attribute:: sphereSphereOnly (= False) Only export contacts between two spheres (not sphere+facet and such) [type: bool] .. attribute:: infError (= True) Raise exception for infinite objects which don't have the glAB attribute set properly. [type: bool] .. attribute:: skipInvisible (= True) Skip invisible particles [type: bool] .. attribute:: savePos (= False) Save positions of spheres (redundant information, but useful for coloring by position in Paraview. [type: bool] .. attribute:: clip (= AlignedBox3((1.7976931348623157e308,1.7976931348623157e308,1.7976931348623157e308), (-1.7976931348623157e308,-1.7976931348623157e308,-1.7976931348623157e308))) Only export particles of which first node is in the clip box (if given). [type: AlignedBox3r] .. attribute:: staticMeshBit (= 8) Bit for identifying static mesh particles (:obj:`Facet`, :obj:`Wall`, :obj:`InfCylinder` only) which will be exported only once. [type: int] .. attribute:: staticMeshDone (= False) Whether static mesh was already exported [type: bool] .. attribute:: subdiv (= 16) Subdivision fineness for circular objects (such as cylinders). .. note:: :obj:`Facets ` are rendered without rounded edges (they are closed flat). .. note:: :obj:`Ellipsoids ` triangulation is controlled via the :obj:`ellLev` parameter. [type: int] .. attribute:: ellLev (= 0) Tesselation level for exporting ellipsoids (0 = icosahedron, each level subdivides one triangle into three. [type: int, range: 0−3] .. attribute:: thickFacetDiv (= 1) Subdivision for :obj:`woo.dem.Facet` objects with non-zero :obj:`woo.dem.Facet.halfThick`; the value of -1 will use :obj:`subdiv`; 0 will render only faces, without edges; 1 will close the edge flat; higher values mean the number of subdivisions. [type: int] .. attribute:: cylCaps (= True) Render caps of :obj:`InfCylinder` (at :obj:`InfCylinder.glAB`). [type: bool] .. attribute:: rodSurf (= False) Export rods (and derived classes) as capsule-shaped triangulated surfaces; without this option, rods are exported as plain connecting lines. [type: bool] .. attribute:: nanValue (= 0.0) Use this number instead of NaN in entries, since VTK cannot read NaNs properly [type: Real] .. attribute:: outFiles (= {}) Files which have been written out, keyed by what they contain: 'spheres','mesh','con'. [type: map_string_vector_string, not shown in the UI, read-only in python] .. attribute:: outTimes (= []) Times at which files were written. [type: vector, not shown in the UI, read-only in python] .. attribute:: outSteps (= []) Steps at which files were written. [type: vector, not shown in the UI, read-only in python] .. attribute:: mkDir (= False) Attempt to create directory for output files, if not present. [type: bool] .. attribute:: prevCellNum (= Vector3i(0,0,0)) Previous cell array sized, for pre-allocation. [type: Vector3i, not shown in the UI, not saved, read-only in python] .. rst-class:: html-toggle .. rst-class:: emphasized FlowAnalysis ++++++++++++ :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.PeriodicEngine` → :obj:`~woo.dem.FlowAnalysis` .. autoclass:: FlowAnalysis :members: :exclude-members: box, node, data, dLim, masks, nFractions, cellSize, boxCells, mask, cellData, porosity, matStateScalar, matStateName, timeSpan, color, __init__, __getstate__, __setstate__ :special-members: .. attribute:: box (= AlignedBox3((1.7976931348623157e308,1.7976931348623157e308,1.7976931348623157e308), (-1.7976931348623157e308,-1.7976931348623157e308,-1.7976931348623157e308))) Domain in which the flow is to be analyzed; the box may glow slightly to accomodate integer number of cells. Do not change once there is some data alread. Do not change once there is some data already. [type: AlignedBox3r] .. attribute:: node (= None) Defines local coordinates system; it undefined, uses global coordinates. [type: shared_ptr<:obj:`Node `>] .. attribute:: data Grid data -- 5d since each 3d point contains multiple entries, and there are multiple grids. [type: boost_multi_array_real_5, not accessible from python] .. attribute:: dLim (= []) Limiting diameter values, for defining fractions which are analyzed separately. Do not change when there is some data already. [type: vector] .. attribute:: masks (= []) Mask values for fractions; it is an error if a particle matches multiple masks. Do not change when there is some data already. [type: vector] .. attribute:: nFractions (= -1) Number of fractions, defined via :obj:`dLim` or :obj:`masks`; set automatically. [type: int, read-only in python] .. attribute:: cellSize (= nan) Size of one cell in the box (in all directions); will be satisfied exactly at the expense of perhaps slightly growing :obj:`box`. Do not change once there is some data already. [type: Real] .. attribute:: boxCells (= Vector3i(0,0,0)) Number of cells in the box (computed automatically) [type: Vector3i, read-only in python] .. attribute:: mask (= 0) Particles to consider in the flow analysis (0 to consider everything). [type: int] .. attribute:: cellData (= False) Write flow rate as cell data rather than point data. [type: bool] .. attribute:: porosity (= False) Compute (and export) solid ratio (1-porosity) for all spheroidal particles (requires triangulation of the domain at every step, hence slow and not enabled by default. [type: bool] .. attribute:: matStateScalar (= -1) If non-negative, index of material state to analyze. [type: int] .. attribute:: matStateName (= '') If given, used for VTK-export of the scalar; if not given, is filled form the first instance encountered automatically. [type: string] .. attribute:: timeSpan (= 0.0) Total time that the analysis has been running. [type: Real] .. attribute:: color (= Vector3(1,1,0)) Color for rendering the domain [type: Vector3r] .. rst-class:: html-toggle .. rst-class:: emphasized POVRayExport ++++++++++++ :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.PeriodicEngine` → :obj:`~woo.dem.POVRayExport` .. autoclass:: POVRayExport :members: :exclude-members: out, mask, skipInvisible, clip, frameCounter, colorRange, colorFuzz, staticMask, masks, textures, cylCapTexture, wallTexture, texturesInc, extraInc, camLocation, camLookAt, camAngle, connMesh, __init__, __getstate__, __setstate__ :special-members: .. attribute:: out (= '') Filename prefix to write into; :obj:`woo.core.Scene.tags` written as ``{tagName}`` are expanded at the first run. [type: string] .. attribute:: mask (= 0) If non-zero, only particles matching the mask will be exported. [type: int] .. attribute:: skipInvisible (= True) Skip invisible particles [type: bool] .. attribute:: clip (= AlignedBox3((1.7976931348623157e308,1.7976931348623157e308,1.7976931348623157e308), (-1.7976931348623157e308,-1.7976931348623157e308,-1.7976931348623157e308))) Only export particles of which first node is in the clip box (if given). [type: AlignedBox3r] .. attribute:: frameCounter (= 0) Counts exported frames and uses the number to name output files. [type: int] .. attribute:: colorRange (= ) Range to map :obj:`woo.dem.Shape.color` to RGB for pigment specification. [type: shared_ptr<:obj:`ScalarRange `>] .. attribute:: colorFuzz (= 0.2) Relative fuzz for particle color; the texture is called with RGB colors mapped (via :obj:`colorRange`) from :obj:`Shape.color` - colorFuzz and :obj:`Shape.color` + colorFuzz, clamped to (0,1)). [type: Real] .. attribute:: staticMask (= 8) Mask for static particles, which will be exported only once into a special incude file separate from the per-frame include files. [type: int] .. attribute:: masks (= [8, 4, 1]) Masks which will be tried one after another (first match counts) on each particle to determine which texture will be applied to it. Texture names are taken from :obj:`textures` and must be defined in the master file. [type: vector] .. attribute:: textures (= ['static', 'outlet', 'movable']) Texture names applied to particles matching :obj:`masks` -- the first matching mask counts, textures are named ``woo_tex_*`` and must be modified in the master file by the user (only an example definition is written by Woo). Particles not matching any mask will be assigned texture ``default`` (``woo_tex_default``). Each texture receives two rgb arguments which are colormapped from :obj:`woo.dem.Shape.color` using :obj:`colorRange` and :obj:`colorFuzz`. [type: vector] .. attribute:: cylCapTexture (= '') If non-empty, :obj:`InfCylinder` objects will be drawn as several objects, with caps having this separate texture type. [type: string] .. attribute:: wallTexture (= '') If non-empty, :obj:`Wall` objects will have this texture applied, regardless of their mask. Meant for easily assigning checkerboard texture to wall objects. [type: string] .. attribute:: texturesInc (= '') Better textures, conditionally included in every step; if not provided, default filename will be generated. [type: string] .. attribute:: extraInc (= ['woo-logo.inc']) If set, these files will be conditionally included at the end of every step. [type: vector] .. attribute:: camLocation (= Vector3(15,10,0)) Default location of the camera [type: Vector3r] .. attribute:: camLookAt (= Vector3(0,0,0)) Default look direction of the camera [type: Vector3r] .. attribute:: camAngle (= 45.0) Default camera angle (in degrees) [type: float] .. attribute:: connMesh (= 1) Whether to export facets (:obj:`Facet` and derived classes) as connected meshes, and in what cases. This entails building topology and determining connected components of the topology graph, which can demand non-negligible computation; the default is to do it for static mesh only, which is done only once, but not at every simulations steps. It is however necessary to set to ``always`` if non-static mesh is moving and should be exported. .. note:: Facets are normally exported one-by-one. Mesh allows for more efficient processing in POV-Ray and for things like texture covering more facets. [type: int, named enum, possible values are: **'none'** (*''*, *'never'*; 0), **'static'** (*'stat'*, *'static only'*; 1), **'always'** (*'yes'*; 2)] .. rst-class:: html-toggle .. rst-class:: emphasized Particle -------- Each particles in DEM is defined by its shape (given by multiple nodes) and other parameters. .. rst-class:: html-toggle .. rst-class:: emphasized Particle ++++++++ :obj:`~woo.core.Object` → :obj:`~woo.dem.Particle` .. autoclass:: Particle :members: :exclude-members: id, mask, shape, material, matState, contacts, __init__, __getstate__, __setstate__ :special-members: .. attribute:: id (= -1) Index in DemField::particles [type: id_t, read-only in python] .. attribute:: mask (= 1) Bitmask for collision detection and other (group 1 by default) [type: uint] .. attribute:: shape (= None) Geometrical configuration of the particle [type: shared_ptr<:obj:`Shape `>] .. attribute:: material (= None) Material of the particle [type: shared_ptr<:obj:`Material `>] .. attribute:: matState (= None) Material state of the particle (such as damage data and similar) [type: shared_ptr<:obj:`MatState `>] .. attribute:: contacts (= {}) Contacts of this particle, indexed by id of the other particle. [type: MapParticleContact, not saved, not accessible from python] .. rst-class:: html-toggle .. rst-class:: emphasized Shape +++++ :obj:`~woo.core.Object` → :obj:`~woo.dem.Shape` .. graphviz:: digraph Shape { rankdir=LR; margin=.2; "Shape" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Shape"]; "Wall" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Shape"]; "Shape" -> "Wall" [arrowsize=0.5,style="setlinewidth(0.5)"] "Ellipsoid" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Shape"]; "Shape" -> "Ellipsoid" [arrowsize=0.5,style="setlinewidth(0.5)"] "woo.fem.Membrane" [shape="box",fontsize=8,style="setlinewidth(0.5),filled",fillcolor=grey,height=0.2,URL="woo.fem.html#woo.fem.Shape"]; "Facet" -> "woo.fem.Membrane" [arrowsize=0.5,style="setlinewidth(0.5)"] "Rod" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Shape"]; "Shape" -> "Rod" [arrowsize=0.5,style="setlinewidth(0.5)"] "Cone" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Shape"]; "Shape" -> "Cone" [arrowsize=0.5,style="setlinewidth(0.5)"] "InfCylinder" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Shape"]; "Shape" -> "InfCylinder" [arrowsize=0.5,style="setlinewidth(0.5)"] "woo.fem.Tetra" [shape="box",fontsize=8,style="setlinewidth(0.5),filled",fillcolor=grey,height=0.2,URL="woo.fem.html#woo.fem.Shape"]; "Shape" -> "woo.fem.Tetra" [arrowsize=0.5,style="setlinewidth(0.5)"] "Facet" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Shape"]; "Shape" -> "Facet" [arrowsize=0.5,style="setlinewidth(0.5)"] "Truss" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Shape"]; "Rod" -> "Truss" [arrowsize=0.5,style="setlinewidth(0.5)"] "woo.fem.Tet4" [shape="box",fontsize=8,style="setlinewidth(0.5),filled",fillcolor=grey,height=0.2,URL="woo.fem.html#woo.fem.Shape"]; "woo.fem.Tetra" -> "woo.fem.Tet4" [arrowsize=0.5,style="setlinewidth(0.5)"] "Capsule" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Shape"]; "Shape" -> "Capsule" [arrowsize=0.5,style="setlinewidth(0.5)"] "Sphere" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Shape"]; "Shape" -> "Sphere" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: Shape :members: :exclude-members: bound, nodes, color, __init__, __getstate__, __setstate__ :special-members: .. attribute:: bound (= None) Bound of the particle, for use by collision detection only [type: shared_ptr<:obj:`Bound `>] .. attribute:: nodes (= NodeList[]) Nodes associated with this particle [type: vector >] .. attribute:: color (= 0.9161950680037007) Normalized color for rendering; negative values render with wire (rather than solid), :math:`|\text{color}|`>2 means invisible. (use *wire*, *hi* and *visible* to manipulate those) [type: Real] .. rst-class:: html-toggle .. rst-class:: emphasized InfCylinder """"""""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.Shape` → :obj:`~woo.dem.InfCylinder` .. autoclass:: InfCylinder :members: :exclude-members: radius, axis, glAB, __init__, __getstate__, __setstate__ :special-members: .. attribute:: radius (= nan) Radius of the cylinder [type: Real] .. attribute:: axis (= 0) Axis of the normal; can be 0,1,2 for +x, +y, +z respectively (Node's orientation is disregarded for walls) [type: int] .. attribute:: glAB (= Vector2(nan,nan)) Endpoints between which the infinite cylinder is drawn, in local coordinate system along :obj:`axis`; if NaN, taken from scene view to be visible [type: Vector2r] .. rst-class:: html-toggle .. rst-class:: emphasized Wall """" :obj:`~woo.core.Object` → :obj:`~woo.dem.Shape` → :obj:`~woo.dem.Wall` .. autoclass:: Wall :members: :exclude-members: sense, axis, glAB, __init__, __getstate__, __setstate__ :special-members: .. attribute:: sense (= 0) Which side of the wall interacts: -1 for negative only, 0 for both, +1 for positive only. [type: int] .. attribute:: axis (= 0) Axis of the normal; can be 0,1,2 for +x, +y, +z respectively (Node's orientation is disregarded for walls) [type: int] .. attribute:: glAB (= AlignedBox2((nan,nan), (nan,nan))) Points between which the wall is drawn (if NaN, computed automatically to cover the visible part of the scene) [type: AlignedBox2r] .. rst-class:: html-toggle .. rst-class:: emphasized Sphere """""" :obj:`~woo.core.Object` → :obj:`~woo.dem.Shape` → :obj:`~woo.dem.Sphere` .. autoclass:: Sphere :members: :exclude-members: radius, __init__, __getstate__, __setstate__ :special-members: .. attribute:: radius (= nan) Radius. [type: Real, unit: m] .. rst-class:: html-toggle .. rst-class:: emphasized Ellipsoid """"""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.Shape` → :obj:`~woo.dem.Ellipsoid` .. autoclass:: Ellipsoid :members: :exclude-members: semiAxes, __init__, __getstate__, __setstate__ :special-members: .. attribute:: semiAxes (= Vector3(nan,nan,nan)) Semi-principal axes. [type: Vector3r, unit: m] .. rst-class:: html-toggle .. rst-class:: emphasized Rod """ :obj:`~woo.core.Object` → :obj:`~woo.dem.Shape` → :obj:`~woo.dem.Rod` .. graphviz:: digraph Rod { rankdir=LR; margin=.2; "Rod" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Rod"]; "Truss" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Rod"]; "Rod" -> "Truss" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: Rod :members: :exclude-members: radius, __init__, __getstate__, __setstate__ :special-members: .. attribute:: radius (= nan) Radius of the rod. [type: Real] Truss %%%%% :obj:`~woo.core.Object` → :obj:`~woo.dem.Shape` → :obj:`~woo.dem.Rod` → :obj:`~woo.dem.Truss` .. autoclass:: Truss :members: :exclude-members: l0, axialStress, preStress, __init__, __getstate__, __setstate__ :special-members: .. attribute:: l0 (= nan) Initial (usually equilibrium) length [type: Real] .. attribute:: axialStress (= 0.0) Current normal stress (informative only) [type: Real] .. attribute:: preStress (= 0.0) Pre-stress (stress at zero strain) [type: Real] .. rst-class:: html-toggle .. rst-class:: emphasized Facet """"" :obj:`~woo.core.Object` → :obj:`~woo.dem.Shape` → :obj:`~woo.dem.Facet` .. graphviz:: digraph Facet { rankdir=LR; margin=.2; "Facet" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Facet"]; "woo.fem.Membrane" [shape="box",fontsize=8,style="setlinewidth(0.5),filled",fillcolor=grey,height=0.2,URL="woo.fem.html#woo.fem.Facet"]; "Facet" -> "woo.fem.Membrane" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: Facet :members: :exclude-members: fakeVel, halfThick, n21lim, __init__, __getstate__, __setstate__ :special-members: .. attribute:: fakeVel (= Vector3(0,0,0)) Fake velocity when computing contact, in global coordinates (for modeling moving surface modeled using static triangulation); only in-plane velocity is meaningful, but this is not enforced. .. note:: If the x-component is NaN, the meaning is special: :obj:`fakeVel` is taken as zero vector and, in addition, local in-plane facet's linear velocity at the contact is taken as zero (rather than linearly interpolated between velocity of nodes). [type: Vector3r] .. attribute:: halfThick (= 0.0) Geometric thickness (added in all directions) [type: Real] .. attribute:: n21lim (= Vector3(nan,nan,nan)) Edge & vertex contact: limit value for dot-product with normal (dot-product of normal with in-plane angle of neighboring facet, perpendicular to the edge). [type: Vector3r] .. rst-class:: html-toggle .. rst-class:: emphasized Cone """" :obj:`~woo.core.Object` → :obj:`~woo.dem.Shape` → :obj:`~woo.dem.Cone` .. autoclass:: Cone :members: :exclude-members: radii, __init__, __getstate__, __setstate__ :special-members: .. attribute:: radii (= Vector2(nan,nan)) Radii of the cone. One of them can be zero (for full cone). When both radii are non-zero, the result is conical frustum. [type: Vector2r] .. rst-class:: html-toggle .. rst-class:: emphasized Capsule """"""" :obj:`~woo.core.Object` → :obj:`~woo.dem.Shape` → :obj:`~woo.dem.Capsule` .. autoclass:: Capsule :members: :exclude-members: radius, shaft, __init__, __getstate__, __setstate__ :special-members: .. attribute:: radius (= nan) Radius of the capsule -- of half-spherical caps and also of the middle part. [type: Real, unit: m] .. attribute:: shaft (= nan) Length of the middle segment [type: Real, unit: m] .. rst-class:: html-toggle .. rst-class:: emphasized Material properties +++++++++++++++++++ TODO .. rst-class:: html-toggle .. rst-class:: emphasized Material """""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.Material` .. graphviz:: digraph Material { rankdir=LR; margin=.2; "Material" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Material"]; "ConcreteMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Material"]; "FrictMat" -> "ConcreteMat" [arrowsize=0.5,style="setlinewidth(0.5)"] "FrictMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Material"]; "ElastMat" -> "FrictMat" [arrowsize=0.5,style="setlinewidth(0.5)"] "IceMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Material"]; "FrictMat" -> "IceMat" [arrowsize=0.5,style="setlinewidth(0.5)"] "HertzMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Material"]; "FrictMat" -> "HertzMat" [arrowsize=0.5,style="setlinewidth(0.5)"] "ElastMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Material"]; "Material" -> "ElastMat" [arrowsize=0.5,style="setlinewidth(0.5)"] "PelletMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Material"]; "FrictMat" -> "PelletMat" [arrowsize=0.5,style="setlinewidth(0.5)"] "LudingMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Material"]; "FrictMat" -> "LudingMat" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: Material :members: :exclude-members: density, id, __init__, __getstate__, __setstate__ :special-members: .. attribute:: density (= 1000.0) Density [type: Real, unit: kg/m³] .. attribute:: id (= -1) Some number identifying this material; used with MatchMaker objects, useless otherwise [type: int, not shown in the UI] .. rst-class:: html-toggle .. rst-class:: emphasized ElastMat """""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.Material` → :obj:`~woo.dem.ElastMat` .. graphviz:: digraph ElastMat { rankdir=LR; margin=.2; "ElastMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.ElastMat"]; "ConcreteMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.ElastMat"]; "FrictMat" -> "ConcreteMat" [arrowsize=0.5,style="setlinewidth(0.5)"] "IceMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.ElastMat"]; "FrictMat" -> "IceMat" [arrowsize=0.5,style="setlinewidth(0.5)"] "PelletMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.ElastMat"]; "FrictMat" -> "PelletMat" [arrowsize=0.5,style="setlinewidth(0.5)"] "HertzMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.ElastMat"]; "FrictMat" -> "HertzMat" [arrowsize=0.5,style="setlinewidth(0.5)"] "FrictMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.ElastMat"]; "ElastMat" -> "FrictMat" [arrowsize=0.5,style="setlinewidth(0.5)"] "LudingMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.ElastMat"]; "FrictMat" -> "LudingMat" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: ElastMat :members: :exclude-members: young, __init__, __getstate__, __setstate__ :special-members: .. attribute:: young (= 1000000000.0) Young's modulus [type: Real, unit: Pa] FrictMat %%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.dem.Material` → :obj:`~woo.dem.ElastMat` → :obj:`~woo.dem.FrictMat` .. graphviz:: digraph FrictMat { rankdir=LR; margin=.2; "FrictMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.FrictMat"]; "ConcreteMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.FrictMat"]; "FrictMat" -> "ConcreteMat" [arrowsize=0.5,style="setlinewidth(0.5)"] "IceMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.FrictMat"]; "FrictMat" -> "IceMat" [arrowsize=0.5,style="setlinewidth(0.5)"] "HertzMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.FrictMat"]; "FrictMat" -> "HertzMat" [arrowsize=0.5,style="setlinewidth(0.5)"] "PelletMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.FrictMat"]; "FrictMat" -> "PelletMat" [arrowsize=0.5,style="setlinewidth(0.5)"] "LudingMat" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.FrictMat"]; "FrictMat" -> "LudingMat" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: FrictMat :members: :exclude-members: tanPhi, ktDivKn, __init__, __getstate__, __setstate__ :special-members: .. attribute:: tanPhi (= 0.5) Tangent of internal friction angle. [type: Real] .. attribute:: ktDivKn (= 0.2) Ratio of tangent and shear modulus on contact. [type: Real] PelletMat ''''''''' :obj:`~woo.core.Object` → :obj:`~woo.dem.Material` → :obj:`~woo.dem.ElastMat` → :obj:`~woo.dem.FrictMat` → :obj:`~woo.dem.PelletMat` .. autoclass:: PelletMat :members: :exclude-members: normPlastCoeff, kaDivKn, __init__, __getstate__, __setstate__ :special-members: .. attribute:: normPlastCoeff (= 0.0) Coefficient \ :math:`\alpha`\ in the normal yield function; non-positive deactivates. [type: Real] .. attribute:: kaDivKn (= 0.0) Ratio of \ :math:`\frac{k_A}{K_N}`\ for the adhesion function; non-positive deactivates. [type: Real] PelletAgglomerator ^^^^^^^^^^^^^^^^^^ :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.dem.PelletAgglomerator` .. autoclass:: PelletAgglomerator :members: :exclude-members: agglomSrcs, massIncPerRad, dampHalfLife, currRate, currRateSmooth, mass, __init__, __getstate__, __setstate__ :special-members: .. attribute:: agglomSrcs (= _8ParticleList[]) Sources of agglomerating mass; particles in contact with this source will have their radius increased based on their relative angular velocity. [type: vector>] .. attribute:: massIncPerRad (= nan) Increase of sphere mass per one radian of rolling (radius is increased in such way that mass increase is satisfied). [type: Real] .. attribute:: dampHalfLife (= -10000.0) Half-life for rotation damping (includes both rolling and twist); if negative, relative to the (initial) :obj:`woo.core.Scene.dt`; zero deactivates damping. Half-life is \ :math:`t_{1/.2}=\frac{\ln 2}{\lambda}`\ where \ :math:`\lambda`\ is decay coefficient applied as \ :math:`\d\omega=-\lambda\omega`\ (see http://en.wikipedia.org/wiki/Exponential_decay for details). [type: Real] .. attribute:: currRate (= 0.0) Current rate of mass increase due to agglomeration. [type: Real] .. attribute:: currRateSmooth (= 0.001) Smoothing coefficient for currRate ∈〈0,1〉 (should be rather low, since this engine runs at every step). [type: Real] .. attribute:: mass (= 0.0) Total cumulative mass increase due to agglomeration. [type: Real] LudingMat ''''''''' :obj:`~woo.core.Object` → :obj:`~woo.dem.Material` → :obj:`~woo.dem.ElastMat` → :obj:`~woo.dem.FrictMat` → :obj:`~woo.dem.LudingMat` .. autoclass:: LudingMat :members: :exclude-members: k1DivKn, kaDivKn, deltaLimRel, viscN, dynDivStat, viscT, krDivKn, statR, viscR, kwDivKn, statW, viscW, __init__, __getstate__, __setstate__ :special-members: .. rubric:: ► Normal .. attribute:: k1DivKn (= 0.5) Ratio of plastic (loading) stiffness to maximum normal (elastic, unloading/reloading) stiffness. [type: Real] .. attribute:: kaDivKn (= 0.2) Ratio of adhesive 'stiffness' to elastic (unloading) stiffness. [type: Real] .. attribute:: deltaLimRel (= 0.1) Maximum plasticity depth relative to minimum radius of contacting particles. [type: Real] .. attribute:: viscN (= 0.0) Normal viscous coefficient. [type: Real] .. rubric:: ► Tangential .. attribute:: dynDivStat (= 0.7) Dynamic to static friction ratio (:math:`\phi_d=\mu_d/\mu_s`); applied in tangential, rolling and twisting senses. [type: Real] .. attribute:: viscT (= 0.0) Tangential viscosity. [type: Real] .. rubric:: ► Rolling .. attribute:: krDivKn (= 0.2) Rolling stiffness relative to maximal elastic stiffness (divided by average contact radius for dimensional consistency). [type: Real] .. attribute:: statR (= 0.4) Rolling static friction coefficient. [type: Real] .. attribute:: viscR (= 0.1) Rolling viscous coefficient for rolling. [type: Real] .. rubric:: ► Twisting .. attribute:: kwDivKn (= 0.2) Twist stiffness relative to maximal elastic stiffness (divided by average contact radius for dimensional consistency). [type: Real] .. attribute:: statW (= 0.3) Twisting static friction coefficient. [type: Real] .. attribute:: viscW (= 0.1) Twisting viscous coefficient. [type: Real] ConcreteMat ''''''''''' :obj:`~woo.core.Object` → :obj:`~woo.dem.Material` → :obj:`~woo.dem.ElastMat` → :obj:`~woo.dem.FrictMat` → :obj:`~woo.dem.ConcreteMat` .. autoclass:: ConcreteMat :members: :exclude-members: sigmaT, neverDamage, epsCrackOnset, relDuctility, damLaw, dmgTau, dmgRateExp, plTau, plRateExp, isoPrestress, __init__, __getstate__, __setstate__ :special-members: .. attribute:: sigmaT (= nan) Initial cohesion [Pa] [type: Real] .. attribute:: neverDamage (= False) If true, no damage will occur (for testing only). [type: bool] .. attribute:: epsCrackOnset (= nan) Limit elastic strain [-] [type: Real] .. attribute:: relDuctility (= nan) relative ductility of bonds in normal direction [type: Real] .. attribute:: damLaw (= 1) Law for damage evolution in uniaxial tension. 0 for linear stress-strain softening branch, 1 (default) for exponential damage evolution law [type: int, named enum, possible values are: **'linear softening'** (*'lin'*; 0), **'exponential softening'** (*'exp'*; 1)] .. attribute:: dmgTau (= -1.0) Characteristic time for normal viscosity. [s] [type: Real] .. attribute:: dmgRateExp (= 0.0) Exponent for normal viscosity function. [-] [type: Real] .. attribute:: plTau (= -1.0) Characteristic time for visco-plasticity. [s] [type: Real] .. attribute:: plRateExp (= 0.0) Exponent for visco-plasticity function. [-] [type: Real] .. attribute:: isoPrestress (= 0.0) Isotropic prestress of the whole specimen. [P a] [type: Real] IceMat '''''' :obj:`~woo.core.Object` → :obj:`~woo.dem.Material` → :obj:`~woo.dem.ElastMat` → :obj:`~woo.dem.FrictMat` → :obj:`~woo.dem.IceMat` .. autoclass:: IceMat :members: :exclude-members: breakN, alpha, beta, mu, __init__, __getstate__, __setstate__ :special-members: .. attribute:: breakN (= 0.0001) Normal strain where cohesion stress is reached. [type: Real] .. attribute:: alpha (= Vector2(1,1)) Factors :math:`(\alpha_w, \alpha_t)` to compute twisting/rolling stiffnesses from :math:`k_n` and :math:`k_t`. [type: Vector2r] .. attribute:: beta (= Vector3(0.1,0.1,0.1)) Factors :math:`(\beta_t,\beta_w,\beta_r)` for computing cohesion from normal cohesion :math:`c_n` [type: Vector3r] .. attribute:: mu (= 0.05) Kinetic (rolling) friction coefficient. [type: Real] HertzMat '''''''' :obj:`~woo.core.Object` → :obj:`~woo.dem.Material` → :obj:`~woo.dem.ElastMat` → :obj:`~woo.dem.FrictMat` → :obj:`~woo.dem.HertzMat` .. autoclass:: HertzMat :members: :exclude-members: surfEnergy, alpha, __init__, __getstate__, __setstate__ :special-members: .. attribute:: surfEnergy (= 0.0) Surface energy parameter [J/m^2] per each unit contact surface, to derive adhesive (DMT, JKR, Schwarz) formulation from HM. If zero, adhesion is disabled. [type: Real] .. attribute:: alpha (= 0.0) Parameter interpolating between DMT and JKR extremes in the Schwarz model. :math:`alpha` was introduced in :cite:`Carpick1999` [type: Real] .. rst-class:: html-toggle .. rst-class:: emphasized MatState """""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.MatState` .. graphviz:: digraph MatState { rankdir=LR; margin=.2; "MatState" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.MatState"]; "InletMatState" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.MatState"]; "MatState" -> "InletMatState" [arrowsize=0.5,style="setlinewidth(0.5)"] "LudingMatState" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.MatState"]; "MatState" -> "LudingMatState" [arrowsize=0.5,style="setlinewidth(0.5)"] "ConcreteMatState" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.MatState"]; "MatState" -> "ConcreteMatState" [arrowsize=0.5,style="setlinewidth(0.5)"] "ClusterMatState" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.MatState"]; "MatState" -> "ClusterMatState" [arrowsize=0.5,style="setlinewidth(0.5)"] "PelletMatState" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.MatState"]; "MatState" -> "PelletMatState" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: MatState :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: LudingMatState %%%%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.dem.MatState` → :obj:`~woo.dem.LudingMatState` .. autoclass:: LudingMatState :members: :exclude-members: total, visco, plast, __init__, __getstate__, __setstate__ :special-members: .. attribute:: total (= 0.0) Total dissipated energy (sum of the terms below) [type: Real] .. attribute:: visco (= 0.0) Energy dissipated by viscous effects. [type: Real] .. attribute:: plast (= 0.0) Energy dissipated by plastic effects. [type: Real] PelletMatState %%%%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.dem.MatState` → :obj:`~woo.dem.PelletMatState` .. autoclass:: PelletMatState :members: :exclude-members: normPlast, shearPlast, agglomRate, stepAgglomUpdated, cumAgglomMass, cumAgglomAngle, __init__, __getstate__, __setstate__ :special-members: .. attribute:: normPlast (= 0.0) Plastic energy dissipated in the normal sense [type: Real] .. attribute:: shearPlast (= 0.0) Plastic energy dissipated in the tangential sense [type: Real] .. attribute:: agglomRate (= nan) Agglomeration speed [type: Real] .. attribute:: stepAgglomUpdated (= -1) Step in which the agglomeration speed was updated for the last time. [type: long] .. attribute:: cumAgglomMass (= 0.0) Cumulative mass agglomerated by this particle. [type: Real] .. attribute:: cumAgglomAngle (= 0.0) Cumulative length of rolling when agglomeration was active. [type: Real] InletMatState %%%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.dem.MatState` → :obj:`~woo.dem.InletMatState` .. autoclass:: InletMatState :members: :exclude-members: timeNew, __init__, __getstate__, __setstate__ :special-members: .. attribute:: timeNew (= -1.0) Step at which this particle was created by the inlet. [type: Real] ClusterMatState %%%%%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.dem.MatState` → :obj:`~woo.dem.ClusterMatState` .. autoclass:: ClusterMatState :members: :exclude-members: labels, __init__, __getstate__, __setstate__ :special-members: .. attribute:: labels (= []) Cluster label for 0,1,2,... connectivity. [type: vector] ConcreteMatState %%%%%%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.dem.MatState` → :obj:`~woo.dem.ConcreteMatState` .. autoclass:: ConcreteMatState :members: :exclude-members: numBrokenCohesive, __init__, __getstate__, __setstate__ :special-members: .. attribute:: numBrokenCohesive (= 0) Number of (cohesive) contacts that damaged completely [type: int] .. rst-class:: html-toggle .. rst-class:: emphasized Inlets & Outlets ---------------- TODO .. rst-class:: html-toggle .. rst-class:: emphasized Inlet +++++ :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.PeriodicEngine` → :obj:`~woo.dem.Inlet` .. graphviz:: digraph Inlet { rankdir=LR; margin=.2; "Inlet" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Inlet"]; "BoxInlet" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Inlet"]; "RandomInlet" -> "BoxInlet" [arrowsize=0.5,style="setlinewidth(0.5)"] "BoxInlet2d" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Inlet"]; "BoxInlet" -> "BoxInlet2d" [arrowsize=0.5,style="setlinewidth(0.5)"] "CylinderInlet" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Inlet"]; "RandomInlet" -> "CylinderInlet" [arrowsize=0.5,style="setlinewidth(0.5)"] "ConveyorInlet" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Inlet"]; "Inlet" -> "ConveyorInlet" [arrowsize=0.5,style="setlinewidth(0.5)"] "RandomInlet" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Inlet"]; "Inlet" -> "RandomInlet" [arrowsize=0.5,style="setlinewidth(0.5)"] "ArcInlet" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Inlet"]; "RandomInlet" -> "ArcInlet" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: Inlet :members: :exclude-members: mask, maxMass, maxNum, doneHook, mass, num, currRate, zeroRateAtStop, currRateSmooth, glColor, __init__, __getstate__, __setstate__ :special-members: .. attribute:: mask (= 5) :obj:`~woo.dem.Particle.mask` for new particles. [type: int] .. attribute:: maxMass (= -1.0) Mass at which the engine will not produce any particles (inactive if not positive) [type: Real, unit: kg] .. attribute:: maxNum (= -1) Number of generated particles after which no more will be produced (inactive if not positive) [type: long] .. attribute:: doneHook (= '') Python string to be evaluated when :obj:`maxMass` or :obj:`maxNum` have been reached (or with :obj:`RandomInlet`, :obj:`maxAttempts` were exhausted and :obj:`RandomInlet.atMaxAttempts` equals ``'done'``). The engine is made dead automatically even if doneHook is not specified. [type: string] .. attribute:: mass (= 0.0) Generated mass total [type: Real, unit: kg] .. attribute:: num (= 0) Number of generated particles [type: long] .. attribute:: currRate (= nan) Current value of mass flow rate [type: Real, unit: kg/s, read-only in python] .. attribute:: zeroRateAtStop (= True) When the generator stops (mass/number of particles reached, ...), set :obj:`currRate` to zero immediately [type: bool] .. attribute:: currRateSmooth (= 1.0) Smoothing factor for currRate ∈〈0,1〉 [type: Real, range: 0−1] .. attribute:: glColor (= 0.0) Color for rendering (nan disables rendering) [type: Real, not shown in the UI] .. rst-class:: html-toggle .. rst-class:: emphasized RandomInlet +++++++++++ :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.PeriodicEngine` → :obj:`~woo.dem.Inlet` → :obj:`~woo.dem.RandomInlet` .. graphviz:: digraph RandomInlet { rankdir=LR; margin=.2; "RandomInlet" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.RandomInlet"]; "ArcInlet" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.RandomInlet"]; "RandomInlet" -> "ArcInlet" [arrowsize=0.5,style="setlinewidth(0.5)"] "BoxInlet" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.RandomInlet"]; "RandomInlet" -> "BoxInlet" [arrowsize=0.5,style="setlinewidth(0.5)"] "BoxInlet2d" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.RandomInlet"]; "BoxInlet" -> "BoxInlet2d" [arrowsize=0.5,style="setlinewidth(0.5)"] "CylinderInlet" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.RandomInlet"]; "RandomInlet" -> "CylinderInlet" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: RandomInlet :members: :exclude-members: massRate, materials, matStates, generator, shooter, spatialBias, maxAttempts, attemptPar, atMaxAttempts, padDist, kinEnergyIx, color, stepGoalMass, collideExisting, __init__, __getstate__, __setstate__ :special-members: .. attribute:: massRate (= nan) Mass flow rate; if non-positive, keep generating and placing new particles until :obj:`maxAttempts` is exhausted and :obj:`atMaxAttempts` is used to decide what to do next. [type: Real, unit: kg/s] .. attribute:: materials (= []) Set of materials for new particles, randomly picked from [type: vector>] .. attribute:: matStates (= []) Set of material states; when material is picked from :obj:`materials`, :obj:`MatState` at the same index is assigned to the particle; if it is ``None`` or :obj:`matStates` is shorter than requested index, no material state will be assigned. [type: vector>] .. attribute:: generator (= None) Particle generator instance [type: shared_ptr<:obj:`ParticleGenerator `>] .. attribute:: shooter (= None) Particle shooter instance (assigns velocities to generated particles. If not given, particles have zero velocities initially. [type: shared_ptr<:obj:`ParticleShooter `>] .. attribute:: spatialBias (= None) Make random position biased based on the radius of the current particle; if unset, distribute uniformly. [type: shared_ptr<:obj:`SpatialBias `>] .. attribute:: maxAttempts (= 5000) Maximum attempts to position new particles randomly, without collision. If 0, no limit is imposed. When reached, :obj:`atMaxAttempts` determines, what will be done. Each particle is tried maxAttempts/maxMetaAttempts times, then a new particle is tried. [type: int] .. attribute:: attemptPar (= 5) Number of trying a different particle to position (each will be tried maxAttempts/attemptPar times) [type: int] .. attribute:: atMaxAttempts (= 0) What to do when maxAttempts is reached. [type: int, named enum, possible values are: **'error'** (0), **'dead'** (1), **'warn'** (2), **'silent'** (*'nothing'*, *'ignore'*, *''*; 3), **'doneHook'** (*'done'*; 4)] .. attribute:: padDist (= 0.0) Pad geometry by this distance inside; random points will be chosen inside the shrunk geometry, whereas boxes will be validated in the larger one. This attribute must be set by the generator. [type: Real, read-only in python] .. attribute:: kinEnergyIx (= -1) Index for kinetic energy in scene.energy [type: int, not saved, not accessible from python] .. attribute:: color (= nan) Color for new particles (NaN for random; negative for keeping color assigned by the generator). [type: Real] .. attribute:: stepGoalMass (= 0.0) Mass to be attained in this step [type: Real, read-only in python] .. attribute:: collideExisting (= True) Consider collisions with pre-existing particle; this is generally a good idea, though if e.g. there are no pre-existing particles, it is useful to set to ``False`` to avoid having to define collider for no other reason than make :obj:`RandomInlet` happy. [type: bool] .. rst-class:: html-toggle .. rst-class:: emphasized ArcInlet """""""" :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.PeriodicEngine` → :obj:`~woo.dem.Inlet` → :obj:`~woo.dem.RandomInlet` → :obj:`~woo.dem.ArcInlet` .. autoclass:: ArcInlet :members: :exclude-members: node, cylBox, glSlices, __init__, __getstate__, __setstate__ :special-members: .. attribute:: node (= ) Node defining local coordinate system. *Must* be given. [type: shared_ptr<:obj:`Node `>] .. attribute:: cylBox (= AlignedBox3((1.7976931348623157e308,1.7976931348623157e308,1.7976931348623157e308), (-1.7976931348623157e308,-1.7976931348623157e308,-1.7976931348623157e308))) Box in cylindrical coordinates, as: (ρ₀,φ₀,z₀),(ρ₁,φ₁,z₁). ρ must be non-negative, (φ₁-φ₀)≤2π. [type: AlignedBox3r] .. attribute:: glSlices (= 32) Number of slices for rendering circle (the arc takes the proportionate value [type: int] .. rst-class:: html-toggle .. rst-class:: emphasized CylinderInlet """"""""""""" :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.PeriodicEngine` → :obj:`~woo.dem.Inlet` → :obj:`~woo.dem.RandomInlet` → :obj:`~woo.dem.CylinderInlet` .. autoclass:: CylinderInlet :members: :exclude-members: node, height, radius, glSlices, __init__, __getstate__, __setstate__ :special-members: .. attribute:: node (= None) Node defining local coordinate system. If not given, global coordinates are used. [type: shared_ptr<:obj:`Node `>] .. attribute:: height (= nan) Height along the local :math:`x`-axis. [type: Real, unit: m] .. attribute:: radius (= nan) Radius of the cylinder (perpendicular to the local :math:`x`-axis). [type: Real, unit: m] .. attribute:: glSlices (= 16) Number of subdivision slices for rendering. [type: int] .. rst-class:: html-toggle .. rst-class:: emphasized BoxInlet """""""" :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.PeriodicEngine` → :obj:`~woo.dem.Inlet` → :obj:`~woo.dem.RandomInlet` → :obj:`~woo.dem.BoxInlet` .. graphviz:: digraph BoxInlet { rankdir=LR; margin=.2; "BoxInlet" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.BoxInlet"]; "BoxInlet2d" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.BoxInlet"]; "BoxInlet" -> "BoxInlet2d" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: BoxInlet :members: :exclude-members: box, node, __init__, __getstate__, __setstate__ :special-members: .. attribute:: box (= AlignedBox3((nan,nan,nan), (nan,nan,nan))) Box volume specification (lower and upper corners) [type: AlignedBox3r] .. attribute:: node (= ) Node defining local coordinate system (optional; if not given, global coordinates are used). [type: shared_ptr<:obj:`Node `>] BoxInlet2d %%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.PeriodicEngine` → :obj:`~woo.dem.Inlet` → :obj:`~woo.dem.RandomInlet` → :obj:`~woo.dem.BoxInlet` → :obj:`~woo.dem.BoxInlet2d` .. autoclass:: BoxInlet2d :members: :exclude-members: axis, __init__, __getstate__, __setstate__ :special-members: .. attribute:: axis (= 2) Axis normal to the plane in which particles are generated. [type: short] .. rst-class:: html-toggle .. rst-class:: emphasized ConveyorInlet +++++++++++++ :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.PeriodicEngine` → :obj:`~woo.dem.Inlet` → :obj:`~woo.dem.ConveyorInlet` .. autoclass:: ConveyorInlet :members: :exclude-members: material, spherePack, shapePack, zTrim, zTrimHt, cellLen, radii, centers, clumps, massRate, vel, packVel, relLatVel, clipX, clipZ, clipLastX, clipPos, startLen, barrierColor, color, barrierLayer, movingBedZ, movingBedColor, save, matState, nextIx, lastX, barrier, node, streamBeginNode, barrierImpose, xDebt, initSortLimit, avgRate, kinEnergyIx, genDiamMassTime, __init__, __getstate__, __setstate__ :special-members: .. rubric:: ► Particles .. attribute:: material (= None) Material for new particles [type: shared_ptr<:obj:`Material `>] .. attribute:: spherePack (= None) :obj:`woo.pack.SpherePack` object; when specified, :obj:`centers`, :obj:`radii` (and :obj:`clumps`, if clumps are contained) are discarded and will be computed from this :obj:`SpherePack`. The attribute is reset afterwards. [type: shared_ptr, not shown in the UI, not saved] .. attribute:: shapePack (= None) Purely geomerical description of particles to be generated (will replace :obj:`spherePack`, :obj:`centers`, :obj:`radii`, :obj:`clumps` and :obj:`cellLen` in the future). [type: shared_ptr<:obj:`ShapePack `>, not dumped] .. attribute:: zTrim (= False) Trim packing from above so that the ratio of :obj:`vel` / :obj:`packVel` is as small as possible. Spheres/clumps will be discarded from above and this flag will be set to false once trimming is done (it will not be called again explicitly even if :obj:`massRate` or :obj:`vel` change. [type: bool, not shown in the UI] .. attribute:: zTrimHt (= nan) Height at which the packing was trimmed if :obj:`zTrim` was set. [type: Real, not shown in the UI] .. attribute:: cellLen (= nan) Length of the band cell, which is repeated periodically (if :obj:`spherePack` is given and is periodic, this value is deduced) [type: Real, unit: m] .. attribute:: radii (= []) Radii for the packing (if :obj:`spherePack` is given, radii are computed) [type: vector, not shown in the UI, not dumped] .. attribute:: centers (= []) Centers of spheres/clumps in the packing (if :obj:`spherePack` is given, centers are computed) [type: vector, not shown in the UI, not dumped] .. attribute:: clumps (= []) Clump geometry, corresponding to each :obj:`radii` and :obj:`centers`. (if :obj:`spherePack` is given, clumps are computed) [type: vector>, not shown in the UI, not dumped] .. attribute:: massRate (= nan) Average mass flow rate; if given, :obj:`vel` is adjusted (if both are given, :obj:`massRate` takes precedence). [type: Real, unit: kg/s] .. attribute:: vel (= nan) Velocity of particles; if specified, :obj:`massRate` is adjusted (of both are given, such as in constructor, :obj:`massRate` has precedence and a warning is issued if the two don't match) [type: Real, unit: m/s] .. attribute:: packVel (= nan) Velocity by which the packing is traversed and new particles emmited; always smaller than or equal to :obj:`vel`. Computed automatically. [type: Real, unit: m/s, read-only in python] .. attribute:: relLatVel (= 0.0) Relative velocity components lateral to :obj:`vel` (local x-axis); both components are assigned with uniform probability from range `(-relLatVel*vel,+relLatVel*vel)`, at the moment the particle leaves the barrier layer. [type: Real] .. rubric:: ► Clipping .. attribute:: clipX (= []) If given, clip the given packing from above by the given function \ :math:`z_max(x)`\ given as piecewise-linear function in same-length arrays :obj:`clipX` and :obj:`clipZ`. If :obj:`clipX` is empty, no clipping is done. [type: vector, unit: m] .. attribute:: clipZ (= []) Z-coordinate (max sphere \ :math:`z`\ coordinate), with points corresponding to :obj:`clipX`. [type: vector, unit: m] .. attribute:: clipLastX (= 0.0) X-coordinate of last-generated particles, for use with clipping (clipping may have different periodicity than the packing, this value can be different from :obj:`lastX` and wraps around :obj:`cellLen`. [type: Real, read-only in python] .. attribute:: clipPos (= 0) Internal variable for optimizing interpolation in :obj:`clipX` and :obj:`clipZ`. [type: size_t, not shown in the UI, read-only in python] .. rubric:: ► Tunables .. attribute:: startLen (= nan) Band to be created at the very start; if NaN, only the usual starting amount is created (depending on feed velocity) [type: Real] .. attribute:: barrierColor (= 0.2) Color for barrier particles (NaN for random) [type: Real] .. attribute:: color (= nan) Color for non-barrier particles (NaN for random) [type: Real] .. attribute:: barrierLayer (= -3.0) Some length of the last part of new particles has all DoFs blocked, so that when new particles are created, there are no sudden contacts in the band; in the next step, DoFs in this layer are unblocked. If *barrierLayer* is negative, it is relative to the maximum radius in the given packing, and is automatically set to the correct value at the first run [type: Real] .. attribute:: movingBedZ (= nan) If given, particles with z coordinate lower than this value will move indefinitely with the conveyor (contact velocity, blocked DOFs), technically not added to the barrier at all. [type: Real] .. attribute:: movingBedColor (= 0.5) Color for particles selected with :obj:`movingBedZ` (NaN for random). [type: Real] .. attribute:: save (= True) Save generated particles so that PSD can be generated afterwards [type: bool] .. attribute:: matState (= False) Endow new particles with :obj:`InletMatState` (for tracking when a particular particle was created and similar. [type: bool] .. rubric:: ► Bookkeeping .. attribute:: nextIx (= -1) Index of last-generated particles in the packing [type: int, read-only in python] .. attribute:: lastX (= 0.0) X-coordinate of last-generated particles in the packing [type: Real, read-only in python] .. attribute:: barrier (= []) Nodes which make up the barrier and will be unblocked once they leave barrierLayer. [type: list>, not accessible from python] .. attribute:: node (= ) Position and orientation of the factory; local x-axis is the feed direction. [type: shared_ptr<:obj:`Node `>] .. attribute:: streamBeginNode (= None) Node at which the particle stream will start, which can be moving during the simulation without disrupting stream continuity. It is the position of this node, projected onto :math:`x`-axis of :obj:`node`, which is relevant. [type: shared_ptr<:obj:`Node `>] .. attribute:: barrierImpose (= None) Imposition which is used for barrier nodes, as long as they are in the barrier. [type: shared_ptr<:obj:`Impose `>] .. attribute:: xDebt (= 0.0) Length of packing which was not covered in the last step due to :obj:`streamBeginNode` offset. [type: Real, not shown in the UI, read-only in python] .. attribute:: initSortLimit (= 200) Limit of number of particles generated in a single step above which :obj:`woo.dem.InsertionSortCollider.forceInitSort` will be set (only useful if :obj:`InsertionSortCollider` is actually used). [type: int] .. attribute:: avgRate (= nan) Average feed rate (computed from :obj:`Material density `, packing and and :obj:`vel` [type: Real, unit: kg/s, read-only in python] .. attribute:: kinEnergyIx (= -1) Index for kinetic energy in scene.energy [type: int, not saved, not accessible from python] .. attribute:: genDiamMassTime (= []) List of generated diameters, masses and times (for making granulometry) [type: vector, not shown in the UI, not dumped, read-only in python] .. rst-class:: html-toggle .. rst-class:: emphasized ParticleGenerator +++++++++++++++++ :obj:`~woo.core.Object` → :obj:`~woo.dem.ParticleGenerator` .. graphviz:: digraph ParticleGenerator { rankdir=LR; margin=.2; "ParticleGenerator" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.ParticleGenerator"]; "PharmaCapsuleGenerator" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.ParticleGenerator"]; "ParticleGenerator" -> "PharmaCapsuleGenerator" [arrowsize=0.5,style="setlinewidth(0.5)"] "MinMaxSphereGenerator" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.ParticleGenerator"]; "ParticleGenerator" -> "MinMaxSphereGenerator" [arrowsize=0.5,style="setlinewidth(0.5)"] "PsdClumpGenerator" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.ParticleGenerator"]; "PsdSphereGenerator" -> "PsdClumpGenerator" [arrowsize=0.5,style="setlinewidth(0.5)"] "PsdCapsuleGenerator" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.ParticleGenerator"]; "PsdSphereGenerator" -> "PsdCapsuleGenerator" [arrowsize=0.5,style="setlinewidth(0.5)"] "PsdSphereGenerator" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.ParticleGenerator"]; "ParticleGenerator" -> "PsdSphereGenerator" [arrowsize=0.5,style="setlinewidth(0.5)"] "PsdEllipsoidGenerator" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.ParticleGenerator"]; "PsdSphereGenerator" -> "PsdEllipsoidGenerator" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: ParticleGenerator :members: :exclude-members: genDiamMassTime, save, __init__, __getstate__, __setstate__ :special-members: .. attribute:: genDiamMassTime (= []) List of generated particle's (equivalent) radii and masses (for making granulometry) [type: vector, not shown in the UI, not dumped, read-only in python] .. attribute:: save (= True) Save generated particles so that PSD can be generated afterwards [type: bool] .. rst-class:: html-toggle .. rst-class:: emphasized PharmaCapsuleGenerator """""""""""""""""""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.ParticleGenerator` → :obj:`~woo.dem.PharmaCapsuleGenerator` .. autoclass:: PharmaCapsuleGenerator :members: :exclude-members: len, capLen, extDiam, colors, cutCorr, __init__, __getstate__, __setstate__ :special-members: .. attribute:: len (= 0.0194) Total (locked) length of the capsule. [type: Real] .. attribute:: capLen (= 0.00978) Cut length of the cap. [type: Real] .. attribute:: extDiam (= Vector2(0.00691,0.00663)) External diameter of the cap and the body. [type: Vector2r] .. attribute:: colors (= Vector2(0.5,0.99)) Color of body and cap; white and red with the default (coolwarm) colormap. [type: Vector2r] .. attribute:: cutCorr (= 0.5) Make the cap shorter by this amount relative to the area of outer cap over the inner cap; this is to compensate for the approximation that the cap is not cut sharply. [type: Real] .. rst-class:: html-toggle .. rst-class:: emphasized MinMaxSphereGenerator """"""""""""""""""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.ParticleGenerator` → :obj:`~woo.dem.MinMaxSphereGenerator` .. autoclass:: MinMaxSphereGenerator :members: :exclude-members: dRange, __init__, __getstate__, __setstate__ :special-members: .. attribute:: dRange (= Vector2(nan,nan)) Minimum and maximum diameters of generated spheres. [type: Vector2r] .. rst-class:: html-toggle .. rst-class:: emphasized PsdSphereGenerator """""""""""""""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.ParticleGenerator` → :obj:`~woo.dem.PsdSphereGenerator` .. graphviz:: digraph PsdSphereGenerator { rankdir=LR; margin=.2; "PsdSphereGenerator" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.PsdSphereGenerator"]; "PsdEllipsoidGenerator" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.PsdSphereGenerator"]; "PsdSphereGenerator" -> "PsdEllipsoidGenerator" [arrowsize=0.5,style="setlinewidth(0.5)"] "PsdClumpGenerator" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.PsdSphereGenerator"]; "PsdSphereGenerator" -> "PsdClumpGenerator" [arrowsize=0.5,style="setlinewidth(0.5)"] "PsdCapsuleGenerator" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.PsdSphereGenerator"]; "PsdSphereGenerator" -> "PsdCapsuleGenerator" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: PsdSphereGenerator :members: :exclude-members: discrete, psdPts, mass, weightPerBin, weightTotal, __init__, __getstate__, __setstate__ :special-members: .. attribute:: discrete (= False) The points on the PSD curve will be interpreted as the only allowed diameter values; if *false*, linear interpolation between them is assumed instead. Do not change once the generator is running. [type: bool] .. attribute:: psdPts (= []) Points of the PSD curve; the first component is particle diameter [m] (not radius!), the second component is passing percentage. Both diameter and passing values must be increasing (diameters must be strictly increasing). Passing values are normalized so that the last value is 1.0 (therefore, you can enter the values in percents if you like). [type: vector, units: [m,-]] .. attribute:: mass (= True) PSD has mass percentages; if false, number of particles percentages are assumed. Do not change once the generator is running. [type: bool] .. attribute:: weightPerBin (= []) Keep track of mass/number of particles for each point on the PSD so that we get as close to the curve as possible. Only used for discrete PSD. [type: vector, not shown in the UI, not dumped, read-only in python] .. attribute:: weightTotal (= 0.0) Total mass (number, with *discrete*) of of particles generated. [type: Real, not shown in the UI, not dumped, read-only in python] PsdEllipsoidGenerator %%%%%%%%%%%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.dem.ParticleGenerator` → :obj:`~woo.dem.PsdSphereGenerator` → :obj:`~woo.dem.PsdEllipsoidGenerator` .. autoclass:: PsdEllipsoidGenerator :members: :exclude-members: axisRatio2, axisRatio3, __init__, __getstate__, __setstate__ :special-members: .. attribute:: axisRatio2 (= Vector2(0.5,0.5)) Range for second semi-axis ratio. [type: Vector2r] .. attribute:: axisRatio3 (= Vector2(0.5,0.5)) Range for third semi-axis ratio; if one of the coefficients is non-positive, the thirs semi-axis will be the same as the second one. [type: Vector2r] PsdCapsuleGenerator %%%%%%%%%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.dem.ParticleGenerator` → :obj:`~woo.dem.PsdSphereGenerator` → :obj:`~woo.dem.PsdCapsuleGenerator` .. autoclass:: PsdCapsuleGenerator :members: :exclude-members: shaftRadiusRatio, __init__, __getstate__, __setstate__ :special-members: .. attribute:: shaftRadiusRatio (= Vector2(0.5,1.5)) Range for :obj:`shaft ` / :obj:`radius `; the ratio is selected uniformly from this range. [type: Vector2r] PsdClumpGenerator %%%%%%%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.dem.ParticleGenerator` → :obj:`~woo.dem.PsdSphereGenerator` → :obj:`~woo.dem.PsdClumpGenerator` .. autoclass:: PsdClumpGenerator :members: :exclude-members: clumps, scaleMethod, genClumpNo, oris, oriFuzz, __init__, __getstate__, __setstate__ :special-members: .. attribute:: clumps (= []) Sequence of clump geometry definitions (:obj:`SphereClumpGeom`); for every selected radius from the PSD, clump will be chosen based on the :obj:`SphereClumpGeom.scaleProb` function and scaled to that radius. [type: vector>] .. attribute:: scaleMethod (= 0) Method to compute clump scaling. The default uses the equivalent radius to determine scaling to fulfill prescribed PSD. Other methods are to scale according to the radius of the first sphere in the clump, or according to the average sphere radius in the clump. [type: int, named enum, possible values are: **'equiv'** (*'equivRad'*; 0), **'firstSphere'** (1), **'avgSphere'** (2)] .. attribute:: genClumpNo (= []) If :obj:`save` is set, keeps clump numbers (indices in :obj:`clumps` for each generated clump. [type: vector, not shown in the UI, read-only in python] .. attribute:: oris (= []) Base orientations for clumps, in the same order as :obj:`clumps`. If the sequence is shorter than selected clump configuration, its orientation will be completely random. [type: vector] .. attribute:: oriFuzz (= []) Fuzz (in radians) for orientation, if set based on :obj:`oris`; if :obj:`oriFuzz` is shorter than clump configuration in question, the base orientation (:obj:`oriFuzz`) is used as-is. Random orientation axis is picked first, then rotation angle is taken from ``〈-oriFuzz[i],+oriFuzz[i]〉`` with uniform probability. Note: this simple algorithm does not generate completely homogeneous probability density in the rotation space. [type: vector] .. rst-class:: html-toggle .. rst-class:: emphasized SpatialBias +++++++++++ :obj:`~woo.core.Object` → :obj:`~woo.dem.SpatialBias` .. graphviz:: digraph SpatialBias { rankdir=LR; margin=.2; "SpatialBias" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.SpatialBias"]; "NonuniformAxisPlacementBias" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.SpatialBias"]; "SpatialBias" -> "NonuniformAxisPlacementBias" [arrowsize=0.5,style="setlinewidth(0.5)"] "AxialBias" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.SpatialBias"]; "SpatialBias" -> "AxialBias" [arrowsize=0.5,style="setlinewidth(0.5)"] "LayeredAxialBias" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.SpatialBias"]; "AxialBias" -> "LayeredAxialBias" [arrowsize=0.5,style="setlinewidth(0.5)"] "PsdAxialBias" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.SpatialBias"]; "AxialBias" -> "PsdAxialBias" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: SpatialBias :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: .. rst-class:: html-toggle .. rst-class:: emphasized AxialBias """"""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.SpatialBias` → :obj:`~woo.dem.AxialBias` .. graphviz:: digraph AxialBias { rankdir=LR; margin=.2; "AxialBias" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.AxialBias"]; "PsdAxialBias" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.AxialBias"]; "AxialBias" -> "PsdAxialBias" [arrowsize=0.5,style="setlinewidth(0.5)"] "LayeredAxialBias" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.AxialBias"]; "AxialBias" -> "LayeredAxialBias" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: AxialBias :members: :exclude-members: axis, d01, fuzz, phase, __init__, __getstate__, __setstate__ :special-members: .. attribute:: axis (= 0) Axis which is biased. [type: int] .. attribute:: d01 (= Vector2(nan,nan)) Diameter at the lower and upper end (the order matters); it is possible that :math:`r_0>r_1`, in which case the bias is reversed (bigger radii have smaller coordinate). [type: Vector2r] .. attribute:: fuzz (= 0.0) Allow for random variations around the position determined from diameter. [type: Real] .. attribute:: phase (= nan) If NaN, coordinate after fuzz will be clamped to 0…1. If a number, it will be added to the coordinate after fuzz (zero is allowed) and the value will be modulated to 0…1 (rather than clamped), overflowing between beginning and end. [type: float] PsdAxialBias %%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.dem.SpatialBias` → :obj:`~woo.dem.AxialBias` → :obj:`~woo.dem.PsdAxialBias` .. autoclass:: PsdAxialBias :members: :exclude-members: psdPts, invert, discrete, reorder, __init__, __getstate__, __setstate__ :special-members: .. attribute:: psdPts (= []) Points of the mapping function, similar to :obj:`PsdParticleGenerator.psdPts`. [type: vector] .. attribute:: invert (= False) Reverse the ordering along the axis, which makes the bigger particles be close to zero. [type: bool] .. attribute:: discrete (= False) Interpret :obj:`psdPts` as piecewise-constant (rather than piecewise-linear) function. Each diameter will be distributed uniformly in the whole interval between percentage of the current and previous points. [type: bool] .. attribute:: reorder (= []) Reorder the PSD fractions; this is mainly useful for discrete distributions, where the order can be non-increasing, such as with ``reorder=[1,0,2]`` which will put the finest fraction in the middle of the other two [type: vector] LayeredAxialBias %%%%%%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.dem.SpatialBias` → :obj:`~woo.dem.AxialBias` → :obj:`~woo.dem.LayeredAxialBias` .. autoclass:: LayeredAxialBias :members: :exclude-members: layerSpec, xRangeSum, __init__, __getstate__, __setstate__ :special-members: .. attribute:: layerSpec (= []) Vector specifying layering; each item contains the following numbers: ``dMin, dMax, xMin0, xMax0, xMin1, xMax1, ...``. A particle which falls within ``dMin, dMax`` will be placed, with uniform probability, into intervals specified by other couples. Coordinates are given in normalized space, so ``xMin..xMax`` must lie in in 〈0,1〉. Particles which do not fall into any fraction will not be biased (thus placed uniformly randomly), and a warning will be issued. [type: vector] .. attribute:: xRangeSum (= []) Sum of ``xMax_i-xMin_i`` for each fraction, for faster lookup. Internal/debugging use only. [type: vector, not shown in the UI, not dumped, not saved, read-only in python] .. rst-class:: html-toggle .. rst-class:: emphasized NonuniformAxisPlacementBias """"""""""""""""""""""""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.SpatialBias` → :obj:`~woo.dem.NonuniformAxisPlacementBias` .. autoclass:: NonuniformAxisPlacementBias :members: :exclude-members: axis, pdf, cdf, dx, __init__, __getstate__, __setstate__ :special-members: .. attribute:: axis (= 0) Biased axis. [type: int] .. attribute:: pdf (= []) Probability density function values, on uniform grid spanning the axis unit range. If given, integrated numerically (trapezoid integration) to obtain :obj:`cdf` (which is normalized). [type: vector] .. attribute:: cdf (= []) Cumulative distribution function, either given directly, or computed from :obj:`pdf`, on uniform grid on unit range. Automatically normalized so that it ends at unity. [type: vector] .. attribute:: dx (= nan) Precomputed value of step size. [type: Real, not shown in the UI, not dumped, read-only in python] .. rst-class:: html-toggle .. rst-class:: emphasized ParticleShooter +++++++++++++++ :obj:`~woo.core.Object` → :obj:`~woo.dem.ParticleShooter` .. graphviz:: digraph ParticleShooter { rankdir=LR; margin=.2; "ParticleShooter" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.ParticleShooter"]; "AlignedMinMaxShooter" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.ParticleShooter"]; "ParticleShooter" -> "AlignedMinMaxShooter" [arrowsize=0.5,style="setlinewidth(0.5)"] "ArcShooter" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.ParticleShooter"]; "ParticleShooter" -> "ArcShooter" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: ParticleShooter :members: :exclude-members: __init__, __getstate__, __setstate__ :special-members: .. rst-class:: html-toggle .. rst-class:: emphasized AlignedMinMaxShooter """""""""""""""""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.ParticleShooter` → :obj:`~woo.dem.AlignedMinMaxShooter` .. autoclass:: AlignedMinMaxShooter :members: :exclude-members: dir, vRange, __init__, __getstate__, __setstate__ :special-members: .. attribute:: dir (= Vector3(1,0,0)) Direction (will be normalized). [type: Vector3r] .. attribute:: vRange (= Vector2(nan,nan)) Minimum and maximum velocities. [type: Vector2r] .. rst-class:: html-toggle .. rst-class:: emphasized ArcShooter """""""""" :obj:`~woo.core.Object` → :obj:`~woo.dem.ParticleShooter` → :obj:`~woo.dem.ArcShooter` .. autoclass:: ArcShooter :members: :exclude-members: node, elevRange, azimRange, vRange, __init__, __getstate__, __setstate__ :special-members: .. attribute:: node (= ) Node defining local coordinate system. *Must* be given. [type: shared_ptr<:obj:`Node `>] .. attribute:: elevRange (= Vector2(0,0)) Range for elevation from the plane perpendicular to the local :math:`z`-axis (as defined by :obj:`node`). The actual value is chosen with uniform probability from this range. [type: Vector2r, unit: rad] .. attribute:: azimRange (= Vector2(0,0)) Range for azimuth angle, where zero is radial connecting particle position and local origin (:obj:`node`) and positive sense defined as rotation around the :obj:`node` :math:`z`-axis. [type: Vector2r, unit: rad] .. attribute:: vRange (= Vector2(nan,nan)) Range for velocity magnitude. [type: Vector2r, unit: m/s] .. rst-class:: html-toggle .. rst-class:: emphasized Outlet ++++++ :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.PeriodicEngine` → :obj:`~woo.dem.Outlet` .. graphviz:: digraph Outlet { rankdir=LR; margin=.2; "Outlet" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Outlet"]; "StackedBoxOutlet" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Outlet"]; "BoxOutlet" -> "StackedBoxOutlet" [arrowsize=0.5,style="setlinewidth(0.5)"] "BoxOutlet" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Outlet"]; "Outlet" -> "BoxOutlet" [arrowsize=0.5,style="setlinewidth(0.5)"] "ArcOutlet" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.Outlet"]; "Outlet" -> "ArcOutlet" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: Outlet :members: :exclude-members: markMask, mask, inside, save, recoverRadius, rDivR0, diamMassTime, locs, num, savePar, par, mass, glColor, glHideZero, currRate, currRateSmooth, kinEnergyIx, __init__, __getstate__, __setstate__ :special-members: .. attribute:: markMask (= 0) When non-zero, switch to marking mode -- particles of which :obj:`Particle.mask` does not comtain :obj:`markMask` (i.e. ``(mask&markMask)!=markMask``) have :obj:`markMask` bit-added to :obj:`Particle.mask` (this can happen only once for each particle); particles are not deleted, but their diameter/mass added to :obj:`diamMassTime` if :obj:`save` is True. [type: uint] .. attribute:: mask (= 4) If non-zero, only particles matching the mask will be candidates for removal [type: uint] .. attribute:: inside (= False) Delete particles which fall inside the volume rather than outside [type: bool] .. attribute:: save (= False) Save particle data which are deleted in the :obj:`diamMassTime` list [type: bool] .. attribute:: recoverRadius (= False) Recover radius of Spheres by computing it back from particle's mass and its material density (used when radius is changed due to radius thinning (in Law2_L6Geom_PelletPhys_Pellet.thinningFactor). When radius is recovered, the :math:`r/r_0` ratio is added to :obj:`rDivR0` for further processing. [type: bool] .. attribute:: rDivR0 (= []) List of the :math:`r/r_0` ratio of deleted particles, when :obj:`recoverRadius` is true. [type: vector, not shown in the UI, not dumped, read-only in python] .. attribute:: diamMassTime (= []) Radii and masses of deleted particles; not accessible from python (shadowed by the :obj:`diamMassTime` method). [type: vector, not accessible from python] .. attribute:: locs (= []) Integer location specified for particles; -1 by default, derived classes can use this for any purposes (usually more precise location within the outlet volume). [type: vector, not shown in the UI, not dumped, read-only in python] .. attribute:: num (= 0) Number of deleted particles [type: int, read-only in python] .. attribute:: savePar (= False) Save particles as objects in :obj:`par` [type: bool] .. attribute:: par (= _8ParticleList[]) Deleted :obj:`particles ` (only saved with :obj:`savePar`. [type: vector>, not shown in the UI, not dumped, read-only in python] .. attribute:: mass (= 0.0) Total mass of deleted particles [type: Real, read-only in python] .. attribute:: glColor (= 0.0) Color for rendering (NaN disables rendering) [type: Real] .. attribute:: glHideZero (= False) Show numbers (mass and rate) even if they are zero. [type: bool] .. attribute:: currRate (= nan) Current value of mass flow rate [type: Real, read-only in python] .. attribute:: currRateSmooth (= 1.0) Smoothing factor for currRate ∈〈0,1〉 [type: Real, range: 0−1] .. attribute:: kinEnergyIx (= -1) Index for kinetic energy in scene.energy [type: int, not saved, not accessible from python] .. rst-class:: html-toggle .. rst-class:: emphasized BoxOutlet """"""""" :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.PeriodicEngine` → :obj:`~woo.dem.Outlet` → :obj:`~woo.dem.BoxOutlet` .. graphviz:: digraph BoxOutlet { rankdir=LR; margin=.2; "BoxOutlet" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.BoxOutlet"]; "StackedBoxOutlet" [shape="box",fontsize=8,style="setlinewidth(0.5),solid",height=0.2,URL="woo.dem.html#woo.dem.BoxOutlet"]; "BoxOutlet" -> "StackedBoxOutlet" [arrowsize=0.5,style="setlinewidth(0.5)"] } .. autoclass:: BoxOutlet :members: :exclude-members: box, node, __init__, __getstate__, __setstate__ :special-members: .. attribute:: box (= AlignedBox3((1.7976931348623157e308,1.7976931348623157e308,1.7976931348623157e308), (-1.7976931348623157e308,-1.7976931348623157e308,-1.7976931348623157e308))) Box volume specification (lower and upper corners). If :obj:`node` is specified, the box is in local coordinates; otherwise, global coorinates are used. [type: AlignedBox3r] .. attribute:: node (= None) Node specifying local coordinates; if not given :obj:`box` is in global coords. [type: shared_ptr<:obj:`Node `>] StackedBoxOutlet %%%%%%%%%%%%%%%% :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.PeriodicEngine` → :obj:`~woo.dem.Outlet` → :obj:`~woo.dem.BoxOutlet` → :obj:`~woo.dem.StackedBoxOutlet` .. autoclass:: StackedBoxOutlet :members: :exclude-members: divs, divColors, axis, loc0, __init__, __getstate__, __setstate__ :special-members: .. attribute:: divs (= []) Coordinates of division between boxes in the stack; must be an increasing sequence. [type: vector] .. attribute:: divColors (= []) Colors for rendering the dividers; if not given, use darkened :obj:`~woo.dem.BoxOutlet.color`, same for all dividers. [type: vector] .. attribute:: axis (= 0) Axis along which the :obj:`box` is subdivided. [type: short] .. attribute:: loc0 (= 0) Index at which numbering of boxes starts. The first box is 0 by default, but it can be changed using this attribute, e.g. setting loc0=10 will make the first box 10, second 11 etc. [type: int] .. rst-class:: html-toggle .. rst-class:: emphasized ArcOutlet """"""""" :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.PeriodicEngine` → :obj:`~woo.dem.Outlet` → :obj:`~woo.dem.ArcOutlet` .. autoclass:: ArcOutlet :members: :exclude-members: node, cylBox, glSlices, __init__, __getstate__, __setstate__ :special-members: .. attribute:: node (= ) Node defining local coordinates system. *Must* be given. [type: shared_ptr<:obj:`Node `>] .. attribute:: cylBox (= AlignedBox3((1.7976931348623157e308,1.7976931348623157e308,1.7976931348623157e308), (-1.7976931348623157e308,-1.7976931348623157e308,-1.7976931348623157e308))) Box in cylindrical coordinates, as: (ρ₀,φ₀,z₀),(ρ₁,φ₁,z₁). ρ must be non-negative, (φ₁-φ₀)≤2π. [type: AlignedBox3r] .. attribute:: glSlices (= 32) Number of slices for rendering circle (the arc takes the proportionate value [type: int] .. rst-class:: html-toggle .. rst-class:: emphasized DetectSteadyState +++++++++++++++++ :obj:`~woo.core.Object` → :obj:`~woo.core.Engine` → :obj:`~woo.core.PeriodicEngine` → :obj:`~woo.dem.DetectSteadyState` .. autoclass:: DetectSteadyState :members: :exclude-members: waitInit, relFlow, waitTrans, waitSteady, hookFlow, hookTrans, hookSteady, hookDone, rateSmooth, stage, stageEntered, inlets, outlets, influx, efflux, __init__, __getstate__, __setstate__ :special-members: .. attribute:: waitInit (= 0.0) Time to wait in ``init`` stage, before moving to ``flow``. [type: Real, unit: s] .. attribute:: relFlow (= 1.0) Relative flow used for comparing influx and efflux in the ``flow`` stage. [type: Real, unit: s] .. attribute:: waitTrans (= 0.0) Time to wait in ``trans`` stage, before moving to ``steady``. [type: Real, unit: s] .. attribute:: waitSteady (= 0.0) Time to wait in the steady stage, before moving to ``done``. [type: Real, unit: s] .. attribute:: hookFlow (= '') Hook executed when the ``flow`` stage is entered. [type: string] .. attribute:: hookTrans (= '') Hook executed when the ``trans`` stage is entered. [type: string] .. attribute:: hookSteady (= '') Hook executed when the ``steady`` stage is entered. [type: string] .. attribute:: hookDone (= 'e.dead=True') Hook executed when the ``done`` stage is entered. [type: string] .. attribute:: rateSmooth (= 1.0) Smoothing factor for rates ∈〈0,1〉 [type: Real, range: 0−1] .. attribute:: stage (= 0) Stage in which we currently are. [type: int, read-only in python, named enum, possible values are: **'init'** (0), **'flow'** (1), **'trans'** (2), **'steady'** (3), **'done'** (4)] .. attribute:: stageEntered (= 0.0) Time when the current stage was entered. [type: Real, unit: s, read-only in python] .. attribute:: inlets (= []) Inlets of which rates are used to compute summary influx. [type: vector>] .. attribute:: outlets (= []) Inlets of which rates are used to compute summary efflux. [type: vector>] .. attribute:: influx (= nan) Smoothed summary influx value. [type: Real, read-only in python] .. attribute:: efflux (= nan) Smoothed summary efflux value. [type: Real, read-only in python] .. rst-class:: html-toggle .. rst-class:: emphasized DEM field --------- TODO .. rst-class:: html-toggle .. rst-class:: emphasized DemField ++++++++ :obj:`~woo.core.Object` → :obj:`~woo.core.Field` → :obj:`~woo.dem.DemField` .. autoclass:: DemField :members: :exclude-members: particles, contacts, loneMask, gravity, distFactor, saveDead, deadNodes, deadParticles, __init__, __getstate__, __setstate__ :special-members: .. attribute:: particles (= ) Particles (each particle holds its contacts, and references associated nodes) [type: shared_ptr<:obj:`ParticleContainer `>, read-only in python] .. attribute:: contacts (= ) Linear view on particle contacts [type: shared_ptr<:obj:`ContactContainer `>, read-only in python] .. attribute:: loneMask (= 2) Particle groups which have bits in loneMask in common (i.e. (A.mask & B.mask & loneMask)!=0) will not have contacts between themselves [type: uint] .. attribute:: gravity (= Vector3(0,0,0)) Constant gravity acceleration [type: Vector3r] .. attribute:: distFactor (= -1.0) Relative enlargement of bounding boxes, and of radii in contacts; only supported by a few functors (:obj:`Bo1_Sphere_Aabb`, :obj:`Cg2_Sphere_Sphere_L6Geom`), storing the value in :obj:`DemField` ensures the values are synchronized between all functors interested. Deactivated if negative; any negative value (``-1`` by default) is equivalent to ``1`` (no enlargement at all). [type: Real] .. attribute:: saveDead (= False) Save unused nodes of deleted particles, which would be otherwise removed (useful for displaying traces of deleted particles). [type: bool] .. attribute:: deadNodes (= NodeList[]) List of nodes belonging to deleted particles; only used if :obj:`saveDead` is ``True`` [type: vector>, not shown in the UI, read-only in python] .. attribute:: deadParticles (= _8ParticleList[]) Deleted particles; only used if :obj:`saveDead` is ``True`` [type: vector>, not shown in the UI, read-only in python] .. rst-class:: html-toggle .. rst-class:: emphasized ContactContainer ++++++++++++++++ :obj:`~woo.core.Object` → :obj:`~woo.dem.ContactContainer` .. autoclass:: ContactContainer :members: :exclude-members: linView, dirty, stepColliderLastRun, threadsPending, __init__, __getstate__, __setstate__ :special-members: .. attribute:: linView (= []) Linear storage of references; managed by accessor methods, do not modify directly! [type: ContainerT, not accessible from python] .. attribute:: dirty (= False) Flag for notifying the collider that persistent data should be invalidated [type: bool, not accessible from python] .. attribute:: stepColliderLastRun (= -1) Step number when a collider was last run; set by the collider, if it wants contacts that were not encoutered in that step to be deleted by ContactLoop (such as SpatialQuickSortCollider). Other colliders (such as InsertionSortCollider) set it it -1, which is the default. [type: int, read-only in python] .. attribute:: threadsPending (= [[], [], [], [], [], [], [], []]) Contacts which might be deleted by the collider in the next step (separate for each thread, for safe lock-free writes) [type: std::vector>, not accessible from python] .. rst-class:: html-toggle .. rst-class:: emphasized ParticleContainer +++++++++++++++++ :obj:`~woo.core.Object` → :obj:`~woo.dem.ParticleContainer` .. autoclass:: ParticleContainer :members: :exclude-members: parts, freeIds, __init__, __getstate__, __setstate__ :special-members: .. attribute:: parts (= _8ParticleList[]) Actual particle storage [type: ContainerT, not accessible from python] .. attribute:: freeIds (= []) Free particle id's [type: list, not accessible from python] .. rst-class:: html-toggle .. rst-class:: emphasized TraceVisRep ----------- :obj:`~woo.core.Object` → :obj:`~woo.core.NodeVisRep` → :obj:`~woo.dem.TraceVisRep` .. autoclass:: TraceVisRep :members: :exclude-members: pts, scalars, times, t0, tracer, writeIx, flags, __init__, __getstate__, __setstate__ :special-members: .. attribute:: pts (= []) History points [type: vector, not shown in the UI, read-only in python] .. attribute:: scalars (= []) History scalars [type: vector, not shown in the UI, read-only in python] .. attribute:: times (= []) History times (only saved with :obj:`Tracer.saveTime`). [type: vector, not shown in the UI, read-only in python] .. attribute:: t0 (= nan) Time the trace was created/reset, for plotting relative time; does not change with compression. [type: Real] .. attribute:: tracer (= None) :obj:`Tracer` which created (and is, presumably, managing) this object; it is necessary for getting rendering parameters, and is updated automatically. [type: shared_ptr<:obj:`Tracer `>, read-only in python] .. attribute:: writeIx (= 0) Index where next data will be written [type: size_t] .. attribute:: flags (= 0) Flags for this instance [type: short]