Author: eudoxos
Date: 2008-09-30 20:38:52 +0200 (Tue, 30 Sep 2008)
New Revision: 1534

Modified:
   trunk/gui/py/_utils.cpp
   trunk/gui/py/eudoxos.py
   trunk/pkg/dem/PreProcessor/TriaxialTest.cpp
   trunk/pkg/dem/PreProcessor/TriaxialTest.hpp
Log:
1. TriaxialTest now takes readiusMean argument (by default negative, i.e. 
disabled); if >0, box size is scaled so that both requested porosity and mean 
size can be preserved.
2. Attempt to fix computation of stress from stored elastic energy.


Modified: trunk/gui/py/_utils.cpp
===================================================================
--- trunk/gui/py/_utils.cpp     2008-09-30 10:49:22 UTC (rev 1533)
+++ trunk/gui/py/_utils.cpp     2008-09-30 18:38:52 UTC (rev 1534)
@@ -17,20 +17,20 @@
 bool isInBB(Vector3r p, Vector3r bbMin, Vector3r bbMax){return p[0]>bbMin[0] 
&& p[0]<bbMax[0] && p[1]>bbMin[1] && p[1]<bbMax[1] && p[2]>bbMin[2] && 
p[2]<bbMax[2];}
 
 /* \todo implement groupMask */
