Revision: 14363
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14363
Author: n_t
Date: 2008-04-08 18:56:43 +0200 (Tue, 08 Apr 2008)
Log Message:
-----------
This version now includes the fluid control sources, however the Blender
interface for it is still missing. Right now there is only a simple hard coded
example, that moves a single control particle with strong attraction
and velocity forces through the domain.
I added more detailed information about the control code to the wiki
http://wiki.blender.org/index.php/SoCFluidDevelDoc#The_Fluid-Control_Branch ,
together with some thoughts on how a Blender integration could be done.
Modified Paths:
--------------
branches/fluidcontrol/intern/elbeem/CMakeLists.txt
branches/fluidcontrol/intern/elbeem/SConscript
branches/fluidcontrol/intern/elbeem/intern/elbeem.cpp
branches/fluidcontrol/intern/elbeem/intern/isosurface.cpp
branches/fluidcontrol/intern/elbeem/intern/solver_adap.cpp
branches/fluidcontrol/intern/elbeem/intern/solver_class.h
branches/fluidcontrol/intern/elbeem/intern/solver_init.cpp
branches/fluidcontrol/intern/elbeem/intern/solver_main.cpp
branches/fluidcontrol/intern/elbeem/intern/solver_relax.h
Added Paths:
-----------
branches/fluidcontrol/intern/elbeem/intern/controlparticles.cpp
branches/fluidcontrol/intern/elbeem/intern/controlparticles.h
branches/fluidcontrol/intern/elbeem/intern/elbeem_control.cpp
branches/fluidcontrol/intern/elbeem/intern/elbeem_control.h
branches/fluidcontrol/intern/elbeem/intern/mvmcoords.cpp
branches/fluidcontrol/intern/elbeem/intern/mvmcoords.h
branches/fluidcontrol/intern/elbeem/intern/solver_control.cpp
branches/fluidcontrol/intern/elbeem/intern/solver_control.h
Modified: branches/fluidcontrol/intern/elbeem/CMakeLists.txt
===================================================================
--- branches/fluidcontrol/intern/elbeem/CMakeLists.txt 2008-04-08 16:50:20 UTC
(rev 14362)
+++ branches/fluidcontrol/intern/elbeem/CMakeLists.txt 2008-04-08 16:56:43 UTC
(rev 14363)
@@ -31,7 +31,7 @@
FILE(GLOB SRC intern/*.cpp)
-ADD_DEFINITIONS(-DNOGUI -DELBEEM_BLENDER=1)
+ADD_DEFINITIONS(-DNOGUI -DELBEEM_BLENDER=1 -DLBM_INCLUDE_CONTROL=1)
IF(WINDOWS)
ADD_DEFINITIONS(-DUSE_MSVC6FIXES)
ENDIF(WINDOWS)
Modified: branches/fluidcontrol/intern/elbeem/SConscript
===================================================================
--- branches/fluidcontrol/intern/elbeem/SConscript 2008-04-08 16:50:20 UTC
(rev 14362)
+++ branches/fluidcontrol/intern/elbeem/SConscript 2008-04-08 16:56:43 UTC
(rev 14363)
@@ -5,7 +5,7 @@
sources = env.Glob('intern/*.cpp')
-defs = ' NOGUI ELBEEM_BLENDER=1'
+defs = 'NOGUI ELBEEM_BLENDER=1 LBM_INCLUDE_CONTROL=1'
if env['WITH_BF_OPENMP'] == 1:
defs += ' PARALLEL'
Added: branches/fluidcontrol/intern/elbeem/intern/controlparticles.cpp
===================================================================
--- branches/fluidcontrol/intern/elbeem/intern/controlparticles.cpp
(rev 0)
+++ branches/fluidcontrol/intern/elbeem/intern/controlparticles.cpp
2008-04-08 16:56:43 UTC (rev 14363)
@@ -0,0 +1,1320 @@
+// --------------------------------------------------------------------------
+//
+// El'Beem - the visual lattice boltzmann freesurface simulator
+// All code distributed as part of El'Beem is covered by the version 2 of the
+// GNU General Public License. See the file COPYING for details.
+//
+// Copyright 2008 Nils Thuerey , Richard Keiser, Mark Pauly, Ulrich Ruede
+//
+// implementation of control particle handling
+//
+// --------------------------------------------------------------------------
+
+// indicator for LBM inclusion
+#include "ntl_geometrymodel.h"
+#include "ntl_world.h"
+#include "solver_class.h"
+#include "controlparticles.h"
+#include "mvmcoords.h"
+#include <zlib.h>
+
+#ifndef sqrtf
+#define sqrtf sqrt
+#endif
+
+// brute force circle test init in initTimeArray
+// replaced by mDebugInit
+//#define CP_FORCECIRCLEINIT 0
+
+
+void ControlParticles::initBlenderTest() {
+ mPartSets.clear();
+
+ ControlParticleSet cps;
+ mPartSets.push_back(cps);
+ int setCnt = mPartSets.size()-1;
+ ControlParticle p;
+
+ // set for time zero
+ mPartSets[setCnt].time = 0.;
+
+ // add single particle
+ p.reset();
+ p.pos = LbmVec(0.5, 0.5, -0.5);
+ mPartSets[setCnt].particles.push_back(p);
+
+ // add second set for animation
+ mPartSets.push_back(cps);
+ setCnt = mPartSets.size()-1;
+ mPartSets[setCnt].time = 0.15;
+
+ // insert new position
+ p.reset();
+ p.pos = LbmVec(-0.5, -0.5, 0.5);
+ mPartSets[setCnt].particles.push_back(p);
+
+ // applyTrafos();
+ initTime(0. , 1.);
+}
+
+
+// init all zero / defaults for a single particle
+void ControlParticle::reset() {
+ pos = LbmVec(0.,0.,0.);
+ vel = LbmVec(0.,0.,0.);
+ influence = 1.;
+ size = 1.;
+#ifndef LBMDIM
+#ifdef MAIN_2D
+ rotaxis = LbmVec(0.,1.,0.); // SPH xz
+#else // MAIN_2D
+ // 3d - roate in xy plane, vortex
+ rotaxis = LbmVec(0.,0.,1.);
+ // 3d - rotate for wave
+ //rotaxis = LbmVec(0.,1.,0.);
+#endif // MAIN_2D
+#else // LBMDIM
+ rotaxis = LbmVec(0.,1.,0.); // LBM xy , is swapped afterwards
+#endif // LBMDIM
+
+ density = 0.;
+ densityWeight = 0.;
+ avgVelAcc = avgVel = LbmVec(0.);
+ avgVelWeight = 0.;
+}
+
+
+// default preset/empty init
+ControlParticles::ControlParticles() :
+ _influenceTangential(0.f),
+ _influenceAttraction(0.f),
+ _influenceVelocity(0.f),
+ _influenceMaxdist(0.f),
+ _radiusAtt(1.0f),
+ _radiusVel(1.0f),
+ _radiusMinMaxd(2.0f),
+ _radiusMaxd(3.0f),
+ _currTime(-1.0), _currTimestep(1.),
+ _initTimeScale(1.),
+ _initPartOffset(0.), _initPartScale(1.),
+ _initLastPartOffset(0.), _initLastPartScale(1.),
+ _initMirror(""),
+ _fluidSpacing(1.), _kernelWeight(-1.),
+ _charLength(1.), _charLengthInv(1.),
+ mvCPSStart(-10000.), mvCPSEnd(10000.),
+ mCPSWidth(0.1), mCPSTimestep(0.05),
+ mCPSTimeStart(0.), mCPSTimeEnd(0.5), mCPSWeightFac(1.),
+ mDebugInit(0)
+{
+ _radiusAtt = 0.15f;
+ _radiusVel = 0.15f;
+ _radiusMinMaxd = 0.16f;
+ _radiusMaxd = 0.3;
+
+ _influenceAttraction = 0.f;
+ _influenceTangential = 0.f;
+ _influenceVelocity = 0.f;
+ // 3d tests */
+}
+
+
+
+ControlParticles::~ControlParticles() {
+ // nothing to do...
+}
+
+LbmFloat ControlParticles::getControlTimStart() {
+ if(mPartSets.size()>0) { return mPartSets[0].time; }
+ return -1000.;
+}
+LbmFloat ControlParticles::getControlTimEnd() {
+ if(mPartSets.size()>0) { return mPartSets[mPartSets.size()-1].time; }
+ return -1000.;
+}
+
+// calculate for delta t
+void ControlParticles::setInfluenceVelocity(LbmFloat set, LbmFloat dt) {
+ const LbmFloat dtInter = 0.01;
+ LbmFloat facFv = 1.-set; //cparts->getInfluenceVelocity();
+ // mLevel[mMaxRefine].timestep
+ LbmFloat facNv = (LbmFloat)( 1.-pow( (double)facFv,
(double)(dt/dtInter)) );
+ //errMsg("vwcalc","ts:"<<dt<< " its:"<<(dt/dtInter) <<" fv"<<facFv<<"
nv"<<facNv<<" test:"<< pow( (double)(1.-facNv),(double)(dtInter/dt)) );
+ _influenceVelocity = facNv;
+}
+
+int ControlParticles::initExampleSet()
+{
+ // unused
+}
+
+int ControlParticles::getTotalSize()
+{
+ int s=0;
+ for(int i=0; i<(int)mPartSets.size(); i++) {
+ s+= mPartSets[i].particles.size();
+ }
+ return s;
+}
+
+// --------------------------------------------------------------------------
+// load positions & timing from text file
+// WARNING - make sure file has unix format, no win/dos linefeeds...
+#define LINE_LEN 100
+int ControlParticles::initFromTextFile(string filename)
+{
+ const bool debugRead = false;
+ char line[LINE_LEN];
+ line[LINE_LEN-1] = '\0';
+ mPartSets.clear();
+ if(filename.size()<2) return 0;
+
+ // HACK , use "cparts" suffix as old
+ // e.g. "cpart2" as new
+ if(filename[ filename.size()-1 ]=='s') {
+ return initFromTextFileOld(filename);
+ }
+
+ FILE *infile = fopen(filename.c_str(), "r");
+ if(!infile) {
+ errMsg("ControlParticles::initFromTextFile","unable to open
'"<<filename<<"' " );
+ // try to open as gz sequence
+ if(initFromBinaryFile(filename)) { return 1; }
+ // try mesh MVCM generation
+ if(initFromMVCMesh(filename)) { return 1; }
+ // failed...
+ return 0;
+ }
+
+ int haveNo = false;
+ int haveScale = false;
+ int haveTime = false;
+ int noParts = -1;
+ int partCnt = 0;
+ int setCnt = 0;
+ //ControlParticle p; p.reset();
+ // scale times by constant factor while reading
+ LbmFloat timeScale= 1.0;
+ int lineCnt = 0;
+ bool abortParse = false;
+#define LASTCP mPartSets[setCnt].particles[
mPartSets[setCnt].particles.size()-1 ]
+
+ while( (!feof(infile)) && (!abortParse)) {
+ lineCnt++;
+ fgets(line, LINE_LEN, infile);
+
+ //if(debugRead) printf("\nDEBUG%d r '%s'\n",lineCnt, line);
+ if(!line) continue;
+ int len = (int)strlen(line);
+
+ // skip empty lines and comments (#,//)
+ if(len<1) continue;
+ if( (line[0]=='#') || (line[0]=='\n') ) continue;
+ if((len>1) && (line[0]=='/' && line[1]=='/')) continue;
+
+ // debug remove newline
+ if((len>=1)&&(line[len-1]=='\n')) line[len-1]='\0';
+
+ switch(line[0]) {
+
+ case 'N': { // total number of particles, more for debugging...
+ noParts = atoi(line+2);
+ if(noParts<=0) {
+
errMsg("ControlParticles::initFromTextFile","file '"<<filename<<"' - invalid no
of particles "<<noParts);
+ mPartSets.clear(); fclose(infile); return 0;
+ }
+ if(debugRead) printf("CPDEBUG%d no parts
'%d'\n",lineCnt, noParts );
+ haveNo = true;
+ } break;
+
+ case 'T': { // global time scale
+ timeScale *= (LbmFloat)atof(line+2);
+ if(debugRead)
printf("ControlParticles::initFromTextFile - line %d , set timescale '%f', org
%f\n",lineCnt, timeScale , _initTimeScale);
+ if(timeScale==0.) {
fprintf(stdout,"ControlParticles::initFromTextFile - line %d ,error: timescale
= 0.! reseting to 1 ...\n",lineCnt); timeScale=1.; }
+ haveScale = true;
+ } break;
+
+ case 'I': { // influence settings, overrides others as of now...
+ float val = (LbmFloat)atof(line+3);
+ const char *setvar = "[invalid]";
+ switch(line[1]) {
+ //case 'f': { _influenceFalloff = val; setvar =
"falloff"; } break;
+ case 't': { _influenceTangential = val; setvar
= "tangential"; } break;
+ case 'a': { _influenceAttraction = val; setvar
= "attraction"; } break;
+ case 'v': { _influenceVelocity = val; setvar =
"velocity"; } break;
+ case 'm': { _influenceMaxdist = val; setvar =
"maxdist"; } break;
+ default:
+
fprintf(stdout,"ControlParticles::initFromTextFile (%s) - line %d , invalid
influence setting %c, %f\n",filename.c_str() ,lineCnt, line[1], val);
+ }
+ if(debugRead) printf("CPDEBUG%d set influence '%s'=%f
\n",lineCnt, setvar, val);
+ } break;
+
+ case 'R': { // radius settings, overrides others as of now...
+ float val = (LbmFloat)atof(line+3);
+ const char *setvar = "[invalid]";
+ switch(line[1]) {
+ case 'a': { _radiusAtt = val; setvar =
"r_attraction"; } break;
+ case 'v': { _radiusVel = val; setvar =
"r_velocity"; } break;
+ case 'm': { _radiusMaxd = val; setvar =
"r_maxdist"; } break;
+ default:
+
fprintf(stdout,"ControlParticles::initFromTextFile (%s) - line %d , invalid
influence setting %c, %f\n",filename.c_str() ,lineCnt, line[1], val);
+ }
+ if(debugRead) printf("CPDEBUG%d set influence '%s'=%f
\n",lineCnt, setvar, val);
+ } break;
+
+ case 'S': { // new particle set at time T
+ ControlParticleSet cps;
+ mPartSets.push_back(cps);
+ setCnt = (int)mPartSets.size()-1;
+
+ LbmFloat val = (LbmFloat)atof(line+2);
+ mPartSets[setCnt].time = val * timeScale;
+ if(debugRead) printf("CPDEBUG%d new set, time '%f',
%d\n",lineCnt, mPartSets[setCnt].time, setCnt );
+ haveTime = true;
+ partCnt = -1;
+ } break;
+
+ case 'P': // new particle with pos
+ case 'n': { // new particle without pos
+ if((!haveTime)||(setCnt<0)) {
fprintf(stdout,"ControlParticles::initFromTextFile - line %d ,error: set
missing!\n",lineCnt); abortParse=true; break; }
+ partCnt++;
+ if(partCnt>=noParts) {
+ if(debugRead) printf("CPDEBUG%d partset
done \n",lineCnt);
+ haveTime = false;
+ } else {
+ ControlParticle p; p.reset();
+
mPartSets[setCnt].particles.push_back(p);
+ }
+ }
+ // only new part, or new with pos?
+ if(line[0] == 'n') break;
+
+ // particle properties
+
+ case 'p': { // new particle set at time T
@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs