- fixed fluidsim inflow speed init

- fixed intersecting fluid objects init
- added MSVC6 fixes from bjornmose (thanks!)
This commit is contained in:
Nils Thuerey 2005-10-10 08:52:42 +00:00
parent 328eeaf10b
commit d3d8441f67
9 changed files with 44 additions and 26 deletions

@ -1233,6 +1233,7 @@ yysymprint (yyoutput, yytype, yyvaluep)
# endif
switch (yytype)
{
case 0:
default:
break;
}

@ -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<D>::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<D>::initialize( ntlTree* /*tree*/, vector<ntlGeometryObject*>* /*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<D>::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<D>::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<D>::stepMain()
"mlsups(curr:"<<D::mMLSUPS<<
" avg:"<<(mAvgMLSUPS/mAvgMLSUPSCnt)<<"), "<< sepStr<<
" totcls:"<<(D::mNumUsedCells)<< sepStr<<
#ifndef USE_MSVC6FIXES
" avgcls:"<< (int)(mAvgNumUsedCells/(long long int)D::mStepCnt)<< sepStr<<
#endif
" intd:"<<mNumInterdCells<< sepStr<<
" invif:"<<mNumInvIfCells<< sepStr<<
" invift:"<<mNumInvIfTotal<< sepStr<<
@ -4461,8 +4466,8 @@ LbmFsgrSolver<D>::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<D>::recalculateObjectSpeeds() {
}
mObjectSpeeds.resize(numobjs+0);
for(int i=0; i<(int)(numobjs+0); i++) {
//errMsg("recalculateObjectSpeeds","id"<<i<<" "<<vec2L(D::mpParam->calculateLattVelocityFromRw( vec2P( (*D::mpGiObjects)[i]->getInitialVelocity() )) ));
mObjectSpeeds[i] = vec2L(D::mpParam->calculateLattVelocityFromRw( vec2P( (*D::mpGiObjects)[i]->getInitialVelocity() )));
//errMsg("recalculateObjectSpeeds","id"<<i<<" set to "<< mObjectSpeeds[i]<<", unscaled:"<< (*D::mpGiObjects)[i]->getInitialVelocity() ));
}
}

@ -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 */

@ -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];
}
}

@ -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);

@ -23,19 +23,21 @@
#include <string.h>
#include <stdio.h>
// 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;

@ -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:"<<mAniFrameTime<<", resetting to 0.1");
mDomainSize = 0.1;
}
mGravity = mpAttrs->readVec3d("p_gravity",mGravity, "Parametrizer","mGravity", false);
if(getAttributeList()->exists("p_gravity")) seenThis( PARAM_GRAVITY );

@ -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 */

@ -555,13 +555,13 @@ void fluidsimBake(struct Object *ob)
" define { \n" ;
char *obstacleString =
" geoinittype= \"" "%s" /* type */ "\"; #cfgset \n"
" geoinit_intersect = 1; \n"
" filename= \"" "%s" /* data filename */ "\"; #cfgset \n" ;
char *fluidString =
" geoinittype= \"" "%s" /* type */ "\"; \n"
" filename= \"" "%s" /* data filename */ "\"; #cfgset \n"
" initial_velocity= " "%f %f %f" /* vel vector */ "; #cfgset \n" ;
char *objectStringEnd =
" geoinit_intersect = 1; \n" /* always use accurate init here */
" geoinitid= 1; \n"
" } \n"
" } \n"