← Back to team overview

yade-dev team mailing list archive

[Branch ~yade-pkg/yade/git-trunk] Rev 3934: Including interface orientation data in CapillaryPhys code

 

------------------------------------------------------------
revno: 3934
committer: jduriez <jerome.duriez@xxxxxxxxxxx>
timestamp: Wed 2016-09-21 10:20:15 -0600
message:
  Including interface orientation data in CapillaryPhys code
modified:
  pkg/dem/CapillaryPhys.hpp
  pkg/dem/Law2_ScGeom_CapillaryPhys_Capillarity.cpp
  pkg/dem/Law2_ScGeom_CapillaryPhys_Capillarity.hpp


--
lp:yade
https://code.launchpad.net/~yade-pkg/yade/git-trunk

Your team Yade developers is subscribed to branch lp:yade.
To unsubscribe from this branch go to https://code.launchpad.net/~yade-pkg/yade/git-trunk/+edit-subscription
=== modified file 'pkg/dem/CapillaryPhys.hpp'
--- pkg/dem/CapillaryPhys.hpp	2015-05-22 05:46:49 +0000
+++ pkg/dem/CapillaryPhys.hpp	2016-09-21 16:20:15 +0000
@@ -26,6 +26,8 @@
 				 ((Real,Delta2,0.,,"Defines the surface area wetted by the meniscus on the biggest grains of radius R2 (R1<R2)"))
 				 ((Vector3r,fCap,Vector3r::Zero(),,"Capillary force produced by the presence of the meniscus. This is the force acting on particle #2"))
 				 ((short int,fusionNumber,0.,,"Indicates the number of meniscii that overlap with this one"))
+				 ((Real,nn11,0.,,":math:`\\iint_A n_1 n_1 \\, dS = \\iint_A n_2 n_2 \\, dS`, $A$ being the liquid-gas surface of the meniscus, $\\vec n$ the associated normal, and $(1,2,3)$ a local basis with $3$ the meniscus orientation (:yref:`ScGeom.normal`). NB: $A$ = 2 :yref:`nn11<CapillaryPhys.nn11>` + :yref:`nn33<CapillaryPhys.nn33>`."))
+				 ((Real,nn33,0.,,":math:`\\iint_A n_3 n_3 \\, dS`, $A$ being the liquid-gas surface of the meniscus, $\\vec n$ the associated normal, and $(1,2,3)$ a local basis with $3$ the meniscus orientation (:yref:`ScGeom.normal`). NB: $A$ = 2 :yref:`nn11<CapillaryPhys.nn11>` + :yref:`nn33<CapillaryPhys.nn33>`."))
 				 ,,
 				 createIndex();currentIndexes[0]=currentIndexes[1]=currentIndexes[2]=currentIndexes[3]=0;
 				 ,

=== modified file 'pkg/dem/Law2_ScGeom_CapillaryPhys_Capillarity.cpp'
--- pkg/dem/Law2_ScGeom_CapillaryPhys_Capillarity.cpp	2016-07-25 19:26:13 +0000
+++ pkg/dem/Law2_ScGeom_CapillaryPhys_Capillarity.cpp	2016-09-21 16:20:15 +0000
@@ -21,16 +21,16 @@
 void Law2_ScGeom_CapillaryPhys_Capillarity::postLoad(Law2_ScGeom_CapillaryPhys_Capillarity&){
 
   capillary = shared_ptr<capillarylaw>(new capillarylaw);
-  capillary->fill("M(r=1)");
-  capillary->fill("M(r=1.1)");
-  capillary->fill("M(r=1.25)");
-  capillary->fill("M(r=1.5)");
-  capillary->fill("M(r=1.75)");
-  capillary->fill("M(r=2)");
-  capillary->fill("M(r=3)");
-  capillary->fill("M(r=4)");
-  capillary->fill("M(r=5)");
-  capillary->fill("M(r=10)");
+  capillary->fill(("M(r=1)"+suffCapFiles).c_str());
+  capillary->fill(("M(r=1.1)"+suffCapFiles).c_str());
+  capillary->fill(("M(r=1.25)"+suffCapFiles).c_str());
+  capillary->fill(("M(r=1.5)"+suffCapFiles).c_str());
+  capillary->fill(("M(r=1.75)"+suffCapFiles).c_str());
+  capillary->fill(("M(r=2)"+suffCapFiles).c_str());
+  capillary->fill(("M(r=3)"+suffCapFiles).c_str());
+  capillary->fill(("M(r=4)"+suffCapFiles).c_str());
+  capillary->fill(("M(r=5)"+suffCapFiles).c_str());
+  capillary->fill(("M(r=10)"+suffCapFiles).c_str());
 }
 
 
