sandbox/Antoonvh/heating.c

A rising plume
Herein we model the flow originating from a localized heat source. Such flows are often associated with smoke. As such, the flow is visualized with a volumetric rendering of the smoke concentration field.
Volumetric rendering
grid refinement
#include "grid/octree.h"
#include "navier-stokes/centered.h"
#include "tracer.h"
#include "diffusion.h"
#include "utils.h"
#include "bwatch.h"
The buoyancy and smoke fields are modelled seperately
scalar b[], s[], * tracers = {b, s};
//size of heat source
double siz = 0.3;
face vector av[];
double muv = 2e-4;
// Grid paramters
double be = 0.05, ue = 0.05;
int maxlevel = 10, minlevel = 5;
int main() {
= 100;
L0 = Y0 = Z0 = -L0/2;
X0 = av;
a = 0.1;
DT = 1 << minlevel;
N const face vector muc[] = {muv, muv, muv};
= muc;
mu run();
}
event init (t = 0) {
for (scalar s in tracers)
.gradient = minmod2;
srefine ((sq(x) + sq(y + L0/3.) + sq(z)) < sq(20*siz) &&
< maxlevel - 2);
level
refine ((sq(x) + sq(y + L0/3.) + sq(z)) < sq(10*siz) &&
< maxlevel - 1);
level refine ((sq(x) + sq(y + L0/3.) + sq(z)) < sq(2*siz) &&
< maxlevel);
level foreach()
for (scalar st in tracers)
[] = exp(-(sq(x) + sq(y + L0/3.) + sq(z))/sq(siz));
st
}
event acceleration(i++) {
double tau = 1;
foreach()
for (scalar st in tracers)
[] += (1 - st[])*dt/tau*exp(-(sq(x) + sq(y + L0/3.) + sq(z))/sq(siz));
st
foreach_face(y)
.y[] = (b[] + b[0,-1])/2.;
av}
Only the buoyancy field is subjected to diffusion.
event tracer_diffusion (i++) {
(b, dt, mu);
diffusion }
event adapt (i++) {
({s, b, u}, (double[]){be/4., be, ue, ue, ue},
adapt_wavelet , minlevel);
maxlevel}
event mov (t += 0.5) {
output_ppm (b, file = "b.mp4", n = 300);
output_ppm (s, file = "s.mp4", n = 300);
scalar lev[];
foreach()
[] = level;
levoutput_ppm (lev, file = "level.mp4", n = 300,
= minlevel - 1, max = maxlevel);
min
static FILE * fp = popen ("ppm2mp4 plume.mp4", "w");
watch (fov = 40, O = {1,1,100}, nx = 400, ny = 800);
sphere (150, mat = {.dull = true, .col[0] = 5, .col[1] = 5, .col[2] = 70,
.col2[0] = 5, .col2[1] = 5, .col2[2] = 5,
.n1 = (coord){0.1, 1, 0}});
volume (s, sc = siz, mval = 1e-2, col = {255,255,255}, shading = 1);
store (fp);
}
event stop (t = 125) {
dump ("smoke_dump");
}