[Bf-blender-cvs] [7177c3f] soc-2014-fluid: separate function for semiLagrange advecttion. Using stringstream for script generation

Roman Pogribnyi noreply at git.blender.org
Sun Jun 8 13:20:48 CEST 2014


Commit: 7177c3f1290c12a3e64028ad5e811e58c12585cc
Author: Roman Pogribnyi
Date:   Tue Jun 3 23:16:30 2014 +0200
https://developer.blender.org/rB7177c3f1290c12a3e64028ad5e811e58c12585cc

separate function for semiLagrange advecttion. Using stringstream for script generation

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

M	intern/smoke/intern/MANTA.h

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

diff --git a/intern/smoke/intern/MANTA.h b/intern/smoke/intern/MANTA.h
index 91145a8..87fabaf 100644
--- a/intern/smoke/intern/MANTA.h
+++ b/intern/smoke/intern/MANTA.h
@@ -5,6 +5,8 @@
 #include "../../../source/blender/makesdna/DNA_scene_types.h"
 #include "../../../source/blender/makesdna/DNA_modifier_types.h"
 #include "../../../source/blender/makesdna/DNA_smoke_types.h"
+#include <sstream>
+#include <fstream>
 extern "C" bool manta_check_grid_size(struct FLUID_3D *fluid, int dimX, int dimY, int dimZ)
 {
 	if (!(dimX == fluid->xRes() && dimY == fluid->yRes() && dimZ == fluid->zRes())) {
@@ -78,20 +80,28 @@ extern "C" void read_mantaflow_sim(struct FLUID_3D *fluid, char *name)
 #	endif	/*zlib*/
 }
 
-static void manta_gen_noise(FILE *f, bool clamp, int clampNeg, int clampPos, float valScale, float valOffset, float timeAnim)
+static void manta_gen_noise(stringstream& ss, bool clamp, int clampNeg, int clampPos, float valScale, float valOffset, float timeAnim)
 {
-	if (f == NULL)/*should never be here*/
+	if (ss == NULL)/*should never be here*/
 	{
 		return;
 	}
-	fprintf(f, "  noise = s.create(NoiseField) \n");
-	fprintf(f, "  noise.posScale = vec3(45) \n");
-	fprintf(f, "  noise.clamp = %s \n", (clamp)?"True":"False");
-	fprintf(f, "  noise.clampNeg = %d \n", clampNeg);
-	fprintf(f, "  noise.clampPos = %d \n", clampPos);
-	fprintf(f, "  noise.valScale = %f \n", valScale);
-	fprintf(f, "  noise.valOffset = %f \n", valOffset);
-	fprintf(f, "  noise.timeAnim = %f \n", timeAnim);
+	ss << "noise = s.create(NoiseField) \n";
+	ss << "noise.posScale = vec3(45) \n";
+	ss << "noise.clamp = " << ((clamp)?"True":"False") << " \n";
+	ss << "noise.clampNeg = " << clampNeg << " \n";
+	ss << "noise.clampPos = " << clampPos << " \n";
+	ss << "noise.valScale = " << valScale << " \n";
+	ss << "noise.valOffset = " << valOffset << " \n";
+	ss << "noise.timeAnim = " << timeAnim << " \n";
+}
+
+static void manta_advect_SemiLagr(stringstream& ss, char *indent, char *flags, char *vel, char *grid, int order)
+{
+	if((order <=1) || (indent == NULL) || (flags == NULL) || (vel == NULL) || (grid == NULL))
+	{return;}
+	ss << indent << "advectSemiLagrange(flags=" << flags << ", vel=" << vel \
+	<< ", grid=" << grid << ", order=" << order << ") \n"; 
 }
 
 static void generate_manta_sim_file(Scene *scene, SmokeModifierData *smd)
@@ -100,59 +110,70 @@ static void generate_manta_sim_file(Scene *scene, SmokeModifierData *smd)
 	*create python file with 2-spaces indentation*/
 	
 	FLUID_3D *fluid = smd->domain->fluid;
-	FILE *f = fopen("manta_scene.py", "w");
-	if (f == NULL)
-	{
-		exit(1);
-	}
+	
+	ofstream manta_setup_file;
+	manta_setup_file.open("manta_scene.py", std::fstream::trunc);
+	stringstream ss; /*setup contents*/
+	
 	/*header*/
-	fprintf(f, "from manta import * \n");
+	ss << "from manta import * \n";
 
 /*Data Declaration*/
 	/*Solver Resolution*/
-	fprintf(f, "res = %d \n", smd->domain->maxres);
+	ss << "res = " << smd->domain->maxres << " \n";
 		/*Z axis in Blender = Y axis in Mantaflow*/
-	fprintf(f, "gs = vec3(%d, %d, %d) \n", fluid->xRes(), fluid->zRes(), fluid->yRes());
-	fprintf(f, "s = Solver(name = 'main', gridSize = gs) \n");
-	fprintf(f, "s.timestep = %f \n", smd->domain->time_scale);
+	ss << "gs = vec3(" << fluid->xRes() << ", " << fluid->zRes() << ", " << fluid->yRes() << ")" << " \n";
+	ss << "s = Solver(name = 'main', gridSize = gs) \n";
+	ss << "s.timestep = " << smd->domain->time_scale << " \n";
 	
 /*Grids setup*/
 /*For now, only one grid of each kind is needed*/
-	fprintf(f, "flags = s.create(FlagGrid) \n");/*must always be present*/
-	fprintf(f, "vel = s.create(MACGrid) \n");
-	fprintf(f, "density = s.create(RealGrid) \n");/*smoke simulation*/
-	fprintf(f, "pressure = s.create(RealGrid) \n");/*must always be present*/
+	ss << "flags = s.create(FlagGrid) \n";/*must always be present*/
+	ss << "vel = s.create(MACGrid) \n";
+	ss << "density = s.create(RealGrid) \n";/*smoke simulation*/
+	ss << "pressure = s.create(RealGrid) \n";/*must always be present*/
 
 /*Noise Field*/
-	manta_gen_noise(f, true, 0, 1, 1, 0.75, 0.2);
+	manta_gen_noise(ss, true, 0, 1, 1, 0.75, 0.2);
+/*	ss << "noise = s.create(NoiseField) \n");
+	ss << "noise.posScale = vec3(45) \n");
+	ss << "noise.clamp = True \n");
+	ss << "noise.clampNeg = 0 \n");
+	ss << "noise.clampPos = 1 \n");
+	ss << "noise.valScale = 1 \n");
+	ss << "noise.valOffset = 0.75 \n");
+	ss << "noise.timeAnim = 0.2 \n");
+*/
 	
 /*Flow setup*/
-	fprintf(f, "flags.initDomain() \n");
-	fprintf(f, "flags.fillGrid() \n");
+	ss << "flags.initDomain() \n";
+	ss << "flags.fillGrid() \n";
 
 /*GUI for debugging purposes*/
-	fprintf(f, "if (GUI):\n  gui = Gui()\n  gui.show() \n");
+	ss << "if (GUI):\n  gui = Gui()\n  gui.show() \n";
 
 /*Inflow source - for now, using mock sphere */
-	fprintf(f, "source = s.create(Cylinder, center=gs*vec3(0.5,0.1,0.5), radius=res*0.14, z=gs*vec3(0, 0.02, 0)) \n");
+	ss << "source = s.create(Cylinder, center=gs*vec3(0.5,0.1,0.5), radius=res*0.14, z=gs*vec3(0, 0.02, 0)) \n";
 	
 /*Flow solving stepsv, main loop*/
-	fprintf(f, "for t in xrange(%d, %d): \n", scene->r.sfra, scene->r.efra);
-	fprintf(f, "  densityInflow(flags=flags, density=density, noise=noise, shape=source, scale=1, sigma=0.5) \n");
-	fprintf(f, "  advectSemiLagrange(flags=flags, vel=vel, grid=density, order=2) \n");
-	fprintf(f, "  advectSemiLagrange(flags=flags, vel=vel, grid=vel, order=2) \n");
-	fprintf(f, "  setWallBcs(flags=flags, vel=vel) \n");
-	fprintf(f, "  addBuoyancy(density=density, vel=vel, gravity=vec3(0,-6e-4,0), flags=flags) \n");
-	fprintf(f, "  solvePressure(flags=flags, vel=vel, pressure=pressure, useResNorm=True, openBound='%s') \n",(smd->domain->border_collisions == 2)?"N":"Y");/*2:closed border*/
-	fprintf(f, "  setWallBcs(flags=flags, vel=vel) \n");
+	ss << "for t in xrange(" << scene->r.sfra << ", " << scene->r.efra << "): \n";
+	ss << "  densityInflow(flags=flags, density=density, noise=noise, shape=source, scale=1, sigma=0.5) \n"	;
+	manta_advect_SemiLagr(ss, "  ", "flags", "vel", "density", 2);
+	manta_advect_SemiLagr(ss, "  ", "flags", "vel", "vel", 2);
+/*	ss << "  advectSemiLagrange(flags=flags, vel=vel, grid=density, order=2) \n");*/
+/*	ss << "  advectSemiLagrange(flags=flags, vel=vel, grid=vel, order=2) \n");*/
+	ss << "  setWallBcs(flags=flags, vel=vel) \n";
+	ss << "  addBuoyancy(density=density, vel=vel, gravity=vec3(0,-6e-4,0), flags=flags) \n";
+	ss << "  solvePressure(flags=flags, vel=vel, pressure=pressure, useResNorm=True, openBound='" << ((smd->domain->border_collisions == 2)?"N":"Y") << "') \n";/*2:closed border*/
+	ss << "  setWallBcs(flags=flags, vel=vel) \n";
 
 /*Saving output*/
-	char format_str[] = "  density.save('den%04d.uni' % t) \n";
-	fwrite(format_str, 1, sizeof(format_str)-1, f);
-	fprintf(f, "  s.step()\n");
-	fprintf(f, " \n");
+	ss << "  density.save('den%04d.uni' % t) \n";
+	ss << "  s.step()\n";
+	ss << " \n";
 	
-	fclose(f);		
+	manta_setup_file << ss.rdbuf();
+	manta_setup_file.close();		
 }
 
 #endif /* MANTA_H */




More information about the Bf-blender-cvs mailing list