sandbox/Antoonvh/soil.c
A soil underneath an atmosphere
On this page we explore a possibility to implement a soil underneath an atmosphere. The soil may store and diffuse heat with a different diffusivity compared to the air in the atmosphere.
The case concerns warm air that is transpored downwards by a dipolar vortex from aloft. The warm air reaches the underlaying surface and the heat then partly diffuses into the soil where it is stored.
This is the movie we generate
It appears to work OK.
#include "navier-stokes/centered.h"
#include "tracer.h"
#include "diffusion.h"
#include "fractions.h"
#include "view.h"
#define RAD (pow(pow((x - xo), 2)+(pow((y - yo), 2)), 0.5))
#define ST (-(x - xo)/RAD)
scalar s[], f[];
scalar * tracers = {s};
s[top] = neumann(1.);
double xo = 7.7, yo = 7.6;
double temp = 30;
double Re = 1000;
int main(){
L0 = 15.;
init_grid (1 << (8));
f.refine = f.prolongation = fraction_refine;
foreach_dimension()
u.x.refine = refine_linear;
const face vector muc[] = {1./Re, 1./Re};
mu = muc;
run();
}
event init (t = 0){
fraction(f, pi - y);
foreach()
s[] = (y - pi)*(y > pi);
refine (RAD < 2.0 && level <= 8);
refine (RAD < 1.0 && level <= 9);
scalar psi[];
double k = 3.83170597;
foreach()
psi[] = ((RAD > 1)*((1/RAD))*ST) + ((RAD < 1)*((-2*j1(k*RAD)*ST/(k*j0(k))) + (RAD*ST)));
boundary({psi});
foreach() {
u.x[] = -((psi[0, 1] - psi[0, -1])/(2*Delta));
u.y[] = (psi[1, 0] - psi[-1, 0])/(2*Delta);
}
boundary(all);
}
face vector muz[];
event tracer_diffusion(i++){
foreach_face()
muz.x[] = (1./Re) + 0.05*(f[] + f[-1]);
diffusion(s, dt , muz);
}
event adapt(i++)
adapt_wavelet((scalar *){u, s}, (double []){0.05, 0.05, 0.025}, 9);
event wall(i++){ //Stephane's trick
foreach(){
foreach_dimension()
u.x[] -= u.x[]*f[];
}
}
event bviewer(t += 0.075; t <= temp){
scalar omega[];
view(fov = 25, tx = -0.5, ty = -0.4, width = 1200, height = 500);
vorticity(u, omega);
squares("omega", map = cool_warm);
draw_vof("f", lw = 3);
translate(x = L0){
squares("s", min = 0, max = 1);
draw_vof("f", lw = 3);
}
translate(x = -L0){
cells();
}
draw_string(" Cells, Vorticity and Temperature", size = 35);
save("mp4.mp4");
}