9.1
general documentation
cs_gradient_boundary.cpp File Reference

Gradient reconstruction at boundaries and associated functions. More...

#include "base/cs_defs.h"
#include <cmath>
#include <chrono>
#include <assert.h>
#include <errno.h>
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <float.h>
#include "bft/bft_error.h"
#include "bft/bft_printf.h"
#include "base/cs_ext_neighborhood.h"
#include "base/cs_field.h"
#include "base/cs_halo.h"
#include "base/cs_math.h"
#include "base/cs_mem.h"
#include "base/cs_parall.h"
#include "base/cs_profiling.h"
#include "mesh/cs_mesh.h"
#include "mesh/cs_mesh_adjacencies.h"
#include "mesh/cs_mesh_quantities.h"
#include "alge/cs_gradient.h"
#include "alge/cs_gradient_priv.h"
#include "alge/cs_gradient_boundary.h"
+ Include dependency graph for cs_gradient_boundary.cpp:

Functions

void cs_gradient_boundary_iprime_lsq_s (cs_dispatch_context &ctx, const cs_mesh_t *m, const cs_mesh_quantities_t *fvq, cs_lnum_t n_faces, const cs_lnum_t *face_ids, cs_halo_type_t halo_type, double clip_coeff, int hyd_p_flag, cs_real_t f_ext[][3], cs_real_t *df_limiter, const cs_field_bc_coeffs_t *bc_coeffs, const cs_real_t c_weight[], const cs_real_t var[], cs_real_t *restrict var_iprime, cs_real_t var_iprime_flux[])
 Compute the values of a scalar at boundary face I' positions using least-squares interpolation. More...
 
void cs_gradient_boundary_iprime_lsq_s_ani (cs_dispatch_context &ctx, const cs_mesh_t *m, const cs_mesh_quantities_t *fvq, cs_lnum_t n_faces, const cs_lnum_t *face_ids, double clip_coeff, int hyd_p_flag, cs_real_t f_ext[][3], cs_real_t *df_limiter, const cs_field_bc_coeffs_t *bc_coeffs, cs_real_t viscce[][6], const cs_real_t weighb[], const cs_real_t c_weight[][6], const cs_real_t var[], cs_real_t *restrict var_iprime, cs_real_t var_iprime_flux[])
 Compute the values of a scalar at boundary face I' positions using least-squares interpolation with anisotropic weighting. More...
 
template<cs_lnum_t stride>
void cs_gradient_boundary_iprime_lsq_strided (cs_dispatch_context &ctx, const cs_mesh_t *m, const cs_mesh_quantities_t *fvq, cs_lnum_t n_faces, const cs_lnum_t *face_ids, cs_halo_type_t halo_type, double b_clip_coeff, cs_real_t *df_limiter, const cs_field_bc_coeffs_t *bc_coeffs, const cs_real_t c_weight[], const cs_real_t var[][stride], cs_real_t var_iprime[][stride], cs_real_t var_iprime_lim[][stride])
 Compute the values of a vector at boundary face I' positions using least-squares interpolation. More...
 
template void cs_gradient_boundary_iprime_lsq_strided (cs_dispatch_context &ctx, const cs_mesh_t *m, const cs_mesh_quantities_t *fvq, cs_lnum_t n_faces, const cs_lnum_t *face_ids, cs_halo_type_t halo_type, double b_clip_coeff, cs_real_t *df_limiter, const cs_field_bc_coeffs_t *bc_coeffs, const cs_real_t c_weight[], const cs_real_t var[][3], cs_real_t var_iprime[][3], cs_real_t var_iprime_lim[][3])
 
template void cs_gradient_boundary_iprime_lsq_strided (cs_dispatch_context &ctx, const cs_mesh_t *m, const cs_mesh_quantities_t *fvq, cs_lnum_t n_faces, const cs_lnum_t *face_ids, cs_halo_type_t halo_type, double b_clip_coeff, cs_real_t *df_limiter, const cs_field_bc_coeffs_t *bc_coeffs, const cs_real_t c_weight[], const cs_real_t var[][6], cs_real_t var_iprime[][6], cs_real_t var_iprime_lim[][6])
 

