/**
## Tri/Bi-periodic simulations of rising droplets aiming to close the Navier-Stokes averaged equations.
Warning : Before running this file apply this
[patch](http://basilisk.fr/sandbox/fintzin/Patches/einstein_sum2.patch)
with darcs apply file.patch on your basilisk installation.
*/
#define dimension 3
#include "grid/multigrid.h"
#include "navier-stokes/centered.h"
#include "two-phase.h"
#include "tension.h"
#include "view.h"
#include "output.h"
#include "no-coalescence.h"
#include "tag.h"
/** My own header files
algebra.h --> include operator for coord and tens struct
parameters.h --> Define all the parameters
MISC.h --> definition of miscellaneous functions
CA.h --> continuous average functions
Drop.h --> compute the properties of tehs droplets
PA.h --> compute the particular average closure terms
CW.h --> compute the continuity waves data
*/
#include "parameters.h"
#include "algebra.h"
#include "MISC.h"
#define compute_output 1
#if compute_output
/** declaration of the main instance containing the statistics and drops properties */
#include "Drop.h"
#include "CA.h"
#include "PA.h"
#include "CW.h"
Drop Bub[Nb+Nbsup]; // Creation of a global Drop instance (defined in Drop.h)
Drop BubTmp[Nb+Nbsup];
event track_bub(t=0; t <= TMAX; t += dtprint){
int tagi = 0;
int nbubble;
int shift;
for(scalar s in interfaces) {
scalar tag_level[];
foreach() tag_level[] = s[]> EPS;
nbubble = tag(tag_level);
Compute_drops(s,tag_level,nbubble,tagi,Bub); // compute each drops properties
#if COAL
neighboring_scalar(s,tag_level,nbubble,tagi,Bub); // mark each neigboring scalar
#endif
shift = 0;
for(int j=0;j1 && !shift) coalescence(Bub,tagi);
#endif
/** Now that we have all the information on the drops we can compute
* closure terms using continuous and particular averages */
CA ca; // Creation of a global CA instance (defined in CA.h)
PA pa; // Creation of a global PA instance (defined in PA.h)
calcul_CA(&ca);
calcul_PA(&pa,Bub,BubTmp);
compute_alpha_layer();
// save the datas
if(main_process()){
print_Drop(BubTmp,Bub,tagi,i,t);
print_CA(ca,i);
print_PA(pa,i);
}
dump (file = "dump-last");
int nvof = list_len(interfaces);
FILE * para = fopen("number_of_vof.txt","w");
fprintf(para,"%d",nvof);
fclose(para);
memcpy(BubTmp, Bub, sizeof(Drop)*(Nb+Nbsup));// copy the arry
}
#endif // end compute outpute
/**Initializes the domain with zero velocity and outputs the flow parameters*/
event init (t=0){
if(restore(file = "../dump/dump-last")){
restore_old_csv();
}else{
foreach(){
f[] = geometry(x,y,z);
u.x[]=u.y[]=u.z[]=0.;
}
init_and_print_header();
}
}
/** Overloads the acceleration event to apply the effect of gravity.
* Due to the periodic boundary conditions the acceleration needs to be reduced by
* $\frac{\rho_{av}}{\rho}g$ rho is not available directly as a face centered vector
* so the stagger of f[] is adjusted to calculate it */
event acceleration (i++) {
double rhoav=avg_rho();
face vector av = a;
foreach_face(y)
av.y[] -= (1-rhoav/((f[]+f[0,-1])/2*(rho1-rho2)+rho2))*g;
#if CORREC
coord Uavg = avg_U();
foreach_face()
av.x[] -= Uavg.x/dt;
#endif
}
/** Outputs videos of the velocity, Pressure, vorticity, and tag fields
![Pressure face view](RS/P.mp4)
![Velocity iso view ](RS/U.mp4)
*/
event movies(t=0; t<=TMAX; t+=MOVIES){
#if dimension == 3
view (fov=30,
camera="front",
width = 800,
height = 800);
clear();
box();
draw_vof("f", lw = 2.);
squares(color = "u.y", n = {0,0,1}, alpha = -Ls/2);
save("P.mp4");
clear();
view (fov=30,
camera="iso",
width = 800,
height = 800);
box();
draw_vof("f", lw = 2.);
squares(color = "u.y", n = {0,0,1} ,alpha = -Ls/2.);
squares(color = "u.y", n = {0,1,0} ,alpha = -Ls/2.);
squares(color = "u.y", n = {1,0,0} ,alpha = -Ls/2.);
save("U.mp4");
#elif dimension == 2
box();
draw_vof("f", lw = 2.);
squares("u.y");
save("uy.mp4");
clear();
box();
draw_vof("f", lw = 2.);
squares("p");
save("P.mp4");
clear();
box();
squares("a.y");
save("a.mp4");
clear();
scalar inter[];
for(scalar s in interfaces)
foreach()
inter[] += (s.i)* (s[]>EPS);
box();
squares("inter",map=randomap);
save("inter.mp4");
clear();
#endif
}
#ifdef LOI
event defaults (i=0)
{
length_of_interfaces = LOI;
}
#endif
/** The flow parameters are calculated based on the previously defined non-dimensional parameters.
* The tolerance is reduced to 1e-4 and the boundaries are set to be periodic*/
int main(int argc, char** argv){
size(Ls);
init_grid(1<<(LEVEL));
origin(-Ls/2.,-Ls/2.,-Ls/2.);
rho1 =r1;
mu1 =mu_d;
rho2 =rho_f;
mu2 =mu_f;
f.sigma =sig;
TOLERANCE =1e-5;
foreach_dimension()
periodic(right);
run();
}
event stop(t=TMAX){
return 1;
}
/**
## References
~~~bib
@article{batchelor1970stress,
title={The stress system in a suspension of force-free particles},
author={Batchelor, GK},
journal={Journal of fluid mechanics},
volume={41},
number={3},
pages={545--570},
year={1970},
publisher={Cambridge University Press}
}
~~~
*/