-python::tuple aabbExtrema(Real cutoff=0.0){
+python::tuple aabbExtrema(Real cutoff=0.0, bool centers=false){
        if(cutoff<0. || cutoff>1.) throw invalid_argument("Cutoff must be >=0 
and <=1.");
        Real inf=std::numeric_limits<Real>::infinity();
        Vector3r minimum(inf,inf,inf),maximum(-inf,-inf,-inf);
        FOREACH(const shared_ptr<Body>& b, 
*Omega::instance().getRootBody()->bodies){
                shared_ptr<Sphere> 
s=dynamic_pointer_cast<Sphere>(b->geometricalModel); if(!s) continue;
                Vector3r rrr(s->radius,s->radius,s->radius);
-               
minimum=componentMinVector(minimum,b->physicalParameters->se3.position-rrr);
-               
maximum=componentMaxVector(maximum,b->physicalParameters->se3.position+rrr);
+               
minimum=componentMinVector(minimum,b->physicalParameters->se3.position-(centers?0:rrr));
+               
maximum=componentMaxVector(maximum,b->physicalParameters->se3.position+(centers?0:rrr));
        }
        Vector3r dim=maximum-minimum;
        return 
python::make_tuple(vec2tuple(minimum+.5*cutoff*dim),vec2tuple(maximum-.5*cutoff*dim));
 }
-BOOST_PYTHON_FUNCTION_OVERLOADS(aabbExtrema_overloads,aabbExtrema,0,1);
+BOOST_PYTHON_FUNCTION_OVERLOADS(aabbExtrema_overloads,aabbExtrema,0,2);
 
 python::tuple negPosExtremeIds(int axis, Real distFactor=1.1){
        python::tuple extrema=aabbExtrema();
@@ -163,7 +163,7 @@
 
 BOOST_PYTHON_MODULE(_utils){
        def("PWaveTimeStep",PWaveTimeStep);
-       def("aabbExtrema",aabbExtrema,aabbExtrema_overloads(args("cutoff")));
+       
def("aabbExtrema",aabbExtrema,aabbExtrema_overloads(args("cutoff","centers")));
        
def("negPosExtremeIds",negPosExtremeIds,negPosExtremeIds_overloads(args("axis","distFactor")));
        
def("coordsAndDisplacements",coordsAndDisplacements,coordsAndDisplacements_overloads(args("AABB")));
        def("setRefSe3",setRefSe3);

Modified: trunk/gui/py/eudoxos.py
===================================================================
--- trunk/gui/py/eudoxos.py     2008-09-30 10:49:22 UTC (rev 1533)
+++ trunk/gui/py/eudoxos.py     2008-09-30 18:38:52 UTC (rev 1534)
@@ -9,7 +9,7 @@
        # E=(1/2)σεAl # global stored energy
        # σ=EE/(.5εAl)=EE/(.5εV)
        from yade import utils
-       dim=utils.aabbDim(cutoff)
+       dim=utils.aabbDim(cutoff,centers=True)
        return 
utils.elasticEnergy(utils.aabbExtrema(cutoff))/(.5*strain*dim[0]*dim[1]*dim[2])
 
 def estimatePoissonYoung(principalAxis,stress=0,plot=False,cutoff=0.):

Modified: trunk/pkg/dem/PreProcessor/TriaxialTest.cpp
===================================================================
--- trunk/pkg/dem/PreProcessor/TriaxialTest.cpp 2008-09-30 10:49:22 UTC (rev 
1533)
+++ trunk/pkg/dem/PreProcessor/TriaxialTest.cpp 2008-09-30 18:38:52 UTC (rev 
1534)
@@ -81,15 +81,12 @@
 #include <boost/random/normal_distribution.hpp>
 
 
+CREATE_LOGGER(TriaxialTest);
 
-
 using namespace boost;
 using namespace std;
 
 
-typedef pair<Vector3r, Real> BasicSphere;
-//! generate a list of non-overlapping spheres
-string GenerateCloud(vector<BasicSphere>& sphere_list, Vector3r lowerCorner, 
Vector3r upperCorner, long number, Real rad_std_dev, Real porosity);
 
 
 TriaxialTest::TriaxialTest () : FileGenerator()
@@ -161,6 +158,7 @@
        biaxial2dTest=false;
 
        radiusStdDev=0.3;
+       radiusMean=-1; // no radius specified
        
 //     wall_top_id =0;
 //     wall_bottom_id =0;
@@ -192,6 +190,7 @@
        REGISTER_ATTRIBUTE(maxMultiplier);
        REGISTER_ATTRIBUTE(finalMaxMultiplier);
        REGISTER_ATTRIBUTE(radiusStdDev);
+       REGISTER_ATTRIBUTE(radiusMean);
 
        REGISTER_ATTRIBUTE(sphereYoungModulus);
        REGISTER_ATTRIBUTE(spherePoissonRatio);
@@ -277,6 +276,25 @@
        rootBody->bodies                        = shared_ptr<BodyContainer>(new 
BodyRedirectionVector);
 
        shared_ptr<Body> body;
+
+
+
+       /* if _mean_radius is not given (i.e. <=0), then calculate it from box 
size;
+        * OTOH, if it is specified, scale the box preserving its ratio and 
lowerCorner so that the radius can be as requested
+        */
+       Vector3r dimensions=upperCorner-lowerCorner; Real 
volume=dimensions.X()*dimensions.Y()*dimensions.Z();
+       Real porosity=.75;
+       Real really_radiusMean;
+
+       if(radiusMean<=0) 
really_radiusMean=pow(volume*(1-porosity)/(Mathr::PI*(4/3.)*numberOfGrains),1/3.);
+       else {
+               Real 
boxScaleFactor=radiusMean*pow((4/3.)*Mathr::PI*numberOfGrains/(volume*(1-porosity)),1/3.);
+               LOG_INFO("Mean radius value of "<<radiusMean<<" requested, 
scaling box by "<<boxScaleFactor);
+               dimensions*=boxScaleFactor;
+               upperCorner=lowerCorner+dimensions;
+               really_radiusMean=radiusMean;
+       }
+
        
        
        
@@ -386,27 +404,18 @@
        
        vector<BasicSphere> sphere_list;
        if(importFilename!="") 
sphere_list=Shop::loadSpheresFromFile(importFilename,lowerCorner,upperCorner);
-       else message+=GenerateCloud(sphere_list, lowerCorner, upperCorner, 
numberOfGrains, radiusStdDev, 0.75);
-       
+       else message+=GenerateCloud(sphere_list, lowerCorner, upperCorner, 
numberOfGrains, radiusStdDev, really_radiusMean, porosity);
        vector<BasicSphere>::iterator it = sphere_list.begin();
        vector<BasicSphere>::iterator it_end = sphere_list.end();
-                       
-       for (;it!=it_end; ++it)
-       {
-               cerr << "sphere (" << it->first << " " << it->second << 
")"<<endl;
-               createSphere(body,it->first,it->second,false,true);
+       FOREACH(const BasicSphere& it, sphere_list){
+               LOG_DEBUG("sphere (" << it.first << " " << it.second << ")");
+               createSphere(body,it.first,it.second,false,true);
                rootBody->bodies->insert(body);
        }       
+
        
        
        return true;
-//     return "Generated a sample inside box of dimensions: (" 
-//             + lexical_cast<string>(lowerCorner[0]) + "," 
-//             + lexical_cast<string>(lowerCorner[1]) + "," 
-//             + lexical_cast<string>(lowerCorner[2]) + ") and (" 
-//             + lexical_cast<string>(upperCorner[0]) + "," 
-//             + lexical_cast<string>(upperCorner[1]) + "," 
-//             + lexical_cast<string>(upperCorner[2]) + ").";
 
 }
 
@@ -609,10 +618,12 @@
        //cerr << "fin de section triaxialcompressionEngine = 
shared_ptr<TriaxialCompressionEngine> (new TriaxialCompressionEngine);" << 
std::endl;
        
 // recording global stress
-       triaxialStateRecorder = shared_ptr<TriaxialStateRecorder>(new 
TriaxialStateRecorder);
-       triaxialStateRecorder-> outputFile              = WallStressRecordFile 
+ Key;
-       triaxialStateRecorder-> interval                = recordIntervalIter;
-       //triaxialStateRecorderer-> thickness           = thickness;
+       if(recordIntervalIter>0){
+               triaxialStateRecorder = shared_ptr<TriaxialStateRecorder>(new 
TriaxialStateRecorder);
+               triaxialStateRecorder-> outputFile              = 
WallStressRecordFile + Key;
+               triaxialStateRecorder-> interval                = 
recordIntervalIter;
+               //triaxialStateRecorderer-> thickness           = thickness;
+       }
 
        shared_ptr<MakeItFlat> makeItFlat(new MakeItFlat);
        makeItFlat->direction=2;
@@ -699,7 +710,7 @@
 }
 
 
-string GenerateCloud(vector<BasicSphere>& sphere_list, Vector3r lowerCorner, 
Vector3r upperCorner, long number, Real rad_std_dev, Real porosity)
+string TriaxialTest::GenerateCloud(vector<BasicSphere>& sphere_list, Vector3r 
lowerCorner, Vector3r upperCorner, long number, Real rad_std_dev, Real 
mean_radius, Real porosity)
 {
        typedef boost::minstd_rand StdGenerator;
        static StdGenerator generator;
@@ -711,11 +722,8 @@
        sphere_list.clear();
        long tries = 1000; //nb of tries for positionning the next sphere
        Vector3r dimensions = upperCorner - lowerCorner;
-               
-       Real mean_radius = 
std::pow(dimensions.X()*dimensions.Y()*dimensions.Z()*(1-porosity)/(3.1416*1.3333*number),0.333333);
-        //cerr << mean_radius;
 
-       std::cerr << "generating aggregates ... ";
+       LOG_INFO("Generating aggregates ...");
        
        long t, i;
        for (i=0; i<number; ++i) {

Modified: trunk/pkg/dem/PreProcessor/TriaxialTest.hpp
===================================================================
--- trunk/pkg/dem/PreProcessor/TriaxialTest.hpp 2008-09-30 10:49:22 UTC (rev 
1533)
+++ trunk/pkg/dem/PreProcessor/TriaxialTest.hpp 2008-09-30 18:38:52 UTC (rev 
1534)
@@ -73,9 +73,9 @@
                                StabilityCriterion,
                                maxMultiplier, ///max multiplier of diameters 
during internal compaction
                                finalMaxMultiplier,
-                               wallOversizeFactor,
-                               radiusStdDev; // make walls bigger (/smaller) 
than necessary by this factor
-
+                               wallOversizeFactor, // make walls bigger 
(/smaller) than necessary by this factor
+                               radiusStdDev,
+                               radiusMean;
                bool             wall_top
                                ,wall_bottom
                                ,wall_1
@@ -127,6 +127,11 @@
                void createSphere(shared_ptr<Body>& body, Vector3r position, 
Real radius,bool big,bool dynamic);
                void createActors(shared_ptr<MetaBody>& rootBody);
                void positionRootBody(shared_ptr<MetaBody>& rootBody);
+
+               typedef pair<Vector3r, Real> BasicSphere;
+               //! generate a list of non-overlapping spheres
+               string GenerateCloud(vector<BasicSphere>& sphere_list, Vector3r 
lowerCorner, Vector3r upperCorner, long number, Real rad_std_dev, Real 
mean_radius, Real porosity);
+
        
        public : 
                TriaxialTest ();
@@ -137,6 +142,7 @@
                void registerAttributes();
        REGISTER_CLASS_NAME(TriaxialTest);
        REGISTER_BASE_CLASS_NAME(FileGenerator);
+       DECLARE_LOGGER;
 };
 
 REGISTER_SERIALIZABLE(TriaxialTest,false);


_______________________________________________
Mailing list: https://launchpad.net/~yade-dev
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~yade-dev
More help   : https://help.launchpad.net/ListHelp

Reply via email to