Author: eudoxos
Date: 2009-07-29 22:36:40 +0200 (Wed, 29 Jul 2009)
New Revision: 1905

Modified:
   trunk/pkg/dem/DataClass/InteractionGeometry/DemXDofGeom.hpp
   trunk/pkg/dem/DataClass/InteractionGeometry/SpheresContactGeometry.hpp
   trunk/pkg/dem/Engine/StandAloneEngine/GlobalStiffnessTimeStepper.cpp
Log:
1. Add GenericSpheresContactClass to unit radius1, radius2 and normal between 
SpheresContactGeometry and Dem3DofGeom (to make it work with 
GlobalSitffnessTimeStepper). Partially solves 
https://bugs.launchpad.net/yade/+bug/399963



Modified: trunk/pkg/dem/DataClass/InteractionGeometry/DemXDofGeom.hpp
===================================================================
--- trunk/pkg/dem/DataClass/InteractionGeometry/DemXDofGeom.hpp 2009-07-29 
20:05:42 UTC (rev 1904)
+++ trunk/pkg/dem/DataClass/InteractionGeometry/DemXDofGeom.hpp 2009-07-29 
20:36:40 UTC (rev 1905)
@@ -2,15 +2,26 @@
 #pragma once
 #include<yade/core/InteractionGeometry.hpp>
 
+/*! Abstract class that unites SpheresContactGeometry and Dem3DofGeom,
+       created for the purposes of GlobalStiffnessTimeStepper.
+       It exists purely on the c++, i.e. registers no attributes (the derived 
classes do register
+       their attributes that are initialized as references here) and doesn't 
exist in the yade
+       hierarchy. */
+class GenericSpheresContact: public InteractionGeometry{
+       public:
+               Vector3r normal;
+               Real refR1, refR2;
+};
+
 /*! Abstract base class for representing contact geometry of 2 elements that 
has 3 degrees of freedom:
  *  normal (1 component) and shear (Vector3r, but in plane perpendicular to 
the normal)
  */
-class Dem3DofGeom: public InteractionGeometry{
+class Dem3DofGeom: public GenericSpheresContact{
        public:
                //! some length used to convert displacements to strains
                Real refLength;
                //! some unit reference vector (in the direction of the 
interaction)
-               Vector3r normal;
+               Vector3r &normal;
                //! some reference point for the interaction
                Vector3r contactPoint;
                //! make strain go to -∞ for length going to zero
@@ -18,8 +29,10 @@
                //! se3 of both bodies (needed to compute torque from the 
contact, strains etc). Must be updated at every step.
                Se3r se31, se32;
                //! reference radii of particles (for initial contact stiffness 
computation)
-               Real refR1, refR2;
+               Real &refR1, &refR2;
 
+               Dem3DofGeom(): normal(GenericSpheresContact::normal), 
refR1(GenericSpheresContact::refR1), refR2(GenericSpheresContact::refR2) {}
+
                // API that needs to be implemented in derived classes
                virtual Real displacementN();
                virtual Vector3r displacementT(){throw;}

Modified: trunk/pkg/dem/DataClass/InteractionGeometry/SpheresContactGeometry.hpp
===================================================================
--- trunk/pkg/dem/DataClass/InteractionGeometry/SpheresContactGeometry.hpp      
2009-07-29 20:05:42 UTC (rev 1904)
+++ trunk/pkg/dem/DataClass/InteractionGeometry/SpheresContactGeometry.hpp      
2009-07-29 20:36:40 UTC (rev 1905)
@@ -6,6 +6,7 @@
 #include<yade/core/InteractionGeometry.hpp>
 #include<yade/lib-base/yadeWm3.hpp>
 #include<yade/pkg-common/RigidBodyParameters.hpp>
