Commit: 3656c02c928b19d410fe00de1d1d14fa0ee81ae6
Author: Sebastián Barschkis
Date:   Thu Dec 1 13:19:53 2016 +0100
Branches: fluid-mantaflow
https://developer.blender.org/rB3656c02c928b19d410fe00de1d1d14fa0ee81ae6

improved inflow, outflow and implemented initial support for moving objects

- outflow objects may move now
- inflow routine in mantaflow script now inside adaptive time stepping
- flag grid is generated from phiobs. no more "hacks" that write bit
masks by hand

TODO:
- object velocities need to be set at borders

===================================================================

M       intern/mantaflow/extern/manta_fluid_API.h
M       intern/mantaflow/intern/FLUID.cpp
M       intern/mantaflow/intern/FLUID.h
M       intern/mantaflow/intern/manta_fluid_API.cpp
M       intern/mantaflow/intern/strings/liquid_script.h
M       intern/mantaflow/intern/strings/smoke_script.h
M       source/blender/blenkernel/intern/smoke.c

===================================================================

diff --git a/intern/mantaflow/extern/manta_fluid_API.h 
b/intern/mantaflow/extern/manta_fluid_API.h
index 6b5e4de..a2ab4d5 100644
--- a/intern/mantaflow/extern/manta_fluid_API.h
+++ b/intern/mantaflow/extern/manta_fluid_API.h
@@ -91,10 +91,9 @@ float *smoke_get_inflow_grid(struct FLUID *smoke);
 float *smoke_get_fuel_inflow(struct FLUID *smoke);
 int *smoke_turbulence_get_obstacle(struct FLUID *smoke);
 
-float *liquid_get_phi(struct FLUID *liquid);
-float *liquid_get_phiinit(struct FLUID *liquid);
-float *liquid_get_phiobsinit(struct FLUID *liquid);
-float *liquid_turbulence_get_phi(struct FLUID *liquid);
+float *liquid_get_phiin(struct FLUID *liquid);
+float *liquid_get_phiobs(struct FLUID *liquid);
+float *liquid_get_phiout(struct FLUID *liquid);
 void liquid_ensure_init(struct FLUID *liquid, struct SmokeModifierData *smd);
 void liquid_save_mesh(struct FLUID *liquid, char *filename);
 void liquid_save_data(struct FLUID *liquid, char *pathname);
diff --git a/intern/mantaflow/intern/FLUID.cpp 
b/intern/mantaflow/intern/FLUID.cpp
index 2a1cde8..8b0dce2 100644
--- a/intern/mantaflow/intern/FLUID.cpp
+++ b/intern/mantaflow/intern/FLUID.cpp
@@ -112,12 +112,9 @@ FLUID::FLUID(int *res, SmokeModifierData *smd)
        mTextureW2      = NULL;
        
        // Liquid low res grids
-       mPhi            = NULL;
-       mPhiInit        = NULL;
-       mPhiObsInit     = NULL;
-
-       // Liquid high res grids
-       mPhiHigh        = NULL;
+       mPhiIn          = NULL;
+       mPhiObs         = NULL;
+       mPhiOut         = NULL;
        
        mNumVertices  = 0;
        mNumNormals   = 0;
