sandbox/Antoonvh/SGS.h
Apply the Vreman Sub-Grid Scale Model
This header file can be used to run with a sub-grid scale model. By default, the eddy viscosity is based on the Vreman Eddy viscosity model. This file should included after the Navier-Stokes/centered.h module is included but before grid adaptation is carried out. This module also applies diffusion to the list of tracers.
#include "tracer.h"
#include "diffusion.h"
#include "vreman.h"
We initialize global variables: K_h and K_m are the diffusivity for heat and momentum, respectively. Pr is the turbulent Prandlt number, defined as Pr=\frac{K_h-\nu}{K_m-\nu}, with \nu being the molecular viscosity (molvis). Csmag is the classical Smagorinsky constant and tracers is a list of diffusive flow tracers, e.g. the Buoyancy field.
face vector Km[],Kh[];
(const) face vector Pr;
scalar Evis[]; //Cell Centered diffusivity
double molvis;
double Csmag;
scalar * tracers;
Since K_m\propto K_h \propto \Delta^2, proper care is required for evaluating corresponding diffusivities at the different levels of resolution boundaries.
static inline void Evisprol(Point point,scalar s){
foreach_child()
Evis[]=bilinear(point,Evis)/4.;
}
static inline void Evisres(Point point,scalar s){
double sum = 0.;
foreach_child()
sum += s[];
s[] = sum/2.;
}
We set some default values and for the parameters that may be overwritten by the users’ init event.
event defaults(i=0){
if (dimension!=3) //Allow to run, but give a warning
fprintf(stdout,"Warning %dD grid. The used formulations only make sense for 3D turbulence simulations\n",dimension);
mu=Kh;
Pr=unityf;
molvis=0.;
Csmag=0.12;
Evis.prolongation=Evisprol;
Evis.restriction=Evisres;
On tree grids we do not care about the diffusivities on refined and/or coarsend cells and faces. These should be properly reevaluated before they apear in any computation
#if TREE
Evis.refine=no_restriction;
Evis.coarsen=no_restriction;
foreach_dimension(){
Kh.x.refine=no_restriction;
Km.x.coarsen=no_restriction;
}
#endif
}
We calculate the centered eddyviscosity and translate it into the required face-field diffusivity.
event Eddyvis(i++){
eddyviscosity(Csmag,u,molvis,Evis);
boundary({Evis});
foreach_face(){
Km.x[]=(Evis[]+Evis[-1])/2;
Kh.x[]=(Pr.x[]*(Km.x[]-molvis))+molvis;
}
In 3D, there are 4 finer faces per coarser face. So consistency with K_m,K_h\propto \Delta^2 is conviniently achieved by applying the Boundary_flux function for these face fields
boundary_flux({Km,Kh});
}
For some user-friendliness, the SGS-mixing of the tracers is hard-coded into this header file.
event tracer_diffusion(i++){
for (scalar s in tracers)
diffusion(s,dt,Kh);
}