@@ -40,6 +40,8 @@
         F = 0;
         delta1 = 0;
         delta2 = 0;
+        nn11 = 0;
+        nn33 = 0;
 }
 
 MeniscusParameters::MeniscusParameters(const MeniscusParameters &source)
@@ -48,6 +50,8 @@
         F = source.F;
         delta1 = source.delta1;
         delta2 = source.delta2;
+        nn11 = source.nn11;
+        nn33 = source.nn33;
 }
 
 MeniscusParameters::~MeniscusParameters()
@@ -162,12 +166,17 @@
 				
 				/// wetting angles
 				if (!hertzOn) {
-					cundallContactPhysics->Delta1 = max(solution.delta1,solution.delta2);
+					cundallContactPhysics->Delta1 = min(max(solution.delta1,solution.delta2),90.0); // undesired values greater than 90 degrees (by few degrees) may be present in the capillary files for high r (~ 10) and very low suction and distance
 					cundallContactPhysics->Delta2 = min(solution.delta1,solution.delta2);
 				} else {
-					mindlinContactPhysics->Delta1 = max(solution.delta1,solution.delta2);
+					mindlinContactPhysics->Delta1 = min(max(solution.delta1,solution.delta2),90.0);
 					mindlinContactPhysics->Delta2 = min(solution.delta1,solution.delta2);
 				}
+				// nn11 and nn33
+				if (!hertzOn) {
+					cundallContactPhysics->nn11 = pow(R2/alpha,2) * solution.nn11;
+					cundallContactPhysics->nn33 = pow(R2/alpha,2) * solution.nn33;
+				}
 			}
 		///interaction is not real	//If the interaction is not real, it should not be in the list
 		} else if (fusionDetection) bodiesMenisciiList.remove(interaction);
@@ -286,7 +295,7 @@
 }
 
 MeniscusParameters capillarylaw::interpolate(Real R1, Real R2, Real D, Real P, int* index)
