[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