yade-dev team mailing list archive
-
yade-dev team
-
Mailing list archive
-
Message #12935
[Branch ~yade-pkg/yade/git-trunk] Rev 3978: merging PhaseCluster code with r3975
------------------------------------------------------------
revno: 3978
committer: bchareyre <bruno.chareyre@xxxxxxxxxxxxxxx>
timestamp: Wed 2016-11-23 15:35:05 +0100
message:
merging PhaseCluster code with r3975
modified:
pkg/pfv/TwoPhaseFlowEngine.cpp
pkg/pfv/TwoPhaseFlowEngine.hpp
pkg/pfv/UnsaturatedEngine.cpp
--
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/pfv/TwoPhaseFlowEngine.cpp'
--- pkg/pfv/TwoPhaseFlowEngine.cpp 2016-11-23 10:43:14 +0000
+++ pkg/pfv/TwoPhaseFlowEngine.cpp 2016-11-23 14:35:05 +0000
@@ -17,6 +17,9 @@
#ifdef TWOPHASEFLOW
YADE_PLUGIN((TwoPhaseFlowEngineT));
YADE_PLUGIN((TwoPhaseFlowEngine));
+YADE_PLUGIN((PhaseCluster));
+
+PhaseCluster::~PhaseCluster(){}
void TwoPhaseFlowEngine::initialization()
{
@@ -618,24 +621,35 @@
{
RTriangulation& tri = solver->T[solver->currentTes].Triangulation();
FiniteCellsIterator cellEnd = tri.finite_cells_end();
+ clusters[0]->reset(); clusters[1]->reset();
for ( FiniteCellsIterator cell = tri.finite_cells_begin(); cell != cellEnd; cell++ ) {
- if (cell->info().isNWRes) cell->info().label=0;
- else if (cell->info().isWRes) cell->info().label=1;
+ if (cell->info().isNWRes) {cell->info().label=0; clusters[0]->pores.push_back(cell);}
+ else if (cell->info().isWRes) {cell->info().label=1; clusters[1]->pores.push_back(cell);
+ for (int facet = 0; facet < 4; facet ++) if (!cell->neighbor(facet)->info().isWRes) clusterGetFacet(clusters[1].get(),cell,facet);}
else if (cell->info().label>1) continue;
else cell->info().label=-1;
}
}
-void TwoPhaseFlowEngine:: updateCellLabel()
+void TwoPhaseFlowEngine::clusterGetFacet(PhaseCluster* cluster, CellHandle cell, int facet) {
+ cell->info().hasInterface = true;
+ cluster->interfacialArea += cell->info().poreThroatRadius[facet];//FIXME: define area correctly
+ if (cluster->entryRadius < cell->info().poreThroatRadius[facet]){
+ cluster->entryRadius = cell->info().poreThroatRadius[facet];
+ cluster->entryPore = cell->info().index;
+ }
+}
+
+void TwoPhaseFlowEngine::updateCellLabel()
{
- int currentLabel = getMaxCellLabel();
+ int currentLabel = getMaxCellLabel();//FIXME: A loop on cells for each new label?? is it serious??
updateReservoirLabel();
RTriangulation& tri = solver->T[solver->currentTes].Triangulation();
FiniteCellsIterator cellEnd = tri.finite_cells_end();
for ( FiniteCellsIterator cell = tri.finite_cells_begin(); cell != cellEnd; cell++ ) {
if (cell->info().label==-1) {
- clusters.push_back(shared_ptr<PhaseCluster>(new PhaseCluster));
- updateSingleCellLabelRecursion(cell,currentLabel+1,clusters.back()->pores);
+ clusters.push_back(shared_ptr<PhaseCluster> (new PhaseCluster()));
+ updateSingleCellLabelRecursion(cell,currentLabel+1,clusters.back().get());
currentLabel++;
}
}
@@ -652,10 +666,10 @@
return maxLabel;
}
-void TwoPhaseFlowEngine:: updateSingleCellLabelRecursion(CellHandle cell, int label, std::vector<CellHandle> *outputVector)
+void TwoPhaseFlowEngine::updateSingleCellLabelRecursion(CellHandle cell, int label, PhaseCluster* cluster)
{
cell->info().label=label;
- if (outputVector) outputVector->push_back(cell);
+ cluster->pores.push_back(cell);
for (int facet = 0; facet < 4; facet ++) {
CellHandle nCell = cell->neighbor(facet);
if (solver->T[solver->currentTes].Triangulation().is_infinite(nCell)) continue;
@@ -663,7 +677,10 @@
// if ( (nCell->info().isFictious) && (!isInvadeBoundary) ) continue;
//TODO:the following condition may relax to relate to nCell->info().hasInterface
if ( (nCell->info().saturation==cell->info().saturation) && (nCell->info().label!=cell->info().label) )
- updateSingleCellLabelRecursion(nCell,label,outputVector);
+ updateSingleCellLabelRecursion(nCell,label,cluster);
+ else {
+ clusterGetFacet(cluster,cell,facet);
+ }
}
}
=== modified file 'pkg/pfv/TwoPhaseFlowEngine.hpp'
--- pkg/pfv/TwoPhaseFlowEngine.hpp 2016-11-23 10:43:14 +0000
+++ pkg/pfv/TwoPhaseFlowEngine.hpp 2016-11-23 14:35:05 +0000
@@ -62,22 +62,23 @@
class PhaseCluster : public Serializable
{
double totalCellVolume;
+// CellHandle entryPoreHandle;
public :
virtual ~PhaseCluster();
- vector<TwoPhaseFlowEngineT::CellHandle>* pores;
+ vector<TwoPhaseFlowEngineT::CellHandle> pores;
TwoPhaseFlowEngineT::RTriangulation* tri;
+ void reset() {label=entryPore=-1;volume=entryRadius=interfacialArea=0; pores.clear();}
+
YADE_CLASS_BASE_DOC_ATTRS_INIT_CTOR_PY(PhaseCluster,Serializable,"Preliminary.",
((int,label,-1,,"Unique label of this cluster, should be reflected in pores of this cluster."))
((double,volume,0,,"cumulated volume of all pores."))
- ((double,entryPc,0,,"smallest entry capillary pressure."))
- ((int,entryPore,0,,"the pore of the cluster incident to the throat with smallest entry Pc."))
+ ((double,entryRadius,0,,"smallest entry capillary pressure."))
+ ((int,entryPore,-1,,"the pore of the cluster incident to the throat with smallest entry Pc."))
((double,interfacialArea,0,,"interfacial area of the cluster"))
,,,
)
};
REGISTER_SERIALIZABLE(PhaseCluster);
-YADE_PLUGIN((PhaseCluster));
-PhaseCluster::~PhaseCluster(){}
class TwoPhaseFlowEngine : public TwoPhaseFlowEngineT
{
@@ -126,7 +127,7 @@
void checkTrap(double pressure);
void updateReservoirLabel();
void updateCellLabel();
- void updateSingleCellLabelRecursion(CellHandle cell, int label, std::vector<CellHandle> *outputVector=NULL);
+ void updateSingleCellLabelRecursion(CellHandle cell, int label, PhaseCluster* cluster);
int getMaxCellLabel();
void invasion2();//without-trap
@@ -153,6 +154,11 @@
}
bool detectBridge(RTriangulation::Finite_edges_iterator& edge);
+ boost::python::list pyClusters() { boost::python::list ret;
+ for(vector<shared_ptr<PhaseCluster> >::iterator it=clusters.begin(); it!=clusters.end(); ++it) ret.append(*it);
+ return ret;}
+ void clusterGetFacet(PhaseCluster* cluster, CellHandle cell, int facet);//update cluster inetrfacial area and max entry radius wrt to a facet
+
//post-processing
void savePoreNetwork();
void saveVtk(const char* folder) {bool initT=solver->noCache; solver->noCache=false; solver->saveVtk(folder); solver->noCache=initT;}
@@ -210,7 +216,7 @@
((bool, isImbibitionActivated, false,, "Activates imbibition."))
- ,/*TwoPhaseFlowEngineT()*/,
+ ,/*clusters.resize(2);*//*TwoPhaseFlowEngineT()*/,
,
.def("getCellIsFictious",&TwoPhaseFlowEngine::cellIsFictious,"Check the connection between pore and boundary. If true, pore throat connects the boundary.")
.def("setCellIsNWRes",&TwoPhaseFlowEngine::setCellIsNWRes,"set status whether 'wetting reservoir' state")
@@ -239,6 +245,7 @@
.def("computeCapillaryForce",&TwoPhaseFlowEngine::computeCapillaryForce,"Compute capillary force. ")
.def("saveVtk",&TwoPhaseFlowEngine::saveVtk,(boost::python::arg("folder")="./VTK"),"Save pressure field in vtk format. Specify a folder name for output.")
.def("getPotentialPendularSpheresPair",&TwoPhaseFlowEngine::getPotentialPendularSpheresPair,"Get the list of sphere ID pairs of potential pendular liquid bridge.")
+ .def("getClusters",&TwoPhaseFlowEngine::pyClusters/*,(boost::python::arg("folder")="./VTK")*/,"Get the list of clusters.")
)
DECLARE_LOGGER;
=== modified file 'pkg/pfv/UnsaturatedEngine.cpp'
--- pkg/pfv/UnsaturatedEngine.cpp 2016-11-23 10:43:14 +0000
+++ pkg/pfv/UnsaturatedEngine.cpp 2016-11-23 14:35:05 +0000
@@ -37,27 +37,7 @@
double getSpecificInterfacialArea();
void printSomething();
-
- boost::python::list getPotentialPendularSpheresPair() {
- RTriangulation& Tri = solver->T[solver->currentTes].Triangulation();
- boost::python::list bridgeIds;
- FiniteEdgesIterator ed_it = Tri.finite_edges_begin();
- for ( ; ed_it!=Tri.finite_edges_end(); ed_it++ ) {
- if (detectBridge(ed_it)==true) {
- const VertexInfo& vi1=(ed_it->first)->vertex(ed_it->second)->info();
- const VertexInfo& vi2=(ed_it->first)->vertex(ed_it->third)->info();
- const int& id1 = vi1.id();
- const int& id2 = vi2.id();
- bridgeIds.append(boost::python::make_tuple(id1,id2));}}
- return bridgeIds;}
- bool detectBridge(RTriangulation::Finite_edges_iterator& edge);
-
- boost::python::list pyClusters() { boost::python::list ret;
- for(vector<shared_ptr<PhaseCluster> >::iterator it=clusters.begin(); it!=clusters.end(); ++it) ret.append(*it);
- return ret;}
-
virtual ~UnsaturatedEngine();
-
virtual void action();
YADE_CLASS_BASE_DOC_ATTRS_INIT_CTOR_PY(UnsaturatedEngine,TwoPhaseFlowEngine,"Preliminary version engine of a drainage model for unsaturated soils. Note:Air reservoir is on the top; water reservoir is on the bottom.(deprecated engine, use TwoPhaseFlowEngine instead)",
@@ -74,8 +54,6 @@
.def("getWindowsSaturation",&UnsaturatedEngine::getWindowsSaturation,(boost::python::arg("windowsID"),boost::python::arg("isSideBoundaryIncluded")), "get saturation of subdomain with windowsID. If isSideBoundaryIncluded=false (default), the pores of side boundary are excluded in saturation calculating; if isSideBoundaryIncluded=true (only in isInvadeBoundary=true drainage mode), the pores of side boundary are included in saturation calculating.")
.def("initializeCellWindowsID",&UnsaturatedEngine::initializeCellWindowsID,"Initialize cell windows index. A temporary function for comparison with experiments, will delete soon")
.def("printSomething",&UnsaturatedEngine::printSomething,"print debug.")
- .def("getPotentialPendularSpheresPair",&UnsaturatedEngine::getPotentialPendularSpheresPair,"Get the list of sphere ID pairs of potential pendular liquid bridge.")
- .def("getClusters",&UnsaturatedEngine::pyClusters/*,(boost::python::arg("folder")="./VTK")*/,"Get the list of clusters.")
)
DECLARE_LOGGER;
};