Commit: 9c7f7c6573d47fb98866a1010d02a4457afe9df1
Author: Roman Pogribnyi
Date:   Mon Aug 25 14:43:17 2014 +0200
Branches: soc-2014-fluid
https://developer.blender.org/rB9c7f7c6573d47fb98866a1010d02a4457afe9df1

more parameters for smoke scenario, writing out emitter fields

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

M       intern/smoke/extern/smoke_API.h
M       intern/smoke/intern/MANTA.cpp
M       intern/smoke/intern/MANTA.h
M       intern/smoke/intern/scenarios/smoke.h
M       intern/smoke/intern/smoke_API.cpp
M       source/blender/blenkernel/intern/smoke.c
M       source/blender/python/manta_pp/plugin/initplugins.cpp
M       source/blender/python/manta_pp/pwrapper/pymain.cpp

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

diff --git a/intern/smoke/extern/smoke_API.h b/intern/smoke/extern/smoke_API.h
index f49c144..a270f75 100644
--- a/intern/smoke/extern/smoke_API.h
+++ b/intern/smoke/extern/smoke_API.h
@@ -120,6 +120,8 @@ void smoke_mantaflow_sim_step(struct Scene *scene, struct 
SmokeModifierData *smd
 void smoke_mantaflow_stop_sim();
 void manta_write_effectors(struct Scene *s, struct SmokeModifierData *smd);
 void manta_update_effectors(struct Scene *scene, struct Object *ob,struct 
SmokeDomainSettings *sds, float dt);
+void manta_write_emitters(int min_x, int min_y, int min_z, int max_x, int 
max_y, int max_z, int d_x, int d_y, int d_z,float *influence, float *vel);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/intern/smoke/intern/MANTA.cpp b/intern/smoke/intern/MANTA.cpp
index a7237c9..ab319c0 100644
--- a/intern/smoke/intern/MANTA.cpp
+++ b/intern/smoke/intern/MANTA.cpp
@@ -369,7 +369,7 @@ void generate_manta_sim_file(Scene *scene, 
SmokeModifierData *smd)
        int num_sim_frames = smd->domain->manta_end_frame - 
smd->domain->manta_start_frame + 1;
        if(num_sim_frames < 1)
                return;
-//     ofstream manta_setup_file;
+       ofstream manta_setup_file;
 //     manta_setup_file.open("manta_scene.py", std::fstream::trunc);
        stringstream ss; /*setup contents*/
        
@@ -426,7 +426,7 @@ void generate_manta_sim_file(Scene *scene, 
SmokeModifierData *smd)
                ss << "xl_source.load('manta_flow.obj')\n";
                ss << "transform_back(xl_source, gs)\n";
                
-               /*Obstacle handling*/
+               /*High-res obstacle handling*/
                if (file_exists("manta_coll.obj"))
                {
                        ss << "xl_obs = s.create(Mesh)\n";
@@ -548,7 +548,11 @@ void generate_manta_sim_file(Scene *scene, 
SmokeModifierData *smd)
        }
 //     manta_setup_file << ss.rdbuf();
 //     manta_setup_file.close();
-       parseFile(smd, scene, smoke_setup);
+       /*constrcting final setup*/
+       string smoke_script = smoke_setup_low + 
((wavelets)?smoke_setup_high:"") + smoke_step_low + 
((wavelets)?smoke_step_high:"");    
+       manta_setup_file << smoke_script ;
+       manta_setup_file.close();
+       parseFile(smd, scene, smoke_script);
        vector<string> a;
        a.push_back("manta_scene.py");
        runMantaScript("",a);
@@ -581,6 +585,30 @@ std::string getRealValue(SmokeModifierData *smd, Scene *s, 
const std::string& va
                ss <<  smd->domain->noise_val_scale;
        else if (varName == "NOISE_VALOFFSET")
                ss << smd->domain->noise_val_offset;
+       else if (varName == "NOISE_TIMEANIM")
+               ss << smd->domain->noise_time_anim;
+       else if (varName == "HRESX")
+               ss << smd->domain->wt->getResBig()[0];
+       else if (varName == "HRESY")
+               ss << smd->domain->wt->getResBig()[1];
+       else if (varName == "HRESZ")
+               ss << smd->domain->wt->getResBig()[2];
+       else if (varName == "XL_TIMESTEP")      /*add support*/
+               ss << smd->domain->noise_time_anim * 
smd->domain->amplify+1;/*lowres time * upres*/
+       else if (varName == "USE_WAVELETS")
+               ss << (smd->domain->flags & MOD_SMOKE_HIGHRES)?"True":"False";
+       else if (varName == "BUYO_X")
+               ss << 0.;
+       else if (varName == "BUYO_Y")
+               ss << 0.;
+       else if (varName == "BUYO_Z")
+               ss << (-smd->domain->beta);
+       else if (varName == "ADVECT_ORDER")
+               ss << 2;
+       else if (varName == "ABS_FLOW")
+               ss << (smd->flow->flags & 
MOD_SMOKE_FLOW_ABSOLUTE)?"True":"False";
+       else 
+               cout<< "ERROR: Unknown option:"<< varName <<endl; 
        return ss.str();
 }
 
diff --git a/intern/smoke/intern/MANTA.h b/intern/smoke/intern/MANTA.h
index f087805..715a344 100644
--- a/intern/smoke/intern/MANTA.h
+++ b/intern/smoke/intern/MANTA.h
@@ -14,6 +14,7 @@
 #include "../../../source/blender/blenlib/BLI_path_util.h"
 
 void export_force_fields(int size_x, int size_y, int size_z, float *f_x, 
float*f_y, float*f_z);/*defined in pymain.cpp*/
+void export_em_fields(int min_x, int min_y, int min_z, int max_x, int max_y, 
int max_z, int d_x, int d_y, int d_z, float *inf, float *vel);/*defined in 
pymain.cpp*/
 extern "C" void manta_write_effectors(struct Scene *s, struct 
SmokeModifierData *smd); /*defined in smoke_api.cpp*/
 
 /*for passing to detached thread*/
diff --git a/intern/smoke/intern/scenarios/smoke.h 
b/intern/smoke/intern/scenarios/smoke.h
index 5be3b45..d69f8aa 100644
--- a/intern/smoke/intern/scenarios/smoke.h
+++ b/intern/smoke/intern/scenarios/smoke.h
@@ -1,20 +1,148 @@
 #include <string>
 using namespace std;
-const string smoke_setup = "\n\
-from manta import * \n\
+const string smoke_clean = "";
+
+const string smoke_setup_low ="from manta import * \n\
+import os, shutil, math, sys \n\
+def transform_back(obj, gs):\n\
+  obj.scale(gs/2)\n\
+  obj.offset(gs/2)\n\
+\n\
+uvs = $UVS_CNT$\n\
+solver_dim = $SOLVER_DIM$\n\
+velInflow = vec3(0, 0, 1)\n\
+if $USE_WAVELETS$:\n\
+  upres = $UPRES$\n\
+  wltStrength = $WLT_STR$\n\
+  if $UPRES$ > 0:\n\
+    octaves = int( math.log(upres)/ math.log(2.0) + 0.5 ) \n\
+  else:\n\
+    octaves = 0\n\
+res = $RES$\n\
+gs = vec3($RESX$, $RESY$, $RESZ$) \n\
+s = Solver(name = 'main', gridSize = gs, dim = solver_dim) \n\
+s.timestep = 1 \n\
+noise = s.create(NoiseField, fixedSeed=256, loadFromFile=True) \n\
+noise.posScale = vec3(20) \n\
+noise.clamp = False \n\
+noise.clampNeg = $NOISE_CN$\n\
+noise.clampPos = $NOISE_CP$\n\
+noise.valScale = $NOISE_VALSCALE$\n\
+noise.valOffset = $NOISE_VALOFFSET$\n\
+noise.timeAnim = $NOISE_TIMEANIM$ \n\
+source = s.create(Mesh)\n\
+source.load('manta_flow.obj')\n\
+transform_back(source, gs)\n\
+sourceVel = s.create(Mesh)\n\
+sourceVel.load('manta_flow.obj')\n\
+transform_back(sourceVel, gs)\n\
+flags = s.create(FlagGrid) \n\
+flags.initDomain() \n\
+flags.fillGrid() \n\
+vel = s.create(MACGrid) \n\
+density = s.create(RealGrid) \n\
+pressure = s.create(RealGrid) \n\
+energy = s.create(RealGrid) \n\
+tempFlag  = s.create(FlagGrid)\n\
+sdf_flow  = s.create(LevelsetGrid)\n\
+forces = s.create(MACGrid)\n\
+source.meshSDF(source, sdf_flow, 1.1)\n\
+source_shape = s.create(Cylinder, center=gs*vec3(0.5,0.1,0.5), 
radius=res*0.14, z=gs*vec3(0, 0.02, 0))\n\
+";
+
+const string smoke_setup_high = "xl_gs = vec3($HRESX$, $HRESY$, $HRESZ$) \n\
+xl = Solver(name = 'larger', gridSize = xl_gs, dim = solver_dim) \n\
+if $USE_WAVELETS$ and $UPRES$ > 0:\n\
+  xl.timestep = $XL_TIMESTEP$ \n\
+  xl_vel = xl.create(MACGrid) \n\
+  xl_density = xl.create(RealGrid) \n\
+  xl_flags = xl.create(FlagGrid) \n\
+  xl_flags.initDomain() \n\
+  xl_flags.fillGrid() \n\
+  xl_source = s.create(Mesh)\n\
+  xl_source.load('manta_flow.obj')\n\
+  transform_back(xl_source, gs)\n\
+  xl_noise = xl.create(NoiseField, fixedSeed=256, loadFromFile=True) \n\
+  xl_noise.posScale = vec3(20) \n\
+  xl_noise.clamp = False \n\
+  xl_noise.clampNeg = $NOISE_CN$ \n\
+  xl_noise.clampPos = $NOISE_CP$ \n\
+  xl_noise.valScale = $NOISE_VALSCALE$ \n\
+  xl_noise.valOffset = $NOISE_VALOFFSET$ \n\
+  xl_noise.timeAnim = $NOISE_TIMEANIM$ * $UPRES$ \n\
+  xl_wltnoise = s.create(NoiseField, loadFromFile=True) \n\
+  xl_wltnoise.posScale = vec3( int(1.0*gs.x) ) * 0.5 \n\
+  xl_wltnoise.posScale = xl_wltnoise.posScale * 0.5\n\
+  xl_wltnoise.timeAnim = 0.1 \n\
+";
+
+const string smoke_step_low = "def sim_step(t):\n\
+  forces.load('manta_forces.uni')\n\
+  addForceField(flags=flags, vel=vel,force=forces)\n\
+  addBuoyancy(density=density, vel=vel, 
gravity=vec3($BUYO_X$,$BUYO_Y$,$BUYO_Z$), flags=flags) \n\
+  advectSemiLagrange(flags=flags, vel=vel, grid=density, order=$ADVECT_ORDER$) 
\n\
+  advectSemiLagrange(flags=flags, vel=vel, grid=vel, order=$ADVECT_ORDER$) \n\
+  for i in range(uvs): \n\
+    advectSemiLagrange(flags=flags, vel=vel, grid=uv[i], order=$ADVECT_ORDER$) 
\n\
+    updateUvWeight( resetTime=16.5 , index=i, numUvs=uvs, uv=uv[i] )\n\
+    applyInflow=False\n\
+  if (t>=0 and t<75):\n\
+    if noise.valScale > 0.:\n\
+      densityInflowMeshNoise( flags=flags, density=density, noise=noise, 
mesh=source, scale=3, sigma=0.5 )\n\
+    else:\n\
+      densityInflowMesh(flags=flags, density=density, mesh=source, value=1)\n\
+    applyInflow=True\n\
+  setWallBcs(flags=flags, vel=vel) \n\
+  vorticityConfinement( vel=vel, flags=flags, strength=0.2 ) \n\
+  solvePressure(flags=flags, vel=vel, pressure=pressure, useResNorm=True, 
openBound='xXyYzZ', cgMaxIterFac=1, cgAccuracy=0.01) \n\
+  setWallBcs(flags=flags, vel=vel) \n\
+  computeEnergy(flags=flags, vel=vel, energy=energy)\n\
+  tempFlag.copyFrom(flags)\n\
+  extrapolateSimpleFlags( flags=flags, val=tempFlag, distance=2, 
flagFrom=FlagObstacle, flagTo=FlagFluid )\n\
+  extrapolateSimpleFlags( flags=tempFlag, val=energy, distance=6, 
flagFrom=FlagFluid, flagTo=FlagObstacle )\n\
+  computeWaveletCoeffs(energy)\n\
+  density.save('den%04d_temp.uni' % t) \n\
+  os.rename('den%04d_temp.uni' % t, 'den%04d.uni' % t) \n\
+  s.step()\n";
+
+const string smoke_step_high = "  interpolateMACGrid( source=vel, 
target=xl_vel ) \n\
+  sStr = 1.0 * wltStrength  \n\
+  sPos = 2.0  \n\
+  for o in range(octaves): \n\
+    for i in range(uvs): \n\
+      uvWeight = getUvWeight(uv[i])  \n\
+      applyNoiseVec3( flags=xl_flags, target=xl_vel, noise=xl_wltnoise, 
scale=sStr * uvWeight, scaleSpatial=sPos , weight=energy, uv=uv[i] ) \n\
+    sStr *= 0.06 # magic kolmogorov factor \n\
+    sPos *= 2.0 \n\
+  for substep in range(upres):  \n\
+    advectSemiLagrange(flags=xl_flags, vel=xl_vel, grid=xl_density, 
order=$ADVECT_ORDER$)  \n\
+  if (applyInflow): \n\
+    if noise.valScale > 0.:\n\
+      densityInflowMeshNoise( flags=xl_flags, density=xl_density, 
noise=xl_wltnoise, mesh=source, scale=3, sigma=0.5 )\n\
+    else:\n\
+      densityInflowMesh(flags=xl_flags, density=xl_density, mesh=source, 
value=1)\n\
+  xl_density.save('densityXl_%04d.uni' % t)\n\
+  xl.step()\n";
+
+const string full_smoke_setup = "from manta import * \n\
 import os, shutil, math, sys \n\
 def transform_back(obj, gs):\n\
        obj.scale(gs/2)\n\
        obj.offset(gs/2)\n\
 \n\
 uvs = $UVS_CNT$\n\
+solver_dim = $SOLVER_DIM$\n\
 velInflow = vec3(0, 0, 1)\n\
-upres = $UPRES$\n\
-wltStrength = $WLT_STR$\n\
-octaves = int( math.log(upres)/ math.log(2.0) + 0.5 ) \n\
+if $USE_WAVELETS$:\n\
+       upres = $UPRES$\n\
+       wltStrength = $WLT_STR$\n\
+       if $UPRES$ > 0:\n\
+               octaves = int( math.log(upres)/ math.log(2.0) + 0.5 ) \n\
+       else:\n\
+               octaves = 0\n\
 res = $RES$\n\
 gs = vec3($RESX$, $RESY$, $RESZ$) \n\
-s = Solver(name = 'main', gridSize = gs, dim = $SOLVER_DIM$) \n\
+s = Solver(name = 'main', gridSize = 

@@ 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