Skip to content

Commit

Permalink
Merge branch 'limiter-effect' into 'master'
Browse files Browse the repository at this point in the history
Limiter effect

See merge request fun3d-developers/refine!873
  • Loading branch information
Mike Park committed Mar 28, 2022
2 parents 664232f + ea3eac3 commit 3636b3f
Showing 1 changed file with 90 additions and 0 deletions.
90 changes: 90 additions & 0 deletions src/ref_recon_test.c
Expand Up @@ -53,10 +53,100 @@
#include "ref_validation.h"

int main(int argc, char *argv[]) {
REF_INT pos;
REF_MPI ref_mpi;
RSS(ref_mpi_start(argc, argv), "start");
RSS(ref_mpi_create(&ref_mpi), "create");

/* Influence of the Numerical Scheme in Predictions of Vortex Interaction
* about a Generic Missile Airframe DOI:10.2514/6.2022-1178 */
RXS(ref_args_find(argc, argv, "--limiter-effect", &pos), REF_NOT_FOUND,
"arg search");
if (pos != REF_EMPTY) {
REF_GRID ref_grid = NULL;
REF_NODE ref_node = NULL;
REF_DBL *field, *p, *grad, *limeff;
REF_INT node, ldim, edge;
REF_INT ip = 0, ivol = 1, iphi = 2;
REF_EDGE ref_edge;
REF_RECON_RECONSTRUCTION reconstruction = REF_RECON_KEXACT;
if (ref_mpi_once(ref_mpi))
printf("%s number of processors %d\n", argv[0], ref_mpi_n(ref_mpi));
REIS(4, argc, "required args: --limiter-effect grid.ext [p,vol,phi].solb");
REIS(1, pos, "required args: --limiter-effect grid.ext [p,vol,phi].solb");
if (ref_mpi_once(ref_mpi)) printf("part grid %s\n", argv[2]);
RSS(ref_part_by_extension(&ref_grid, ref_mpi, argv[2]), "argv import");
if (ref_mpi_once(ref_mpi)) printf("extract ref_node\n");
ref_node = ref_grid_node(ref_grid);
ref_mpi_stopwatch_stop(ref_grid_mpi(ref_grid), "grid import");
if (ref_mpi_once(ref_mpi)) printf("reading field %s\n", argv[2]);
RSS(ref_part_scalar(ref_grid, &ldim, &field, argv[3]),
"unable to load field in position 3");
ref_mpi_stopwatch_stop(ref_grid_mpi(ref_grid), "field import");
REIS(3, ldim, "expected [p,vol,phi]");

ref_malloc_init(limeff, ref_node_max(ref_node), REF_DBL, 0.0);
ref_malloc(p, ref_node_max(ref_node), REF_DBL);
ref_malloc(grad, 3 * ref_node_max(ref_node), REF_DBL);
each_ref_node_valid_node(ref_node, node) {
p[node] = field[ip + ldim * node];
}
RSS(ref_recon_gradient(ref_grid, p, grad, reconstruction), "grad");
ref_mpi_stopwatch_stop(ref_grid_mpi(ref_grid), "kexact grad");
RSS(ref_edge_create(&ref_edge, ref_grid), "create");
ref_mpi_stopwatch_stop(ref_grid_mpi(ref_grid), "create edges");
each_ref_edge(ref_edge, edge) {
REF_DBL qunlim, qlim;
REF_DBL r[3];
REF_INT n0, n1;
n0 = ref_edge_e2n(ref_edge, 0, edge);
n1 = ref_edge_e2n(ref_edge, 1, edge);
/* n0 */
r[0] = ref_node_xyz(ref_node, 0, n1) - ref_node_xyz(ref_node, 0, n0);
r[1] = ref_node_xyz(ref_node, 1, n1) - ref_node_xyz(ref_node, 1, n0);
r[2] = ref_node_xyz(ref_node, 2, n1) - ref_node_xyz(ref_node, 2, n0);
qunlim = p[n0] + ref_math_dot(&(grad[3 * n0]), r);
qlim = p[n0] + field[iphi + ldim * n0] * ref_math_dot(&(grad[3 * n0]), r);
limeff[n0] = MAX(limeff[n0], ABS(qunlim - qlim));
/* n1 */
r[0] = ref_node_xyz(ref_node, 0, n0) - ref_node_xyz(ref_node, 0, n1);
r[1] = ref_node_xyz(ref_node, 1, n0) - ref_node_xyz(ref_node, 1, n1);
r[2] = ref_node_xyz(ref_node, 2, n0) - ref_node_xyz(ref_node, 2, n1);
qunlim = p[n1] + ref_math_dot(&(grad[3 * n1]), r);
qlim = p[n1] + field[iphi + ldim * n1] * ref_math_dot(&(grad[3 * n1]), r);
limeff[n1] = MAX(limeff[n1], ABS(qunlim - qlim));
}
each_ref_node_valid_node(ref_grid_node(ref_grid), node) {
REF_DBL h;
h = pow(field[ivol + ldim * node], 1.0 / 3.0);
if (ref_math_divisible(limeff[node], h)) {
limeff[node] /= h;
} else {
printf("DIV zero %e / %e set to zero\n", limeff[node], h);
limeff[node] = 0.0;
}
}
ref_mpi_stopwatch_stop(ref_grid_mpi(ref_grid), "limiter effect");
RSS(ref_gather_scalar_by_extension(ref_grid, 1, limeff, NULL,
"ref_recon_limiter_effect.plt"),
"export lim eff plt");
ref_mpi_stopwatch_stop(ref_grid_mpi(ref_grid),
"ref_recon_limiter_effect.plt");
RSS(ref_gather_scalar_by_extension(ref_grid, 1, limeff, NULL,
"ref_recon_limiter_effect.solb"),
"export lim eff solb");
ref_mpi_stopwatch_stop(ref_grid_mpi(ref_grid),
"ref_recon_limiter_effect.solb");
RSS(ref_edge_free(ref_edge), "free");
ref_free(grad);
ref_free(p);
ref_free(limeff);
RSS(ref_grid_free(ref_grid), "free");
RSS(ref_mpi_free(ref_mpi), "free");
RSS(ref_mpi_stop(), "stop");
return 0;
}

if (argc == 3) {
REF_GRID ref_grid;
REF_DBL *function, *derivatives, *scalar, *grad;
Expand Down

0 comments on commit 3636b3f

Please sign in to comment.