← Back to team overview

yade-dev team mailing list archive

[svn] r1565 - in trunk: gui/py lib/serialization pkg/dem/PreProcessor

 

Author: eudoxos
Date: 2008-10-29 20:29:18 +0100 (Wed, 29 Oct 2008)
New Revision: 1565

Modified:
   trunk/gui/py/pyAttrUtils.hpp
   trunk/lib/serialization/FundamentalHandler.tpp
   trunk/lib/serialization/KnownFundamentalsHandler.tpp
   trunk/pkg/dem/PreProcessor/MembraneTest.cpp
   trunk/pkg/dem/PreProcessor/TriaxialTest.cpp
   trunk/pkg/dem/PreProcessor/TriaxialTest.hpp
Log:
1. Make our intelligence-challenged deserializer finally gracefully handle nan, inf, -inf (arbitrary lower-upper case).
2. Fix crash in MembraneTest (leftover in the commit from testing, oh well)
3. Add TriaxialTest::fixedBoxDims to not scale selected box dimensions if sphere mean radius is given (example underway).



Modified: trunk/gui/py/pyAttrUtils.hpp
===================================================================
--- trunk/gui/py/pyAttrUtils.hpp	2008-10-29 10:31:21 UTC (rev 1564)
+++ trunk/gui/py/pyAttrUtils.hpp	2008-10-29 19:29:18 UTC (rev 1565)
@@ -4,6 +4,7 @@
 #include<map>
 #include<vector>
 #include<boost/shared_ptr.hpp>
+#include<yade/lib-serialization/Archive.hpp>
 #include<yade/lib-serialization-xml/XMLFormatManager.hpp>
 #include<boost/python.hpp>
 
@@ -159,6 +160,7 @@
 		//! return python list of keys (attribute names)
 		boost::python::list pyKeys(){boost::python::list ret; for(DescriptorMap::iterator I=descriptors.begin();I!=descriptors.end();I++)ret.append(I->first); return ret;}
 
+
 		//! return attribute value as python object
 		boost::python::object pyGet(std::string key){
 			DescriptorMap::iterator I=descriptors.find(key);
@@ -167,15 +169,15 @@
 			LOG_DEBUG("Got raw attribute `"<<key<<"'");
 			switch(descriptors[key].type){
 				case BOOL: return python::object(lexical_cast<bool>(raw[0]));
-				case NUMBER: return python::object(lexical_cast<double>(raw[0]));
+				case NUMBER: return python::object(lexical_cast_maybeNanInf<double>(raw[0]));
 				case STRING: return python::object(raw[0]);
 				case SEQ_STRING: {python::list ret; for(size_t i=0; i<raw.size(); i++) ret.append(python::object(raw[i])); return ret;}
-				case SEQ_NUMBER: {python::list ret; for(size_t i=0; i<raw.size(); i++){ ret.append(python::object(lexical_cast<double>(raw[i]))); LOG_TRACE("Appended "<<raw[i]);} return ret; }
+				case SEQ_NUMBER: {python::list ret; for(size_t i=0; i<raw.size(); i++){ ret.append(python::object(lexical_cast_maybeNanInf<double>(raw[i]))); LOG_TRACE("Appended "<<raw[i]);} return ret; }
 				case VEC_VEC: {
 					python::list ret; for(size_t i=0; i<raw.size(); i++){
 						/* raw[i] has the form "{number number number}" */
 						vector<string> s; boost::algorithm::split(s,raw[i],algorithm::is_any_of("{} "),algorithm::token_compress_on);
-						python::list subList; FOREACH(string ss, s) subList.append(python::object(lexical_cast<double>(ss)));
+						python::list subList; FOREACH(string ss, s) subList.append(python::object(lexical_cast_maybeNanInf<double>(ss)));
 						ret.append(subList);
 					}
 				}

Modified: trunk/lib/serialization/FundamentalHandler.tpp
===================================================================
--- trunk/lib/serialization/FundamentalHandler.tpp	2008-10-29 10:31:21 UTC (rev 1564)
+++ trunk/lib/serialization/FundamentalHandler.tpp	2008-10-29 19:29:18 UTC (rev 1565)
@@ -87,6 +87,15 @@
 	}
 };
 