@@ -315,7 +312,7 @@ void FLUID::initColorsHigh(SmokeModifierData *smd)
 
 void FLUID::initLiquid(SmokeModifierData *smd)
 {
-       if (!mPhi) {
+       if (!mPhiIn) {
                std::string tmpString = liquid_alloc_low
                        + liquid_variables_low
                        + liquid_bounds_low
@@ -450,10 +447,9 @@ FLUID::~FLUID()
        mTextureW2      = NULL;
        
        // Liquid
-       mPhi        = NULL;
-       mPhiInit    = NULL;
-       mPhiObsInit = NULL;
-       mPhiHigh    = NULL;
+       mPhiIn  = NULL;
+       mPhiObs = NULL;
+       mPhiOut = NULL;
        
        // Reset flags
        mUsingHeat    = false;
@@ -910,11 +906,12 @@ void FLUID::updatePointers(SmokeModifierData *smd)
        mForceY    = (float*) getGridPointer("y_force", "s");
        mForceZ    = (float*) getGridPointer("z_force", "s");
        
+       mPhiObs = (float*) getGridPointer("phiObsIn", "s");
+       
        // Liquid
        if (mUsingLiquid) {
-               mPhi        = (float*) getGridPointer("phi",        "s");
-               mPhiInit    = (float*) getGridPointer("phiInit",    "s");
-               mPhiObsInit = (float*) getGridPointer("phiObsInit", "s");
+               mPhiIn  = (float*) getGridPointer("phiIn",  "s");
+               mPhiOut = (float*) getGridPointer("phiOut", "s");
        }
        
        // Smoke
diff --git a/intern/mantaflow/intern/FLUID.h b/intern/mantaflow/intern/FLUID.h
index 23174d9..5051fd8 100644
--- a/intern/mantaflow/intern/FLUID.h
+++ b/intern/mantaflow/intern/FLUID.h
@@ -123,11 +123,10 @@ public:
        inline float* getTextureW2() { return mTextureW2; }
        inline int* getObstacleHigh() { return mObstacleHigh; }
        
-       inline float* getPhi()        { return mPhi; }
-       inline float* getPhiInit()    { return mPhiInit; }
-       inline float* getPhiObsInit() { return mPhiObsInit; }
-       inline float* getPhiHigh()    { return NULL; } // Not yet implemented
-
+       inline float* getPhiIn()  { return mPhiIn; }
+       inline float* getPhiObs() { return mPhiObs; }
+       inline float* getPhiOut() { return mPhiOut; }
+       
        static bool mantaInitialized;
        
        // Liquid getters
@@ -214,10 +213,9 @@ private:
        int* mObstacleHigh;
        
        // Liquids
-       float* mPhi;
-       float* mPhiInit;
-       float* mPhiObsInit;
-       float* mPhiHigh;
+       float* mPhiIn;
+       float* mPhiObs;
+       float* mPhiOut;
        
        // Mesh fields for liquid surface
        int mNumVertices;
diff --git a/intern/mantaflow/intern/manta_fluid_API.cpp 
b/intern/mantaflow/intern/manta_fluid_API.cpp
index d1f0732..b5c2a3b 100644
--- a/intern/mantaflow/intern/manta_fluid_API.cpp
+++ b/intern/mantaflow/intern/manta_fluid_API.cpp
@@ -501,19 +501,19 @@ extern "C" float *smoke_get_fuel_inflow(FLUID *smoke)
        return smoke->getFuelInflow();
 }
 
-extern "C" float *liquid_get_phi(FLUID *liquid)
+extern "C" float *liquid_get_phiin(FLUID *liquid)
 {
-       return liquid->getPhi();
+       return liquid->getPhiIn();
 }
 
-extern "C" float *liquid_get_phiinit(FLUID *liquid)
+extern "C" float *liquid_get_phiobs(FLUID *liquid)
 {
-       return liquid->getPhiInit();
+       return liquid->getPhiObs();
 }
 
-extern "C" float *liquid_get_phiobsinit(FLUID *liquid)
+extern "C" float *liquid_get_phiout(FLUID *liquid)
 {
-       return liquid->getPhiObsInit();
+       return liquid->getPhiOut();
 }
 
 extern "C" void liquid_save_mesh(FLUID *liquid, char *filename)
diff --git a/intern/mantaflow/intern/strings/liquid_script.h 
b/intern/mantaflow/intern/strings/liquid_script.h
index dc6f12d..b07fe7a 100644
--- a/intern/mantaflow/intern/strings/liquid_script.h
+++ b/intern/mantaflow/intern/strings/liquid_script.h
@@ -76,11 +76,12 @@ flags      = s.create(FlagGrid)\n\
 numObs     = s.create(IntGrid)\n\
 phiParts   = s.create(LevelsetGrid)\n\
 phi        = s.create(LevelsetGrid)\n\
-phiInit    = s.create(LevelsetGrid)\n\
+phiIn      = s.create(LevelsetGrid)\n\
+phiOut     = s.create(LevelsetGrid)\n\
 pressure   = s.create(RealGrid)\n\
 \n\
 phiObs     = s.create(LevelsetGrid)\n\
-phiObsInit = s.create(LevelsetGrid)\n\
+phiObsIn = s.create(LevelsetGrid)\n\
 fractions  = s.create(MACGrid)\n\
 \n\
 vel        = s.create(MACGrid)\n\
@@ -122,7 +123,7 @@ xl_gpi     = xl.create(IntGrid)\n";
 
 const std::string liquid_init_phi = "\n\
 phi.initFromFlags(flags)\n\
-phiInit.initFromFlags(flags)\n";
+phiIn.initFromFlags(flags)\n";
 
 //////////////////////////////////////////////////////////////////////
 // PRE / POST STEP
@@ -167,20 +168,24 @@ def manta_step(start_frame):\n\
     liquid_pre_step_low()\n\
     if using_highres:\n\
         liquid_pre_step_high()\n\
-    if start_frame == 1:\n\
-        phi.join(phiInit)\n\
-        phiObs.join(phiObsInit)\n\
+    \n\
+    while s.frame == last_frame:\n\
         \n\
-        flags.updateFromLevelset(phi)\n\
-        phi.subtract(phiObs)\n\
+        flags.initDomain(boundaryWidth=boundaryWidth, phiWalls=phiObs)\n\
+        if doOpen:\n\
+            setOpenBound(flags=flags, bWidth=boundaryWidth, 
openBound=boundConditions, type=FlagOutflow|FlagEmpty)\n\
         \n\
-        sampleLevelsetWithParticles(phi=phi, flags=flags, parts=pp, 
discretization=particleNumber, randomness=randomness)\n\
+        phiObs.join(phiObsIn)\n\
+        #phi.subtract(phiObs)\n\
+        phiIn.subtract(phiObs)\n\
+        phi.join(phiIn)\n\
         \n\
         updateFractions(flags=flags, phiObs=phiObs, fractions=fractions, 
boundaryWidth=boundaryWidth)\n\
-        setObstacleFlags(flags=flags, phiObs=phiObs, fractions=fractions)\n\
-    \n\
-    while s.frame == last_frame:\n\
-        sampleLevelsetWithParticles(phi=phiInit, flags=flags, parts=pp, 
discretization=particleNumber, randomness=randomness, refillEmpty=True)\n\
+        setObstacleFlags(flags=flags, phiObs=phiObs, fractions=fractions, 
phiOut=phiOut)\n\
+        \n\
+        sampleLevelsetWithParticles(phi=phiIn, flags=flags, parts=pp, 
discretization=particleNumber, randomness=randomness, refillEmpty=True)\n\
+        flags.updateFromLevelset(phi)\n\
+        pushOutofObs(parts=pp, flags=flags, phiObs=phiObs)\n\
         \n\
         mantaMsg('Adapt timestep')\n\
         maxvel = vel.getMaxValue()\n\
@@ -223,8 +228,8 @@ def liquid_step():\n\
     extrapolateLsSimple(phi=phi, distance=narrowBandWidth+2, inside=True)\n\
     extrapolateLsSimple(phi=phi, distance=3)\n\
     phi.setBoundNeumann(boundaryWidth) # make sure no particles are placed at 
outer boundary\n\
-    if doOpen:\n\
-        resetOutflow(flags=flags, phi=phi, parts=pp, index=gpi, 
indexSys=pindex) # open boundaries\n\
+    #if doOpen:\n\
+    resetOutflow(flags=flags, phi=phi, parts=pp, index=gpi, indexSys=pindex) # 
open boundaries\n\
     flags.updateFromLevelset(phi)\n\
     \n\
     # combine particles velocities with advected grid velocities\n\
@@ -237,6 +242,9 @@ def liquid_step():\n\
     addGravity(flags=flags, vel=vel, gravity=gravity)\n\
     copyRealToVec3(sourceX=x_force, sourceY=y_force, sourceZ=z_force, 
target=forces)\n\
     addForceField(flags=flags, vel=vel, force=forces)\n\
+    # TODO (sebbas): need to extrapolate obvels - currently only on mesh 
border\n\
+    #extrapolateMACSimple(flags=flags, vel=obvel, distance=res/2, 
intoObs=True)\n\
+    addForceField(flags=flags, vel=vel, force=obvel)\n\
     forces.clear()\n\
     \n\
     extrapolateMACSimple(flags=flags, vel=vel, distance=2, intoObs=True)\n\
@@ -247,7 +255,6 @@ def liquid_step():\n\
     extrapolateMACSimple(flags=flags, vel=vel, distance=4, intoObs=True)\n\
     setWallBcs(flags=flags, vel=vel, fractions=fractions, phiObs=phiObs)\n\
     \n\
-    # TODO (sebbas): Clearing should not be needed once obvel are added 
correctly\n\
     clearInObstacle(flags=flags, grid=phi)\n\
     clearInObstacle(flags=flags, grid=phiParts)\n\
     pushOutofObs(parts=pp, flags=flags, phiObs=phiObs)\n\
@@ -293,9 +300,10 @@ def load_liquid_data_low(path):\n\
     \n\
     phiParts.load(os.path.join(path, 'phiParts.uni'))\n\
     phi.load(os.path.join(path, 'phi.uni'))\n\
-    phiInit.load(os.path.join(path, 'phiInit.uni'))\n\
+    phiIn.load(os.path.join(path, 'phiIn.uni'))\n\
     phiObs.load(os.path.join(path, 'phiObs.uni'))\n\
-    phiObsInit.load(os.path.join(path, 'phiObsInit.uni'))\n\
+    phiObsIn.load(os.path.join(path, 'phiObsIn.uni'))\n\
+    phiOut.load(os.path.join(path, 'phiOut.uni'))\n\
     fractions.load(os.path.join(path, 'fractions.uni'))\n\
     pressure.load(os.path.join(path, 'pressure.uni'))\n\
     \n\
@@ -331,9 +339,10 @@ def save_liquid_data_low(path):\n\
     \n\
     phiParts.save(os.path.join(path, 'phiParts.uni'))\n\
     phi.save(os.path.join(path, 'phi.uni'))\n\
-    phiInit.save(os.path.join(path, 'phiInit.uni'))\n\
+    phiIn.save(os.path.join(path, 'phiIn.uni'))\n\
     phiObs.save(os.path.join(path, 'phiObs.uni'))\n\
-    phiObsInit.save(os.path.join(path, 'phiObsInit.uni'))\n\
+    phiObsIn.save(os.path.join(path, 'phiObsIn.uni'))\n\
+    phiOut.save(os.path.join(path, 'phiOut.uni'))\n\
     fractions.save(os.path.join(path, 'fractions.uni'))\n\
     pressure.save(os.path.join(path, 'p

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to