- another minor solver update to fix

obstacle fluid surface generation bug
- also contains some code clean ups
  and safer initializations
This commit is contained in:
2006-06-12 12:55:51 +00:00
parent a0d94e6727
commit b0a22902ec
13 changed files with 205 additions and 101 deletions

View File

@@ -472,35 +472,45 @@ bool AttributeList::ignoreParameter(string name, string source) {
// read channels // read channels
AnimChannel<int> AttributeList::readChannelInt(string name, int defaultValue, string source, string target, bool needed) { AnimChannel<int> AttributeList::readChannelInt(string name, int defaultValue, string source, string target, bool needed) {
if(!exists(name)) { return AnimChannel<int>(defaultValue); } if(!exists(name)) {
if(needed) { errFatal("AttributeList::readChannelInt","Required channel '"<<name<<"' for "<<target<<" from "<< source <<" not set! ", SIMWORLD_INITERROR); }
return AnimChannel<int>(defaultValue); }
AnimChannel<int> ret = find(name)->getChannelInt(); AnimChannel<int> ret = find(name)->getChannelInt();
find(name)->setUsed(true); find(name)->setUsed(true);
channelSimplifyi(ret); channelSimplifyi(ret);
return ret; return ret;
} }
AnimChannel<double> AttributeList::readChannelFloat(string name, double defaultValue, string source, string target, bool needed ) { AnimChannel<double> AttributeList::readChannelFloat(string name, double defaultValue, string source, string target, bool needed ) {
if(!exists(name)) { return AnimChannel<double>(defaultValue); } if(!exists(name)) {
if(needed) { errFatal("AttributeList::readChannelFloat","Required channel '"<<name<<"' for "<<target<<" from "<< source <<" not set! ", SIMWORLD_INITERROR); }
return AnimChannel<double>(defaultValue); }
AnimChannel<double> ret = find(name)->getChannelFloat(); AnimChannel<double> ret = find(name)->getChannelFloat();
find(name)->setUsed(true); find(name)->setUsed(true);
channelSimplifyd(ret); channelSimplifyd(ret);
return ret; return ret;
} }
AnimChannel<ntlVec3d> AttributeList::readChannelVec3d(string name, ntlVec3d defaultValue, string source, string target, bool needed ) { AnimChannel<ntlVec3d> AttributeList::readChannelVec3d(string name, ntlVec3d defaultValue, string source, string target, bool needed ) {
if(!exists(name)) { return AnimChannel<ntlVec3d>(defaultValue); } if(!exists(name)) {
if(needed) { errFatal("AttributeList::readChannelVec3d","Required channel '"<<name<<"' for "<<target<<" from "<< source <<" not set! ", SIMWORLD_INITERROR); }
return AnimChannel<ntlVec3d>(defaultValue); }
AnimChannel<ntlVec3d> ret = find(name)->getChannelVec3d(); AnimChannel<ntlVec3d> ret = find(name)->getChannelVec3d();
find(name)->setUsed(true); find(name)->setUsed(true);
channelSimplifyVd(ret); channelSimplifyVd(ret);
return ret; return ret;
} }
AnimChannel<ntlSetVec3f> AttributeList::readChannelSetVec3f(string name, ntlSetVec3f defaultValue, string source, string target, bool needed) { AnimChannel<ntlSetVec3f> AttributeList::readChannelSetVec3f(string name, ntlSetVec3f defaultValue, string source, string target, bool needed) {
if(!exists(name)) { return AnimChannel<ntlSetVec3f>(defaultValue); } if(!exists(name)) {
if(needed) { errFatal("AttributeList::readChannelSetVec3f","Required channel '"<<name<<"' for "<<target<<" from "<< source <<" not set! ", SIMWORLD_INITERROR); }
return AnimChannel<ntlSetVec3f>(defaultValue); }
AnimChannel<ntlSetVec3f> ret = find(name)->getChannelSetVec3f(); AnimChannel<ntlSetVec3f> ret = find(name)->getChannelSetVec3f();
find(name)->setUsed(true); find(name)->setUsed(true);
//channelSimplifyVf(ret); //channelSimplifyVf(ret);
return ret; return ret;
} }
AnimChannel<float> AttributeList::readChannelSinglePrecFloat(string name, float defaultValue, string source, string target, bool needed ) { AnimChannel<float> AttributeList::readChannelSinglePrecFloat(string name, float defaultValue, string source, string target, bool needed ) {
if(!exists(name)) { return AnimChannel<float>(defaultValue); } if(!exists(name)) {
if(needed) { errFatal("AttributeList::readChannelSinglePrecFloat","Required channel '"<<name<<"' for "<<target<<" from "<< source <<" not set! ", SIMWORLD_INITERROR); }
return AnimChannel<float>(defaultValue); }
AnimChannel<double> convert = find(name)->getChannelFloat(); AnimChannel<double> convert = find(name)->getChannelFloat();
find(name)->setUsed(true); find(name)->setUsed(true);
channelSimplifyd(convert); channelSimplifyd(convert);
@@ -514,7 +524,9 @@ AnimChannel<float> AttributeList::readChannelSinglePrecFloat(string name, float
return ret; return ret;
} }
AnimChannel<ntlVec3f> AttributeList::readChannelVec3f(string name, ntlVec3f defaultValue, string source, string target, bool needed) { AnimChannel<ntlVec3f> AttributeList::readChannelVec3f(string name, ntlVec3f defaultValue, string source, string target, bool needed) {
if(!exists(name)) { return AnimChannel<ntlVec3f>(defaultValue); } if(!exists(name)) {
if(needed) { errFatal("AttributeList::readChannelVec3f","Required channel '"<<name<<"' for "<<target<<" from "<< source <<" not set! ", SIMWORLD_INITERROR); }
return AnimChannel<ntlVec3f>(defaultValue); }
AnimChannel<ntlVec3d> convert = find(name)->getChannelVec3d(); AnimChannel<ntlVec3d> convert = find(name)->getChannelVec3d();
// convert to float // convert to float
@@ -737,6 +749,19 @@ void AnimChannel<Scalar>::debugPrintChannel() {
} }
// hack to force instantiation
void __forceAnimChannelInstantiation() {
AnimChannel< float > tmp1;
AnimChannel< double > tmp2;
AnimChannel< string > tmp3;
AnimChannel< ntlVector3Dim<float> > tmp4;
tmp1.debugPrintChannel();
tmp2.debugPrintChannel();
tmp3.debugPrintChannel();
tmp4.debugPrintChannel();
}
ntlSetVec3f::ntlSetVec3f(double v ) { ntlSetVec3f::ntlSetVec3f(double v ) {
mVerts.clear(); mVerts.clear();
mVerts.push_back( ntlVec3f(v) ); mVerts.push_back( ntlVec3f(v) );

View File

@@ -115,32 +115,45 @@ void elbeemGetErrorString(char *buffer) {
extern "C" extern "C"
void elbeemResetMesh(elbeemMesh *mesh) { void elbeemResetMesh(elbeemMesh *mesh) {
if(!mesh) return; if(!mesh) return;
// init typedef struct elbeemMesh
mesh->type = 0; mesh->type = 0;
mesh->parentDomainId = 0;
mesh->parentDomainId = 0;
/* vertices */
mesh->numVertices = 0; mesh->numVertices = 0;
mesh->vertices = NULL; mesh->vertices = NULL;
mesh->channelSizeVertices = 0;
mesh->channelVertices = NULL;
/* triangles */
mesh->numTriangles = 0; mesh->numTriangles = 0;
mesh->triangles = NULL; mesh->triangles = NULL;
/* animation channels */
mesh->channelSizeTranslation = 0; mesh->channelSizeTranslation = 0;
mesh->channelTranslation = NULL; mesh->channelTranslation = NULL;
mesh->channelSizeRotation = 0; mesh->channelSizeRotation = 0;
mesh->channelRotation = NULL; mesh->channelRotation = NULL;
mesh->channelSizeScale = 0; mesh->channelSizeScale = 0;
mesh->channelScale = NULL; mesh->channelScale = NULL;
/* active channel */
mesh->channelSizeActive = 0; mesh->channelSizeActive = 0;
mesh->channelActive = NULL; mesh->channelActive = NULL;
mesh->channelSizeInitialVel = 0; mesh->channelSizeInitialVel = 0;
mesh->channelInitialVel = NULL; mesh->channelInitialVel = NULL;
mesh->localInivelCoords = 0; mesh->localInivelCoords = 0;
mesh->obstacleType= FLUIDSIM_OBSTACLE_NOSLIP; mesh->obstacleType= FLUIDSIM_OBSTACLE_NOSLIP;
mesh->volumeInitType= OB_VOLUMEINIT_VOLUME;
mesh->obstaclePartslip= 0.; mesh->obstaclePartslip= 0.;
mesh->channelSizeVertices = 0; mesh->volumeInitType= OB_VOLUMEINIT_VOLUME;
mesh->channelVertices = NULL;
/* name of the mesh, mostly for debugging */
mesh->name = "[unnamed]"; mesh->name = "[unnamed]";
} }

View File

@@ -28,9 +28,7 @@ ntlGeometryObjModel::ntlGeometryObjModel( void ) :
mLoaded( false ), mLoaded( false ),
mTriangles(), mVertices(), mNormals(), mTriangles(), mVertices(), mNormals(),
mcAniVerts(), mcAniNorms(), mcAniVerts(), mcAniNorms(),
mcAniTimes(), mAniTimeScale(1.), mAniTimeOffset(0.), mcAniTimes(), mAniTimeScale(1.), mAniTimeOffset(0.)
mvCPSStart(-10000.), mvCPSEnd(10000.),
mCPSFilename(""), mCPSWidth(0.1), mCPSTimestep(1.)
{ {
} }
@@ -52,6 +50,39 @@ bool ntlGeometryObjModel::getMeshAnimated() {
return ret; return ret;
} }
/*! calculate max extends of (ani) mesh */
void ntlGeometryObjModel::getExtends(ntlVec3Gfx &sstart, ntlVec3Gfx &send) {
bool ini=false;
ntlVec3Gfx start(0.),end(0.);
for(int s=0; s<=(int)mcAniVerts.accessValues().size(); s++) {
vector<ntlVec3f> *sverts;
if(mcAniVerts.accessValues().size()>0) {
if(s==(int)mcAniVerts.accessValues().size()) continue;
sverts = &(mcAniVerts.accessValues()[s].mVerts);
} else sverts = &mVertices;
for(int i=0; i<(int)sverts->size(); i++) {
if(!ini) {
start=(*sverts)[i];
end=(*sverts)[i];
//errMsg("getExtends","ini "<<s<<","<<i<<" "<<start<<","<<end);
ini=true;
} else {
for(int j=0; j<3; j++) {
if(start[j] > (*sverts)[i][j]) { start[j]= (*sverts)[i][j]; }
if(end[j] < (*sverts)[i][j]) { end[j] = (*sverts)[i][j]; }
}
//errMsg("getExtends","check "<<s<<","<<i<<" "<<start<<","<<end<<" "<< (*sverts)[i]);
}
}
}
sstart=start;
send=end;
}
/*****************************************************************************/ /*****************************************************************************/
/* Init attributes etc. of this object */ /* Init attributes etc. of this object */
/*****************************************************************************/ /*****************************************************************************/
@@ -90,11 +121,6 @@ void ntlGeometryObjModel::initialize(ntlRenderGlobals *glob)
mAniTimeScale = mpAttrs->readFloat("ani_timescale", mAniTimeScale,"ntlGeometryObjModel", "mAniTimeScale", false); mAniTimeScale = mpAttrs->readFloat("ani_timescale", mAniTimeScale,"ntlGeometryObjModel", "mAniTimeScale", false);
mAniTimeOffset = mpAttrs->readFloat("ani_timeoffset", mAniTimeOffset,"ntlGeometryObjModel", "mAniTimeOffset", false); mAniTimeOffset = mpAttrs->readFloat("ani_timeoffset", mAniTimeOffset,"ntlGeometryObjModel", "mAniTimeOffset", false);
mCPSWidth = mpAttrs->readFloat("cps_width", mCPSWidth,"ntlGeometryObjModel", "mCPSWidth", false);
mCPSTimestep = mpAttrs->readFloat("cps_timestep", mCPSTimestep,"ntlGeometryObjModel", "mCPSTimestep", false);
mvCPSStart = vec2G( mpAttrs->readVec3d("cps_start", vec2D(mvCPSStart),"ntlGeometryObjModel", "mvCPSStart", false));
mvCPSEnd = vec2G( mpAttrs->readVec3d("cps_end", vec2D(mvCPSEnd),"ntlGeometryObjModel", "mvCPSEnd", false));
// continue with standard obj // continue with standard obj
if(loadBobjModel(mFilename)==0) mLoaded=1; if(loadBobjModel(mFilename)==0) mLoaded=1;
if(!mLoaded) { if(!mLoaded) {
@@ -322,7 +348,7 @@ int ntlGeometryObjModel::loadBobjModel(string filename)
bytesRead += gzread(gzf, &frameTime, sizeof(frameTime) ); bytesRead += gzread(gzf, &frameTime, sizeof(frameTime) );
//if(bytesRead!=3*sizeof(float)) { //if(bytesRead!=3*sizeof(float)) {
if(bytesRead!=sizeof(float)) { if(bytesRead!=sizeof(float)) {
debMsgStd("ntlGeometryObjModel::loadBobjModel",DM_MSG, "File '"<<filename<<"' no ani sets. ", 10 ); debMsgStd("ntlGeometryObjModel::loadBobjModel",DM_MSG, "File '"<<filename<<"' end of gzfile. ", 10 );
if(anitimes.size()>0) { if(anitimes.size()>0) {
// finally init channels and stop reading file // finally init channels and stop reading file
mcAniVerts = AnimChannel<ntlSetVec3f>(aniverts,anitimes); mcAniVerts = AnimChannel<ntlSetVec3f>(aniverts,anitimes);
@@ -428,7 +454,7 @@ ntlGeometryObjModel::getTriangles(double t, vector<ntlTriangle> *triangles,
(*normals)[startvert+i] = mNormals[i]; (*normals)[startvert+i] = mNormals[i];
} }
triangles->reserve(triangles->size() + mTriangles.size() ); triangles->reserve(triangles->size() + mTriangles.size()/3 );
for(int i=0; i<(int)mTriangles.size(); i+=3) { for(int i=0; i<(int)mTriangles.size(); i+=3) {
int trip[3]; int trip[3];
trip[0] = startvert+mTriangles[i+0]; trip[0] = startvert+mTriangles[i+0];

View File

@@ -44,8 +44,8 @@ class ntlGeometryObjModel : public ntlGeometryObject
/*! init triangle divisions */ /*! init triangle divisions */
virtual void calcTriangleDivs(vector<ntlVec3Gfx> &verts, vector<ntlTriangle> &tris, gfxReal fsTri); virtual void calcTriangleDivs(vector<ntlVec3Gfx> &verts, vector<ntlTriangle> &tris, gfxReal fsTri);
/*! do ani mesh CPS */ /*! calculate max extends of (ani) mesh */
void calculateCPS(string filename); void getExtends(ntlVec3Gfx &start, ntlVec3Gfx &end);
private: private:
@@ -71,12 +71,6 @@ class ntlGeometryObjModel : public ntlGeometryObject
/*! timing mapping & offset for config files */ /*! timing mapping & offset for config files */
double mAniTimeScale, mAniTimeOffset; double mAniTimeScale, mAniTimeOffset;
/*! ani mesh cps params */
ntlVec3Gfx mvCPSStart, mvCPSEnd;
string mCPSFilename;
gfxReal mCPSWidth, mCPSTimestep;
public: public:
/* Access methods */ /* Access methods */
@@ -87,6 +81,9 @@ class ntlGeometryObjModel : public ntlGeometryObject
inline ntlVec3Gfx getEnd( void ){ return mvEnd; } inline ntlVec3Gfx getEnd( void ){ return mvEnd; }
inline void setEnd( const ntlVec3Gfx &set ){ mvEnd = set; } inline void setEnd( const ntlVec3Gfx &set ){ mvEnd = set; }
inline bool getLoaded( void ){ return mLoaded; }
inline void setLoaded( bool set ){ mLoaded = set; }
/*! set data file name */ /*! set data file name */
inline void setFilename(string set) { mFilename = set; } inline void setFilename(string set) { mFilename = set; }
}; };

View File

@@ -331,6 +331,8 @@ public:
mGeos.push_back( geo ); mGeos.push_back( geo );
geo->setObjectId(mGeos.size()); geo->setObjectId(mGeos.size());
} }
/*! Add a geo object to the scene, warning - only needed for hand init */
inline void addGeoObject(ntlGeometryObject *geo) { mObjects.push_back( geo ); }
/*! Acces a certain object */ /*! Acces a certain object */
inline ntlGeometryObject *getObject(int id) { inline ntlGeometryObject *getObject(int id) {

View File

@@ -154,7 +154,7 @@ void ParticleTracer::cleanup() {
*! dump particles if desired *! dump particles if desired
*****************************************************************************/ *****************************************************************************/
void ParticleTracer::notifyOfDump(int dumptype, int frameNr,char *frameNrStr,string outfilename, double simtime) { void ParticleTracer::notifyOfDump(int dumptype, int frameNr,char *frameNrStr,string outfilename, double simtime) {
debMsgStd("ParticleTracer::notifyOfDump",DM_MSG,"obj:"<<this->getName()<<" frame:"<<frameNrStr<<" dumpp"<<mDumpParts, 10); // DEBUG debMsgStd("ParticleTracer::notifyOfDump",DM_MSG,"obj:"<<this->getName()<<" frame:"<<frameNrStr<<" dumpp"<<mDumpParts<<" t"<<simtime, 10); // DEBUG
if( if(
(dumptype==DUMP_FULLGEOMETRY)&& (dumptype==DUMP_FULLGEOMETRY)&&
@@ -305,7 +305,7 @@ void ParticleTracer::checkTrails(double time) {
/****************************************************************************** /******************************************************************************
* Get triangles for rendering * Get triangles for rendering
*****************************************************************************/ *****************************************************************************/
void ParticleTracer::getTriangles(double t, vector<ntlTriangle> *triangles, void ParticleTracer::getTriangles(double time, vector<ntlTriangle> *triangles,
vector<ntlVec3Gfx> *vertices, vector<ntlVec3Gfx> *vertices,
vector<ntlVec3Gfx> *normals, int objectId ) vector<ntlVec3Gfx> *normals, int objectId )
{ {
@@ -326,7 +326,7 @@ void ParticleTracer::getTriangles(double t, vector<ntlTriangle> *triangles,
int segments = mPartSegments; int segments = mPartSegments;
ntlVec3Gfx scale = ntlVec3Gfx( (mEnd[0]-mStart[0])/(mSimEnd[0]-mSimStart[0]), (mEnd[1]-mStart[1])/(mSimEnd[1]-mSimStart[1]), (mEnd[2]-mStart[2])/(mSimEnd[2]-mSimStart[2])); ntlVec3Gfx scale = ntlVec3Gfx( (mEnd[0]-mStart[0])/(mSimEnd[0]-mSimStart[0]), (mEnd[1]-mStart[1])/(mSimEnd[1]-mSimStart[1]), (mEnd[2]-mStart[2])/(mSimEnd[2]-mSimStart[2]));
ntlVec3Gfx trans = mStart; ntlVec3Gfx trans = mStart;
t = 0.; // doesnt matter time = 0.; // doesnt matter
for(size_t t=0; t<mPrevs.size()+1; t++) { for(size_t t=0; t<mPrevs.size()+1; t++) {
vector<ParticleObject> *dparts; vector<ParticleObject> *dparts;

View File

@@ -96,6 +96,7 @@ void SimulationObject::copyElbeemSettings(elbeemSimulationSettings *settings) {
*mpElbeemSettings = *settings; *mpElbeemSettings = *settings;
mGeoInitId = settings->domainId+1; mGeoInitId = settings->domainId+1;
debMsgStd("SimulationObject",DM_MSG,"mGeoInitId="<<mGeoInitId<<", domainId="<<settings->domainId, 8);
} }
/****************************************************************************** /******************************************************************************
@@ -115,7 +116,7 @@ int SimulationObject::initializeLbmSimulation(ntlRenderGlobals *glob)
} }
this->mGeoInitId = mpAttrs->readInt("geoinitid", this->mGeoInitId,"LbmSolverInterface", "mGeoInitId", false); mGeoInitId = mpAttrs->readInt("geoinitid", mGeoInitId,"LbmSolverInterface", "mGeoInitId", false);
//mDimension, mSolverType are deprecated //mDimension, mSolverType are deprecated
string mSolverType(""); string mSolverType("");
mSolverType = mpAttrs->readString("solver", mSolverType, "SimulationObject","mSolverType", false ); mSolverType = mpAttrs->readString("solver", mSolverType, "SimulationObject","mSolverType", false );
@@ -297,6 +298,7 @@ void SimulationObject::step( void )
// dont advance for stopped time // dont advance for stopped time
mpLbm->step(); mpLbm->step();
mTime += mpParam->getTimestep(); mTime += mpParam->getTimestep();
//if(mTime>0.001) { errMsg("DEBUG!!!!!!!!","quit mlsu..."); exit(1); } // PROFILE DEBUG TEST!
} }
if(mpLbm->getPanic()) mPanic = true; if(mpLbm->getPanic()) mPanic = true;

View File

@@ -106,10 +106,6 @@
#endif #endif
#endif #endif
#if LBM_INCLUDE_TESTSOLVERS==1
#include "solver_test.h"
#endif // LBM_INCLUDE_TESTSOLVERS==1
/*****************************************************************************/ /*****************************************************************************/
/*! cell access classes */ /*! cell access classes */
class UniformFsgrCellIdentifier : class UniformFsgrCellIdentifier :
@@ -467,20 +463,6 @@ class LbmFsgrSolver :
# endif // FSGR_STRICT_DEBUG==1 # endif // FSGR_STRICT_DEBUG==1
bool mUseTestdata; bool mUseTestdata;
#if LBM_INCLUDE_TESTSOLVERS==1
// test functions
LbmTestdata *mpTest;
void initTestdata();
void destroyTestdata();
void handleTestdata();
void set3dHeight(int ,int );
void initCpdata();
void handleCpdata();
public:
// needed for testdata
void find3dHeight(int i,int j, LbmFloat prev, LbmFloat &ret, LbmFloat *retux, LbmFloat *retuy, LbmFloat *retuz);
#endif // LBM_INCLUDE_TESTSOLVERS==1
public: // former LbmModelLBGK functions public: // former LbmModelLBGK functions
// relaxation funtions - implemented together with relax macros // relaxation funtions - implemented together with relax macros

View File

@@ -411,7 +411,7 @@ LbmFsgrSolver::~LbmFsgrSolver()
{ {
if(!this->mInitDone){ debugOut("LbmFsgrSolver::LbmFsgrSolver : not inited...",0); return; } if(!this->mInitDone){ debugOut("LbmFsgrSolver::LbmFsgrSolver : not inited...",0); return; }
#if COMPRESSGRIDS==1 #if COMPRESSGRIDS==1
delete mLevel[mMaxRefine].mprsCells[1]; delete [] mLevel[mMaxRefine].mprsCells[1];
mLevel[mMaxRefine].mprsCells[0] = mLevel[mMaxRefine].mprsCells[1] = NULL; mLevel[mMaxRefine].mprsCells[0] = mLevel[mMaxRefine].mprsCells[1] = NULL;
#endif // COMPRESSGRIDS==1 #endif // COMPRESSGRIDS==1
@@ -469,6 +469,12 @@ void LbmFsgrSolver::parseAttrList()
// FIXME check needed? // FIXME check needed?
mFVArea = this->mpAttrs->readFloat("fvolarea", mFVArea, "LbmFsgrSolver","mFArea", false ); mFVArea = this->mpAttrs->readFloat("fvolarea", mFVArea, "LbmFsgrSolver","mFArea", false );
// debugging - skip some time...
double starttimeskip = 0.;
starttimeskip = this->mpAttrs->readFloat("forcestarttimeskip", starttimeskip, "LbmFsgrSolver","starttimeskip", false );
mSimulationTime += starttimeskip;
if(starttimeskip>0.) debMsgStd("LbmFsgrSolver::parseStdAttrList",DM_NOTIFY,"Used starttimeskip="<<starttimeskip<<", t="<<mSimulationTime, 1);
#if LBM_INCLUDE_TESTSOLVERS==1 #if LBM_INCLUDE_TESTSOLVERS==1
mUseTestdata = 0; mUseTestdata = 0;
mUseTestdata = this->mpAttrs->readBool("use_testdata", mUseTestdata,"LbmFsgrSolver", "mUseTestdata", false); mUseTestdata = this->mpAttrs->readBool("use_testdata", mUseTestdata,"LbmFsgrSolver", "mUseTestdata", false);
@@ -483,7 +489,7 @@ void LbmFsgrSolver::parseAttrList()
mUseTestdata = 0; mUseTestdata = 0;
if(mFarFieldSize>=2.) mUseTestdata=1; // equiv. to test solver check if(mFarFieldSize>=2.) mUseTestdata=1; // equiv. to test solver check
#endif // LBM_INCLUDE_TESTSOLVERS!=1 #endif // LBM_INCLUDE_TESTSOLVERS!=1
if(mUseTestdata) { mMaxRefine=0; } // force fsgr off if(mUseTestdata) { mMaxRefine=0; } // force fsgr off
if(mMaxRefine==0) mInitialCsmago=0.02; if(mMaxRefine==0) mInitialCsmago=0.02;
mInitialCsmago = this->mpAttrs->readFloat("csmago", mInitialCsmago, "SimulationLbm","mInitialCsmago", false ); mInitialCsmago = this->mpAttrs->readFloat("csmago", mInitialCsmago, "SimulationLbm","mInitialCsmago", false );
@@ -1184,6 +1190,7 @@ void LbmFsgrSolver::initMovingObstacles(bool staticInit) {
if(obj->getGeoInitType()==FGI_BNDFREE) otype = ntype = CFBnd|CFBndFreeslip; if(obj->getGeoInitType()==FGI_BNDFREE) otype = ntype = CFBnd|CFBndFreeslip;
} }
break; break;
// off */
/* /*
case FGI_BNDPART: rhomass = BND_FILL; case FGI_BNDPART: rhomass = BND_FILL;
otype = ntype = CFBnd|CFBndPartslip; otype = ntype = CFBnd|CFBndPartslip;
@@ -1191,7 +1198,7 @@ void LbmFsgrSolver::initMovingObstacles(bool staticInit) {
case FGI_BNDFREE: rhomass = BND_FILL; case FGI_BNDFREE: rhomass = BND_FILL;
otype = ntype = CFBnd|CFBndFreeslip; otype = ntype = CFBnd|CFBndFreeslip;
break; break;
// */ // off */
case FGI_BNDNO: rhomass = BND_FILL; case FGI_BNDNO: rhomass = BND_FILL;
otype = ntype = CFBnd|CFBndNoslip; otype = ntype = CFBnd|CFBndNoslip;
break; break;
@@ -1876,7 +1883,6 @@ void LbmFsgrSolver::initFreeSurfaces() {
mLevel[lev].setCurr ^= 1; mLevel[lev].setCurr ^= 1;
} }
// copy back...? // copy back...?
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@@ -44,6 +44,7 @@ LbmSolverInterface::LbmSolverInterface() :
mName("lbm_default") , mName("lbm_default") ,
mpIso( NULL ), mIsoValue(0.499), mpIso( NULL ), mIsoValue(0.499),
mSilent(false) , mSilent(false) ,
mLbmInitId(1) ,
mpGiTree( NULL ), mpGiTree( NULL ),
mpGiObjects( NULL ), mGiObjInside(), mpGlob( NULL ), mpGiObjects( NULL ), mGiObjInside(), mpGlob( NULL ),
mRefinementDesired(0), mRefinementDesired(0),
@@ -284,7 +285,7 @@ void LbmSolverInterface::initGeoTree() {
if(mpGiTree != NULL) delete mpGiTree; if(mpGiTree != NULL) delete mpGiTree;
char treeFlag = (1<<(this->mLbmInitId+4)); char treeFlag = (1<<(this->mLbmInitId+4));
mpGiTree = new ntlTree( mpGiTree = new ntlTree(
15, 8, // warning - fixed values for depth & maxtriangles here... 15, 8, // TREEwarning - fixed values for depth & maxtriangles here...
scene, treeFlag ); scene, treeFlag );
} }
@@ -299,6 +300,7 @@ void LbmSolverInterface::freeGeoTree() {
int globGeoInitDebug = 0; int globGeoInitDebug = 0;
int globGICPIProblems = 0;
/*****************************************************************************/ /*****************************************************************************/
/*! check for a certain flag type at position org */ /*! check for a certain flag type at position org */
bool LbmSolverInterface::geoInitCheckPointInside(ntlVec3Gfx org, int flags, int &OId, gfxReal &distance) { bool LbmSolverInterface::geoInitCheckPointInside(ntlVec3Gfx org, int flags, int &OId, gfxReal &distance) {
@@ -371,7 +373,8 @@ bool LbmSolverInterface::geoInitCheckPointInside(ntlVec3Gfx org, int flags, int
if(giObjFirstHistSide[i] != 1) mess=true; if(giObjFirstHistSide[i] != 1) mess=true;
} }
if(mess) { if(mess) {
errMsg("IIIproblem","At "<<org<<" obj "<<i<<" inside:"<<mGiObjInside[i]<<" firstside:"<<giObjFirstHistSide[i] ); //errMsg("IIIproblem","At "<<org<<" obj "<<i<<" inside:"<<mGiObjInside[i]<<" firstside:"<<giObjFirstHistSide[i] );
globGICPIProblems++;
mGiObjInside[i]++; // believe first hit side... mGiObjInside[i]++; // believe first hit side...
} }
} }

View File

@@ -294,6 +294,8 @@ LbmFsgrSolver::mainLoop(int lev)
int kstart=getForZMin1(), kend=getForZMax1(mMaxRefine); int kstart=getForZMin1(), kend=getForZMax1(mMaxRefine);
//{ errMsg("LbmFsgrSolver::mainLoop","Err MAINADVANCE0 ks:"<< kstart<<" ke:"<<kend<<" dim:"<<LBMDIMcDimension<<" mlsz:"<< mLevel[mMaxRefine].lSizez<<" zmax1:"<<getForZMax1(mMaxRefine) ); } // DEBUG //{ errMsg("LbmFsgrSolver::mainLoop","Err MAINADVANCE0 ks:"<< kstart<<" ke:"<<kend<<" dim:"<<LBMDIMcDimension<<" mlsz:"<< mLevel[mMaxRefine].lSizez<<" zmax1:"<<getForZMax1(mMaxRefine) ); } // DEBUG
#define PERFORM_USQRMAXCHECK USQRMAXCHECK(usqr,ux,uy,uz, mMaxVlen, mMxvx,mMxvy,mMxvz); #define PERFORM_USQRMAXCHECK USQRMAXCHECK(usqr,ux,uy,uz, mMaxVlen, mMxvx,mMxvy,mMxvz);
#define LIST_EMPTY(x) mListEmpty.push_back( x );
#define LIST_FULL(x) mListFull.push_back( x );
#endif // PARALLEL==1 #endif // PARALLEL==1
// local to loop // local to loop
@@ -360,22 +362,15 @@ LbmFsgrSolver::mainLoop(int lev)
} // COMPRT } // COMPRT
#if PARALLEL==0 #if PARALLEL==0
const int id = 0, Nthrds = 1; //const int id = 0, Nthrds = 1;
#endif // PARALLEL==1 const int jstart = 0;
const int Nj = mLevel[mMaxRefine].lSizey; const int jend = mLevel[mMaxRefine].lSizey;
int jstart = 0+( id * (Nj / Nthrds) ); //#endif // PARALLEL==1
int jend = 0+( (id+1) * (Nj / Nthrds) ); #else // PARALLEL==1
if( ((Nj/Nthrds) *Nthrds) != Nj) {
errMsg("LbmFsgrSolver","Invalid domain size Nj="<<Nj<<" Nthrds="<<Nthrds);
}
// cutoff obstacle boundary
if(jstart<1) jstart = 1;
if(jend>mLevel[mMaxRefine].lSizey-1) jend = mLevel[mMaxRefine].lSizey-1;
#if PARALLEL==1
PARA_INITIALIZE(); PARA_INITIALIZE();
//errMsg("LbmFsgrSolver::mainLoop","id="<<id<<" js="<<jstart<<" je="<<jend<<" jdir="<<(1) ); // debug errMsg("LbmFsgrSolver::mainLoop","id="<<id<<" js="<<jstart<<" je="<<jend<<" jdir="<<(1) ); // debug
#endif // PARALLEL==1 #endif // PARALLEL==1
for(int k=kstart;k!=kend;k+=kdir) { for(int k=kstart;k!=kend;k+=kdir) {
//errMsg("LbmFsgrSolver::mainLoop","k="<<k<<" ks="<<kstart<<" ke="<<kend<<" kdir="<<kdir<<" x*y="<<mLevel[mMaxRefine].lSizex*mLevel[mMaxRefine].lSizey*dTotalNum ); // debug //errMsg("LbmFsgrSolver::mainLoop","k="<<k<<" ks="<<kstart<<" ke="<<kend<<" kdir="<<kdir<<" x*y="<<mLevel[mMaxRefine].lSizex*mLevel[mMaxRefine].lSizey*dTotalNum ); // debug
@@ -459,13 +454,14 @@ LbmFsgrSolver::mainLoop(int lev)
changeFlag(lev, i,j,k, TSET(lev), CFInter); changeFlag(lev, i,j,k, TSET(lev), CFInter);
// same as ifemptied for if below // same as ifemptied for if below
LbmPoint emptyp; emptyp.flag = 0; LbmPoint oemptyp; oemptyp.flag = 0;
emptyp.x = i; emptyp.y = j; emptyp.z = k; oemptyp.x = i; oemptyp.y = j; oemptyp.z = k;
#if PARALLEL==1 #if PARALLEL==1
calcListEmpty[id].push_back( emptyp ); //calcListEmpty[id].push_back( oemptyp );
#else // PARALLEL==1 #else // PARALLEL==1
mListEmpty.push_back( emptyp ); //mListEmpty.push_back( oemptyp );
#endif // PARALLEL==1 #endif // PARALLEL==1
LIST_EMPTY(oemptyp);
calcCellsEmptied++; calcCellsEmptied++;
continue; continue;
} }
@@ -601,6 +597,7 @@ LbmFsgrSolver::mainLoop(int lev)
// for fluid cells - just the f_i difference from streaming to empty cells ---- // for fluid cells - just the f_i difference from streaming to empty cells ----
numRecons = 0; numRecons = 0;
bool onlyBndnb = ((!(oldFlag&CFNoBndFluid))&&(oldFlag&CFNoNbFluid)&&(nbored&CFBndNoslip)); bool onlyBndnb = ((!(oldFlag&CFNoBndFluid))&&(oldFlag&CFNoNbFluid)&&(nbored&CFBndNoslip));
//onlyBndnb = false; // DEBUG test off
FORDF1 { // dfl loop FORDF1 { // dfl loop
recons[l] = 0; recons[l] = 0;
@@ -1008,6 +1005,7 @@ LbmFsgrSolver::mainLoop(int lev)
// looks much nicer... LISTTRICK // looks much nicer... LISTTRICK
#if FSGR_LISTTRICK==1 #if FSGR_LISTTRICK==1
if((oldFlag&CFNoNbEmpty)&&(newFlag&CFNoNbEmpty)) { TEST_IF_CHECK; }
if(newFlag&CFNoBndFluid) { // test NEW TEST if(newFlag&CFNoBndFluid) { // test NEW TEST
if(!iffilled) { if(!iffilled) {
// remove cells independent from amount of change... // remove cells independent from amount of change...
@@ -1035,10 +1033,11 @@ LbmFsgrSolver::mainLoop(int lev)
if(!(newFlag&CFNoBndFluid)) filledp.flag |= 1; // NEWSURFT if(!(newFlag&CFNoBndFluid)) filledp.flag |= 1; // NEWSURFT
filledp.x = i; filledp.y = j; filledp.z = k; filledp.x = i; filledp.y = j; filledp.z = k;
#if PARALLEL==1 #if PARALLEL==1
calcListFull[id].push_back( filledp ); //calcListFull[id].push_back( filledp );
#else // PARALLEL==1 #else // PARALLEL==1
mListFull.push_back( filledp ); //mListFull.push_back( filledp );
#endif // PARALLEL==1 #endif // PARALLEL==1
LIST_FULL(filledp);
//this->mNumFilledCells++; // DEBUG //this->mNumFilledCells++; // DEBUG
calcCellsFilled++; calcCellsFilled++;
} }
@@ -1047,10 +1046,11 @@ LbmFsgrSolver::mainLoop(int lev)
if(!(newFlag&CFNoBndFluid)) emptyp.flag |= 1; // NEWSURFT if(!(newFlag&CFNoBndFluid)) emptyp.flag |= 1; // NEWSURFT
emptyp.x = i; emptyp.y = j; emptyp.z = k; emptyp.x = i; emptyp.y = j; emptyp.z = k;
#if PARALLEL==1 #if PARALLEL==1
calcListEmpty[id].push_back( emptyp ); //calcListEmpty[id].push_back( emptyp );
#else // PARALLEL==1 #else // PARALLEL==1
mListEmpty.push_back( emptyp ); //mListEmpty.push_back( emptyp );
#endif // PARALLEL==1 #endif // PARALLEL==1
LIST_EMPTY(emptyp);
//this->mNumEmptiedCells++; // DEBUG //this->mNumEmptiedCells++; // DEBUG
calcCellsEmptied++; calcCellsEmptied++;
} }

View File

@@ -17,7 +17,6 @@
#if LBM_INCLUDE_TESTSOLVERS!=1
// off for non testing // off for non testing
#define PRECOLLIDE_MODS(rho,ux,uy,uz, grav) \ #define PRECOLLIDE_MODS(rho,ux,uy,uz, grav) \
@@ -25,11 +24,8 @@
uy += (grav)[1]; \ uy += (grav)[1]; \
uz += (grav)[2]; \ uz += (grav)[2]; \
#else // LBM_INCLUDE_TESTSOLVERS!=1 #define TEST_IF_CHECK
// defined in test.h
#endif // LBM_INCLUDE_TESTSOLVERS!=1
/****************************************************************************** /******************************************************************************
@@ -1125,7 +1121,7 @@ inline void LbmFsgrSolver::collideArrays(
for(l=0; l<this->cDfNum; l++) { for(l=0; l<this->cDfNum; l++) {
df[l] = (1.0-omegaNew ) * df[l] + omegaNew * feq[l]; df[l] = (1.0-omegaNew ) * df[l] + omegaNew * feq[l];
} }
if((i==16)&&(j==10)) DEBUG_CALCPRINTCELL( "2dcoll "<<PRINT_IJK, df); //if((i==16)&&(j==10)) DEBUG_CALCPRINTCELL( "2dcoll "<<PRINT_IJK, df);
mux = ux; mux = ux;
muy = uy; muy = uy;

View File

@@ -53,33 +53,60 @@ void LbmFsgrSolver::prepareVisualization( void ) {
for(int j=1;j<mLevel[lev].lSizey-1;j++) for(int j=1;j<mLevel[lev].lSizey-1;j++)
for(int i=1;i<mLevel[lev].lSizex-1;i++) { for(int i=1;i<mLevel[lev].lSizex-1;i++) {
const CellFlagType cflag = RFLAG(lev, i,j,k,workSet); const CellFlagType cflag = RFLAG(lev, i,j,k,workSet);
//continue; // OFF DEBUG //if(cflag&(CFBnd|CFEmpty)) {
if(cflag&(CFBnd|CFEmpty)) { if(cflag&(CFBnd)) {
continue; continue;
} else if( (cflag&CFInter) ) { } else if( (cflag&CFEmpty) ) {
//} else if( (cflag&CFInter) && (!(cflag&CFNoBndFluid)) && (cflag&CFNoNbFluid) ) { //continue; // OFF DEBUG
//} else if( (cflag&CFInter) && (!(cflag&CFNoBndFluid)) ) { int noslipbnd = 0;
int intercnt = 0;
CellFlagType nbored;
FORDF1 {
const CellFlagType nbflag = RFLAG_NB(lev, i,j,k, workSet,l);
if((nbflag&CFBnd)&&(nbflag&CFBnd)&&(nbflag&CFBndNoslip)){ noslipbnd=1; }
if(nbflag&CFInter){ intercnt++; }
nbored |= nbflag;
}
//? val = (QCELL(lev, i,j,k,workSet, dFfrac));
if((noslipbnd)&&(intercnt>6)) {
//if(val<minval) val = minval;
//*this->mpIso->lbmGetData(i,j,ZKOFF) += minval-( val * mIsoWeight[13] );
*this->mpIso->lbmGetData(i,j,ZKOFF) += minval;
} else if((noslipbnd)&&(intercnt>0)) {
*this->mpIso->lbmGetData(i,j,ZKOFF) += this->mIsoValue*0.95;
} else {
}
continue;
//} else if( (cflag&CFInter) ) {
} else if( (cflag&CFFluid) && (cflag&CFNoBndFluid) ) {
// optimized fluid
val = 1.;
} else if( (cflag&(CFInter|CFFluid)) ) {
int noslipbnd = 0; int noslipbnd = 0;
FORDF1 { FORDF1 {
const CellFlagType nbflag = RFLAG_NB(lev, i,j,k, workSet,l); const CellFlagType nbflag = RFLAG_NB(lev, i,j,k, workSet,l);
if((nbflag&CFBnd)&&(nbflag&CFBnd)&&(CFBndNoslip)){ noslipbnd=1; l=100; } if((nbflag&CFBnd)&&(nbflag&CFBnd)&&(CFBndNoslip)){ noslipbnd=1; l=100; }
} }
// no empty nb interface cells are treated as full
if(cflag&(CFNoNbEmpty|CFFluid)) {
val=1.0;
}
val = (QCELL(lev, i,j,k,workSet, dFfrac)); val = (QCELL(lev, i,j,k,workSet, dFfrac));
if(noslipbnd) { if(noslipbnd) {
//errMsg("NEWVAL", PRINT_IJK<<" val"<<val <<" f"<< convertCellFlagType2String(cflag)<<" "<<noslipbnd); //" nbfl"<<convertCellFlagType2String(nbored) ); //errMsg("NEWVAL", PRINT_IJK<<" val"<<val <<" f"<< convertCellFlagType2String(cflag)<<" "<<noslipbnd); //" nbfl"<<convertCellFlagType2String(nbored) );
if(val<minval) val = minval; if(val<minval) val = minval;
*this->mpIso->lbmGetData( i , j ,ZKOFF ) += minval-( val * mIsoWeight[13] ); *this->mpIso->lbmGetData(i,j,ZKOFF) += minval-( val * mIsoWeight[13] );
} }
// */ // */
// no empty nb interface cells are treated as full
if(cflag&CFNoNbEmpty) {
val=1.0;
}
} else { // fluid? } else { // unused?
val = 1.0; continue;
// old fluid val = 1.0;
} // */ } // */
*this->mpIso->lbmGetData( i-1 , j-1 ,ZKOFF-ZKD1) += ( val * mIsoWeight[0] ); *this->mpIso->lbmGetData( i-1 , j-1 ,ZKOFF-ZKD1) += ( val * mIsoWeight[0] );
@@ -885,10 +912,11 @@ void LbmFsgrSolver::advanceParticles() {
} }
void LbmFsgrSolver::notifySolverOfDump(int dumptype, int frameNr,char *frameNrStr,string outfilename) { void LbmFsgrSolver::notifySolverOfDump(int dumptype, int frameNr,char *frameNrStr,string outfilename) {
int workSet = mLevel[mMaxRefine].setCurr;
std::ostringstream name;
// debug - raw dump of ffrac values // debug - raw dump of ffrac values
if(getenv("ELBEEM_RAWDEBUGDUMP")) { if(getenv("ELBEEM_RAWDEBUGDUMP")) {
int workSet = mLevel[mMaxRefine].setCurr;
std::ostringstream name;
//name <<"fill_" << this->mStepCnt <<".dump"; //name <<"fill_" << this->mStepCnt <<".dump";
name << outfilename<< frameNrStr <<".dump"; name << outfilename<< frameNrStr <<".dump";
FILE *file = fopen(name.str().c_str(),"w"); FILE *file = fopen(name.str().c_str(),"w");
@@ -898,9 +926,12 @@ void LbmFsgrSolver::notifySolverOfDump(int dumptype, int frameNr,char *frameNrSt
for(int j=0;j<mLevel[mMaxRefine].lSizey-0;j++) { for(int j=0;j<mLevel[mMaxRefine].lSizey-0;j++) {
for(int i=0;i<mLevel[mMaxRefine].lSizex-0;i++) { for(int i=0;i<mLevel[mMaxRefine].lSizex-0;i++) {
float val = 0.; float val = 0.;
if(RFLAG(mMaxRefine, i,j,k, workSet) & CFInter) val = QCELL(mMaxRefine,i,j,k, mLevel[mMaxRefine].setCurr,dFfrac); if(RFLAG(mMaxRefine, i,j,k, workSet) & CFInter) {
val = QCELL(mMaxRefine,i,j,k, mLevel[mMaxRefine].setCurr,dFfrac);
if(val<0.) val=0.;
if(val>1.) val=1.;
}
if(RFLAG(mMaxRefine, i,j,k, workSet) & CFFluid) val = 1.; if(RFLAG(mMaxRefine, i,j,k, workSet) & CFFluid) val = 1.;
//fwrite( &val, sizeof(val), 1, file); // binary
fprintf(file, "%f ",val); // text fprintf(file, "%f ",val); // text
//errMsg("W", PRINT_IJK<<" val:"<<val); //errMsg("W", PRINT_IJK<<" val:"<<val);
} }
@@ -912,6 +943,27 @@ void LbmFsgrSolver::notifySolverOfDump(int dumptype, int frameNr,char *frameNrSt
} // file } // file
} // */ } // */
if(getenv("ELBEEM_BINDEBUGDUMP")) {
name << outfilename<< frameNrStr <<".bdump";
FILE *file = fopen(name.str().c_str(),"w");
if(file) {
for(int k= getForZMinBnd(); k< getForZMaxBnd(mMaxRefine); ++k) {
for(int j=0;j<mLevel[mMaxRefine].lSizey-0;j++) {
for(int i=0;i<mLevel[mMaxRefine].lSizex-0;i++) {
float val = 0.;
if(RFLAG(mMaxRefine, i,j,k, workSet) & CFInter) {
val = QCELL(mMaxRefine,i,j,k, mLevel[mMaxRefine].setCurr,dFfrac);
if(val<0.) val=0.;
if(val>1.) val=1.;
}
if(RFLAG(mMaxRefine, i,j,k, workSet) & CFFluid) val = 1.;
fwrite( &val, sizeof(val), 1, file); // binary
}
}
}
fclose(file);
} // file
}
dumptype = 0; frameNr = 0; // get rid of warning dumptype = 0; frameNr = 0; // get rid of warning
} }