+#include<yade/pkg-dem/DemXDofGeom.hpp>
 /*! Class representing geometry of two spheres in contact.
  *
  * The code under SCG_SHEAR is experimental and is used only if 
ElasticContactLaw::useShear is explicitly true
@@ -13,12 +14,12 @@
 
 #define SCG_SHEAR
 
-class SpheresContactGeometry: public InteractionGeometry {
+class SpheresContactGeometry: public GenericSpheresContact {
        public:
-               Vector3r normal, // unit vector in the direction from sphere1 
center to sphere2 center
-                       contactPoint;
+               Vector3r& normal; // unit vector in the direction from sphere1 
center to sphere2 center
+               Vector3r contactPoint;
                Real penetrationDepth;
-               Real radius1, radius2;
+               Real &radius1, &radius2;
 
                #ifdef SCG_SHEAR
                        //! Total value of the current shear. Update the value 
using updateShear.
@@ -39,7 +40,7 @@
                #endif
 
 
-               
SpheresContactGeometry():contactPoint(Vector3r::ZERO),radius1(0.),radius2(0.)
+               
SpheresContactGeometry():contactPoint(Vector3r::ZERO),normal(GenericSpheresContact::normal),radius1(GenericSpheresContact::refR1),radius2(GenericSpheresContact::refR2)
                #ifdef SCG_SHEAR
                        ,shear(Vector3r::ZERO), prevNormal(Vector3r::ZERO) 
/*initialized to proper value by geom functor*/
                #endif

Modified: trunk/pkg/dem/Engine/StandAloneEngine/GlobalStiffnessTimeStepper.cpp
===================================================================
--- trunk/pkg/dem/Engine/StandAloneEngine/GlobalStiffnessTimeStepper.cpp        
2009-07-29 20:05:42 UTC (rev 1904)
+++ trunk/pkg/dem/Engine/StandAloneEngine/GlobalStiffnessTimeStepper.cpp        
2009-07-29 20:36:40 UTC (rev 1905)
@@ -9,6 +9,7 @@
 #include"GlobalStiffnessTimeStepper.hpp"
 #include<yade/pkg-dem/ElasticContactInteraction.hpp>
 #include<yade/pkg-dem/SpheresContactGeometry.hpp>
+#include<yade/pkg-dem/DemXDofGeom.hpp>
 //#include<yade/pkg-dem/MacroMicroElasticRelationships.hpp>
 #include<yade/core/Interaction.hpp>
 #include<yade/core/MetaBody.hpp>
@@ -183,10 +184,10 @@
        FOREACH(const shared_ptr<Interaction>& contact, *rb->interactions){
                if(!contact->isReal()) continue;
 
-               SpheresContactGeometry* 
geom=YADE_CAST<SpheresContactGeometry*>(contact->interactionGeometry.get()); 
assert(geom);
+               GenericSpheresContact* 
geom=YADE_CAST<GenericSpheresContact*>(contact->interactionGeometry.get()); 
assert(geom);
                NormalShearInteraction* 
phys=YADE_CAST<NormalShearInteraction*>(contact->interactionPhysics.get()); 
assert(phys);
                // all we need for getting stiffness
-               Vector3r& normal=geom->normal; Real& kn=phys->kn; Real& 
ks=phys->ks; Real& radius1=geom->radius1; Real& radius2=geom->radius2;
+               Vector3r& normal=geom->normal; Real& kn=phys->kn; Real& 
ks=phys->ks; Real& radius1=geom->refR1; Real& radius2=geom->refR2;
                // FIXME? NormalShearInteraction knows nothing about whether 
the contact is "active" (force!=0) or not;
                // former code: if(force==0) continue; /* disregard this 
interaction, it is not active */.
                // It seems though that in such case either the interaction is 
accidentally at perfect equilibrium (unlikely)


_______________________________________________
Mailing list: https://launchpad.net/~yade-dev
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~yade-dev
More help   : https://help.launchpad.net/ListHelp
_______________________________________________
yade-dev mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/yade-dev

Reply via email to