From 8ce75feb7a6b91bb98b71195819851d774811723 Mon Sep 17 00:00:00 2001 From: laurence Date: Thu, 5 Jan 2012 12:21:31 +0000 Subject: [PATCH 1/7] BUG: List constructor now uses deref op instead of operator()()- mantis #219 --- applications/test/List/Test-List.C | 31 +++++++++++++++++++++++ src/OpenFOAM/containers/Lists/List/List.C | 2 +- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/applications/test/List/Test-List.C b/applications/test/List/Test-List.C index 681e6796ef..ca303d53b7 100644 --- a/applications/test/List/Test-List.C +++ b/applications/test/List/Test-List.C @@ -37,6 +37,8 @@ Description #include "vector.H" #include "ListOps.H" +#include + using namespace Foam; @@ -117,6 +119,35 @@ int main(int argc, char *argv[]) << "-wordList: " << wLst << nl << "-stringList: " << sLst << endl; + + Info<< nl + << "Test List Iterator Constuctor" << endl; + + List initialList(IStringStream("((0 1 2) (3 4 5) (6 7 8))")()); + + Info<< " Initial List: " << initialList << endl; + + List iteratorList(initialList.begin(), initialList.end()); + + Info<< " Foam::List constructed from Foam::List: " + << iteratorList << endl; + + std::list stlList(initialList.begin(), initialList.end()); + + Info<< " std::list constructed from Foam::List: "; + + std::list::iterator it; + for (it=stlList.begin(); it != stlList.end(); it++) + { + Info<< *it << " "; + } + Info<< endl; + + List iteratorSTLList(stlList.begin(), stlList.end()); + + Info<< " Foam::List constructed from std::list: " + << iteratorList << endl; + return 0; } diff --git a/src/OpenFOAM/containers/Lists/List/List.C b/src/OpenFOAM/containers/Lists/List/List.C index 7e9e741a0e..5f97921e3d 100644 --- a/src/OpenFOAM/containers/Lists/List/List.C +++ b/src/OpenFOAM/containers/Lists/List/List.C @@ -200,7 +200,7 @@ Foam::List::List(InputIterator first, InputIterator last) ++iter ) { - this->operator[](s++) = iter(); + this->operator[](s++) = *iter; } } From e0824b96927cc0694369983bf9b728d79e2e9ba2 Mon Sep 17 00:00:00 2001 From: laurence Date: Thu, 5 Jan 2012 17:45:46 +0000 Subject: [PATCH 2/7] BUG: objToVTK: Do not print vertex normal header in vtk if none are in the obj --- .../utilities/mesh/manipulation/objToVTK/objToVTK.C | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/applications/utilities/mesh/manipulation/objToVTK/objToVTK.C b/applications/utilities/mesh/manipulation/objToVTK/objToVTK.C index 76babb0b8c..4ff721f485 100644 --- a/applications/utilities/mesh/manipulation/objToVTK/objToVTK.C +++ b/applications/utilities/mesh/manipulation/objToVTK/objToVTK.C @@ -273,12 +273,16 @@ int main(int argc, char *argv[]) } } - outFile << nl << "NORMALS pointNormals float\n"; - forAll(pointNormals, i) + if (!pointNormals.empty()) { - const vector& n = pointNormals[i]; + outFile << nl << "NORMALS pointNormals float\n"; - outFile << n.x() << ' ' << n.y() << ' ' << n.z() << nl; + forAll(pointNormals, i) + { + const vector& n = pointNormals[i]; + + outFile << n.x() << ' ' << n.y() << ' ' << n.z() << nl; + } } Info<< "End\n" << endl; From 05d2ab92dd55951214c9c5bdf24be7a4f6553b56 Mon Sep 17 00:00:00 2001 From: andy Date: Tue, 10 Jan 2012 11:48:32 +0000 Subject: [PATCH 3/7] ENH: Updated liquid evaporation/boiling model in lagrangian intermediate library --- .../LiquidEvaporationBoil.C | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporationBoil/LiquidEvaporationBoil.C b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporationBoil/LiquidEvaporationBoil.C index 651d95d1c6..ced9a98221 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporationBoil/LiquidEvaporationBoil.C +++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporationBoil/LiquidEvaporationBoil.C @@ -157,8 +157,8 @@ void Foam::LiquidEvaporationBoil::calculate // liquid volume fraction const scalarField X(liquids_.X(Yl)); - // droplet surface pressure - scalar ps = liquids_.pv(pc, T, X); + // droplet vapour surface pressure + scalar ps = liquids_.pv(pc, Ts, X); // vapour density at droplet surface [kg/m3] scalar rhos = ps*liquids_.W(X)/(specie::RR*Ts); @@ -178,66 +178,64 @@ void Foam::LiquidEvaporationBoil::calculate const label lid = liqToLiqMap_[i]; // boiling temperature at cell pressure for liquid species lid [K] - const scalar TBoil = liquids_.properties()[lid].pvInvert(pc); + const scalar TBoil = liquids_.properties()[lid].pvInvert(ps); // limit droplet temperature to boiling/critical temperature const scalar Td = min(T, 0.999*TBoil); // saturation pressure for liquid species lid [Pa] - const scalar pSat = liquids_.properties()[lid].pv(pc, Td); + const scalar pSat = liquids_.properties()[lid].pv(ps, Td); // carrier phase concentration const scalar Xc = XcMix[gid]; + if (Xc*pc > pSat) { // saturated vapour - no phase change } else { + // vapour diffusivity [m2/s] + const scalar Dab = liquids_.properties()[lid].D(ps, Td); + + // Schmidt number + const scalar Sc = nu/(Dab + ROOTVSMALL); + + // Sherwood number + const scalar Sh = this->Sh(Re, Sc); + + if (pSat > 0.999*pc) { // boiling -// const scalar deltaT = max(Tc - Td, 0.5); - const scalar deltaT = max(Tc - T, 0.5); + const scalar deltaT = max(T - TBoil, 0.5); // liquid specific heat capacity const scalar Cp = liquids_.properties()[lid].Cp(pc, Td); - // vapour heat of fomation + // vapour heat of formation const scalar hv = liquids_.properties()[lid].hl(pc, Td); - // Nusselt number - const scalar Nu = 2.0 + 0.6*sqrt(Re)*cbrt(Pr); - const scalar lg = log(1.0 + Cp*deltaT/max(SMALL, hv)); // mass transfer [kg] - dMassPC[lid] += pi*kappac*Nu*lg*d/Cp*dt; + // NOTE: Using Sherwood number instead of Nusselt number + dMassPC[lid] += pi*kappac*Sh*lg*d/Cp*dt; } else { // evaporation // surface molar fraction - Raoult's Law - const scalar Xs = X[lid]*pSat/pc; + const scalar Xs = X[lid]*pSat/ps; // molar ratio const scalar Xr = (Xs - Xc)/max(SMALL, 1.0 - Xs); - if (Xr > 0) { - // vapour diffusivity [m2/s] - const scalar Dab = liquids_.properties()[lid].D(pc, Td); - - // Schmidt number - const scalar Sc = nu/(Dab + ROOTVSMALL); - - // Sherwood number - const scalar Sh = this->Sh(Re, Sc); - // mass transfer coefficient [m/s] const scalar kc = Sh*Dab/(d + ROOTVSMALL); @@ -261,18 +259,24 @@ Foam::scalar Foam::LiquidEvaporationBoil::dh { scalar dh = 0; + scalar TDash = T; + if (liquids_.properties()[idl].pv(p, T) >= 0.999*p) + { + TDash = liquids_.properties()[idl].pvInvert(p); + } + typedef PhaseChangeModel parent; switch (parent::enthalpyTransfer_) { case (parent::etLatentHeat): { - dh = liquids_.properties()[idl].hl(p, T); + dh = liquids_.properties()[idl].hl(p, TDash); break; } case (parent::etEnthalpyDifference): { - scalar hc = this->owner().composition().carrier().H(idc, T); - scalar hp = liquids_.properties()[idl].h(p, T); + scalar hc = this->owner().composition().carrier().H(idc, TDash); + scalar hp = liquids_.properties()[idl].h(p, TDash); dh = hc - hp; break; From cd082ff459fa90a81bc7e88b0bf45514dcee0f82 Mon Sep 17 00:00:00 2001 From: andy Date: Tue, 10 Jan 2012 15:22:49 +0000 Subject: [PATCH 4/7] ENH: Further updates to liquid boiling model with contribution from Niklas Nordin --- .../LiquidEvaporationBoil.C | 86 ++++++++++++++----- .../LiquidEvaporationBoil.H | 11 ++- 2 files changed, 73 insertions(+), 24 deletions(-) diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporationBoil/LiquidEvaporationBoil.C b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporationBoil/LiquidEvaporationBoil.C index ced9a98221..9887cf3897 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporationBoil/LiquidEvaporationBoil.C +++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporationBoil/LiquidEvaporationBoil.C @@ -157,19 +157,12 @@ void Foam::LiquidEvaporationBoil::calculate // liquid volume fraction const scalarField X(liquids_.X(Yl)); - // droplet vapour surface pressure + // droplet surface pressure assumed to surface vapour pressure scalar ps = liquids_.pv(pc, Ts, X); // vapour density at droplet surface [kg/m3] scalar rhos = ps*liquids_.W(X)/(specie::RR*Ts); - // thermal conductivity of carrier [W/m/K] - scalar kappac = 0.0; - forAll(this->owner().thermo().carrier().Y(), i) - { - const scalar Yc = this->owner().thermo().carrier().Y()[i][cellI]; - kappac += Yc*this->owner().thermo().carrier().kappa(i, Ts); - } // calculate mass transfer of each specie in liquid forAll(activeLiquids_, i) @@ -178,13 +171,13 @@ void Foam::LiquidEvaporationBoil::calculate const label lid = liqToLiqMap_[i]; // boiling temperature at cell pressure for liquid species lid [K] - const scalar TBoil = liquids_.properties()[lid].pvInvert(ps); + const scalar TBoil = liquids_.properties()[lid].pvInvert(pc); // limit droplet temperature to boiling/critical temperature const scalar Td = min(T, 0.999*TBoil); // saturation pressure for liquid species lid [Pa] - const scalar pSat = liquids_.properties()[lid].pv(ps, Td); + const scalar pSat = liquids_.properties()[lid].pv(pc, Td); // carrier phase concentration const scalar Xc = XcMix[gid]; @@ -197,7 +190,7 @@ void Foam::LiquidEvaporationBoil::calculate else { // vapour diffusivity [m2/s] - const scalar Dab = liquids_.properties()[lid].D(ps, Td); + const scalar Dab = liquids_.properties()[lid].D(ps, Ts); // Schmidt number const scalar Sc = nu/(Dab + ROOTVSMALL); @@ -212,35 +205,82 @@ void Foam::LiquidEvaporationBoil::calculate const scalar deltaT = max(T - TBoil, 0.5); - // liquid specific heat capacity - const scalar Cp = liquids_.properties()[lid].Cp(pc, Td); + scalar Hsc = 0.0; + scalar Hc = 0.0; + scalar Cpc = 0.0; + scalar kappac = 0.0; + forAll(this->owner().thermo().carrier().Y(), i) + { + scalar Yc = this->owner().thermo().carrier().Y()[i][cellI]; + Hc += Yc*this->owner().thermo().carrier().H(i, Tc); + Hsc += Yc*this->owner().thermo().carrier().H(i, Ts); + Cpc += Yc*this->owner().thermo().carrier().Cp(i, Ts); + kappac += Yc*this->owner().thermo().carrier().kappa(i, Ts); + } // vapour heat of formation const scalar hv = liquids_.properties()[lid].hl(pc, Td); - const scalar lg = log(1.0 + Cp*deltaT/max(SMALL, hv)); + // empirical heat transfer coefficient W/m2/K + scalar alphaS = 0.0; + if (deltaT < 5.0) + { + alphaS = 760.0*pow(deltaT, 0.26); + } + else if (deltaT < 25.0) + { + alphaS = 27.0*pow(deltaT, 2.33); + } + else + { + alphaS = 13800.0*pow(deltaT, 0.39); + } - // mass transfer [kg] - // NOTE: Using Sherwood number instead of Nusselt number - dMassPC[lid] += pi*kappac*Sh*lg*d/Cp*dt; + // flash-boil vaporisation rate + const scalar Gf = alphaS*deltaT*pi*sqr(d)/hv; + + // model constants + // NOTE: using Sherwood number instead of Nusselt number + const scalar A = (Hc - Hsc)/hv; + const scalar B = pi*kappac/Cpc*d*Sh; + + scalar G = 0.0; + if (A > 0.0) + { + // heat transfer from the surroundings contributes + // to the vaporisation process + scalar Gr = 1e-5; + + for (label i=0; i<50; i++) + { + scalar GrDash = Gr; + + G = B/(1.0 + Gr)*log(1.0 + A*(1.0 + Gr)); + Gr = Gf/G; + + if (mag(Gr - GrDash)/GrDash < 1e-3) + { + break; + } + } + } + + dMassPC[lid] += (G + Gf)*dt; } else { // evaporation // surface molar fraction - Raoult's Law - const scalar Xs = X[lid]*pSat/ps; + const scalar Xs = X[lid]*pSat/pc; // molar ratio const scalar Xr = (Xs - Xc)/max(SMALL, 1.0 - Xs); if (Xr > 0) { - // mass transfer coefficient [m/s] - const scalar kc = Sh*Dab/(d + ROOTVSMALL); - // mass transfer [kg] - dMassPC[lid] += pi*sqr(d)*kc*rhos*log(1.0 + Xr)*dt; + dMassPC[lid] += pi*d*Sh*Dab*rhos*log(1.0 + Xr)*dt; } } } @@ -291,7 +331,7 @@ Foam::scalar Foam::LiquidEvaporationBoil::dh "const label, " "const label, " "const label" - ")" + ") const" ) << "Unknown enthalpyTransfer type" << abort(FatalError); } } diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporationBoil/LiquidEvaporationBoil.H b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporationBoil/LiquidEvaporationBoil.H index f16ea47be9..48d92292cd 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporationBoil/LiquidEvaporationBoil.H +++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporationBoil/LiquidEvaporationBoil.H @@ -27,7 +27,16 @@ Class Description Liquid evaporation model - uses ideal gas assumption - - includes boiling model + - includes boiling model based on: + + \verbatim + "Studies of Superheated Fuel Spray Structures and Vaporization in + GDI Engines" + + Zuo, B., Gomes, A. M. and Rutland C. J. + + International Journal of Engine Research, 2000, Vol. 1(4), pp. 321-336 + \endverbatim \*---------------------------------------------------------------------------*/ From 5cb322dbdc9237d6d4910d2b353c437aff58c3b4 Mon Sep 17 00:00:00 2001 From: andy Date: Tue, 10 Jan 2012 15:24:32 +0000 Subject: [PATCH 5/7] ENH: Restricted pEqn maxIter to 20 for parcel evaporation tutorial case --- .../parcelInBox/system/fvSolution | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/parcelInBox/system/fvSolution b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/parcelInBox/system/fvSolution index 6622d336f4..b4db5d1593 100644 --- a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/parcelInBox/system/fvSolution +++ b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/parcelInBox/system/fvSolution @@ -59,6 +59,7 @@ solvers nCellsInCoarsestLevel 10; agglomerator faceAreaPair; mergeLevels 1; + maxIter 20; } pFinal @@ -66,7 +67,6 @@ solvers $p; tolerance 1e-06; relTol 0; - maxIter 20; } "(Yi|O2|N2|H2O)" From 396ba5f24e77c5254ccd78d8d9eb01ebf1d106b6 Mon Sep 17 00:00:00 2001 From: andy Date: Tue, 10 Jan 2012 15:29:04 +0000 Subject: [PATCH 6/7] ENH: Further updates to liquid boiling code --- .../LiquidEvaporationBoil.C | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporationBoil/LiquidEvaporationBoil.C b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporationBoil/LiquidEvaporationBoil.C index 9887cf3897..643beb55e1 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporationBoil/LiquidEvaporationBoil.C +++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporationBoil/LiquidEvaporationBoil.C @@ -163,6 +163,19 @@ void Foam::LiquidEvaporationBoil::calculate // vapour density at droplet surface [kg/m3] scalar rhos = ps*liquids_.W(X)/(specie::RR*Ts); + // carrier thermo properties + scalar Hsc = 0.0; + scalar Hc = 0.0; + scalar Cpc = 0.0; + scalar kappac = 0.0; + forAll(this->owner().thermo().carrier().Y(), i) + { + scalar Yc = this->owner().thermo().carrier().Y()[i][cellI]; + Hc += Yc*this->owner().thermo().carrier().H(i, Tc); + Hsc += Yc*this->owner().thermo().carrier().H(i, Ts); + Cpc += Yc*this->owner().thermo().carrier().Cp(i, Ts); + kappac += Yc*this->owner().thermo().carrier().kappa(i, Ts); + } // calculate mass transfer of each specie in liquid forAll(activeLiquids_, i) @@ -205,19 +218,6 @@ void Foam::LiquidEvaporationBoil::calculate const scalar deltaT = max(T - TBoil, 0.5); - scalar Hsc = 0.0; - scalar Hc = 0.0; - scalar Cpc = 0.0; - scalar kappac = 0.0; - forAll(this->owner().thermo().carrier().Y(), i) - { - scalar Yc = this->owner().thermo().carrier().Y()[i][cellI]; - Hc += Yc*this->owner().thermo().carrier().H(i, Tc); - Hsc += Yc*this->owner().thermo().carrier().H(i, Ts); - Cpc += Yc*this->owner().thermo().carrier().Cp(i, Ts); - kappac += Yc*this->owner().thermo().carrier().kappa(i, Ts); - } - // vapour heat of formation const scalar hv = liquids_.properties()[lid].hl(pc, Td); From e615b0b401877134ea32084292f94eb960caa80a Mon Sep 17 00:00:00 2001 From: andy Date: Tue, 10 Jan 2012 15:31:01 +0000 Subject: [PATCH 7/7] STYLE: Corrected comment in error message --- .../PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.C | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.C b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.C index d2825055ba..e5948b85a7 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.C +++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.C @@ -232,7 +232,7 @@ Foam::scalar Foam::LiquidEvaporation::dh "const label, " "const label, " "const label" - ")" + ") const" ) << "Unknown enthalpyTransfer type" << abort(FatalError); } }