int ntlWorld::addDomain(elbeemSimulationSettings *settings) { // create domain obj SimulationObject *sim = new SimulationObject(); char simname[100]; snprintf(simname,100,"domain%04d",globalDomainCounter); globalDomainCounter++; sim->setName(string(simname)); mpGlob->getSims()->push_back( sim ); // important - add to both, only render scene objects are free'd mpGlob->getRenderScene()->addGeoClass( sim ); mpGlob->getSimScene()->addGeoClass( sim ); sim->setGeoStart(ntlVec3Gfx(settings->geoStart[0],settings->geoStart[1],settings->geoStart[2])); sim->setGeoEnd(ntlVec3Gfx( settings->geoStart[0]+settings->geoSize[0], settings->geoStart[1]+settings->geoSize[1], settings->geoStart[2]+settings->geoSize[2] )); // further init in postGeoConstrInit/initializeLbmSimulation of SimulationObject sim->copyElbeemSettings(settings); Parametrizer *param = sim->getParametrizer(); param->setSize( settings->resolutionxyz ); param->setDomainSize( settings->realsize ); param->setAniStart( settings->animStart ); param->setNormalizedGStar( settings->gstar ); // init domain channels vector<ParamFloat> valf; vector<ParamVec> valv; vector<double> time; #define INIT_CHANNEL_FLOAT(channel,size) \ valf.clear(); time.clear(); elbeemSimplifyChannelFloat(channel,&size); \ for(int i=0; i<size; i++) { valf.push_back( channel[2*i+0] ); time.push_back( channel[2*i+1] ); } #define INIT_CHANNEL_VEC(channel,size) \ valv.clear(); time.clear(); elbeemSimplifyChannelVec3(channel,&size); \ for(int i=0; i<size; i++) { valv.push_back( ParamVec(channel[4*i+0],channel[4*i+1],channel[4*i+2]) ); time.push_back( channel[4*i+3] ); } param->setViscosity( settings->viscosity ); if((settings->channelViscosity)&&(settings->channelSizeViscosity>0)) { INIT_CHANNEL_FLOAT(settings->channelViscosity, settings->channelSizeViscosity); param->initViscosityChannel(valf,time); } param->setGravity( ParamVec(settings->gravity[0], settings->gravity[1], settings->gravity[2]) ); if((settings->channelGravity)&&(settings->channelSizeGravity>0)) { INIT_CHANNEL_VEC(settings->channelGravity, settings->channelSizeGravity); param->initGravityChannel(valv,time); } param->setAniFrameTimeChannel( settings->aniFrameTime ); if((settings->channelFrameTime)&&(settings->channelSizeFrameTime>0)) { INIT_CHANNEL_FLOAT(settings->channelFrameTime, settings->channelSizeFrameTime); param->initAniFrameTimeChannel(valf,time); } #undef INIT_CHANNEL_FLOAT #undef INIT_CHANNEL_VEC // might be set by previous domain if(mpGlob->getAniFrames() < settings->noOfFrames) mpGlob->setAniFrames( settings->noOfFrames ); // set additionally to SimulationObject->mOutFilename mpGlob->setOutFilename( settings->outputPath ); return 0; }