19#include "pism/rheology/FlowLaw.hh"
24#include "pism/util/EnthalpyConverter.hh"
25#include "pism/util/array/Scalar.hh"
26#include "pism/util/array/Array3D.hh"
28#include "pism/util/Config.hh"
29#include "pism/util/Grid.hh"
31#include "pism/util/error_handling.hh"
37 std::shared_ptr<EnthalpyConverter> ec)
45 auto standard_gravity = config.
get_number(
"constants.standard_gravity");
62 schoofLen = config.
get_number(
"flow_law.Schoof_regularizing_length",
"m"),
63 schoofVel = config.
get_number(
"flow_law.Schoof_regularizing_velocity",
"m second-1");
91 double pressure,
double grain_size)
const {
92 return this->
flow_impl(stress, enthalpy, pressure, grain_size);
96 double pressure,
double )
const {
97 return softness(enthalpy, pressure) * pow(stress,
m_n-1);
101 const double *pressure,
const double *grainsize,
102 unsigned int n,
double *result)
const {
103 this->
flow_n_impl(stress, enthalpy, pressure, grainsize,
n, result);
107 const double *pressure,
const double *grainsize,
108 unsigned int n,
double *result)
const {
109 for (
unsigned int k = 0;
k <
n; ++
k) {
110 result[
k] = this->
flow(stress[
k], enthalpy[
k], pressure[
k], grainsize[
k]);
124 unsigned int n,
double *result)
const {
129 unsigned int n,
double *result)
const {
130 for (
unsigned int k = 0;
k <
n; ++
k) {
131 result[
k] = this->
hardness(enthalpy[
k], pressure[
k]);
139 return std::numeric_limits<double>::max();
171 double *nu,
double *dnu)
const {
176 double *nu,
double *dnu)
const {
180 if (PetscLikely(nu != NULL)) {
184 if (PetscLikely(dnu != NULL)) {
194 const Grid &grid = *thickness.
grid();
200 for (
auto p : grid.points()) {
201 const int i = p.i(), j = p.j();
204 double H = thickness(i,j);
205 const double *enthColumn = enthalpy.
get_column(i, j);
207 grid.z().data(), enthColumn);
223 unsigned int kbelowH,
224 const double *zlevels,
225 const double *enthalpy) {
228 const auto &EC = *ice.
EC();
233 p0 = EC.pressure(thickness),
237 for (
unsigned int i = 1; i <= kbelowH; ++i) {
239 p1 = EC.pressure(thickness - zlevels[i]),
244 B += (zlevels[i] - zlevels[i-1]) * (
h0 + h1);
256 depth = thickness - zlevels[kbelowH],
257 p = EC.pressure(depth);
259 B += depth * ice.
hardness(enthalpy[kbelowH], p);
272 static const double gs[] = {1e-4, 1e-3, 1e-2, 1}, s=1e4, E=400000, p=1e6;
273 double ref = flow_law.
flow(s, E, p, gs[0]);
274 for (
int i=1; i<4; i++) {
275 if (flow_law.
flow(s, E, p, gs[i]) != ref) {
double get_number(const std::string &name, UseFlag flag=REMEMBER_THIS_USE) const
A class for storing and accessing PISM configuration flags and parameters.
Describes the PISM grid and the distribution of data across processors.
void failed()
Indicates a failure of a parallel section.
Makes sure that we call begin_access() and end_access() for all accessed array::Arrays.
double * get_column(int i, int j)
A virtual class collecting methods common to ice and bedrock 3D fields.
std::shared_ptr< const Grid > grid() const
void update_ghosts()
Updates ghost points.
double m_crit_temp
critical temperature (cold – warm transition)
double softness_paterson_budd(double T_pa) const
Return the softness parameter A(T) for a given temperature T.
double m_schoofReg
regularization parameter for
virtual double hardness_impl(double E, double p) const
double m_A_warm
Paterson-Budd softness, warm case.
double m_A_cold
Paterson-Budd softness, cold case.
double m_Q_cold
Activation energy, cold case.
double m_viscosity_power
; used to compute viscosity
FlowLaw(double exponent, const Config &config, std::shared_ptr< EnthalpyConverter > EC)
void flow_n(const double *stress, const double *E, const double *pressure, const double *grainsize, unsigned int n, double *result) const
std::shared_ptr< EnthalpyConverter > m_EC
virtual void hardness_n_impl(const double *enthalpy, const double *pressure, unsigned int n, double *result) const
void effective_viscosity(double hardness, double gamma, double *nu, double *dnu) const
Computes the regularized effective viscosity and its derivative with respect to the second invariant ...
void hardness_n(const double *enthalpy, const double *pressure, unsigned int n, double *result) const
double m_rho_g
ice density times acceleration due to gravity
double softness(double E, double p) const
virtual double softness_impl(double E, double p) const =0
double m_hardness_power
; used to compute hardness
double m_beta_CC_grad
Clausius-Clapeyron gradient.
double flow(double stress, double enthalpy, double pressure, double grain_size) const
The flow law itself.
double m_ideal_gas_constant
ideal gas constant
virtual double flow_impl(double stress, double E, double pressure, double grainsize) const
double m_Q_warm
Activation energy, warm case.
double m_n
power law exponent
double hardness(double E, double p) const
virtual void flow_n_impl(const double *stress, const double *E, const double *pressure, const double *grainsize, unsigned int n, double *result) const
std::shared_ptr< EnthalpyConverter > EC() const
#define PISM_ERROR_LOCATION
void averaged_hardness_vec(const FlowLaw &ice, const array::Scalar &thickness, const array::Array3D &enthalpy, array::Scalar &result)
double averaged_hardness(const FlowLaw &ice, double thickness, unsigned int kbelowH, const double *zlevels, const double *enthalpy)
Computes vertical average of B(E, p) ice hardness, namely .
bool FlowLawUsesGrainSize(const FlowLaw &flow_law)