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

Reply via email to