862
839
RAC(tcel, dWT) = (lcsmeq[dWT] + (MSRC_WT-lcsmeq[dWT] )*lcsmdfscale);
863
840
RAC(tcel, dWB) = (lcsmeq[dWB] + (MSRC_WB-lcsmeq[dWB] )*lcsmdfscale);
864
841
# endif // OPT3D==0
865
#endif //! LBM_NOADCOARSENING==1
868
844
void LbmFsgrSolver::interpolateCellFromCoarse(int lev, int i, int j,int k, int dstSet, LbmFloat t, CellFlagType flagSet, bool markNbs) {
869
#if LBM_NOADCOARSENING==1
870
if(mMaxRefine>0) errMsg("LbmFsgrSolver","Adaptive Coarsening not compiled, but refinement switched on ("<<mMaxRefine<<")!");
871
i=j=k=dstSet=lev =0; // get rid of warnings...
872
t=0.0; flagSet=0; markNbs=false;
874
845
LbmFloat rho=0.0, ux=0.0, uy=0.0, uz=0.0;
875
846
LbmFloat intDf[19] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
974
949
levOldOmega[lev] = mLevel[lev].omega;
975
950
levOldStepsize[lev] = mLevel[lev].timestep;
977
//if(mTimeSwitchCounts>0){ errMsg("DEB CSKIP",""); return; } // DEBUG
979
953
const LbmFloat reduceFac = 0.8; // modify time step by 20%, TODO? do multiple times for large changes?
980
954
LbmFloat diffPercent = 0.05; // dont scale if less than 5%
981
LbmFloat allowMax = this->mpParam->getTadapMaxSpeed(); // maximum allowed velocity
982
LbmFloat nextmax = this->mpParam->getSimulationMaxSpeed() + norm(mLevel[mMaxRefine].gravity);
984
//newdt = this->mpParam->getTimestep() * (allowMax/nextmax);
985
LbmFloat newdt = this->mpParam->getTimestep(); // newtr
955
LbmFloat allowMax = mpParam->getTadapMaxSpeed(); // maximum allowed velocity
956
LbmFloat nextmax = mpParam->getSimulationMaxSpeed() + norm(mLevel[mMaxRefine].gravity);
959
#if LBM_INCLUDE_TESTSOLVERS==1
961
if(mLevel[mMaxRefine].lsteps % MPTADAP_INTERV != MPTADAP_INTERV-1) {
962
debMsgStd("LbmFsgrSolver::TAdp",DM_MSG, "mpact:"<<glob_mpactive<<","<<glob_mpindex<<"/"<<glob_mpnum<<" step:"<<mLevel[mMaxRefine].lsteps<<" skipping tadap...",8);
965
nextmax = mrInitTadap(nextmax);
967
#endif // LBM_INCLUDE_TESTSOLVERS==1
969
LbmFloat newdt = mpParam->getTimestep(); // newtr
986
970
if(nextmax > allowMax/reduceFac) {
987
971
mTimeMaxvelStepCnt++; }
988
972
else { mTimeMaxvelStepCnt=0; }
990
974
// emergency, or 10 steps with high vel
991
975
if((mTimeMaxvelStepCnt>5) || (nextmax> (1.0/3.0)) || (mForceTimeStepReduce) ) {
992
//if(nextmax > allowMax/reduceFac) {
993
newdt = this->mpParam->getTimestep() * reduceFac;
976
newdt = mpParam->getTimestep() * reduceFac;
995
978
if(nextmax<allowMax*reduceFac) {
996
newdt = this->mpParam->getTimestep() / reduceFac;
979
newdt = mpParam->getTimestep() / reduceFac;
999
//errMsg("LbmFsgrSolver::adaptTimestep","nextmax="<<nextmax<<" allowMax="<<allowMax<<" fac="<<reduceFac<<" simmaxv="<< this->mpParam->getSimulationMaxSpeed() );
982
//errMsg("LbmFsgrSolver::adaptTimestep","nextmax="<<nextmax<<" allowMax="<<allowMax<<" fac="<<reduceFac<<" simmaxv="<< mpParam->getSimulationMaxSpeed() );
1001
984
bool minCutoff = false;
1002
985
LbmFloat desireddt = newdt;
1003
if(newdt>this->mpParam->getMaxTimestep()){ newdt = this->mpParam->getMaxTimestep(); }
1004
if(newdt<this->mpParam->getMinTimestep()){
1005
newdt = this->mpParam->getMinTimestep();
986
if(newdt>mpParam->getMaxTimestep()){ newdt = mpParam->getMaxTimestep(); }
987
if(newdt<mpParam->getMinTimestep()){
988
newdt = mpParam->getMinTimestep();
1006
989
if(nextmax>allowMax/reduceFac){ minCutoff=true; } // only if really large vels...
1009
LbmFloat dtdiff = fabs(newdt - this->mpParam->getTimestep());
1010
if(!this->mSilent) {
1011
debMsgStd("LbmFsgrSolver::TAdp",DM_MSG, "new"<<newdt<<" max"<<this->mpParam->getMaxTimestep()<<" min"<<this->mpParam->getMinTimestep()<<" diff"<<dtdiff<<
1012
" simt:"<<mSimulationTime<<" minsteps:"<<(mSimulationTime/mMaxTimestep)<<" maxsteps:"<<(mSimulationTime/mMinTimestep) , 10); }
992
LbmFloat dtdiff = fabs(newdt - mpParam->getTimestep());
994
debMsgStd("LbmFsgrSolver::TAdp",DM_MSG, "new"<<newdt
995
<<" max"<<mpParam->getMaxTimestep()<<" min"<<mpParam->getMinTimestep()<<" diff"<<dtdiff
996
<<" simt:"<<mSimulationTime<<" minsteps:"<<(mSimulationTime/mMaxTimestep)<<" maxsteps:"<<(mSimulationTime/mMinTimestep)<<
997
" olddt"<<levOldStepsize[mMaxRefine]<<" redlock"<<mTimestepReduceLock
1014
1000
// in range, and more than X% change?
1015
//if( newdt < this->mpParam->getTimestep() ) // DEBUG
1001
//if( newdt < mpParam->getTimestep() ) // DEBUG
1016
1002
LbmFloat rhoAvg = mCurrentMass/mCurrentVolume;
1017
if( (newdt<=this->mpParam->getMaxTimestep()) && (newdt>=this->mpParam->getMinTimestep())
1018
&& (dtdiff>(this->mpParam->getTimestep()*diffPercent)) ) {
1003
if( (newdt<=mpParam->getMaxTimestep()) && (newdt>=mpParam->getMinTimestep())
1004
&& (dtdiff>(mpParam->getTimestep()*diffPercent)) ) {
1019
1005
if((newdt>levOldStepsize[mMaxRefine])&&(mTimestepReduceLock)) {
1020
1006
// wait some more...
1021
1007
//debMsgNnl("LbmFsgrSolver::TAdp",DM_NOTIFY," Delayed... "<<mTimestepReduceLock<<" ",10);
1022
1008
debMsgDirect("D");
1024
this->mpParam->setDesiredTimestep( newdt );
1010
mpParam->setDesiredTimestep( newdt );
1025
1011
rescale = true;
1026
if(!this->mSilent) {
1027
1013
debMsgStd("LbmFsgrSolver::TAdp",DM_NOTIFY,"\n\n\n\n",10);
1028
debMsgStd("LbmFsgrSolver::TAdp",DM_NOTIFY,"Timestep change: new="<<newdt<<" old="<<this->mpParam->getTimestep()<<" maxSpeed:"<<this->mpParam->getSimulationMaxSpeed()<<" next:"<<nextmax<<" step:"<<this->mStepCnt, 10 );
1029
debMsgStd("LbmFsgrSolver::TAdp",DM_NOTIFY,"Timestep change: "<<
1030
"rhoAvg="<<rhoAvg<<" cMass="<<mCurrentMass<<" cVol="<<mCurrentVolume,10);
1014
debMsgStd("LbmFsgrSolver::TAdp",DM_NOTIFY,"Timestep changing: new="<<newdt<<" old="<<mpParam->getTimestep()
1015
<<" maxSpeed:"<<mpParam->getSimulationMaxSpeed()<<" next:"<<nextmax<<" step:"<<mStepCnt, 10 );
1016
//debMsgStd("LbmFsgrSolver::TAdp",DM_NOTIFY,"Timestep changing: "<< "rhoAvg="<<rhoAvg<<" cMass="<<mCurrentMass<<" cVol="<<mCurrentVolume,10);
1032
1018
} // really change dt
1039
1025
/*const int tadtogInter = 100;
1040
1026
const double tadtogSwitch = 0.66;
1041
1027
errMsg("TIMESWITCHTOGGLETEST","warning enabled "<< tadtogSwitch<<","<<tadtogSwitch<<" !!!!!!!!!!!!!!!!!!!");
1042
if( ((this->mStepCnt% tadtogInter)== (tadtogInter/4*1)-1) ||
1043
((this->mStepCnt% tadtogInter)== (tadtogInter/4*2)-1) ){
1028
if( ((mStepCnt% tadtogInter)== (tadtogInter/4*1)-1) ||
1029
((mStepCnt% tadtogInter)== (tadtogInter/4*2)-1) ){
1044
1030
rescale = true; minCutoff = false;
1045
newdt = tadtogSwitch * this->mpParam->getTimestep();
1046
this->mpParam->setDesiredTimestep( newdt );
1031
newdt = tadtogSwitch * mpParam->getTimestep();
1032
mpParam->setDesiredTimestep( newdt );
1048
if( ((this->mStepCnt% tadtogInter)== (tadtogInter/4*3)-1) ||
1049
((this->mStepCnt% tadtogInter)== (tadtogInter/4*4)-1) ){
1034
if( ((mStepCnt% tadtogInter)== (tadtogInter/4*3)-1) ||
1035
((mStepCnt% tadtogInter)== (tadtogInter/4*4)-1) ){
1050
1036
rescale = true; minCutoff = false;
1051
newdt = this->mpParam->getTimestep()/tadtogSwitch ;
1052
this->mpParam->setDesiredTimestep( newdt );
1037
newdt = mpParam->getTimestep()/tadtogSwitch ;
1038
mpParam->setDesiredTimestep( newdt );
1054
1040
rescale = false; minCutoff = false;
1058
1044
// test mass rescale
1060
scaleFac = newdt/this->mpParam->getTimestep();
1046
scaleFac = newdt/mpParam->getTimestep();
1062
1048
// perform acutal rescaling...
1063
1049
mTimeMaxvelStepCnt=0;
1064
1050
mForceTimeStepReduce = false;
1066
1052
// FIXME - approximate by averaging, take gravity direction here?
1067
mTimestepReduceLock = 4*(mLevel[mMaxRefine].lSizey+mLevel[mMaxRefine].lSizez+mLevel[mMaxRefine].lSizex)/3;
1053
//mTimestepReduceLock = 4*(mLevel[mMaxRefine].lSizey+mLevel[mMaxRefine].lSizez+mLevel[mMaxRefine].lSizex)/3;
1054
// use z as gravity direction
1055
mTimestepReduceLock = 4*mLevel[mMaxRefine].lSizez;
1069
1057
mTimeSwitchCounts++;
1070
this->mpParam->calculateAllMissingValues( mSimulationTime, this->mSilent );
1058
mpParam->calculateAllMissingValues( mSimulationTime, mSilent );
1071
1059
recalculateObjectSpeeds();
1072
1060
// calc omega, force for all levels
1073
1061
mLastOmega=1e10; mLastGravity=1e10;
1074
1062
initLevelOmegas();
1075
if(this->mpParam->getTimestep()<mMinTimestep) mMinTimestep = this->mpParam->getTimestep();
1076
if(this->mpParam->getTimestep()>mMaxTimestep) mMaxTimestep = this->mpParam->getTimestep();
1063
if(mpParam->getTimestep()<mMinTimestep) mMinTimestep = mpParam->getTimestep();
1064
if(mpParam->getTimestep()>mMaxTimestep) mMaxTimestep = mpParam->getTimestep();
1078
1066
// this might be called during init, before we have any particles
1079
1067
if(mpParticles) { mpParticles->adaptPartTimestep(scaleFac); }
1148
1136
LbmFloat df[LBM_DFNUM];
1149
1137
LbmFloat feqOld[LBM_DFNUM];
1150
1138
LbmFloat feqNew[LBM_DFNUM];
1151
for(int l=0; l<this->cDfNum; l++) {
1152
feqOld[l] = this->getCollideEq(l,rhoOld, velOld[0],velOld[1],velOld[2] );
1153
feqNew[l] = this->getCollideEq(l,rhoNew, velNew[0],velNew[1],velNew[2] );
1139
for(int l=0; l<cDfNum; l++) {
1140
feqOld[l] = getCollideEq(l,rhoOld, velOld[0],velOld[1],velOld[2] );
1141
feqNew[l] = getCollideEq(l,rhoNew, velNew[0],velNew[1],velNew[2] );
1154
1142
df[l] = QCELL(lev, i,j,k,workSet, l);
1156
const LbmFloat Qo = this->getLesNoneqTensorCoeff(df,feqOld);
1157
const LbmFloat oldOmega = this->getLesOmega(levOldOmega[lev], mLevel[lev].lcsmago,Qo);
1158
const LbmFloat newOmega = this->getLesOmega(mLevel[lev].omega,mLevel[lev].lcsmago,Qo);
1144
const LbmFloat Qo = getLesNoneqTensorCoeff(df,feqOld);
1145
const LbmFloat oldOmega = getLesOmega(levOldOmega[lev], mLevel[lev].lcsmago,Qo);
1146
const LbmFloat newOmega = getLesOmega(mLevel[lev].omega,mLevel[lev].lcsmago,Qo);
1159
1147
//newOmega = mLevel[lev].omega; // FIXME debug test
1161
1149
//LbmFloat dfScaleFac = (newSteptime/1.0)/(levOldStepsize[lev]/levOldOmega[lev]);
1162
1150
const LbmFloat dfScale = (newSteptime/newOmega)/(levOldStepsize[lev]/oldOmega);
1163
1151
//dfScale = dfScaleFac/newOmega;
1165
for(int l=0; l<this->cDfNum; l++) {
1153
for(int l=0; l<cDfNum; l++) {
1167
1155
//df = eqOld + (df-eqOld)*dfScale; df *= (eqNew/eqOld); // non-eq. scaling, important
1209
if(!this->mSilent) {
1210
debMsgStd("LbmFsgrSolver::step",DM_MSG,"REINIT DONE "<<this->mStepCnt<<
1198
debMsgStd("LbmFsgrSolver::step",DM_MSG,"REINIT DONE "<<mStepCnt<<
1211
1199
" no"<<mTimeSwitchCounts<<" maxdt"<<mMaxTimestep<<
1212
1200
" mindt"<<mMinTimestep<<" currdt"<<mLevel[mMaxRefine].timestep, 10);
1213
1201
debMsgStd("LbmFsgrSolver::step",DM_MSG,"REINIT DONE masst:"<<massTNew<<","<<massTOld<<" org:"<<mCurrentMass<<"; "<<
1214
1202
" volt:"<<volTNew<<","<<volTOld<<" org:"<<mCurrentVolume, 10);
1216
debMsgStd("\nLbmOptSolver::step",DM_MSG,"Timestep change by "<< (newdt/levOldStepsize[mMaxRefine]) <<" newDt:"<<newdt
1217
<<", oldDt:"<<levOldStepsize[mMaxRefine]<<" newOmega:"<<this->mOmega<<" gStar:"<<this->mpParam->getCurrentGStar() , 10);
1204
debMsgStd("\nLbmOptSolver::step",DM_MSG,"Timestep changed by "<< (newdt/levOldStepsize[mMaxRefine]) <<" newDt:"<<newdt
1205
<<", oldDt:"<<levOldStepsize[mMaxRefine]<<" newOmega:"<<mOmega<<" gStar:"<<mpParam->getCurrentGStar()<<", step:"<<mStepCnt , 10);
1220
1208
//NEWDEBCHECK("tt2");
1222
1210
//errMsg("adaptTimestep","Warning - brute force rescale off!"); minCutoff = false; // DEBUG
1223
1211
if(minCutoff) {
1224
errMsg("adaptTimestep","Warning - performing Brute-Force rescale... (sim:"<<this->mName<<" step:"<<this->mStepCnt<<" newdt="<<desireddt<<" mindt="<<this->mpParam->getMinTimestep()<<") " );
1212
errMsg("adaptTimestep","Warning - performing Brute-Force rescale... (sim:"<<mName<<" step:"<<mStepCnt<<" newdt="<<desireddt<<" mindt="<<mpParam->getMinTimestep()<<") " );
1225
1213
//brute force resacle all the time?
1227
1215
for(int lev=mMaxRefine; lev>=0 ; lev--) {