[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