From d3d8441f678e8bf444a04e7379abc5322e4980b0 Mon Sep 17 00:00:00 2001 From: Nils Thuerey Date: Mon, 10 Oct 2005 08:52:42 +0000 Subject: - fixed fluidsim inflow speed init - fixed intersecting fluid objects init - added MSVC6 fixes from bjornmose (thanks!) --- intern/elbeem/intern/cfgparser.cpp | 1 + intern/elbeem/intern/lbmfsgrsolver.h | 29 +++++++++++++++++------------ intern/elbeem/intern/lbminterface.h | 10 +++++----- intern/elbeem/intern/ntl_bsptree.cpp | 10 +++++----- intern/elbeem/intern/ntl_bsptree.h | 2 +- intern/elbeem/intern/ntl_vector3dim.h | 6 ++++-- intern/elbeem/intern/parametrizer.cpp | 4 ++++ intern/elbeem/intern/simulation_object.h | 6 ++++++ 8 files changed, 43 insertions(+), 25 deletions(-) (limited to 'intern/elbeem') diff --git a/intern/elbeem/intern/cfgparser.cpp b/intern/elbeem/intern/cfgparser.cpp index 8984fce107c..22f2af8f962 100644 --- a/intern/elbeem/intern/cfgparser.cpp +++ b/intern/elbeem/intern/cfgparser.cpp @@ -1233,6 +1233,7 @@ yysymprint (yyoutput, yytype, yyvaluep) # endif switch (yytype) { + case 0: default: break; } diff --git a/intern/elbeem/intern/lbmfsgrsolver.h b/intern/elbeem/intern/lbmfsgrsolver.h index d9622fd65ac..febfe5da59c 100644 --- a/intern/elbeem/intern/lbmfsgrsolver.h +++ b/intern/elbeem/intern/lbmfsgrsolver.h @@ -103,6 +103,8 @@ ERROR - define model first! #define FSGR_MAGICNR 0.025 //0.04 +//! maxmimum no. of grid levels +#define FSGR_MAXNOOFLEVELS 5 // helper for comparing floats with epsilon #define GFX_FLOATNEQ(x,y) ( ABS((x)-(y)) > (VECTOR_EPSILON) ) @@ -421,7 +423,11 @@ class LbmFsgrSolver : //bool mStartSymm; //! kepp track of max/min no. of filled cells int mMaxNoCells, mMinNoCells; +#ifndef USE_MSVC6FIXES long long int mAvgNumUsedCells; +#else + _int64 mAvgNumUsedCells; +#endif //! for interactive - how to drop drops? int mDropMode; @@ -441,8 +447,7 @@ class LbmFsgrSolver : // grid coarsening vars /*! vector for the data for each level */ -# define MAX_LEV 5 - FsgrLevelData mLevel[MAX_LEV]; + FsgrLevelData mLevel[FSGR_MAXNOOFLEVELS]; /*! minimal and maximal refinement levels */ int mMaxRefine; @@ -1386,6 +1391,8 @@ LbmFsgrSolver::parseAttrList() // refinement mMaxRefine = D::mpAttrs->readInt("maxrefine", mMaxRefine ,"LbmFsgrSolver", "mMaxRefine", true); + if(mMaxRefine<0) mMaxRefine=0; + if(mMaxRefine>FSGR_MAXNOOFLEVELS) mMaxRefine=FSGR_MAXNOOFLEVELS-1; mDisableStandingFluidInit = D::mpAttrs->readInt("disable_stfluidinit", mDisableStandingFluidInit,"LbmFsgrSolver", "mDisableStandingFluidInit", false); mForceTadapRefine = D::mpAttrs->readInt("forcetadaprefine", mForceTadapRefine,"LbmFsgrSolver", "mForceTadapRefine", false); @@ -1569,10 +1576,7 @@ LbmFsgrSolver::initialize( ntlTree* /*tree*/, vector* /*o // init vectors - if(mMaxRefine >= MAX_LEV) { - errFatal("LbmFsgrSolver::initializeLbmGridref"," error: Too many levels!", SIMWORLD_INITERROR); - return false; - } + //if(mMaxRefine >= FSGR_MAXNOOFLEVELS) { errFatal("LbmFsgrSolver::initializeLbmGridref"," error: Too many levels!", SIMWORLD_INITERROR); return false; } for(int i=0; i<=mMaxRefine; i++) { mLevel[i].id = i; mLevel[i].nodeSize = 0.0; @@ -2043,10 +2047,9 @@ LbmFsgrSolver::initGeometryFlags() { } if(ntype != CFInvalid) { // initDefaultCell - if((ntype == CFMbndInflow) || (ntype == CFMbndOutflow) ) { + if((ntype & CFMbndInflow) || (ntype & CFMbndOutflow) ) { ntype |= (OId<<24); } - initVelocityCell(level, i,j,k, ntype, rhomass, rhomass, mObjectSpeeds[OId] ); } @@ -2058,7 +2061,7 @@ LbmFsgrSolver::initGeometryFlags() { dcnt += dvec[0]; i++; savedNodes++; if(ntype != CFInvalid) { - // rhomass are still inited from above + // rho,mass,OId are still inited from above initVelocityCell(level, i,j,k, ntype, rhomass, rhomass, mObjectSpeeds[OId] ); } } @@ -2699,7 +2702,9 @@ LbmFsgrSolver::stepMain() "mlsups(curr:"<::adaptTimestep() bool rescale = false; // do any rescale at all? LbmFloat scaleFac = -1.0; // timestep scaling - LbmFloat levOldOmega[MAX_LEV]; - LbmFloat levOldStepsize[MAX_LEV]; + LbmFloat levOldOmega[FSGR_MAXNOOFLEVELS]; + LbmFloat levOldStepsize[FSGR_MAXNOOFLEVELS]; for(int lev=mMaxRefine; lev>=0 ; lev--) { levOldOmega[lev] = mLevel[lev].omega; levOldStepsize[lev] = mLevel[lev].stepsize; @@ -6180,8 +6185,8 @@ void LbmFsgrSolver::recalculateObjectSpeeds() { } mObjectSpeeds.resize(numobjs+0); for(int i=0; i<(int)(numobjs+0); i++) { - //errMsg("recalculateObjectSpeeds","id"<calculateLattVelocityFromRw( vec2P( (*D::mpGiObjects)[i]->getInitialVelocity() )) )); mObjectSpeeds[i] = vec2L(D::mpParam->calculateLattVelocityFromRw( vec2P( (*D::mpGiObjects)[i]->getInitialVelocity() ))); + //errMsg("recalculateObjectSpeeds","id"<getInitialVelocity() )); } } diff --git a/intern/elbeem/intern/lbminterface.h b/intern/elbeem/intern/lbminterface.h index 294d6a76627..073558e1309 100644 --- a/intern/elbeem/intern/lbminterface.h +++ b/intern/elbeem/intern/lbminterface.h @@ -294,11 +294,11 @@ class LbmSolverInterface ntlVec3Gfx getGeoMaxInitialVelocity(); /* rt interface functions */ - unsigned int getIsoVertexCount() { return mpIso->getIsoVertexCount(); } - unsigned int getIsoIndexCount() { return mpIso->getIsoIndexCount(); } - char* getIsoVertexArray() { return mpIso->getIsoVertexArray(); } - unsigned int *getIsoIndexArray() { return mpIso->getIsoIndexArray(); } - void triangulateSurface() { return mpIso->triangulate(); } + unsigned int getIsoVertexCount() { return mpIso->getIsoVertexCount(); } + unsigned int getIsoIndexCount() { return mpIso->getIsoIndexCount(); } + char* getIsoVertexArray() { return mpIso->getIsoVertexArray(); } + unsigned int *getIsoIndexArray() { return mpIso->getIsoIndexArray(); } + void triangulateSurface() { mpIso->triangulate(); } /* access functions */ diff --git a/intern/elbeem/intern/ntl_bsptree.cpp b/intern/elbeem/intern/ntl_bsptree.cpp index 43d45130ca6..0c6cdbd3d83 100644 --- a/intern/elbeem/intern/ntl_bsptree.cpp +++ b/intern/elbeem/intern/ntl_bsptree.cpp @@ -886,14 +886,14 @@ gfxReal ntlTree::distanceToPlane(BSPNode *curr, ntlVec3Gfx plane, ntlRay ray) co /****************************************************************************** * return ordering of children nodes relatice to origin point *****************************************************************************/ -void ntlTree::getChildren(BSPNode *curr, ntlVec3Gfx origin, BSPNode *&near, BSPNode *&far) const +void ntlTree::getChildren(BSPNode *curr, ntlVec3Gfx origin, BSPNode *&node_near, BSPNode *&node_far) const { if(curr->child[0]->max[ curr->axis ] >= origin[ curr->axis ]) { - near = curr->child[0]; - far = curr->child[1]; + node_near = curr->child[0]; + node_far = curr->child[1]; } else { - near = curr->child[1]; - far = curr->child[0]; + node_near = curr->child[1]; + node_far = curr->child[0]; } } diff --git a/intern/elbeem/intern/ntl_bsptree.h b/intern/elbeem/intern/ntl_bsptree.h index b2d24fd318a..d9746532fc0 100644 --- a/intern/elbeem/intern/ntl_bsptree.h +++ b/intern/elbeem/intern/ntl_bsptree.h @@ -66,7 +66,7 @@ class ntlTree gfxReal distanceToPlane(BSPNode *curr, ntlVec3Gfx plane, ntlRay ray) const; //! return ordering of children nodes relatice to origin point - void getChildren(BSPNode *curr, ntlVec3Gfx origin, BSPNode *&near, BSPNode *&far) const; + void getChildren(BSPNode *curr, ntlVec3Gfx origin, BSPNode *&node_near, BSPNode *&node_far) const; //! delete a node of the tree with all sub nodes, dont delete root members void deleteNode(BSPNode *curr); diff --git a/intern/elbeem/intern/ntl_vector3dim.h b/intern/elbeem/intern/ntl_vector3dim.h index fe43fab462f..acda16b3bbb 100644 --- a/intern/elbeem/intern/ntl_vector3dim.h +++ b/intern/elbeem/intern/ntl_vector3dim.h @@ -23,19 +23,21 @@ #include #include -// hack for dxxx MSVC6.0 compiler +// hack for MSVC6.0 compiler #ifdef _MSC_VER #if _MSC_VER < 1300 #define for if(false); else for #define map std::map #define vector std::vector #define string std::string +// use this define for MSVC6 stuff hereafter +#define USE_MSVC6FIXES #else // _MSC_VER < 1300 , 7.0 or higher using std::map; using std::vector; using std::string; #endif -#else // MSVC6 +#else // not MSVC6 // for proper compilers... using std::map; using std::vector; diff --git a/intern/elbeem/intern/parametrizer.cpp b/intern/elbeem/intern/parametrizer.cpp index 8b5a9772923..6f6d275aa2f 100644 --- a/intern/elbeem/intern/parametrizer.cpp +++ b/intern/elbeem/intern/parametrizer.cpp @@ -96,6 +96,10 @@ void Parametrizer::parseAttrList() mDomainSize = mpAttrs->readFloat("p_domainsize",mDomainSize, "Parametrizer","mDomainSize", false); if(getAttributeList()->exists("p_domainsize")) seenThis( PARAM_DOMAINSIZE ); + if(mDomainSize<=0.0) { + errMsg("Parametrizer::parseAttrList","Invalid real world domain size:"<readVec3d("p_gravity",mGravity, "Parametrizer","mGravity", false); if(getAttributeList()->exists("p_gravity")) seenThis( PARAM_GRAVITY ); diff --git a/intern/elbeem/intern/simulation_object.h b/intern/elbeem/intern/simulation_object.h index ec84ab02bd3..84a0fd8222a 100644 --- a/intern/elbeem/intern/simulation_object.h +++ b/intern/elbeem/intern/simulation_object.h @@ -162,7 +162,13 @@ class SimulationObject : bool mShowParticles; /*! debug display settings */ +#ifndef USE_MSVC6FIXES static const int MAX_DEBDISPSET = 10; +#else + // so this is a known and documented MSVC6 bug + // work around + enum {MAX_DEBDISPSET = 10}; +#endif fluidDispSettings mDebDispSet[ MAX_DEBDISPSET ]; /*! pointer to identifier of selected node */ -- cgit v1.2.3