Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNils Thuerey <nils@thuerey.de>2005-11-09 10:56:26 +0300
committerNils Thuerey <nils@thuerey.de>2005-11-09 10:56:26 +0300
commite3f681da67989ed87a270a2c07849265d44bb7da (patch)
tree0f08613c0a39187dd7dbb84df7ff45f39936c36f /intern/elbeem
parent564b62901346ba0f40032616c51ac7da1c703a54 (diff)
- 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
Diffstat (limited to 'intern/elbeem')
-rw-r--r--intern/elbeem/intern/blendercall.cpp11
-rw-r--r--intern/elbeem/intern/ntl_world.cpp7
-rw-r--r--intern/elbeem/intern/parametrizer.cpp9
-rw-r--r--intern/elbeem/intern/solver_class.h1
-rw-r--r--intern/elbeem/intern/solver_init.cpp28
-rw-r--r--intern/elbeem/intern/solver_interface.cpp5
-rw-r--r--intern/elbeem/intern/solver_main.cpp144
-rw-r--r--intern/elbeem/intern/solver_relax.h40
-rw-r--r--intern/elbeem/intern/solver_util.cpp10
-rw-r--r--intern/elbeem/intern/utilities.cpp17
10 files changed, 168 insertions, 104 deletions
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 <stdlib.h>
+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 '"<<strEnvName<<"'='"<<getenv(strEnvName)<<"', debugLevel set to: "<<gDebugLevel<<"\n", 1);
- }
+
//if(gDebugLevel>0) {
+ elbeemCheckDebugEnv();
debMsgStd("performElbeemSimulation",DM_NOTIFY,"Running El'Beem from Blender with file '"<< cfgfilename <<"', debugLevel:"<<gDebugLevel<<" ...\n", 2);
//}
// load given file in command line mode
diff --git a/intern/elbeem/intern/ntl_world.cpp b/intern/elbeem/intern/ntl_world.cpp
index bd7a6abeb6f..b2677fe7011 100644
--- a/intern/elbeem/intern/ntl_world.cpp
+++ b/intern/elbeem/intern/ntl_world.cpp
@@ -176,8 +176,10 @@ int ntlWorld::renderAnimation( void )
mThreadRunning = true; // not threaded, but still use the same flags
renderScene();
for(int i=0; ((i<mpGlob->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;i<mpSims->size();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 (="<<mAniFrameTime<<") <> ani-frame-time ("<<mStepTime<<") settings, aborting...", SIMWORLD_INITERROR);
+ return 1;
+ }
+ return value;
}
/*! get extent of the domain = (1,1,1) if parametrizer not used, (x,y,z) [m] otherwise */
diff --git a/intern/elbeem/intern/solver_class.h b/intern/elbeem/intern/solver_class.h
index 214113e5093..40e562b1ab0 100644
--- a/intern/elbeem/intern/solver_class.h
+++ b/intern/elbeem/intern/solver_class.h
@@ -470,6 +470,7 @@ class LbmFsgrSolver :
#if ELBEEM_BLENDER!=1
// test functions
+ bool mUseTestdata;
LbmTestdata *mpTest;
void initTestdata();
void destroyTestdata();
diff --git a/intern/elbeem/intern/solver_init.cpp b/intern/elbeem/intern/solver_init.cpp
index 5d692d8ae52..99db4bc433f 100644
--- a/intern/elbeem/intern/solver_init.cpp
+++ b/intern/elbeem/intern/solver_init.cpp
@@ -46,6 +46,9 @@ LbmFsgrSolver<D>::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<class D>
LbmFsgrSolver<D>::~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<D>::~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<D>::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<D>::initialize( ntlTree* /*tree*/, vector<ntlGeometryObject*>* /*o
int maskBits = mMaxRefine;
if(PARALLEL==1) maskBits+=2;
for(int i=0; i<maskBits; i++) { sizeMask |= (1<<i); }
+
+ // at least size 4 on coarsest level
+ int minSize = (int)powf(2.0, maskBits+2.0);
+ if(D::mSizex<minSize) D::mSizex = minSize;
+ if(D::mSizey<minSize) D::mSizey = minSize;
+ if(D::mSizez<minSize) D::mSizez = minSize;
+errMsg("MMS","minSize"<<minSize);
+
sizeMask = ~sizeMask;
if(debugGridsizeInit) debMsgStd("LbmFsgrSolver::initialize",DM_MSG,"Size X:"<<D::mSizex<<" Y:"<<D::mSizey<<" Z:"<<D::mSizez<<" m"<<convertCellFlagType2String(sizeMask) ,10);
D::mSizex &= sizeMask;
D::mSizey &= sizeMask;
D::mSizez &= sizeMask;
- // force geom size to match rounded grid sizes
+
+ // force geom size to match rounded/modified grid sizes
D::mvGeoEnd[0] = D::mvGeoStart[0] + cellSize*(LbmFloat)D::mSizex;
D::mvGeoEnd[1] = D::mvGeoStart[1] + cellSize*(LbmFloat)D::mSizey;
D::mvGeoEnd[2] = D::mvGeoStart[2] + cellSize*(LbmFloat)D::mSizez;
@@ -1027,7 +1043,7 @@ LbmFsgrSolver<D>::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<D>::stepMain()
} // */
#if ELBEEM_BLENDER!=1
- handleTestdata();
+ if(mUseTestdata) handleTestdata();
#endif // ELBEEM_BLENDER!=1
}
@@ -299,9 +299,6 @@ LbmFsgrSolver<D>::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<D>::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<D>::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<D>::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<D::cDfNum; l++) { ofrho += RAC(ccel,l); }
-//FST errMsg("TTTfl","at "<<PRINT_IJK<<", rho"<<rho );
calcCurrentMass += rho;
calcCurrentVolume += 1.0;
continue;
@@ -594,23 +592,31 @@ LbmFsgrSolver<D>::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<D>::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<D>::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<D>::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 "<<PRINT_IJK<<",l"<<l<<" m"<<mass<<",c"<<change<<" nbflag"<<convertCellFlagType2String(NBFLAG(l))<<" nbdf"<<nbdf(l)<<" mydf"<<MYDF(l)<<" isflix"<<((NBFLAG(l)&(CFFluid|CFBnd) )!=0) );
// modify mass at SRCS
mass += change;
} // l
@@ -665,15 +670,15 @@ LbmFsgrSolver<D>::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<D>::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<D>::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 "<<PRINT_IJK); };
- iffilled = 1;
- }
- }
- if(!ifemptied) {
- if( (oldFlag & CFNoNbFluid)&&(newFlag & CFNoNbFluid)&&
- ( (mass<(rho*FSGR_LISTTTHRESHEMPTY)) || ((nbored&CFInter)==0) )
- )
- {
- //if((nbored&CFInter)==0){ errMsg("NBORED!CFINTER","emptied "<<PRINT_IJK); };
- ifemptied = 1;
- }
- } // */
+ if(newFlag&CFNoBndFluid) { // test NEW TEST
+ 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 "<<PRINT_IJK); };
+ iffilled = 1;
+ }
+ }
+ if(!ifemptied) {
+ if( (oldFlag & CFNoNbFluid)&&(newFlag & CFNoNbFluid)&&
+ ( (mass<(rho*FSGR_LISTTTHRESHEMPTY)) || ((nbored&CFInter)==0) )
+ )
+ {
+ //if((nbored&CFInter)==0){ errMsg("NBORED!CFINTER","emptied "<<PRINT_IJK); };
+ ifemptied = 1;
+ }
+ }
+ } // nobndfluid only */
#endif
//iffilled = ifemptied = 0; // DEBUG!!!!!!!!!!!!!!!
@@ -855,21 +860,31 @@ LbmFsgrSolver<D>::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; nn<D::cDfNum; nn++) {
- if(RFLAG_NB(lev, i,j,k,SRCS(lev),nn) & (CFFluid|CFInter|CFBnd)) {
- flux += D::dfLength[nn];
+ float flux = FLUX_INIT; // dxqn on
+ if(newFlag&CFNoBndFluid) {
+ //flux = 50.0; // extreme on
+ for(int nn=1; nn<D::cDfNum; nn++) {
+ if(nbflag[nn] & (CFFluid|CFInter|CFBnd)) { flux += D::dfLength[nn]; }
}
- }
- //flux = FLUX_INIT; // calc flux off
+ // optical hack - smooth slow moving
+ // surface regions
+ if(usqr< sssUsqrLimit) {
+ for(int nn=1; nn<D::cDfNum; nn++) {
+ if(nbfracs[nn]!=0.0) {
+ LbmFloat curSmooth = (sssUsqrLimit-usqr)*sssUsqrLimitInv;
+ if(curSmooth>1.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 "<<mass);
calcCurrentMass += mass;
calcCurrentVolume += RAC(tcel,dFfrac);
@@ -919,7 +934,6 @@ LbmFsgrSolver<D>::mainLoop(int lev)
// check other vars...?
}
-#undef NBFLAG
template<class D>
void
@@ -2632,6 +2646,7 @@ void LbmFsgrSolver<D>::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<D>::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<D>::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<D::mIsoValue) ){
+ val = D::mIsoValue*1.1; }
+ // */
} else {
// fluid?
val = 1.0; ///27.0;
@@ -107,6 +112,7 @@ void LbmFsgrSolver<D>::prepareVisualization( void ) {
*D::mpIso->lbmGetData( i+1 , j+1 ,ZKOFF+ZKD1) += ( val * mIsoWeight[26] );
}
+
/*
for(int k=0;k<mLevel[mMaxRefine].lSizez-1;k++)
for(int j=0;j<mLevel[mMaxRefine].lSizey-1;j++) {
@@ -213,7 +219,7 @@ vector<ntlGeometryObject*> LbmFsgrSolver<D>::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 '"<<strEnvName<<"'='"<<getenv(strEnvName)<<"', debugLevel set to: "<<gDebugLevel<<"\n", 1);
+ }
+ globalFirstEnvCheck = 1;
+}
+
/* elbeem debug output function */
extern "C"
void elbeemDebugOut(char *msg) {
+ elbeemCheckDebugEnv();
// external messages default to debug level 5...
if(gDebugLevel<5) return;
// delegate to messageOutputFunc