[Bf-blender-cvs] [6a1ffee] soc-2014-fluid: indents added; correct order of wavelets restored
Roman Pogribnyi
noreply at git.blender.org
Sun Jun 8 13:20:58 CEST 2014
Commit: 6a1ffeefd8ff8c16b0547ea9797d1d851e9c7d66
Author: Roman Pogribnyi
Date: Sun Jun 8 13:16:35 2014 +0200
https://developer.blender.org/rB6a1ffeefd8ff8c16b0547ea9797d1d851e9c7d66
indents added; correct order of wavelets restored
===================================================================
M intern/smoke/intern/MANTA.h
===================================================================
diff --git a/intern/smoke/intern/MANTA.h b/intern/smoke/intern/MANTA.h
index fac19a9..52e2ddc 100644
--- a/intern/smoke/intern/MANTA.h
+++ b/intern/smoke/intern/MANTA.h
@@ -81,7 +81,7 @@ extern "C" void read_mantaflow_sim(struct FLUID_3D *fluid, char *name)
# endif /*zlib*/
}
-static void manta_gen_noise(stringstream& ss, int indent, char *noise, int seed, bool load, bool clamp, int clampNeg, int clampPos, float valScale, float valOffset, float timeAnim)
+static void manta_gen_noise(stringstream& ss, char* solver, int indent, char *noise, int seed, bool load, bool clamp, int clampNeg, int clampPos, float valScale, float valOffset, float timeAnim)
{
if (ss == NULL)/*should never be here*/
{
@@ -91,7 +91,7 @@ static void manta_gen_noise(stringstream& ss, int indent, char *noise, int seed,
for (size_t cnt(0); cnt < indent; ++cnt) {
indentation += " ";/*two-spaces indent*/
}
- ss << indentation << noise << " = s.create(NoiseField, fixedSeed=" << seed << ", loadFromFile="<< (load?"True":"False") <<") \n";
+ ss << indentation << noise << " = "<<solver<<".create(NoiseField, fixedSeed=" << seed << ", loadFromFile="<< (load?"True":"False") <<") \n";
ss << indentation << noise << ".posScale = vec3(20) \n";
ss << indentation << noise << ".clamp = " << ((clamp)?"True":"False") << " \n";
ss << indentation << noise << ".clampNeg = " << clampNeg << " \n";
@@ -101,33 +101,39 @@ static void manta_gen_noise(stringstream& ss, int indent, char *noise, int seed,
ss << indentation << noise << ".timeAnim = " << timeAnim << " \n";
}
-static void manta_solve_pressure(stringstream& ss, char *flags, char *vel, char *pressure, bool useResNorms, int openBound, int solver_res)
+static void manta_solve_pressure(stringstream& ss, char *flags, char *vel, char *pressure, bool useResNorms, int openBound, int solver_res,float cgMaxIterFac=1.0, float cgAccuracy = 0.01)
{
/*open:0 ; vertical : 1; closed:2*/
ss << " solvePressure(flags=" << flags << ", vel=" << vel << ", pressure=" << pressure << ", useResNorm=" << (useResNorms?"True":"False") << ", openBound='";
if(openBound == 1) /*vertical*/
{
- ss << "yY') \n";
+ ss << "yY'";
}
else if (openBound == 0) /*open*/
{
if(solver_res == 2)
- ss << "xXyY') \n";
+ ss << "xXyY'";
else
- ss << "xXyYzZ') \n";
+ ss << "xXyYzZ'";
}
else /*also for closed bounds*/
{
- ss << "') \n";
+ ss << "'";
}
+ ss << ", cgMaxIterFac=" << cgMaxIterFac << ", cgAccuracy=" << cgAccuracy << ") \n";
}
-static void manta_advect_SemiLagr(stringstream& ss, char *indent, char *flags, char *vel, char *grid, int order)
+static void manta_advect_SemiLagr(stringstream& ss, int indent, char *flags, char *vel, char *grid, int order)
{
- if((order <=1) || (indent == NULL) || (flags == NULL) || (vel == NULL) || (grid == NULL))
+ if((order <=1) || (flags == NULL) || (vel == NULL) || (grid == NULL))
{return;}
- ss << indent << "advectSemiLagrange(flags=" << flags << ", vel=" << vel \
+ std::string indentation = "";
+ for (size_t cnt(0); cnt < indent; ++cnt) {
+ indentation += " ";/*two-spaces indent*/
+ }
+
+ ss << indentation << "advectSemiLagrange(flags=" << flags << ", vel=" << vel \
<< ", grid=" << grid << ", order=" << order << ") \n";
}
@@ -161,12 +167,12 @@ static void generate_manta_sim_file(Scene *scene, SmokeModifierData *smd)
/*Data Declaration*/
/*Wavelets variables*/
int upres = smd->domain->amplify;
+ ss << "uvs = 1" << "\n"; /*TODO:add UI*/
+ ss << "velInflow = vec3(2, 0, 0)"<< "\n"; /*TODO:add UI*/
if (wavelets) {
ss << "upres = " << upres << "\n";
ss << "wltStrength = " << smd->domain->strength << "\n";
- ss << "uvs = 1" << "\n"; /*TODO:add UI*/
- ss << "velInflow = vec3(2, 0, 0)"<< "\n"; /*TODO:add UI*/
- if(smd->domain->amplify > 0)/*TODO:add UI*/
+ if(upres > 0)/*TODO:add UI*/
{ ss << "octaves = int( math.log(upres)/ math.log(2.0) + 0.5 ) \n"; }
else
{ ss << "octaves = 0"<< "\n"; }
@@ -178,65 +184,125 @@ static void generate_manta_sim_file(Scene *scene, SmokeModifierData *smd)
/*Z axis in Blender = Y axis in Mantaflow*/
manta_create_solver(ss, "s", "main", "gs", fluid->xRes(), fluid->zRes(), fluid->yRes(), smd->domain->manta_solver_res);
ss << "s.timestep = " << smd->domain->time_scale << " \n";
-
-/*Grids setup*/
-/*For now, only one grid of each kind is needed*/
- ss << "vel = s.create(MACGrid) \n";
- ss << "density = s.create(RealGrid) \n";/*smoke simulation*/
- ss << "pressure = s.create(RealGrid) \n";/*must always be present*/
- if(wavelets){
- ss << "energy = s.create(RealGrid) \n";
- ss << "tempFlag = s.create(FlagGrid)\n";
- }
+
/*Noise Field*/
- manta_gen_noise(ss, 0, "noise", 256, true, true, 0, 1, 1, 0.75, 0.2);
+ manta_gen_noise(ss, "s", 0, "noise", 256, true, true, 0, 2, 1, 0.075, 0.2);
+
+/*Inflow source - for now, using mock sphere */
+ ss << "source = s.create(Cylinder, center=gs*vec3(0.3,0.2,0.5), radius=res*0.081, z=gs*vec3(0.081, 0, 0))\n";
+ ss << "sourceVel = s.create(Cylinder, center=gs*vec3(0.3,0.2,0.5), radius=res*0.15 , z=gs*vec3(0.15 , 0, 0))\n";
+ ss << "obs = s.create(Sphere, center=gs*vec3(0.5,0.5,0.5), radius=res*0.15)\n";
/*Wavelets: larger solver*/
if(wavelets && upres>0)
{
- manta_create_solver(ss, "xl", "larger", "xl_gs", fluid->xRes(), fluid->zRes(), fluid->yRes(), smd->domain->manta_solver_res);
+ manta_create_solver(ss, "xl", "larger", "xl_gs", fluid->xRes() * upres, fluid->zRes()* upres, fluid->yRes() * upres, smd->domain->manta_solver_res);
ss << "xl.timestep = " << smd->domain->time_scale << " \n";
- ss << "xl_vel = s.create(MACGrid) \n";
- ss << "xl_density = s.create(RealGrid) \n";/*smoke simulation*/
- ss << "xl_flags = s.create(FlagGrid) \n";
+ ss << "xl_vel = xl.create(MACGrid) \n";
+ ss << "xl_density = xl.create(RealGrid) \n";/*smoke simulation*/
+ ss << "xl_flags = xl.create(FlagGrid) \n";
ss << "xl_flags.initDomain() \n";
ss << "xl_flags.fillGrid() \n";
ss << "xl_source = xl.create(Cylinder, center=xl_gs*vec3(0.3,0.2,0.5), radius=xl_gs.x*0.081, z=xl_gs*vec3(0.081, 0, 0)) \n";
ss << "xl_obs = xl.create(Sphere, center=xl_gs*vec3(0.5,0.5,0.5), radius=xl_gs.x*0.15) \n";
ss << "xl_obs.applyToGrid(grid=xl_flags, value=FlagObstacle) \n";
- manta_gen_noise(ss, 0, "xl_noise", 256, true, true, 0, 2, 1, 0.075, 0.3 * upres);
+ manta_gen_noise(ss, "xl", 0, "xl_noise", 256, true, true, 0, 2, 1, 0.075, 0.2 * (float)upres);
}
/*Flow setup*/
ss << "flags = s.create(FlagGrid) \n";/*must always be present*/
ss << "flags.initDomain() \n";
ss << "flags.fillGrid() \n";
+ ss << "obs.applyToGrid(grid=flags, value=FlagObstacle)\n";
+ /*Create the array of UV grids*/
+ if(wavelets){
+ ss << "uv = [] \n";
+ ss << "for i in range(uvs): \n";
+ ss << " uvGrid = s.create(VecGrid) \n";
+ ss << " uv.append(uvGrid) \n";
+ ss << " resetUvGrid( uv[i] ) \n";
+ }
+ /*Grids setup*/
+ /*For now, only one grid of each kind is needed*/
+ ss << "vel = s.create(MACGrid) \n";
+ ss << "density = s.create(RealGrid) \n";/*smoke simulation*/
+ ss << "pressure = s.create(RealGrid) \n";/*must always be present*/
+ ss << "energy = s.create(RealGrid) \n";
+ ss << "tempFlag = s.create(FlagGrid)\n";
+
+ /*Wavelets noise field*/
+ if (wavelets)
+ {
+ ss << "xl_wltnoise = s.create(NoiseField, loadFromFile=True) \n";
+ ss << "xl_wltnoise.posScale = vec3( int(1.0*gs.x) ) * 0.5 \n";
+ /*scale according to lowres sim , smaller numbers mean larger vortices*/
+ if (upres > 0){
+ ss << "xl_wltnoise.posScale = xl_wltnoise.posScale * " << (1./(float)upres) << ((upres == 1)?". \n":"\n");
+ }
+ ss << "xl_wltnoise.timeAnim = 0.1 \n";
+ }
+
/*GUI for debugging purposes*/
ss << "if (GUI):\n gui = Gui()\n gui.show() \n";
-/*Inflow source - for now, using mock sphere */
- ss << "source = s.create(Cylinder, center=gs*vec3(0.3,0.2,0.5), radius=res*0.081, z=gs*vec3(0.081, 0, 0))\n";
- ss << "sourceVel = s.create(Cylinder, center=gs*vec3(0.3,0.2,0.5), radius=res*0.15 , z=gs*vec3(0.15 , 0, 0))\n";
- ss << "obs = s.create(Sphere, center=gs*vec3(0.5,0.5,0.5), radius=res*0.15)\n";
- ss << "obs.applyToGrid(grid=flags, value=FlagObstacle)\n";
-
/*Flow solving stepsv, main loop*/
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);
+ manta_advect_SemiLagr(ss, 1, "flags", "vel", "density", 2);
+ manta_advect_SemiLagr(ss, 1, "flags", "vel", "vel", 2);
+
+ if(wavelets){
+ ss << " for i in range(uvs): \n";
+ manta_advect_SemiLagr(ss, 2, "flags", "vel", "uv[i]", 2);
+ ss << " updateUvWeight( resetTime=16.5 , index=i, numUvs=uvs, uv=uv[i] )\n";
+ }
+ ss << " applyInflow=False\n";
+ ss << " if (t>=0 and t<75):\n";
+ ss << " densityInflow( flags=flags, density=density, noise=noise, shape=source, scale=1, sigma=0.5 )\n";
+ ss << " sourceVel.applyToGrid( grid=vel , value=velInflow )\n";
+ ss << " applyInflow=True\n";
+
ss << " setWallBcs(flags=flags, vel=vel) \n";
ss << " addBuoyancy(density=density, vel=vel, gravity=vec3(0,-6e-4,0), flags=flags) \n";
- manta_solve_pressure(ss,"flags", "vel", "pressure",true,smd->domain->border_collisions, smd->domain->manta_solver_res);
+ ss << " vorticityConfinement( vel=vel, flags=flags, strength=0.4 ) \n";
+
+ manta_solve_pressure(ss,"flags", "vel", "pressure",true,smd->domain->border_collisions, smd->domain->manta_solver_res,1.0,0.01);
ss << " setWallBcs(flags=flags, vel=vel) \n";
+ /*determine weighting*/
+ ss << " computeEnergy(flags=flags, vel=vel, energy=energy)\n";
+ /* mark outer obstacle region by extrapolating flags for 2 layers */
+ ss << " tempFlag.copyFrom(flags)\n";
+ ss << " extrapolateSimpleFlags( flags=flags, val=tempFlag, distance=2, flagFrom=FlagObstacle, flagTo=FlagFluid )\n";
+ /*now extrapolate energy weights into obstacles to fix boundary layer*/
+ ss << " extrapolateSimpleFlags( flags=tempFlag, val=energy, distance=6, flagFrom=FlagFluid, flagTo=FlagObstacle )\n";
+ ss << " computeWaveletCoeffs(ener
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list