yade-dev team mailing list archive
-
yade-dev team
-
Mailing list archive
-
Message #06525
[Branch ~yade-dev/yade/trunk] Rev 2610: 1. Add docs for LawTester, and fix docs elsewhere as well.
------------------------------------------------------------
revno: 2610
committer: Václav Šmilauer <eu@xxxxxxxx>
branch nick: yade
timestamp: Sun 2010-12-12 14:55:12 +0100
message:
1. Add docs for LawTester, and fix docs elsewhere as well.
modified:
pkg/dem/DomainLimiter.cpp
pkg/dem/DomainLimiter.hpp
pkg/dem/L3Geom.hpp
py/_extraDocs.py
--
lp:yade
https://code.launchpad.net/~yade-dev/yade/trunk
Your team Yade developers is subscribed to branch lp:yade.
To unsubscribe from this branch go to https://code.launchpad.net/~yade-dev/yade/trunk/+edit-subscription
=== modified file 'pkg/dem/DomainLimiter.cpp'
--- pkg/dem/DomainLimiter.cpp 2010-12-10 14:52:22 +0000
+++ pkg/dem/DomainLimiter.cpp 2010-12-12 13:55:12 +0000
@@ -90,9 +90,10 @@
if(state2->blockedDOFs!=State::DOF_ALL) { LOG_INFO("Blocking all DOFs for #"<<id2); state2->blockedDOFs=State::DOF_ALL;}
- if(step>*(_pathT.rbegin())){
+ if(step-1>*(_pathT.rbegin())){
LOG_INFO("Last step done, setting zero velocities on #"<<id1<<", #"<<id2<<".");
state1->vel=state1->angVel=state2->vel=state2->angVel=Vector3r::Zero();
+ uTest=uTestNext;
if(doneHook.empty()){ LOG_INFO("No doneHook set, dying."); dead=true; }
else{ LOG_INFO("Running doneHook: "<<doneHook); pyRunString(doneHook);}
return;
@@ -166,7 +167,10 @@
// signed and weighted displacement/rotation to be applied on this sphere (reversed for #0)
// some rotations must cancel the sign, by multiplying by sign again
Vector3r ddU=sign*dU*weight;
- Vector3r ddPhi=sign*dPhi*(1-relRad); /* angles must distribute to both, otherwise it would induce shear; combination of shear and bending must make sure they are properly orthogonal! */
+
+ // twist can be still distributed with idWeight (!)
+ Vector3r ddPhi=sign*dPhi*(1-relRad); /* shear angles must distribute to both, otherwise it would induce shear */
+ ddPhi[0]=sign*dPhi[0]*idWeight; // twist can be still distributed with idWeight
vel[i]=angVel[i]=Vector3r::Zero();
// normal displacement
=== modified file 'pkg/dem/DomainLimiter.hpp'
--- pkg/dem/DomainLimiter.hpp 2010-12-10 10:13:47 +0000
+++ pkg/dem/DomainLimiter.hpp 2010-12-12 13:55:12 +0000
@@ -51,13 +51,13 @@
((Real,renderLength,0,,"Characteristic length for the purposes of rendering, set equal to the smaller radius."))
((Real,refLength,0,(Attr::readonly),"Reference contact length, for rendering only."))
((Vector3r,contPt,Vector3r::Zero(),Attr::hidden,"Contact point (for rendering only)"))
- ((Real,idWeight,1,,"Float ââ©0,1⪠determining on which particle are displacements applied (0 for id1, 1 for id2); intermediate values will apply respective part to each of them."))
+ ((Real,idWeight,1,,"Float, usually ââ©0,1âª, determining on how are displacements distributed between particles (0 for id1, 1 for id2); intermediate values will apply respective part to each of them. This parameter is ignored with 6-DoFs :yref:`IGeom`."))
((Real,rotWeight,1,,"Float ââ©0,1⪠determining whether shear displacement is applied as rotation or displacement on arc (0 is displacement-only, 1 is rotation-only). Not effective when mutual rotation is specified."))
// reset force components along individual axes, instead of blocking DOFs which have no specific direction (for the force control)
, /* deprec */ ((path,disPath,"LawTester.path will be used for generalized displacement (6-component) loading path in the future."))
, /* init */
, /* ctor */
- , /* py */ .add_property("ptOurs",&LawTester::get_ptOurs) .add_property("ptGeom",&LawTester::get_ptGeom) .add_property("rotOurs",&LawTester::get_rotOurs) .add_property("rotGeom",&LawTester::get_rotGeom)
+ , /* py */ .add_property("ptOurs",&LawTester::get_ptOurs,"first 3 components of uTest |ydeprecated|") .add_property("ptGeom",&LawTester::get_ptGeom,"first 3 components of uGeom |ydeprecated|") .add_property("rotOurs",&LawTester::get_rotOurs,"last 3 components of uTest |ydeprecated|") .add_property("rotGeom",&LawTester::get_rotGeom,"last 3 components of uGeom |ydeprecated|")
);
};
REGISTER_SERIALIZABLE(LawTester);
=== modified file 'pkg/dem/L3Geom.hpp'
--- pkg/dem/L3Geom.hpp 2010-12-11 23:01:30 +0000
+++ pkg/dem/L3Geom.hpp 2010-12-12 13:55:12 +0000
@@ -87,7 +87,7 @@
enum { APPROX_NO_RENORM_TRSF=1, APPROX_NO_MID_TRSF=2, APPROX_NO_MID_NORMAL=4, APPROX_NO_RENORM_MID_NORMAL=8 };
- YADE_CLASS_BASE_DOC_ATTRS(Ig2_Sphere_Sphere_L3Geom_Inc,IGeomFunctor,"Incrementally compute :yref:`L3Geom` for contact of 2 spheres.\n\n.. note:: The initial value of *u[0]* (normal displacement) might be non-zero, with or without *distFactor*, since it is given purely by sphere's geometry. If you want to set \"equilibrium distance\", do it in the contact law as explained in :yref:`L3Geom.u0`.",
+ YADE_CLASS_BASE_DOC_ATTRS(Ig2_Sphere_Sphere_L3Geom_Inc,IGeomFunctor,"Incrementally compute :yref:`L3Geom` for contact of 2 spheres. Detailed documentation in py/_extraDocs.py",
((bool,noRatch,true,,"See :yref:`ScGeom.avoidGranularRatcheting`."))
((Real,distFactor,1,,"Create interaction if spheres are not futher than distFactor*(r1+r2)."))
((int,approxMask,0,,"Selectively enable geometrical approximations (bitmask); add the values for approximations to be enabled.\n\n"
=== modified file 'py/_extraDocs.py'
--- py/_extraDocs.py 2010-12-11 23:01:30 +0000
+++ py/_extraDocs.py 2010-12-12 13:55:12 +0000
@@ -180,3 +180,35 @@
.. note: TODO: ``distFactor`` is not yet implemented as described above; some formulas mix values at different times, should be checked carefully.
'''
+
+wrapper.LawTester.__doc__='''Prescribe and apply deformations of an interaction in terms of local mutual displacements and rotations. The loading path is specified either using :yref:`path<LawTester.path>` (as sequence of 6-vectors containing generalized displacements $u_x$, $u_y$, $u_z$, $\phi_x$, $\phi_y$, $\phi_z$) or :yref:`disPath<LawTester.disPath>` ($u_x$, $u_y$, $u_z$) and :yref:`rotPath<LawTester.rotPath>` ($\phi_x$, $\phi_y$, $\phi_z$). Time function with time values (step numbers) corresponding to points on loading path is given by :yref:`pathSteps<LawTester.pathSteps>`. Loading values are linearly interpolated between given loading path points, and starting zero-value (the initial configuration) is assumed for both :yref:`path<LawTester.path>` and :yref:`pathSteps<LawTester.pathSteps>`. :yref:`hooks<LawTester.hooks>` can specify python code to run when respective point on the path is reached; when the path is finished, :yref:`doneHook<LawTester.doneHook>` will be run.
+
+
+LawTester should be placed between :yref:`InteractionLoop` and :yref:`NewtonIntegrator` in the simulation loop, since it controls motion via setting linear/angular velocities on particles; those velocities are integrated by :yref:`NewtonIntegrator` to yield an actual position change, which in turn causes :yref:`IGeom` to be updated (and :yref:`contact law<LawFunctor>` applied) when :yref:`InteractionLoop` is executed. Constitutive law generating forces on particles will not affect prescribed particle motion, since both particles have all :yref:`DoFs blocked<State.blockedDOFs>` when first used with LawTester.
+
+LawTester uses, as much as possible, :yref:`IGeom` to provide useful data (such as local coordinate system), but is able to compute those independently if absent in the respective :yref:`IGeom`:
+
+
+=================== ===== ==================================
+:yref:`IGeom` #DoFs LawTester support level
+=================== ===== ==================================
+:yref:`L3Geom` 3 full
+:yref:`L6Geom` 6 full
+:yref:`ScGeom` 3 emulate local coordinate system
+:yref:`ScGeom6D` 6 emulate local coordinate system
+:yref:`Dem3DofGeom` 3 *not supported*
+=================== ===== ==================================
+
+Depending on :yref:`IGeom`, 3 ($u_x$, $u_y$, $u_z$) or 6 ($u_x$, $u_y$, $u_z$, $\phi_x$, $\phi_y$, $\phi_z$) degrees of freedom (DoFs) are controlled with LawTester, by prescribing linear and angular velocities of both particles in contact. All DoFs controlled with LawTester are orthogonal (fully decoupled) and are controlled independently.
+
+When 3 DoFs are controlled, :yref:`rotWeight<LawTester.rotWeight>` controls whether local shear is applied by moving particle on arc around the other one, or by rotating without changing position; although such rotation induces mutual rotation on the interaction, it is ignored with :yref:`IGeom` with only 3 DoFs. When 6 DoFs are controlled, only arc-displacement is applied for shear, since otherwise mutual rotation would occur.
+
+:yref:`idWeight<LawTester.idWeight>` distributes prescribed motion between both particles (resulting local deformation is the same if ``id1`` is moved towards ``id2`` or ``id2`` towards ``id1``). This is true only for $u_x$, $u_y$, $u_z$, $\phi_x$ however ; bending rotations $\phi_y$, $\phi_z$ are nevertheless always distributed regardless of ``idWeight`` to both spheres in inverse proportion to their radii, so that there is no shear induced.
+
+LawTester knows current contact deformation from 2 sources: from its own internal data (which are used for prescribing the displacement at every step), which can be accessed in :yref:`uTest<LawTester.uTest>`, and from :yref:`IGeom` itself (depending on which data it provides), which is stored in :yref:`uGeom<LawTester.uGeom>`. These two values should be identical (disregarding numerical percision), and it is a way to test whether :yref:`IGeom` and related functors compute what they are supposed to compute.
+
+LawTester-operated interactions can be rendered with :yref:`GlExtra_LawTester` renderer.
+
+See :ysrc:`scripts/test/law-test.py` for an example.
+
+'''