sandbox/Antoonvh/rf4t.c
Higher-order accurate face-value prolongation
Here we test the methods for 4th order face refinement and Solenoidal refinement.
#include "higher-order.h"
#include "poisson.h" //For projection()
#include "utils.h"
face vector fv[];
scalar s[];
double max_divergence (face vector fv);//Prototype
int main() {
= 10;
L0 = Y0 = -L0/2;
X0 foreach_dimension() {
periodic (left);
.x.prolongation = refine_face_4_x;
fv}
.x.refine = refine_face_solenoidal; fv
First, the prolongation method is tested:
set logscale xy 2
set xr [9:4000]
set yr [1e-12:1e-2]
set grid
set xlabel 'N'
set ylabel 'L_1 Error'
set size square
plot 'out' u 1:2, 1000*x**(-4)
for (int l = 4; l < 12; l++) {
(1 << l);
init_grid foreach_face() {
= {y, -x};
coord f .x[] = f.x*exp(-sq(x) - sq(y));
fv}
boundary ((scalar*){fv});
wavelet (fv.x, s);
fprintf (stdout, "%d %g\n", N, normf(s).avg);
}
Next, the Solenoidal refinement test is performed
Accuracy:
set logscale xy 2
set xr [9:4000]
set yr [1e-13:1e-2]
set grid
set size square
set xlabel 'N'
set ylabel 'L_1 Error'
plot 'log' u 1:2, 500000*x**(-5)
Divergence:
reset
set logscale x
set xr [9:4000]
set yr [-1e-11:1e-11]
set grid
set xlabel 'N'
set ylabel 'Max. absolute divergence'
set size square
plot 'log' u 1:4
= 25;
NITERMIN for (int l = 4; l < 12; l++) {
(1 << l);
init_grid foreach_face() {
= {y, -x};
coord f .x[] = f.x*exp(-sq(x) - sq(y));
fv}
project (fv, s);
double md = max_divergence (fv); //approx zero
double * fva = malloc (2*(sq(N))*sizeof(double));
long int j = 0;
foreach_face()
[j++] = fv.x[]; //Array of reference values.
fva
unrefine (level == l - 1);
refine (level < l);
double err = 0;
= 0;
j foreach_face()
+= fabs(fv.x[] - fva[j++]);
err fprintf (stderr, "%d %g %g %g\n",
, err/sq(N), md, max_divergence (fv));
Nfree (fva);
}
}
double max_divergence (face vector fv) {
double max = 0;
foreach() {
double d = 0;
foreach_dimension()
+= fv.x[1] - fv.x[];
d /= Delta;
d if (fabs(d) > max)
= fabs(d);
max }
return max;
}