+template <typename RealType>
+RealType lexical_cast_maybeNanInf(const string& s){
+	if((s[0]=='n' || s[0]=='N') && (s[1]=='a' || s[1]=='A') && (s[2]=='n' || s[2]=='N')) return std::numeric_limits<RealType>::quiet_NaN();
+	if((s[0]=='i' || s[0]=='I') && (s[1]=='n' || s[1]=='N') && (s[2]=='f' || s[2]=='F')) return std::numeric_limits<RealType>::infinity();
+	if(s[0]=='-' && (s[1]=='i' || s[1]=='I') && (s[2]=='n' || s[2]=='N') && (s[3]=='f' || s[3]=='F')) return -std::numeric_limits<RealType>::infinity();
+	return lexical_cast<RealType>(s);
+};
+
+
 template<typename Type >
 inline void lexical_copy(Archive& ac , any& a )
 {
@@ -99,7 +108,9 @@
 		try{
 			*tmp = lexical_cast<Type>(*tmpStr);
 		} catch(boost::bad_lexical_cast& e){
-			if(typeid(tmp)==typeid(bool*) && atoi(tmpStr->c_str())!=0) { cerr<<"warning: offensive bool value `"<<*tmpStr<<"' encountered (interpreted as true)."<<endl; *tmp=lexical_cast<Type>("1"); /* cerr<<"New value: "<<lexical_cast<string>(*tmp)<<endl; cerr<<"Atoi returns "<<atoi(tmpStr->c_str())<<", bool !=0 is "<<(atoi(tmpStr->c_str())!=0)<<endl;*/ }
+			if(typeid(tmp)==typeid(bool*) && atoi(tmpStr->c_str())!=0) { cerr<<"warning: offensive bool value `"<<*tmpStr<<"' encountered (interpreted as true)."<<endl; *tmp=lexical_cast<Type>("1"); /* cerr<<"New value: "<<lexical_cast<string>(*tmp)<<endl; cerr<<"Atoi returns "<<atoi(tmpStr->c_str())<<", bool !=0 is "<<(atoi(tmpStr->c_str())!=0)<<endl;*/
+			}
+			else *tmp=lexical_cast_maybeNanInf<Type>(*tmpStr);
 		}
 	}
 	else if (a.type()==typeid(string*)) // serialization - writing to string from some Type
@@ -115,6 +126,9 @@
 		throw HandlerError(SerializationExceptions::LexicalCopyError);
 }
 
