[Bf-blender-cvs] [b3cc023] soc-2014-fluid: smoke scenarion working
Roman Pogribnyi
noreply at git.blender.org
Mon Aug 25 14:43:54 CEST 2014
Commit: b3cc023c0887b36c679161d39a469b10773c5a4d
Author: Roman Pogribnyi
Date: Tue Aug 19 11:03:29 2014 +0200
Branches: soc-2014-fluid
https://developer.blender.org/rBb3cc023c0887b36c679161d39a469b10773c5a4d
smoke scenarion working
===================================================================
M intern/smoke/CMakeLists.txt
M intern/smoke/intern/MANTA.cpp
M intern/smoke/intern/MANTA.h
A intern/smoke/intern/scenarios/smoke.h
M source/blender/python/manta_pp/CMakeLists.txt
D source/blender/python/manta_pp/scenarios/smoke.py
===================================================================
diff --git a/intern/smoke/CMakeLists.txt b/intern/smoke/CMakeLists.txt
index 783427e..1ca8701 100644
--- a/intern/smoke/CMakeLists.txt
+++ b/intern/smoke/CMakeLists.txt
@@ -63,6 +63,8 @@ set(SRC
intern/WTURBULENCE.h
intern/MANTA.h
intern/MANTA.cpp
+ intern/scenarios/smoke.h
+
intern/tnt/jama_eig.h
intern/tnt/jama_lu.h
intern/tnt/tnt.h
diff --git a/intern/smoke/intern/MANTA.cpp b/intern/smoke/intern/MANTA.cpp
index 375df7e..a7237c9 100644
--- a/intern/smoke/intern/MANTA.cpp
+++ b/intern/smoke/intern/MANTA.cpp
@@ -1,6 +1,6 @@
#include "MANTA.h"
#include "WTURBULENCE.h"
-
+#include "scenarios/smoke.h"
void runMantaScript(vector<string>& args);//defined in manta_pp/pwrapper/pymain.cpp
extern "C" bool manta_check_grid_size(struct FLUID_3D *fluid, int dimX, int dimY, int dimZ)
@@ -369,8 +369,8 @@ 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;
- manta_setup_file.open("manta_scene.py", std::fstream::trunc);
+// ofstream manta_setup_file;
+// manta_setup_file.open("manta_scene.py", std::fstream::trunc);
stringstream ss; /*setup contents*/
/*header*/
@@ -546,9 +546,9 @@ void generate_manta_sim_file(Scene *scene, SmokeModifierData *smd)
//ss << " densityInflow( flags=xl_flags, density=xl_density, noise=xl_noise, shape=xl_source, scale=1, sigma=0.5 ) \n";
ss << " xl.step() \n";
}
- manta_setup_file << ss.rdbuf();
- manta_setup_file.close();
-// parseFile(smd, scene, "smoke.py");
+// manta_setup_file << ss.rdbuf();
+// manta_setup_file.close();
+ parseFile(smd, scene, smoke_setup);
vector<string> a;
a.push_back("manta_scene.py");
runMantaScript("",a);
@@ -608,20 +608,22 @@ std::string parseLine(SmokeModifierData *smd, Scene *s, const string& line)
return res;
}
-void parseFile(SmokeModifierData *smd, Scene *s, char *file)
+void parseFile(SmokeModifierData *smd, Scene *s, const string & setup_string)
{
- ifstream f (file);
- ofstream of("manta_scene.py");
+// ifstream f (file);
+std::istringstream f(setup_string);
+ ofstream of;
+ of.open("manta_scene.py", std::fstream::trunc);
string line="";
- if (f.is_open()){
+// if (f.is_open()){
while(getline(f,line)){
of << parseLine(smd,s,line) << "\n";
}
- f.close();
- }
- else{
- printf ("Error: No scenario file found");
- }
+// f.close();
+// }
+// else{
+// printf ("Error: No scenario file found");
+// }
of.close();
}
diff --git a/intern/smoke/intern/MANTA.h b/intern/smoke/intern/MANTA.h
index 8c17fcb..f087805 100644
--- a/intern/smoke/intern/MANTA.h
+++ b/intern/smoke/intern/MANTA.h
@@ -68,7 +68,7 @@ std::string getRealValue(SmokeModifierData *sds, Scene *s, const string& varName
std::string parseLine(SmokeModifierData *sds, Scene *s, const string& line);
-void parseFile(SmokeModifierData *sds, Scene *s, char *file);
+void parseFile(SmokeModifierData *sds, Scene *s, const string& setup_string);
#endif /* MANTA_H */
diff --git a/intern/smoke/intern/scenarios/smoke.h b/intern/smoke/intern/scenarios/smoke.h
new file mode 100644
index 0000000..5be3b45
--- /dev/null
+++ b/intern/smoke/intern/scenarios/smoke.h
@@ -0,0 +1,114 @@
+#include <string>
+using namespace std;
+const string smoke_setup = "\n\
+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\
+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\
+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 = 0.2 \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\
+xl_gs = vec3(42, 42, 64) \n\
+xl = Solver(name = 'larger', gridSize = xl_gs, dim = 3) \n\
+xl.timestep = 0.5 \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 = 0 \n\
+xl_noise.clampPos = 1 \n\
+xl_noise.valScale = 0 \n\
+xl_noise.valOffset = 0.075 \n\
+xl_noise.timeAnim = 0.4 \n\
+flags = s.create(FlagGrid) \n\
+flags.initDomain() \n\
+flags.fillGrid() \n\
+uv = [] \n\
+for i in range(uvs): \n\
+ uvGrid = s.create(VecGrid) \n\
+ uv.append(uvGrid) \n\
+ resetUvGrid( uv[i] ) \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\
+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\
+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(0,0,-0.1), flags=flags) \n\
+ advectSemiLagrange(flags=flags, vel=vel, grid=density, order=2) \n\
+ advectSemiLagrange(flags=flags, vel=vel, grid=vel, order=2) \n\
+ for i in range(uvs): \n\
+ advectSemiLagrange(flags=flags, vel=vel, grid=uv[i], order=2) \n\
+ updateUvWeight( resetTime=16.5 , index=i, numUvs=uvs, uv=uv[i] )\n\
+ applyInflow=False\n\
+ if (t>=0 and t<75):\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\
+ \n\
+ 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=2) \n\
+ if (applyInflow): \n\
+ densityInflowMesh(flags=xl_flags, density=xl_density, mesh=source, value=1)\n\
+ xl_density.save('densityXl_%04d.uni' % t)\n\
+ xl.step()\n\
+";
diff --git a/source/blender/python/manta_pp/CMakeLists.txt b/source/blender/python/manta_pp/CMakeLists.txt
index f075425..61d52ed 100644
--- a/source/blender/python/manta_pp/CMakeLists.txt
+++ b/source/blender/python/manta_pp/CMakeLists.txt
@@ -126,8 +126,6 @@ ${CMAKE_CURRENT_SOURCE_DIR}/util/mcubes.h
${CMAKE_CURRENT_SOURCE_DIR}/util/randomstream.h
${CMAKE_CURRENT_SOURCE_DIR}/util/solvana.h
-${CMAKE_CURRENT_SOURCE_DIR}/scenarios/smoke.py
-
#gui/customctrl.cpp
#gui/customctrl.h
#gui/customctrl.h.reg
diff --git a/source/blender/python/manta_pp/scenarios/smoke.py b/source/blender/python/manta_pp/scenarios/smoke.py
deleted file mode 100644
index 2182afb..0000000
--- a/source/blender/python/manta_pp/scenarios/smoke.py
+++ /dev/null
@@ -1,110 +0,0 @@
-from manta import *
-import os, shutil, math, sys
-def transform_back(obj, gs):
- obj.scale(gs/2)
- obj.offset(gs/2)
-
-uvs = $UVS_CNT$
-velInflow = vec3(0, 0, 1)
-upres = $UPRES$
-wltStrength = $WLT_STR$
-octaves = int( math.log(upres)/ math.log(2.0) + 0.5 )
-res = $RES$
-gs = vec3($RESX$, $RESY$, $RESZ$)
-s = Solver(name = 'main', gridSize = gs, dim = $SOLVER_DIM$)
-s.timestep = 1
-noise = s.create(NoiseField, fixedSeed=256, loadFromFile=True)
-noise.posScale = vec3(20)
-noise.clamp = False
-noise.clampNeg = $NOISE_CN$
-noise.clampPos = $NOISE_CP$
-noise.valScale = $NOISE_VALSCALE$
-noise.valOffset = $NOISE_VALOFFSET$
-noise.timeAnim = 0.2
-source = s.create(Mesh)
-source.load('manta_flow.obj')
-transform_back(source, gs)
-sourceVel = s.create(Mesh)
-sourceVel.load('manta_flow.obj')
-transform_back(sourceVel, gs)
-xl_gs = vec3(42, 42, 64)
-xl = Solver(name = 'larger', gridSize = xl_gs, dim = 3)
-xl.timestep = 0.5
-xl_vel = xl.create(MACGrid)
-xl_density = xl.create(RealGrid)
-xl_flags = xl.create(FlagGrid)
-xl_flags.initDomain()
-xl_flags.fillGrid()
-xl_source = s.create(Mesh)
-xl_source.load('manta_flow.obj')
-transform_back(xl_source, gs)
-xl_noise = xl.create(NoiseField, fixedSeed=256, loadFromFile=True)
-xl_noise.posScale = vec3(20)
-xl_noise.clamp = False
-xl_noise.clampNeg = 0
-xl_noise.clampPos = 1
-xl_noise.valScale = 0
-xl_noise.valOffset = 0.075
-xl_noise.timeAnim = 0.4
-flags = s.create(FlagGrid)
-flags.initDomain()
-flags.fillGrid()
-uv = []
-for i in range(uvs):
- uvGrid = s.create(VecGrid)
- uv.append(uvGrid)
- resetUvGrid( uv[i] )
-vel = s.create(MACGrid)
-density = s.create(RealGrid)
-pressure = s.create(RealGrid)
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list