Detailed Description

Gradient reconstruction at boundaries and associated functions.

Function Documentation

◆ cs_gradient_boundary_iprime_lsq_s()

void cs_gradient_boundary_iprime_lsq_s ( cs_dispatch_context ctx,
const cs_mesh_t m,
const cs_mesh_quantities_t fvq,
cs_lnum_t  n_faces,
const cs_lnum_t face_ids,
cs_halo_type_t  halo_type,
double  clip_coeff,
int  hyd_p_flag,
cs_real_t  f_ext[][3],
cs_real_t df_limiter,
const cs_field_bc_coeffs_t bc_coeffs,
const cs_real_t  c_weight[],
const cs_real_t  var[],
cs_real_t *restrict  var_iprime,
cs_real_t  var_iprime_flux[] 
)

Compute the values of a scalar at boundary face I' positions using least-squares interpolation.

This assumes ghost cell values for the variable (var) are up-to-date.

A simple limiter is applied to ensure the maximum principle is preserved (using non-reconstructed values in case of non-homogeneous Neumann conditions).

Remarks

To compute the values at I', we only need the gradient along II', so in most cases, we could simply assume a Neumann BC for a given face.

We still use the provided BC's when possible, for the following cases:

  • Given a non-uniform Dirichlet condition and a non-orthogonal mesh, the Dirichlet values at face centers (shifted by II' relative to I') can convey a portion of the information of the gradient along II'.
  • For cells with multiple boundary faces, information from faces whose normals are not orthogonal to II' can also provide a significant contribution to the normal.
Parameters
[in]ctxReference to dispatch context
[in]mpointer to associated mesh structure
[in]fvqpointer to associated finite volume quantities
[in]n_facesnumber of faces at which to compute values
[in]face_idsids of boundary faces at which to compute values, or null for all
[in]halo_typehalo (cell neighborhood) type
[in]clip_coeffclipping (limiter) coefficient (no limiter if < 0)
[in]hyd_p_flagflag for hydrostatic pressure
[in]f_extexterior force generating pressure
[in]df_limiterdiffusion clipping (limiter) field (no limiter if nullptr)
[in]bc_coeffsboundary condition structure, or null
[in]c_weightcell variable weight, or null
[in]varvariable values et cell centers
[out]var_iprimevariable values et face iprime locations
[out]var_iprimevariable values at face iprime locations for gradient
[out]var_iprime_fluxvariable values at face iprime locations for flux, or nullptr if not needed

◆ cs_gradient_boundary_iprime_lsq_s_ani()

void cs_gradient_boundary_iprime_lsq_s_ani ( cs_dispatch_context ctx,
const cs_mesh_t m,
const cs_mesh_quantities_t fvq,
cs_lnum_t  n_faces,
const cs_lnum_t face_ids,
double  clip_coeff,
int  hyd_p_flag,
cs_real_t  f_ext[][3],
cs_real_t df_limiter,
const cs_field_bc_coeffs_t bc_coeffs,
cs_real_t  viscce[][6],
const cs_real_t  weighb[],
const cs_real_t  c_weight[][6],
const cs_real_t  var[],
cs_real_t *restrict  var_iprime,
cs_real_t  var_iprime_flux[] 
)

Compute the values of a scalar at boundary face I' positions using least-squares interpolation with anisotropic weighting.

This assumes ghost cell values for the variable (var) are up-to-date.

A simple limiter is applied to ensure the maximum principle is preserved (using non-reconstructed values in case of non-homogeneous Neumann conditions).