+
+
+
 template< >
 struct FundamentalHandler< int >
 {

Modified: trunk/lib/serialization/KnownFundamentalsHandler.tpp
===================================================================
--- trunk/lib/serialization/KnownFundamentalsHandler.tpp	2008-10-29 10:31:21 UTC (rev 1564)
+++ trunk/lib/serialization/KnownFundamentalsHandler.tpp	2008-10-29 19:29:18 UTC (rev 1565)
@@ -110,8 +110,8 @@
 			vector<string> tokens;
 			IOFormatManager::parseFundamental(*tmpStr, tokens);
 		
-			tmp->X() = lexical_cast<RealType>(tokens[0]);
-			tmp->Y() = lexical_cast<RealType>(tokens[1]);
+			tmp->X() = lexical_cast_maybeNanInf<RealType>(tokens[0]);
+			tmp->Y() = lexical_cast_maybeNanInf<RealType>(tokens[1]);
 		}
 		else if (a.type()==typeid(const vector<unsigned char>*)) // from binary stream to Type
 		{
@@ -168,9 +168,9 @@
 			vector<string> tokens;
 			IOFormatManager::parseFundamental(*tmpStr, tokens);
 		
-			tmp->X() = lexical_cast<RealType>(tokens[0]);
-			tmp->Y() = lexical_cast<RealType>(tokens[1]);
-			tmp->Z() = lexical_cast<RealType>(tokens[2]);
+			tmp->X() = lexical_cast_maybeNanInf<RealType>(tokens[0]);
+			tmp->Y() = lexical_cast_maybeNanInf<RealType>(tokens[1]);
+			tmp->Z() = lexical_cast_maybeNanInf<RealType>(tokens[2]);
 		}
 		else if (a.type()==typeid(const vector<unsigned char>*)) // from binary stream to Type
 		{
@@ -231,10 +231,10 @@
 			vector<string> tokens;
 			IOFormatManager::parseFundamental(*tmpStr, tokens);
 		
-			tmp->X() = lexical_cast<RealType>(tokens[0]);
-			tmp->Y() = lexical_cast<RealType>(tokens[1]);
-			tmp->Z() = lexical_cast<RealType>(tokens[2]);
-			tmp->W() = lexical_cast<RealType>(tokens[3]);
+			tmp->X() = lexical_cast_maybeNanInf<RealType>(tokens[0]);
+			tmp->Y() = lexical_cast_maybeNanInf<RealType>(tokens[1]);
+			tmp->Z() = lexical_cast_maybeNanInf<RealType>(tokens[2]);
+			tmp->W() = lexical_cast_maybeNanInf<RealType>(tokens[3]);
 		}
 		else if (a.type()==typeid(const vector<unsigned char>*)) // from binary stream to Type
 		{
@@ -299,10 +299,11 @@
 			vector<string> tokens;
 			IOFormatManager::parseFundamental(*tmpStr, tokens);
 		
-			*tmp = Matrix2<RealType>(	lexical_cast<RealType>(tokens[0]),
-							lexical_cast<RealType>(tokens[1]),
-							lexical_cast<RealType>(tokens[2]),
-							lexical_cast<RealType>(tokens[3]));
+			*tmp = Matrix2<RealType>(
+							lexical_cast_maybeNanInf<RealType>(tokens[0]),
+							lexical_cast_maybeNanInf<RealType>(tokens[1]),
+							lexical_cast_maybeNanInf<RealType>(tokens[2]),
+							lexical_cast_maybeNanInf<RealType>(tokens[3]));
 		}
 		else if (a.type()==typeid(const vector<unsigned char>*)) // from binary stream to Type
 		{
@@ -367,15 +368,16 @@
 			vector<string> tokens;
 			IOFormatManager::parseFundamental(*tmpStr, tokens);
 		
-			*tmp = Matrix3<RealType>(	lexical_cast<RealType>(tokens[0]),
-							lexical_cast<RealType>(tokens[1]),
-							lexical_cast<RealType>(tokens[2]),
-							lexical_cast<RealType>(tokens[3]),
-							lexical_cast<RealType>(tokens[4]),
-							lexical_cast<RealType>(tokens[5]),
-							lexical_cast<RealType>(tokens[6]),
-							lexical_cast<RealType>(tokens[7]),
-							lexical_cast<RealType>(tokens[8]));
+			*tmp = Matrix3<RealType>(
+							lexical_cast_maybeNanInf<RealType>(tokens[0]),
+							lexical_cast_maybeNanInf<RealType>(tokens[1]),
+							lexical_cast_maybeNanInf<RealType>(tokens[2]),
+							lexical_cast_maybeNanInf<RealType>(tokens[3]),
+							lexical_cast_maybeNanInf<RealType>(tokens[4]),
+							lexical_cast_maybeNanInf<RealType>(tokens[5]),
+							lexical_cast_maybeNanInf<RealType>(tokens[6]),
+							lexical_cast_maybeNanInf<RealType>(tokens[7]),
+							lexical_cast_maybeNanInf<RealType>(tokens[8]));
 		}
 		else if (a.type()==typeid(const vector<unsigned char>*)) // from binary stream to Type
 		{
@@ -460,22 +462,23 @@
 			vector<string> tokens;
 			IOFormatManager::parseFundamental(*tmpStr, tokens);
 		
-			*tmp = Matrix4<RealType>(	lexical_cast<RealType>(tokens[0]),
-							lexical_cast<RealType>(tokens[1]),
-							lexical_cast<RealType>(tokens[2]),
-							lexical_cast<RealType>(tokens[3]),
-							lexical_cast<RealType>(tokens[4]),
-							lexical_cast<RealType>(tokens[5]),
-							lexical_cast<RealType>(tokens[6]),
-							lexical_cast<RealType>(tokens[7]),
-							lexical_cast<RealType>(tokens[8]),
-							lexical_cast<RealType>(tokens[9]),
-							lexical_cast<RealType>(tokens[10]),
-							lexical_cast<RealType>(tokens[11]),
-							lexical_cast<RealType>(tokens[12]),
-							lexical_cast<RealType>(tokens[13]),
-							lexical_cast<RealType>(tokens[14]),
-							lexical_cast<RealType>(tokens[15]));
+			*tmp = Matrix4<RealType>(
+							lexical_cast_maybeNanInf<RealType>(tokens[0]),
+							lexical_cast_maybeNanInf<RealType>(tokens[1]),
+							lexical_cast_maybeNanInf<RealType>(tokens[2]),
+							lexical_cast_maybeNanInf<RealType>(tokens[3]),
+							lexical_cast_maybeNanInf<RealType>(tokens[4]),
+							lexical_cast_maybeNanInf<RealType>(tokens[5]),
+							lexical_cast_maybeNanInf<RealType>(tokens[6]),
+							lexical_cast_maybeNanInf<RealType>(tokens[7]),
+							lexical_cast_maybeNanInf<RealType>(tokens[8]),
+							lexical_cast_maybeNanInf<RealType>(tokens[9]),
+							lexical_cast_maybeNanInf<RealType>(tokens[10]),
+							lexical_cast_maybeNanInf<RealType>(tokens[11]),
+							lexical_cast_maybeNanInf<RealType>(tokens[12]),
+							lexical_cast_maybeNanInf<RealType>(tokens[13]),
+							lexical_cast_maybeNanInf<RealType>(tokens[14]),
+							lexical_cast_maybeNanInf<RealType>(tokens[15]));
 		}
 		else if (a.type()==typeid(const vector<unsigned char>*)) // from binary stream to Type
 		{
@@ -594,17 +597,17 @@
 		
 			if (tokens.size()==3) // Quaternion is written as axis which norm is the angle in radian
 			{
-				axis[0] = lexical_cast<RealType>(tokens[0]);
-				axis[1] = lexical_cast<RealType>(tokens[1]);
-				axis[2] = lexical_cast<RealType>(tokens[2]);
+				axis[0] = lexical_cast_maybeNanInf<RealType>(tokens[0]);
+				axis[1] = lexical_cast_maybeNanInf<RealType>(tokens[1]);
+				axis[2] = lexical_cast_maybeNanInf<RealType>(tokens[2]);
 				angle = axis.Normalize();
 			}
 			else // tokens.size()==4 Quaternion is written as axis angle
 			{
-				axis[0] = lexical_cast<RealType>(tokens[0]);
-				axis[1] = lexical_cast<RealType>(tokens[1]);
-				axis[2] = lexical_cast<RealType>(tokens[2]);
-				angle   = lexical_cast<RealType>(tokens[3]);
+				axis[0] = lexical_cast_maybeNanInf<RealType>(tokens[0]);
+				axis[1] = lexical_cast_maybeNanInf<RealType>(tokens[1]);
+				axis[2] = lexical_cast_maybeNanInf<RealType>(tokens[2]);
+				angle   = lexical_cast_maybeNanInf<RealType>(tokens[3]);
 			}
 			tmp->FromAxisAngle(axis,angle);
 		}
