From 62489f316517e0c6fe9bb6bf7f3d8dac7b2d5b7a Mon Sep 17 00:00:00 2001 From: danielque Date: Fri, 26 Jul 2019 16:29:22 +0200 Subject: [PATCH 1/3] try to increase precision of tsf calculation cf. CFDEMcoupling-PUBLIC --- .../dataExchangeModel/dataExchangeModel.C | 5 +++-- .../dataExchangeModel/dataExchangeModel.H | 15 ++++++--------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/dataExchangeModel/dataExchangeModel.C b/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/dataExchangeModel/dataExchangeModel.C index 723db484..7f143f30 100755 --- a/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/dataExchangeModel/dataExchangeModel.C +++ b/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/dataExchangeModel/dataExchangeModel.C @@ -209,7 +209,7 @@ bool dataExchangeModel::couple(int i) scalar dataExchangeModel::timeStepFraction() const { //return fraction between previous coupling TS and actual TS - return ( particleCloud_.mesh().time().value()-particleCloud_.mesh().time().startTime().value() - (couplingStep_-1) * couplingTime() ) / couplingTime(); + return ( (particleCloud_.mesh().time().timeIndex() - timeIndexOffset_) * particleCloud_.mesh().time().deltaTValue() / couplingTime() - (couplingStep_ - 1) ); } int dataExchangeModel::getNumberOfParticles() const @@ -249,7 +249,8 @@ dataExchangeModel::dataExchangeModel maxNumberOfParticles_(0), couplingStep_(0), DEMts_(-1.), - couplingInterval_(readScalar(dict_.lookup("couplingInterval"))) + couplingInterval_(readScalar(dict_.lookup("couplingInterval"))), + timeIndexOffset_(particleCloud_.mesh().time().timeIndex()) {} // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // diff --git a/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/dataExchangeModel/dataExchangeModel.H b/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/dataExchangeModel/dataExchangeModel.H index e146b0ff..3d0b9e9c 100755 --- a/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/dataExchangeModel/dataExchangeModel.H +++ b/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/dataExchangeModel/dataExchangeModel.H @@ -68,6 +68,8 @@ protected: int couplingInterval_; + const label timeIndexOffset_; + // Protected member functions public: @@ -229,15 +231,10 @@ public: inline bool doCoupleNow() const { - if (particleCloud_.mesh().time().value()-particleCloud_.mesh().time().startTime().value()-SMALL - > couplingStep_*DEMts_*couplingInterval_) - { - return true; - } - else - { - return false; - } + return ( (particleCloud_.mesh().time().timeIndex() - timeIndexOffset_) * particleCloud_.mesh().time().deltaTValue() - SMALL + > + couplingStep_ * DEMts_ * couplingInterval_ + ); } virtual int getNumberOfParticles() const; From d4bb711e9c2846b620d79d7e42716c2b1d5af5e8 Mon Sep 17 00:00:00 2001 From: danielque Date: Fri, 26 Jul 2019 16:31:54 +0200 Subject: [PATCH 2/3] replace time().deltaT().value() by time().deltaTValue() avoid creation of temporary dimensionedScalar that is not needed --- .../dataExchangeModel/dataExchangeModel.H | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/dataExchangeModel/dataExchangeModel.H b/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/dataExchangeModel/dataExchangeModel.H index 3d0b9e9c..a4b73bf1 100755 --- a/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/dataExchangeModel/dataExchangeModel.H +++ b/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/dataExchangeModel/dataExchangeModel.H @@ -200,26 +200,28 @@ public: inline void checkTSsize() const { - if (particleCloud_.mesh().time().deltaT().value() > couplingInterval_ * DEMts_ + SMALL) + if (particleCloud_.mesh().time().deltaTValue() > couplingInterval_ * DEMts_ + SMALL) { - Info << "particleCloud_.mesh().time().deltaT().value() = " << particleCloud_.mesh().time().deltaT().value() << endl; + Info << "particleCloud_.mesh().time().deltaTValue() = " << particleCloud_.mesh().time().deltaTValue() << endl; Info << "couplingInterval_ = " << couplingInterval_ << endl; Info << "DEMts_ = " << DEMts_ << endl; FatalError << "\nError - CFD time-step bigger than coupling time (= DEM time step * coupling interval)!\n" << abort(FatalError); } - if (std::fabs((round(couplingTime()/particleCloud_.mesh().time().deltaT().value())*particleCloud_.mesh().time().deltaT().value())-couplingTime()) > SMALL) + + if (std::fabs((round(couplingTime()/particleCloud_.mesh().time().deltaTValue()) * particleCloud_.mesh().time().deltaTValue()) - couplingTime()) > SMALL) { - Info << "particleCloud_.mesh().time().deltaT().value() = " << particleCloud_.mesh().time().deltaT().value() << endl; + Info << "particleCloud_.mesh().time().deltaTValue() = " << particleCloud_.mesh().time().deltaTValue() << endl; Info << "couplingInterval_ = " << couplingInterval_ << endl; Info << "DEMts_ = " << DEMts_ << endl; Warning << "\nWarning - Coupling time (= DEM time step * coupling interval) is not a multiple of CFD time-step!\n" << endl; } + if (!particleCloud_.allowCFDsubTimestep()) - if (particleCloud_.mesh().time().deltaT().value() < couplingInterval_ * DEMts_ + SMALL) + if (particleCloud_.mesh().time().deltaTValue() < couplingInterval_ * DEMts_ + SMALL) FatalError << "\nYour models require: CFD time-step = coupling interval (= DEM time step * coupling interval)! \n" << abort(FatalError); // warn if sub-TS - if (particleCloud_.mesh().time().deltaT().value() < couplingTime() - SMALL) + if (particleCloud_.mesh().time().deltaTValue() < couplingTime() - SMALL) Warning << "You are using sub-time-steps (i.e. CFD TS < coupling time)! Check your settings properly." << endl; } From 7bb266bc41782b778c0735d9d22fe7ebedcec8a1 Mon Sep 17 00:00:00 2001 From: danielque Date: Fri, 26 Jul 2019 16:59:56 +0200 Subject: [PATCH 3/3] clamp tsf between 0 and 1 the time step fraction should never be outside these bounds since we don't allow variable time steps; hence any value outside these bounds must come from numerical rounding/precision issues; by doing this we no longer need the check in cfdemCloud --- src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C | 8 +------- .../dataExchangeModel/dataExchangeModel.C | 2 +- .../dataExchangeModel/dataExchangeModel.H | 6 ++++++ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C index 5702c2f5..bb205cc4 100644 --- a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C +++ b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C @@ -673,13 +673,7 @@ bool cfdemCloud::evolve int old_precision = Info().precision(10); Info << "\n timeStepFraction() = " << timeStepFrac << endl; Info().precision(old_precision); - if(timeStepFrac > 1.0000001) - { - // FatalError << "cfdemCloud::dataExchangeM().timeStepFraction()>1: Do not do this, since dangerous. This might be due to the fact that you used a adjustable CFD time step. Please use a fixed CFD time step." << abort(FatalError); - old_precision = Warning().precision(10); - Warning << "cfdemCloud::dataExchangeM().timeStepFraction() = " << timeStepFrac << endl; - Warning().precision(old_precision); - } + clockM().start(24,"interpolateEulerFields"); // update voidFractionField diff --git a/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/dataExchangeModel/dataExchangeModel.C b/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/dataExchangeModel/dataExchangeModel.C index 7f143f30..168f513c 100755 --- a/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/dataExchangeModel/dataExchangeModel.C +++ b/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/dataExchangeModel/dataExchangeModel.C @@ -209,7 +209,7 @@ bool dataExchangeModel::couple(int i) scalar dataExchangeModel::timeStepFraction() const { //return fraction between previous coupling TS and actual TS - return ( (particleCloud_.mesh().time().timeIndex() - timeIndexOffset_) * particleCloud_.mesh().time().deltaTValue() / couplingTime() - (couplingStep_ - 1) ); + return clamp( (particleCloud_.mesh().time().timeIndex() - timeIndexOffset_) * particleCloud_.mesh().time().deltaTValue() / couplingTime() - (couplingStep_ - 1) ); } int dataExchangeModel::getNumberOfParticles() const diff --git a/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/dataExchangeModel/dataExchangeModel.H b/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/dataExchangeModel/dataExchangeModel.H index a4b73bf1..7d483325 100755 --- a/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/dataExchangeModel/dataExchangeModel.H +++ b/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/dataExchangeModel/dataExchangeModel.H @@ -72,6 +72,12 @@ protected: // Protected member functions + // note: C++17 has std::clamp + scalar clamp(scalar v, scalar lo=0.0, scalar hi=1.0) const + { + return ((v < lo) ? lo : (hi < v) ? hi : v); + } + public: //- Runtime type information