-{	//cerr << "interpolate" << endl;
+{
         if (R1 > R2) {
                 Real R3 = R1;
                 R1 = R2;
@@ -320,6 +329,8 @@
                         result.F = result_inf.F*(1-r) + r*result_sup.F;
                         result.delta1 = result_inf.delta1*(1-r) + r*result_sup.delta1;
                         result.delta2 = result_inf.delta2*(1-r) + r*result_sup.delta2;
+                        result.nn11 = result_inf.nn11*(1-r) + r*result_sup.nn11;
+                        result.nn33 = result_inf.nn33*(1-r) + r*result_sup.nn33;
 
                         i=NB_R_VALUES;
                         //cerr << "i = " << i << endl;
@@ -329,7 +340,6 @@
                 {
                         result = data_complete[i].Interpolate2(D,P, index[0], index[1]);
                         i=NB_R_VALUES;
-                        //cerr << "i = " << i << endl;
                 }
         }
         return result;
@@ -343,7 +353,6 @@
 {
         ifstream file (filename);
         file >> R;
-        //cerr << "r = " << R << endl;
         int n_D;	//number of D values
         file >> n_D;
 
@@ -373,7 +382,7 @@
         MeniscusParameters result_inf;
         MeniscusParameters result_sup;
 
-        for ( unsigned int i=0; i < full_data.size(); ++i)
+        for ( unsigned int i=0; i < full_data.size(); ++i) // loop over D values
         {
                 if (full_data[i].D > D )	// ok si D rang�s ds l'ordre croissant
 
@@ -387,6 +396,8 @@
                         result.F = result_inf.F*(1-rD) + rD*result_sup.F;
                         result.delta1 = result_inf.delta1*(1-rD) + rD*result_sup.delta1;
                         result.delta2 = result_inf.delta2*(1-rD) + rD*result_sup.delta2;
+                        result.nn11 = result_inf.nn11*(1-rD) + rD*result_sup.nn11;
+                        result.nn33 = result_inf.nn33*(1-rD) + rD*result_sup.nn33;
 
                         i = full_data.size();
                 }
@@ -410,19 +421,20 @@
         Real x;
         int n_lines;	//pb: n_lines is real!!!
         file >> n_lines;
-        //cout << n_lines << endl;
 
         file.ignore(200, '\n'); // saute les caract�res (200 au maximum) jusque au caract�re \n (fin de ligne)*_
 
         if (n_lines!=0)
                 for (; i<n_lines; ++i) {
                         data.push_back(vector<Real> ());
-                        for (int j=0; j < 6; ++j)	// [D,P,V,F,delta1,delta2]
+                        for (int j=0; j < 8; ++j)	// [D,P,V,F,delta1,delta2,nn11,nn33]
                         {
                                 file >> x;
                                 data[i].push_back(x);
                         }
                 }
+        else
+                LOG_ERROR("Problem regarding the capillary file structure (e.g. n_D is not consistent with the actual data), and/or mismatch with the expected structure by the code ! Will segfault");
         D = data[i-1][0];
 }
 
@@ -441,17 +453,23 @@
                         Real Vinf=data[index-1][2];
                         Real Delta1inf=data[index-1][4];
                         Real Delta2inf=data[index-1][5];
+                        Real nn11inf = data[index-1][6];
+                        Real nn33inf = data[index-1][7];
 
                         Real Psup=data[index][1];
                         Real Fsup=data[index][3];
                         Real Vsup=data[index][2];
                         Real Delta1sup=data[index][4];
                         Real Delta2sup=data[index][5];
+                        Real nn11sup = data[index][6];
+                        Real nn33sup = data[index][7];
 
                         result.V = Vinf+((Vsup-Vinf)/(Psup-Pinf))*(P-Pinf);
                         result.F = Finf+((Fsup-Finf)/(Psup-Pinf))*(P-Pinf);
                         result.delta1 = Delta1inf+((Delta1sup-Delta1inf)/(Psup-Pinf))*(P-Pinf);
                         result.delta2 = Delta2inf+((Delta2sup-Delta2inf)/(Psup-Pinf))*(P-Pinf);
+                        result.nn11 = nn11inf + (nn11sup - nn11inf) / (Psup-Pinf) * (P-Pinf);
+                        result.nn33 = nn33inf + (nn33sup - nn33inf) / (Psup-Pinf) * (P-Pinf);
                         return result;
 
         	}
@@ -459,37 +477,45 @@
 	//compteur2+=1;
         for (int k=1; k < dataSize; ++k) 	// Length(data) ??
 
-        {	//cerr << "k = " << k << endl;
+        {
                 if ( data[k][1] > P) 	// OK si P rangés ds l'ordre croissant
 
-                {	//cerr << "if" << endl;
+                {
                         Real Pinf=data[k-1][1];
                         Real Finf=data[k-1][3];
                         Real Vinf=data[k-1][2];
                         Real Delta1inf=data[k-1][4];
                         Real Delta2inf=data[k-1][5];
+                        Real nn11inf = data[k-1][6];
+                        Real nn33inf = data[k-1][7];
 
                         Real Psup=data[k][1];
                         Real Fsup=data[k][3];
                         Real Vsup=data[k][2];
                         Real Delta1sup=data[k][4];
                         Real Delta2sup=data[k][5];
+                        Real nn11sup = data[k][6];
+                        Real nn33sup = data[k][7];
 
                         result.V = Vinf+((Vsup-Vinf)/(Psup-Pinf))*(P-Pinf);
                         result.F = Finf+((Fsup-Finf)/(Psup-Pinf))*(P-Pinf);
                         result.delta1 = Delta1inf+((Delta1sup-Delta1inf)/(Psup-Pinf))*(P-Pinf);
                         result.delta2 = Delta2inf+((Delta2sup-Delta2inf)/(Psup-Pinf))*(P-Pinf);
+                        result.nn11 = nn11inf + (nn11sup - nn11inf) / (Psup-Pinf) * (P-Pinf);
+                        result.nn33 = nn33inf + (nn33sup - nn33inf) / (Psup-Pinf) * (P-Pinf);
                         index = k;
 
                         k=dataSize;
                 }
                 else if (data[k][1] == P)
 
-                {	//cerr << "elseif" << endl;
+                {
                         result.V = data[k][2];
                         result.F = data[k][3];
                         result.delta1 = data[k][4];
                         result.delta2 = data[k][5];
+                        result.nn11= data[k][6];
+                        result.nn33= data[k][7];
                         index = k;
 
                         k=dataSize;

=== modified file 'pkg/dem/Law2_ScGeom_CapillaryPhys_Capillarity.hpp'
--- pkg/dem/Law2_ScGeom_CapillaryPhys_Capillarity.hpp	2015-07-14 22:25:36 +0000
+++ pkg/dem/Law2_ScGeom_CapillaryPhys_Capillarity.hpp	2016-09-21 16:20:15 +0000
@@ -37,6 +37,8 @@
 	Real F; // adimentionnal capillary force for this meniscus : true force / ( 2 * pi * Rmax * superficial tension), (30) of Annexe1 of Scholtes2009d
 	Real delta1; // angle defined Fig 2.5 Scholtes2009d
 	Real delta2; // angle defined Fig 2.5 Scholtes2009d
+	Real nn11; // CapillaryPhys.nn11 / R2^2
+	Real nn33; // CapillaryPhys.nn33 / R2^2
 	int index1;
 	int index2;
 
@@ -94,6 +96,7 @@
 	((bool,binaryFusion,true,,"If true, capillary forces are set to zero as soon as, at least, 1 overlap (menisci fusion) is detected. Otherwise :yref:`fCap<CapillaryPhys.fCap>` = :yref:`fCap<CapillaryPhys.fCap>` / (:yref:`fusionNumber<CapillaryPhys.fusionNumber>` + 1 )"))
 	((bool,createDistantMeniscii,false,,"Generate meniscii between distant spheres? Else only maintain the existing ones. For modeling a wetting path this flag should always be false. For a drying path it should be true for one step (initialization) then false, as in the logic of [Scholtes2009c]_"))
         ((Real,surfaceTension,0.073,,"Value of considered surface tension")) // (0.073 N/m is water tension at 20 Celsius degrees)
+	((string,suffCapFiles,"",,"Capillary files suffix: M(r=X)suffCapFiles"))
 	,,/*constructor*/
 	hertzInitialized = false;
 	hertzOn = false;
@@ -107,7 +110,7 @@
 	public:
 		Real D; // one cst D value in each TableauD (the one appearing last line of corresponding group D=cst in the capillary file)
 		std::vector<std::vector<Real> > data;
-		MeniscusParameters Interpolate3(Real P, int& index);
+		MeniscusParameters Interpolate3(Real P, int& index); // does the interpolation on uc*
 		TableauD();
   		TableauD(std::ifstream& file);
   		~TableauD();
@@ -122,14 +125,14 @@
 	public: 
 		Real R;
 		std::vector<TableauD> full_data; // members of full_data are the different TableauD, for different D.
-		MeniscusParameters Interpolate2(Real D, Real P, int& index1, int& index2);		
+		MeniscusParameters Interpolate2(Real D, Real P, int& index1, int& index2); // does the interpolation on d* (returning no meniscus when d* > the greatest D of the file)
 		std::ifstream& operator<< (std::ifstream& file);		
 		Tableau();
     		Tableau(const char* filename);
     		~Tableau();
 };
 
-class capillarylaw // the whole set of capillary files M(r=..)
+class capillarylaw // class for a whole set of capillary files M(r=..)
 {
 	public:
 		capillarylaw();