@@ -687,23 +690,23 @@
 		
 			if (tokens.size()==6) // Quaternion is written as axis which norm is the angle in radian
 			{
-				position[0]	= lexical_cast<RealType>(tokens[0]);
-				position[1]	= lexical_cast<RealType>(tokens[1]);
-				position[2]	= lexical_cast<RealType>(tokens[2]);
-				axis[0]		= lexical_cast<RealType>(tokens[4]);
-				axis[1]		= lexical_cast<RealType>(tokens[3]);
-				axis[2]		= lexical_cast<RealType>(tokens[5]);
+				position[0]	= lexical_cast_maybeNanInf<RealType>(tokens[0]);
+				position[1]	= lexical_cast_maybeNanInf<RealType>(tokens[1]);
+				position[2]	= lexical_cast_maybeNanInf<RealType>(tokens[2]);
+				axis[0]		= lexical_cast_maybeNanInf<RealType>(tokens[4]);
+				axis[1]		= lexical_cast_maybeNanInf<RealType>(tokens[3]);
+				axis[2]		= lexical_cast_maybeNanInf<RealType>(tokens[5]);
 				angle		= axis.Normalize();
 			}
 			else // tokens.size()==7 Quaternion is writted as axis angle
 			{
-				position[0]	= lexical_cast<RealType>(tokens[0]);
-				position[1]	= lexical_cast<RealType>(tokens[1]);
-				position[2]	= lexical_cast<RealType>(tokens[2]);
-				axis[0]		= lexical_cast<RealType>(tokens[3]);
-				axis[1]		= lexical_cast<RealType>(tokens[4]);
-				axis[2]		= lexical_cast<RealType>(tokens[5]);
-				angle		= lexical_cast<RealType>(tokens[6]);
+				position[0]	= lexical_cast_maybeNanInf<RealType>(tokens[0]);
+				position[1]	= lexical_cast_maybeNanInf<RealType>(tokens[1]);
+				position[2]	= lexical_cast_maybeNanInf<RealType>(tokens[2]);
+				axis[0]		= lexical_cast_maybeNanInf<RealType>(tokens[3]);
+				axis[1]		= lexical_cast_maybeNanInf<RealType>(tokens[4]);
+				axis[2]		= lexical_cast_maybeNanInf<RealType>(tokens[5]);
+				angle		= lexical_cast_maybeNanInf<RealType>(tokens[6]);
 			}
 			orientation.FromAxisAngle(axis,angle);
 			*tmp = Se3<RealType>(position,orientation);