Remarks
The same remark applies as for cs_gradient_boundary_iprime_lsq_s.
Parameters
[in]ctxReference to dispatch context
[in]mpointer to associated mesh structure
[in]fvqpointer to associated finite volume quantities
[in]n_facesnumber of faces at which to compute values
[in]face_idsids of boundary faces at which to compute values, or null for all
[in]clip_coeffclipping (limiter) coefficient (no limiter if < 0)
[in]hyd_p_flagflag for hydrostatic pressure
[in]f_extexterior force generating pressure
[in]df_limiterdiffusion clipping (limiter) field
[in]bc_coeffsboundary condition structure
[in]visccesymmetric cell tensor $ \tens{\mu}_\celli $, or nullptr
[in]weighbboundary face weight for cells i in case of tensor diffusion, or nullptr
[in]c_weightcell variable weight, or null
[in]varvariable values et cell centers
[out]var_iprimevariable values et face iprime locations for gradient
[out]var_iprime_fluxvariabes values at face iprime locations for flux, or nullptr if not needed

◆ cs_gradient_boundary_iprime_lsq_strided() [1/3]

template void cs_gradient_boundary_iprime_lsq_strided ( cs_dispatch_context ctx,
const cs_mesh_t m,
const cs_mesh_quantities_t fvq,
cs_lnum_t  n_faces,
const cs_lnum_t face_ids,
cs_halo_type_t  halo_type,
double  b_clip_coeff,
cs_real_t df_limiter,
const cs_field_bc_coeffs_t bc_coeffs,
const cs_real_t  c_weight[],
const cs_real_t  var[][3],
cs_real_t  var_iprime[][3],
cs_real_t  var_iprime_lim[][3] 
)

◆ cs_gradient_boundary_iprime_lsq_strided() [2/3]

template void cs_gradient_boundary_iprime_lsq_strided ( cs_dispatch_context ctx,
const cs_mesh_t m,
const cs_mesh_quantities_t fvq,
cs_lnum_t  n_faces,
const cs_lnum_t face_ids,
cs_halo_type_t  halo_type,
double  b_clip_coeff,
cs_real_t df_limiter,
const cs_field_bc_coeffs_t bc_coeffs,
const cs_real_t  c_weight[],
const cs_real_t  var[][6],
cs_real_t  var_iprime[][6],
cs_real_t  var_iprime_lim[][6] 
)

◆ cs_gradient_boundary_iprime_lsq_strided() [3/3]

void cs_gradient_boundary_iprime_lsq_strided ( cs_dispatch_context ctx,
const cs_mesh_t m,
const cs_mesh_quantities_t fvq,
cs_lnum_t  n_faces,
const cs_lnum_t face_ids,
cs_halo_type_t  halo_type,
double  b_clip_coeff,
cs_real_t df_limiter,
const cs_field_bc_coeffs_t bc_coeffs,
const cs_real_t  c_weight[],
const cs_real_t  var[][stride],
cs_real_t  var_iprime[][stride],
cs_real_t  var_iprime_lim[][stride] 
)

Compute the values of a vector at boundary face I' positions using least-squares interpolation.

This assumes ghost cell values which might be used are already synchronized.

A simple limiter is applied to ensure the maximum principle is preserved (using non-reconstructed values in case of non-homogeneous Neumann conditions).

This function uses a local iterative approach to compute the cell gradient, as handling of the boundary condition terms b in higher dimensions would otherwise require solving higher-dimensional systems, often at a higher cost.

Remarks

To compute the values at I', we only need the gradient along II', so in most cases, we could simply assume a Neuman BC.

The same logic is applied as for cs_gradient_boundary_iprime_lsq_s.

Parameters
[in]ctxReference to dispatch context
[in]mpointer to associated mesh structure
[in]fvqpointer to associated finite volume quantities
[in]n_facesnumber of faces at which to compute values
[in]face_idsids of boundary faces at which to compute values, or NULL for all
[in]halo_typehalo (cell neighborhood) type
[in]b_clip_coeffboundary clipping (limiter) coefficient (no limiter if < 0)
[in]df_limiterdiffusion clipping (limiter) field (no limiter if nullptr)
[in]bc_coeffsboundary condition structure, or NULL
[in]c_weightcell variable weight, or NULL
[in]varvariable values at cell centers
[out]var_iprimevariable values at face iprime locations
[out]var_iprime_limlimited variable values at face iprime locations