sandbox/pairetti/VOF2LS/vof_to_LS.h
VOF to level-set mapping
The following functions are meant to obtain a level-set distance field from the given volume fraction field.
void vof_to_LS (scalar vof, scalar ls, vector gLSc)
{
Redistancing parameters. Procedure based on Albadawi paper on 2013.
int NCorr = 15;
scalar lsSgn[],HS[];
foreach(){
HS[] = (2*vof[] - 1.)*Delta*0.75;
lsSgn[] = (ls[] > 1e-6 ? 1. : ls[] < -1e-6 ? -1. : ls[]);
}
Smoothing the original step function:
foreach()
ls[] = (8.*HS[] +
4.*(HS[0,0,1] + HS[0,0,-1] + HS[0,1,0] + HS[0,-1,0] + HS[1,0,0] + HS[-1,0,0] )+
2.*(HS[0,1,1] + HS[0,1,-1] + HS[0,-1,1] + HS[0,-1,-1] +
HS[1,0,1] + HS[-1,0,1] + HS[1,0,-1] + HS[-1,0,-1] +
HS[1,1,0] + HS[-1,1,0] + HS[1,-1,0] + HS[-1,-1,0]) +
HS[-1,-1,1] + HS[1,-1,1] + HS[1,1,1] + HS[-1,1,1] +
HS[-1,-1,-1] + HS[1,-1,-1] + HS[1,1,-1] + HS[-1,1,-1] )/64.;
boundary ((scalar *){ls});
Apply redistancing procedure NCorr iterations.
int iters = 0;
double minGrad = 0.;
double maxGrad = 0.;
face vector gLSf[];
while(iters < NCorr){
iters++;
minGrad = HUGE;
maxGrad = -HUGE;
Gradient computation on faces.
foreach_face()
gLSf.x[] = (ls[] - ls[-1])/Delta;
boundary_flux({gLSf});
foreach(){
double curGrad = 0;
Gradient interpolation to cell centers.
foreach_dimension(){
curGrad += sq((gLSf.x[] + gLSf.x[1])/2.);
gLSc.x[] = (gLSf.x[] + gLSf.x[1])/2.;
}
Update level-set function.
ls[] = ls[] + lsSgn[]*(1. - sqrt(curGrad))*Delta*0.1;
boundary ((scalar *){ls});
Get maximum and minimum values for the gradient magnitude.