Modified: trunk/pkg/dem/PreProcessor/MembraneTest.cpp
===================================================================
--- trunk/pkg/dem/PreProcessor/MembraneTest.cpp	2008-10-29 10:31:21 UTC (rev 1564)
+++ trunk/pkg/dem/PreProcessor/MembraneTest.cpp	2008-10-29 19:29:18 UTC (rev 1565)
@@ -301,7 +301,7 @@
 	//interactionGeometryDispatcher->add("InteractingMyTetrahedron2InteractingBox4InteractionOfMyTetrahedron");
 
 	shared_ptr<InteractingGeometryMetaEngine> interactingGeometryDispatcher	= shared_ptr<InteractingGeometryMetaEngine>(new InteractingGeometryMetaEngine);
-	//interactingGeometryDispatcher->add("ef2_BshTube_BssSweptSphereLineSegment_makeBssSweptSphereLineSegment");
+	interactingGeometryDispatcher->add("ef2_BshTube_BssSweptSphereLineSegment_makeBssSweptSphereLineSegment");
 	
 	shared_ptr<BoundingVolumeMetaEngine> boundingVolumeDispatcher	= shared_ptr<BoundingVolumeMetaEngine>(new BoundingVolumeMetaEngine);
 	boundingVolumeDispatcher->add("InteractingSphere2AABB"); // 

Modified: trunk/pkg/dem/PreProcessor/TriaxialTest.cpp
===================================================================
--- trunk/pkg/dem/PreProcessor/TriaxialTest.cpp	2008-10-29 10:31:21 UTC (rev 1564)
+++ trunk/pkg/dem/PreProcessor/TriaxialTest.cpp	2008-10-29 19:29:18 UTC (rev 1565)
@@ -94,7 +94,7 @@
 	lowerCorner 		= Vector3r(0,0,0);
 	upperCorner 		= Vector3r(1,1,1);
 	thickness 		= 0.001;
-	importFilename 		= "../../YADE/trunk-clean/examples/sphere16bidisperse.txt"; // "./small.sdec.xyz";
+	importFilename 		= ""; // oh, PLEASE, keep this empty -- i.e., by default, generate spheres in the box, not load them.
 	Key			="";
 	outputFileName 		= "./TriaxialTest"+Key+".xml";
 	//nlayers = 1;
@@ -260,6 +260,7 @@
 	REGISTER_ATTRIBUTE(DieCompaction);
 	REGISTER_ATTRIBUTE(translationspeed);
 	REGISTER_ATTRIBUTE(wishedporosity);
+	REGISTER_ATTRIBUTE(fixedBoxDims);
  
 
 
@@ -301,9 +302,13 @@
 
 	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;
+		bool fixedDims[3];
+		fixedDims[0]=fixedBoxDims.find('x')!=string::npos; fixedDims[1]=fixedBoxDims.find('y')!=string::npos; fixedDims[2]=fixedBoxDims.find('z')!=string::npos;
+		int nScaled=(3-(int)fixedDims[0]+(int)fixedDims[1]+(int)fixedDims[2]);
+		if(nScaled==3) throw std::invalid_argument("At most 2 (not 3) axes can have fixed dimensions in fixedBoxDims if scaling for given radiusMean.");
+		Real boxScaleFactor=radiusMean*pow((4/3.)*Mathr::PI*numberOfGrains/(volume*(1-porosity)),1./nScaled);
+		LOG_INFO("Mean radius value of "<<radiusMean<<" requested, scaling "<<nScaled<<" dimensions by "<<boxScaleFactor);
+		dimensions[0]*=fixedDims[0]?1.:boxScaleFactor; dimensions[1]*=fixedDims[1]?1.:boxScaleFactor; dimensions[2]*=fixedDims[2]?1.:boxScaleFactor;
 		upperCorner=lowerCorner+dimensions;
 		really_radiusMean=radiusMean;
 	}

Modified: trunk/pkg/dem/PreProcessor/TriaxialTest.hpp
===================================================================
--- trunk/pkg/dem/PreProcessor/TriaxialTest.hpp	2008-10-29 10:31:21 UTC (rev 1564)
+++ trunk/pkg/dem/PreProcessor/TriaxialTest.hpp	2008-10-29 19:29:18 UTC (rev 1565)
@@ -120,7 +120,9 @@
 		string		importFilename
 				,AnimationSnapshotsBaseName
 				,WallStressRecordFile
-				,Key;//A code that is added to output filenames
+				,Key //A code that is added to output filenames
+				//! string that contains some subset (max. 2) of {'x','y','z'} ; containes axes will have box dimension hardcoded, even if box is scaled as mean_radius is prescribed: scaling will be applied on the rest.
+				,fixedBoxDims;
 	
 		shared_ptr<TriaxialCompressionEngine> triaxialcompressionEngine;
 		shared_ptr<TriaxialStressController> triaxialstressController;