20#include "pism/stressbalance/blatter/verification/BlatterTestXZ.hh"
22#include "pism/rheology/IsothermalGlen.hh"
24#include "pism/stressbalance/blatter/verification/manufactured_solutions.hh"
27namespace stressbalance {
30 int Mz,
int coarsening_factor)
31 :
Blatter(grid, Mz, coarsening_factor) {
34 double n =
m_config->get_number(
"stress_balance.blatter.Glen_exponent");
56 m_beta = convert(
m_sys, 1.0,
"kPa year m-1",
"Pa s m-1");
59 m_g =
m_config->get_number(
"constants.standard_gravity");
64 const double *ice_bottom,
65 const double *sea_level) {
77 return (I.
i == 0 or I.
i == info.mx - 1);
87 const double *surface,
103 x_nodal[
n] = element.
x(
n);
104 z_nodal[
n] = element.
z(
n);
112 for (
unsigned int q = 0; q < element.
n_pts(); ++q) {
116 for (
int t = 0; t < element.
n_chi(); ++t) {
117 const auto &psi = element.
chi(q, t);
130 const double *tauc_nodal,
131 const double *f_nodal,
150 x_nodal[
n] = element.
x(
n);
151 z_nodal[
n] = element.
z(
n);
158 for (
unsigned int q = 0; q < face.
n_pts(); ++q) {
162 for (
int t = 0; t < element.
n_chi(); ++t) {
163 auto psi = face.
chi(q, t);
189 x_nodal[
n] = element.
x(
n);
190 z_nodal[
n] = element.
z(
n);
197 for (
unsigned int q = 0; q < face.
n_pts(); ++q) {
204 for (
int t = 0; t < element.
n_chi(); ++t) {
205 auto psi = face.
chi(q, t);
207 residual[t] += - W * psi *
F;
const units::System::Ptr m_sys
unit system used by this component
std::shared_ptr< const Config > m_config
configuration database used by this component
const std::shared_ptr< const Grid > m_grid
grid used by this component
This class represents a 2D vector field (such as ice velocity) at a certain grid point.
void evaluate(const T *x, T *vals, T *dx, T *dy, T *dz) const
Given nodal values, compute the values and partial derivatives at the quadrature points.
double weight(unsigned int q) const
Weight of the quadrature point q
const Germ & chi(unsigned int q, unsigned int k) const
unsigned int n_pts() const
Number of quadrature points.
double weight(unsigned int q) const
unsigned int n_pts() const
Number of quadrature points.
const double & chi(unsigned int q, unsigned int k) const
void evaluate(const T *x, T *result) const
Isothermal Glen ice allowing extra customization.
BlatterTestXZ(std::shared_ptr< const Grid > grid, int Mz, int coarsening_factor)
void residual_basal(const fem::Q1Element3 &element, const fem::Q1Element3Face &face, const double *tauc_nodal, const double *f_nodal, const Vector2d *u_nodal, Vector2d *residual)
Vector2d u_bc(double x, double y, double z) const
bool marine_boundary(int face, const int *node_type, const double *ice_bottom, const double *sea_level)
void residual_source_term(const fem::Q1Element3 &element, const double *surface, const double *bed, Vector2d *residual)
void residual_surface(const fem::Q1Element3 &element, const fem::Q1Element3Face &face, Vector2d *residual)
double m_A
constant ice hardness
bool dirichlet_node(const DMDALocalInfo &info, const fem::Element3::GlobalIndex &I)
virtual void residual_basal(const fem::Q1Element3 &element, const fem::Q1Element3Face &face, const double *tauc_nodal, const double *f_nodal, const Vector2d *u_nodal, Vector2d *residual)
double m_work[m_n_work][m_Nq]
std::shared_ptr< rheology::FlowLaw > m_flow_law
std::shared_ptr< EnthalpyConverter > m_EC
const int n_chi
Number of shape functions on a Q1 element.
static double F(double SL, double B, double H, double alpha)
Vector2d blatter_xz_source_surface(double x, double z, double A, double rho, double g, double s_0, double alpha, double H, double beta)
Vector2d blatter_xz_source(double x, double z, double A, double rho, double g, double s_0, double alpha, double H, double beta)
Vector2d blatter_xz_exact(double x, double z, double A, double rho, double g, double s_0, double alpha, double H, double beta)
Vector2d blatter_xz_source_bed(double x, double z, double A, double rho, double g, double s_0, double alpha, double H, double beta)