From e3f681da67989ed87a270a2c07849265d44bb7da Mon Sep 17 00:00:00 2001 From: Nils Thuerey Date: Wed, 9 Nov 2005 07:56:26 +0000 Subject: - popup menu now aborts by default - changed directory/prefix input (only 1 string instead of two, more similar to render output settings now) - changed reading/writing of surface files - slightly enhanced surface smoothness --- intern/elbeem/intern/blendercall.cpp | 11 +-- intern/elbeem/intern/ntl_world.cpp | 7 +- intern/elbeem/intern/parametrizer.cpp | 9 +- intern/elbeem/intern/solver_class.h | 1 + intern/elbeem/intern/solver_init.cpp | 28 ++++-- intern/elbeem/intern/solver_interface.cpp | 5 +- intern/elbeem/intern/solver_main.cpp | 144 +++++++++++++++++------------- intern/elbeem/intern/solver_relax.h | 40 ++++----- intern/elbeem/intern/solver_util.cpp | 10 ++- intern/elbeem/intern/utilities.cpp | 17 ++++ 10 files changed, 168 insertions(+), 104 deletions(-) (limited to 'intern/elbeem') diff --git a/intern/elbeem/intern/blendercall.cpp b/intern/elbeem/intern/blendercall.cpp index 2d241ae623a..847dbdd4843 100644 --- a/intern/elbeem/intern/blendercall.cpp +++ b/intern/elbeem/intern/blendercall.cpp @@ -13,18 +13,15 @@ #include "ntl_blenderdumper.h" #include +extern "C" void elbeemCheckDebugEnv(void); + extern "C" int performElbeemSimulation(char *cfgfilename) { - const char *strEnvName = "BLENDER_ELBEEMDEBUG"; gWorldState = SIMWORLD_INVALID; strcpy(gWorldStringState,"[none]"); - if(getenv(strEnvName)) { - gDebugLevel = atoi(getenv(strEnvName)); - if(gDebugLevel< 0) gDebugLevel = 0; - if(gDebugLevel>10) gDebugLevel = 0; // only use valid values - if(gDebugLevel>0) debMsgStd("performElbeemSimulation",DM_NOTIFY,"Using envvar '"<0) { + elbeemCheckDebugEnv(); debMsgStd("performElbeemSimulation",DM_NOTIFY,"Running El'Beem from Blender with file '"<< cfgfilename <<"', debugLevel:"<getAniFrames()) && (!getStopRenderVisualization() )); i++) { - advanceSims(); - renderScene(); + if(!advanceSims()) { + renderScene(); + } // else means sim panicked, so dont render... + #if ELBEEM_BLENDER==1 // update gui display simulateThreadIncreaseFrame(); @@ -305,6 +307,7 @@ int ntlWorld::advanceSims() if(allPanic) { warnMsg("ntlWorld::advanceSims","All sims panicked... stopping thread" ); setStopRenderVisualization( true ); + return 1; } for(size_t i=0;isize();i++) { SimulationObject *sim = (*mpSims)[i]; diff --git a/intern/elbeem/intern/parametrizer.cpp b/intern/elbeem/intern/parametrizer.cpp index 6f6d275aa2f..c2126314c0a 100644 --- a/intern/elbeem/intern/parametrizer.cpp +++ b/intern/elbeem/intern/parametrizer.cpp @@ -204,10 +204,15 @@ int Parametrizer::calculateAniStart( void ) { /*! get no of steps for a single animation frame */ int Parametrizer::calculateAniStepsPerFrame( void ) { if(!checkSeenValues(PARAM_ANIFRAMETIME)) { - errFatal("Parametrizer::calculateAniStepsPerFrame", " Missing ani frame time argument!", SIMWORLD_INITERROR); + errFatal("Parametrizer::calculateAniStepsPerFrame", "Missing ani frame time argument!", SIMWORLD_INITERROR); return 1; } - return (int)(mAniFrameTime/mStepTime); + int value = (int)(mAniFrameTime/mStepTime); + if((value<0) || (value>1000000)) { + errFatal("Parametrizer::calculateAniStepsPerFrame", "Invalid step-time (="< ani-frame-time ("<::LbmFsgrSolver() : { // not much to do here... D::mpIso = new IsoSurface( D::mIsoValue, false ); +#if ELBEEM_BLENDER!=1 + mpTest = new LbmTestdata(); +#endif // ELBEEM_BLENDER!=1 // init equilibrium dist. func LbmFloat rho=1.0; @@ -112,7 +115,6 @@ template LbmFsgrSolver::~LbmFsgrSolver() { if(!D::mInitDone){ debugOut("LbmFsgrSolver::LbmFsgrSolver : not inited...",0); return; } - #if COMPRESSGRIDS==1 delete mLevel[mMaxRefine].mprsCells[1]; mLevel[mMaxRefine].mprsCells[0] = mLevel[mMaxRefine].mprsCells[1] = NULL; @@ -128,7 +130,8 @@ LbmFsgrSolver::~LbmFsgrSolver() if(mpPreviewSurface) delete mpPreviewSurface; #if ELBEEM_BLENDER!=1 - destroyTestdata(); + if(mUseTestdata) destroyTestdata(); + delete mpTest; #endif // ELBEEM_BLENDER!=1 // always output performance estimate @@ -179,10 +182,14 @@ LbmFsgrSolver::parseAttrList() mForceTadapRefine = D::mpAttrs->readInt("forcetadaprefine", mForceTadapRefine,"LbmFsgrSolver", "mForceTadapRefine", false); // demo mode settings - mFVHeight = D::mpAttrs->readFloat("fvolheight", mFVHeight, "SimulationLbm","mFVHeight", false ); + mFVHeight = D::mpAttrs->readFloat("fvolheight", mFVHeight, "LbmFsgrSolver","mFVHeight", false ); // FIXME check needed? - mFVArea = D::mpAttrs->readFloat("fvolarea", mFVArea, "SimulationLbm","mFArea", false ); + mFVArea = D::mpAttrs->readFloat("fvolarea", mFVArea, "LbmFsgrSolver","mFArea", false ); +#if ELBEEM_BLENDER!=1 + mUseTestdata = D::mpAttrs->readBool("use_testdata", mUseTestdata,"LbmFsgrSolver", "mUseTestdata", false); + mpTest->parseTestdataAttrList(D::mpAttrs); +#endif // ELBEEM_BLENDER!=1 } @@ -296,12 +303,21 @@ LbmFsgrSolver::initialize( ntlTree* /*tree*/, vector* /*o int maskBits = mMaxRefine; if(PARALLEL==1) maskBits+=2; for(int i=0; i::initGeometryFlags() { } // zmax #if ELBEEM_BLENDER!=1 - initTestdata(); + if(mUseTestdata) initTestdata(); #endif // ELBEEM_BLENDER!=1 D::freeGeoTree(); myTime_t geotimeend = getTime(); diff --git a/intern/elbeem/intern/solver_interface.cpp b/intern/elbeem/intern/solver_interface.cpp index 3d77e4a4968..58f9abb05ed 100644 --- a/intern/elbeem/intern/solver_interface.cpp +++ b/intern/elbeem/intern/solver_interface.cpp @@ -406,8 +406,9 @@ void LbmSolverInterface::initGeoTree(int id) { if(mpGiTree != NULL) delete mpGiTree; char treeFlag = (1<<(mGeoInitId+4)); - mpGiTree = new ntlTree( 20, 4, // warning - fixed values for depth & maxtriangles here... - scene, treeFlag ); + mpGiTree = new ntlTree( + 15, 8, // warning - fixed values for depth & maxtriangles here... + scene, treeFlag ); } /*****************************************************************************/ diff --git a/intern/elbeem/intern/solver_main.cpp b/intern/elbeem/intern/solver_main.cpp index c62b8f87321..a8785da15f1 100644 --- a/intern/elbeem/intern/solver_main.cpp +++ b/intern/elbeem/intern/solver_main.cpp @@ -235,7 +235,7 @@ LbmFsgrSolver::stepMain() } // */ #if ELBEEM_BLENDER!=1 - handleTestdata(); + if(mUseTestdata) handleTestdata(); #endif // ELBEEM_BLENDER!=1 } @@ -299,9 +299,6 @@ LbmFsgrSolver::mainLoop(int lev) // local to loop CellFlagType nbflag[LBM_DFNUM]; -#define NBFLAG(l) nbflag[(l)] - // */ - LbmFloat *ccel = NULL; LbmFloat *tcel = NULL; int oldFlag; @@ -318,9 +315,14 @@ LbmFsgrSolver::mainLoop(int lev) // ifempty cell conversion flags bool iffilled, ifemptied; + LbmFloat nbfracs[LBM_DFNUM]; // ffracs of neighbors int recons[LBM_DFNUM]; // reconstruct this DF? int numRecons; // how many are reconstructed? + // slow surf regions smooth (if below) + const LbmFloat smoothStrength = 0.0; //0.01; + const LbmFloat sssUsqrLimit = 1.5 * 0.03*0.03; + const LbmFloat sssUsqrLimitInv = 1.0/sssUsqrLimit; CellFlagType *pFlagSrc; CellFlagType *pFlagDst; @@ -468,8 +470,6 @@ LbmFsgrSolver::mainLoop(int lev) if(oldFlag & (CFBnd|CFEmpty|CFGrFromCoarse|CFUnused)) { *pFlagDst = oldFlag; - //RAC(tcel,dFfrac) = 0.0; - //RAC(tcel,dFlux) = FLUX_INIT; // necessary? continue; } /*if( oldFlag & CFNoBndFluid ) { // TEST ME FASTER? @@ -552,8 +552,6 @@ LbmFsgrSolver::mainLoop(int lev) // "normal" fluid cells RAC(tcel,dFfrac) = 1.0; *pFlagDst = (CellFlagType)oldFlag; // newFlag; - //? LbmFloat ofrho=RAC(ccel,0); for(int l=1; l::mainLoop(int lev) FORDF1 { // dfl loop recons[l] = 0; + nbfracs[l] = 0.0; // finally, "normal" interface cells ---- - if( NBFLAG(l)&(CFFluid|CFBnd) ) { // NEWTEST! FIXME check!!!!!!!!!!!!!!!!!! + if( nbflag[l]&(CFFluid|CFBnd) ) { // NEWTEST! FIXME check!!!!!!!!!!!!!!!!!! change = nbdf(l) - MYDF(l); } // interface cells - distuingish cells that shouldn't fill/empty - else if( NBFLAG(l) & CFInter ) { + else if( nbflag[l] & CFInter ) { - LbmFloat mynbfac = //numNbs[l] / numNbs[0]; - QCELL_NB(lev, i,j,k,SRCS(lev),l, dFlux) / QCELL(lev, i,j,k,SRCS(lev), dFlux); - LbmFloat nbnbfac = 1.0/mynbfac; - //mynbfac = nbnbfac = 1.0; // switch calc flux off - // OLD - if ((oldFlag|NBFLAG(l))&(CFNoNbFluid|CFNoNbEmpty)) { + LbmFloat mynbfac,nbnbfac; + // NEW TEST t1 + // t2 -> off + if((oldFlag&CFNoBndFluid)&&(nbflag[l]&CFNoBndFluid)) { + mynbfac = QCELL_NB(lev, i,j,k,SRCS(lev),l, dFlux) / QCELL(lev, i,j,k,SRCS(lev), dFlux); + nbnbfac = 1.0/mynbfac; + } else { + mynbfac = nbnbfac = 1.0; // switch calc flux off + } + //mynbfac = nbnbfac = 1.0; // switch calc flux off t3 + + // perform interface case handling + if ((oldFlag|nbflag[l])&(CFNoNbFluid|CFNoNbEmpty)) { switch (oldFlag&(CFNoNbFluid|CFNoNbEmpty)) { case 0: // we are a normal cell so... - switch (NBFLAG(l)&(CFNoNbFluid|CFNoNbEmpty)) { + switch (nbflag[l]&(CFNoNbFluid|CFNoNbEmpty)) { case CFNoNbFluid: // just fill current cell = empty neighbor change = nbnbfac*nbdf(l) ; goto changeDone; @@ -622,7 +628,7 @@ LbmFsgrSolver::mainLoop(int lev) case CFNoNbFluid: // we dont have fluid nb's so... - switch (NBFLAG(l)&(CFNoNbFluid|CFNoNbEmpty)) { + switch (nbflag[l]&(CFNoNbFluid|CFNoNbEmpty)) { case 0: case CFNoNbEmpty: // we have no fluid nb's -> just empty @@ -632,7 +638,7 @@ LbmFsgrSolver::mainLoop(int lev) case CFNoNbEmpty: // we dont have empty nb's so... - switch (NBFLAG(l)&(CFNoNbFluid|CFNoNbEmpty)) { + switch (nbflag[l]&(CFNoNbFluid|CFNoNbEmpty)) { case 0: case CFNoNbFluid: // we have no empty nb's -> just fill @@ -644,19 +650,18 @@ LbmFsgrSolver::mainLoop(int lev) // just do normal mass exchange... change = ( nbnbfac*nbdf(l) - mynbfac*MYDF(l) ) ; changeDone: ; - change *= ( myfrac + QCELL_NB(lev, i,j,k, SRCS(lev),l, dFfrac) ) * 0.5; + nbfracs[l] = QCELL_NB(lev, i,j,k, SRCS(lev),l, dFfrac); + change *= (myfrac + nbfracs[l]) * 0.5; } // the other cell is interface // last alternative - reconstruction in this direction else { - //if(NBFLAG(l) & CFEmpty) { recons[l] = true; } + // empty + bnd case recons[l] = 1; numRecons++; change = 0.0; - // which case is this...? empty + bnd } - //FST errMsg("TTTIF","at "<::mainLoop(int lev) LbmFloat nv1,nv2; LbmFloat nx,ny,nz; - if(NBFLAG(dE) &(CFFluid|CFInter)){ nv1 = RAC((ccel+QCELLSTEP ),dFfrac); } else nv1 = 0.0; - if(NBFLAG(dW) &(CFFluid|CFInter)){ nv2 = RAC((ccel-QCELLSTEP ),dFfrac); } else nv2 = 0.0; + if(nbflag[dE] &(CFFluid|CFInter)){ nv1 = RAC((ccel+QCELLSTEP ),dFfrac); } else nv1 = 0.0; + if(nbflag[dW] &(CFFluid|CFInter)){ nv2 = RAC((ccel-QCELLSTEP ),dFfrac); } else nv2 = 0.0; nx = 0.5* (nv2-nv1); - if(NBFLAG(dN) &(CFFluid|CFInter)){ nv1 = RAC((ccel+(mLevel[lev].lOffsx*QCELLSTEP)),dFfrac); } else nv1 = 0.0; - if(NBFLAG(dS) &(CFFluid|CFInter)){ nv2 = RAC((ccel-(mLevel[lev].lOffsx*QCELLSTEP)),dFfrac); } else nv2 = 0.0; + if(nbflag[dN] &(CFFluid|CFInter)){ nv1 = RAC((ccel+(mLevel[lev].lOffsx*QCELLSTEP)),dFfrac); } else nv1 = 0.0; + if(nbflag[dS] &(CFFluid|CFInter)){ nv2 = RAC((ccel-(mLevel[lev].lOffsx*QCELLSTEP)),dFfrac); } else nv2 = 0.0; ny = 0.5* (nv2-nv1); #if LBMDIM==3 - if(NBFLAG(dT) &(CFFluid|CFInter)){ nv1 = RAC((ccel+(mLevel[lev].lOffsy*QCELLSTEP)),dFfrac); } else nv1 = 0.0; - if(NBFLAG(dB) &(CFFluid|CFInter)){ nv2 = RAC((ccel-(mLevel[lev].lOffsy*QCELLSTEP)),dFfrac); } else nv2 = 0.0; + if(nbflag[dT] &(CFFluid|CFInter)){ nv1 = RAC((ccel+(mLevel[lev].lOffsy*QCELLSTEP)),dFfrac); } else nv1 = 0.0; + if(nbflag[dB] &(CFFluid|CFInter)){ nv2 = RAC((ccel-(mLevel[lev].lOffsy*QCELLSTEP)),dFfrac); } else nv2 = 0.0; nz = 0.5* (nv2-nv1); #else // LBMDIM==3 nz = 0.0; @@ -769,15 +774,13 @@ LbmFsgrSolver::mainLoop(int lev) if(recons[dWB]) { m[dET] = EQWB + EQET - MYDF(dWB); } #endif - // mass streaming done... - // now collide new fluid or "old" if cells + // mass streaming done... do normal collide ux = mLevel[lev].gravity[0]; uy = mLevel[lev].gravity[1]; uz = mLevel[lev].gravity[2]; DEFAULT_COLLIDE; - rho = m[dC]; - FORDF1 { rho+=m[l]; }; - // only with interface neighbors...? PERFORM_USQRMAXCHECK; + // rho init from default collide necessary for fill/empty check below + // inflow bc handling if(oldFlag & (CFMbndInflow)) { // fill if cells in inflow region if(myfrac<0.5) { @@ -802,24 +805,26 @@ LbmFsgrSolver::mainLoop(int lev) // looks much nicer... LISTTRICK #if FSGR_LISTTRICK==1 - if(!iffilled) { - // remove cells independent from amount of change... - if( (oldFlag & CFNoNbEmpty)&&(newFlag & CFNoNbEmpty)&& - ( (mass>(rho*FSGR_LISTTTHRESHFULL)) || ((nbored&CFInter)==0) ) - ) { - //if((nbored&CFInter)==0){ errMsg("NBORED!CFINTER","filled "<(rho*FSGR_LISTTTHRESHFULL)) || ((nbored&CFInter)==0) ) + ) { + //if((nbored&CFInter)==0){ errMsg("NBORED!CFINTER","filled "<::mainLoop(int lev) RAC(tcel,dFfrac) = (mass/rho); // init new flux value - float flux = 0.5*(float)(D::cDfNum); // dxqn on - //flux = 50.0; // extreme on - for(int nn=1; nn1.0) curSmooth=1.0; + flux *= (1.0+ smoothStrength*curSmooth * (nbfracs[nn]-myfrac)) ; + } + } } + // NEW TEST */ + } + // flux = FLUX_INIT; // calc flux off QCELL(lev, i,j,k,TSET(lev), dFlux) = flux; // */ // perform mass exchange with streamed values QCELL(lev, i,j,k,TSET(lev), dMass) = mass; // MASST // set new flag *pFlagDst = (CellFlagType)newFlag; -//FST errMsg("M","i "<::mainLoop(int lev) // check other vars...? } -#undef NBFLAG template void @@ -2632,6 +2646,7 @@ void LbmFsgrSolver::reinitFlags( int workSet ) int nbored = 0; FORDF1 { nbored |= RFLAG_NB(workLev, i,j,k, workSet,l); } + if((nbored & CFBnd)==0) { RFLAG(workLev,i,j,k, workSet) |= CFNoBndFluid; } if((nbored & CFFluid)==0) { RFLAG(workLev,i,j,k, workSet) |= CFNoNbFluid; } if((nbored & CFEmpty)==0) { RFLAG(workLev,i,j,k, workSet) |= CFNoNbEmpty; } @@ -2674,8 +2689,11 @@ void LbmFsgrSolver::reinitFlags( int workSet ) // everything in one file again #if defined(__APPLE_CC__) #define LBM_FORCEINCLUDE -#include "solver_init.cpp" -#include "solver_util.cpp" +#include "olver_init.cpp" +#include "olver_util.cpp" +#ifdef ELBEEM_BLENDER +REMOVE_FIX +#endif #undef LBM_FORCEINCLUDE #endif // defined(__APPLE_CC__) diff --git a/intern/elbeem/intern/solver_relax.h b/intern/elbeem/intern/solver_relax.h index 9136cc0fd74..aa8b775fb80 100644 --- a/intern/elbeem/intern/solver_relax.h +++ b/intern/elbeem/intern/solver_relax.h @@ -250,7 +250,7 @@ #define DEFAULT_STREAM \ m[dC] = RAC(ccel,dC); \ FORDF1 { \ - CellFlagType nbf = NBFLAG( D::dfInv[l] );\ + CellFlagType nbf = nbflag[ D::dfInv[l] ];\ if(nbf & CFBnd) { \ if(nbf & CFBndNoslip) { \ /* no slip, default */ \ @@ -277,7 +277,7 @@ #define _________________DEFAULT_STREAM \ m[dC] = RAC(ccel,dC); \ FORDF1 { \ - CellFlagType nbf = NBFLAG( D::dfInv[l] );\ + CellFlagType nbf = nbflag[ D::dfInv[l] ];\ if(nbf & CFBnd) { \ if(nbf & CFBndNoslip) { \ /* no slip, default */ \ @@ -400,26 +400,26 @@ m[dET] = CSRC_ET; m[dEB] = CSRC_EB; m[dWT] = CSRC_WT; m[dWB] = CSRC_WB; \ } else { \ /* explicit streaming, normal velocity always zero for obstacles */ \ - if(NBFLAG(dS )&CFBnd) { m[dN ] = RAC(ccel,dS ); } else { m[dN ] = CSRC_N ; } \ - if(NBFLAG(dN )&CFBnd) { m[dS ] = RAC(ccel,dN ); } else { m[dS ] = CSRC_S ; } \ - if(NBFLAG(dW )&CFBnd) { m[dE ] = RAC(ccel,dW ); } else { m[dE ] = CSRC_E ; } \ - if(NBFLAG(dE )&CFBnd) { m[dW ] = RAC(ccel,dE ); } else { m[dW ] = CSRC_W ; } \ - if(NBFLAG(dB )&CFBnd) { m[dT ] = RAC(ccel,dB ); } else { m[dT ] = CSRC_T ; } \ - if(NBFLAG(dT )&CFBnd) { m[dB ] = RAC(ccel,dT ); } else { m[dB ] = CSRC_B ; } \ + if(nbflag[dS ]&CFBnd) { m[dN ] = RAC(ccel,dS ); } else { m[dN ] = CSRC_N ; } \ + if(nbflag[dN ]&CFBnd) { m[dS ] = RAC(ccel,dN ); } else { m[dS ] = CSRC_S ; } \ + if(nbflag[dW ]&CFBnd) { m[dE ] = RAC(ccel,dW ); } else { m[dE ] = CSRC_E ; } \ + if(nbflag[dE ]&CFBnd) { m[dW ] = RAC(ccel,dE ); } else { m[dW ] = CSRC_W ; } \ + if(nbflag[dB ]&CFBnd) { m[dT ] = RAC(ccel,dB ); } else { m[dT ] = CSRC_T ; } \ + if(nbflag[dT ]&CFBnd) { m[dB ] = RAC(ccel,dT ); } else { m[dB ] = CSRC_B ; } \ \ /* also treat free slip here */ \ - if(NBFLAG(dSW)&CFBnd) { if(NBFLAG(dSW)&CFBndNoslip){ m[dNE] = RAC(ccel,dSW); }else{ DEFAULT_STREAM_FREESLIP(dNE,dSW,NBFLAG(dSW));} } else { m[dNE] = CSRC_NE; } \ - if(NBFLAG(dSE)&CFBnd) { if(NBFLAG(dSE)&CFBndNoslip){ m[dNW] = RAC(ccel,dSE); }else{ DEFAULT_STREAM_FREESLIP(dNW,dSE,NBFLAG(dSE));} } else { m[dNW] = CSRC_NW; } \ - if(NBFLAG(dNW)&CFBnd) { if(NBFLAG(dNW)&CFBndNoslip){ m[dSE] = RAC(ccel,dNW); }else{ DEFAULT_STREAM_FREESLIP(dSE,dNW,NBFLAG(dNW));} } else { m[dSE] = CSRC_SE; } \ - if(NBFLAG(dNE)&CFBnd) { if(NBFLAG(dNE)&CFBndNoslip){ m[dSW] = RAC(ccel,dNE); }else{ DEFAULT_STREAM_FREESLIP(dSW,dNE,NBFLAG(dNE));} } else { m[dSW] = CSRC_SW; } \ - if(NBFLAG(dSB)&CFBnd) { if(NBFLAG(dSB)&CFBndNoslip){ m[dNT] = RAC(ccel,dSB); }else{ DEFAULT_STREAM_FREESLIP(dNT,dSB,NBFLAG(dSB));} } else { m[dNT] = CSRC_NT; } \ - if(NBFLAG(dST)&CFBnd) { if(NBFLAG(dST)&CFBndNoslip){ m[dNB] = RAC(ccel,dST); }else{ DEFAULT_STREAM_FREESLIP(dNB,dST,NBFLAG(dST));} } else { m[dNB] = CSRC_NB; } \ - if(NBFLAG(dNB)&CFBnd) { if(NBFLAG(dNB)&CFBndNoslip){ m[dST] = RAC(ccel,dNB); }else{ DEFAULT_STREAM_FREESLIP(dST,dNB,NBFLAG(dNB));} } else { m[dST] = CSRC_ST; } \ - if(NBFLAG(dNT)&CFBnd) { if(NBFLAG(dNT)&CFBndNoslip){ m[dSB] = RAC(ccel,dNT); }else{ DEFAULT_STREAM_FREESLIP(dSB,dNT,NBFLAG(dNT));} } else { m[dSB] = CSRC_SB; } \ - if(NBFLAG(dWB)&CFBnd) { if(NBFLAG(dWB)&CFBndNoslip){ m[dET] = RAC(ccel,dWB); }else{ DEFAULT_STREAM_FREESLIP(dET,dWB,NBFLAG(dWB));} } else { m[dET] = CSRC_ET; } \ - if(NBFLAG(dWT)&CFBnd) { if(NBFLAG(dWT)&CFBndNoslip){ m[dEB] = RAC(ccel,dWT); }else{ DEFAULT_STREAM_FREESLIP(dEB,dWT,NBFLAG(dWT));} } else { m[dEB] = CSRC_EB; } \ - if(NBFLAG(dEB)&CFBnd) { if(NBFLAG(dEB)&CFBndNoslip){ m[dWT] = RAC(ccel,dEB); }else{ DEFAULT_STREAM_FREESLIP(dWT,dEB,NBFLAG(dEB));} } else { m[dWT] = CSRC_WT; } \ - if(NBFLAG(dET)&CFBnd) { if(NBFLAG(dET)&CFBndNoslip){ m[dWB] = RAC(ccel,dET); }else{ DEFAULT_STREAM_FREESLIP(dWB,dET,NBFLAG(dET));} } else { m[dWB] = CSRC_WB; } \ + if(nbflag[dSW]&CFBnd) { if(nbflag[dSW]&CFBndNoslip){ m[dNE] = RAC(ccel,dSW); }else{ DEFAULT_STREAM_FREESLIP(dNE,dSW,nbflag[dSW]);} } else { m[dNE] = CSRC_NE; } \ + if(nbflag[dSE]&CFBnd) { if(nbflag[dSE]&CFBndNoslip){ m[dNW] = RAC(ccel,dSE); }else{ DEFAULT_STREAM_FREESLIP(dNW,dSE,nbflag[dSE]);} } else { m[dNW] = CSRC_NW; } \ + if(nbflag[dNW]&CFBnd) { if(nbflag[dNW]&CFBndNoslip){ m[dSE] = RAC(ccel,dNW); }else{ DEFAULT_STREAM_FREESLIP(dSE,dNW,nbflag[dNW]);} } else { m[dSE] = CSRC_SE; } \ + if(nbflag[dNE]&CFBnd) { if(nbflag[dNE]&CFBndNoslip){ m[dSW] = RAC(ccel,dNE); }else{ DEFAULT_STREAM_FREESLIP(dSW,dNE,nbflag[dNE]);} } else { m[dSW] = CSRC_SW; } \ + if(nbflag[dSB]&CFBnd) { if(nbflag[dSB]&CFBndNoslip){ m[dNT] = RAC(ccel,dSB); }else{ DEFAULT_STREAM_FREESLIP(dNT,dSB,nbflag[dSB]);} } else { m[dNT] = CSRC_NT; } \ + if(nbflag[dST]&CFBnd) { if(nbflag[dST]&CFBndNoslip){ m[dNB] = RAC(ccel,dST); }else{ DEFAULT_STREAM_FREESLIP(dNB,dST,nbflag[dST]);} } else { m[dNB] = CSRC_NB; } \ + if(nbflag[dNB]&CFBnd) { if(nbflag[dNB]&CFBndNoslip){ m[dST] = RAC(ccel,dNB); }else{ DEFAULT_STREAM_FREESLIP(dST,dNB,nbflag[dNB]);} } else { m[dST] = CSRC_ST; } \ + if(nbflag[dNT]&CFBnd) { if(nbflag[dNT]&CFBndNoslip){ m[dSB] = RAC(ccel,dNT); }else{ DEFAULT_STREAM_FREESLIP(dSB,dNT,nbflag[dNT]);} } else { m[dSB] = CSRC_SB; } \ + if(nbflag[dWB]&CFBnd) { if(nbflag[dWB]&CFBndNoslip){ m[dET] = RAC(ccel,dWB); }else{ DEFAULT_STREAM_FREESLIP(dET,dWB,nbflag[dWB]);} } else { m[dET] = CSRC_ET; } \ + if(nbflag[dWT]&CFBnd) { if(nbflag[dWT]&CFBndNoslip){ m[dEB] = RAC(ccel,dWT); }else{ DEFAULT_STREAM_FREESLIP(dEB,dWT,nbflag[dWT]);} } else { m[dEB] = CSRC_EB; } \ + if(nbflag[dEB]&CFBnd) { if(nbflag[dEB]&CFBndNoslip){ m[dWT] = RAC(ccel,dEB); }else{ DEFAULT_STREAM_FREESLIP(dWT,dEB,nbflag[dEB]);} } else { m[dWT] = CSRC_WT; } \ + if(nbflag[dET]&CFBnd) { if(nbflag[dET]&CFBndNoslip){ m[dWB] = RAC(ccel,dET); }else{ DEFAULT_STREAM_FREESLIP(dWB,dET,nbflag[dET]);} } else { m[dWB] = CSRC_WB; } \ } diff --git a/intern/elbeem/intern/solver_util.cpp b/intern/elbeem/intern/solver_util.cpp index 8bf2df99278..60c8b08be67 100644 --- a/intern/elbeem/intern/solver_util.cpp +++ b/intern/elbeem/intern/solver_util.cpp @@ -62,7 +62,12 @@ void LbmFsgrSolver::prepareVisualization( void ) { if( (RFLAG(lev, i,j,k,workSet)&CFInter) && (!(RFLAG(lev, i,j,k,workSet)&CFNoNbEmpty)) ){ // no empty nb interface cells are treated as full val = (QCELL(lev, i,j,k,workSet, dFfrac)); - //if( (!(RFLAG(lev, i,j,k,workSet)&CFNoBndFluid)) &&(RFLAG(lev, i,j,k,workSet)&CFNoNbFluid)){ val += D::mIsoValue; } + /* // flicker-test-fix: no real difference + if( (!(RFLAG(lev, i,j,k,workSet)&CFNoBndFluid)) && + (RFLAG(lev, i,j,k,workSet)&CFNoNbFluid) && + (val::prepareVisualization( void ) { *D::mpIso->lbmGetData( i+1 , j+1 ,ZKOFF+ZKD1) += ( val * mIsoWeight[26] ); } + /* for(int k=0;k LbmFsgrSolver::getDebugObjects() { debo.push_back( mpPreviewSurface ); } #ifndef ELBEEM_BLENDER - debo.push_back( mpTest ); + if(mUseTestdata) debo.push_back( mpTest ); #endif // ELBEEM_BLENDER return debo; } diff --git a/intern/elbeem/intern/utilities.cpp b/intern/elbeem/intern/utilities.cpp index b9e97de47fb..acc18fc3bf3 100644 --- a/intern/elbeem/intern/utilities.cpp +++ b/intern/elbeem/intern/utilities.cpp @@ -49,6 +49,7 @@ int globalColorSetting = 0; #else // WIN32 int globalColorSetting = 1; #endif // WIN32 +int globalFirstEnvCheck = 0; //----------------------------------------------------------------------------- @@ -290,9 +291,25 @@ void messageOutputFunc(string from, int id, string msg, myTime_t interval) { } // helper functions from external program using elbeem lib (e.g. Blender) +/* set gDebugLevel according to env. var */ +extern "C" +void elbeemCheckDebugEnv(void) { + const char *strEnvName = "BLENDER_ELBEEMDEBUG"; + if(globalFirstEnvCheck) return; + + if(getenv(strEnvName)) { + gDebugLevel = atoi(getenv(strEnvName)); + if(gDebugLevel< 0) gDebugLevel = 0; + if(gDebugLevel>10) gDebugLevel = 0; // only use valid values + if(gDebugLevel>0) debMsgStd("performElbeemSimulation",DM_NOTIFY,"Using envvar '"<