21 "Ice sheet driver for PISM ice sheet simulations, initialized from data.\n"
22 "The basic PISM executable for evolution runs.\n";
27#include "pism/icemodel/IceModel.hh"
28#include "pism/icemodel/IceEISModel.hh"
29#include "pism/verification/iceCompModel.hh"
30#include "pism/util/Config.hh"
31#include "pism/util/Grid.hh"
33#include "pism/util/Context.hh"
34#include "pism/util/Profiling.hh"
35#include "pism/util/error_handling.hh"
36#include "pism/util/petscwrappers/PetscInitializer.hh"
37#include "pism/util/pism_options.hh"
38#include "pism/util/EnthalpyConverter.hh"
40#include "pism/regional/IceRegionalModel.hh"
50 config.
set_string(
"grid.registration",
"corner");
51 config.
set_string(
"stress_balance.sia.flow_law",
"pb");
56 config.
set_number(
"sea_level.constant.value", -1e4);
59 config.
set_number(
"stress_balance.sia.enhancement_factor", 1.0);
62 config.
set_number(
"stress_balance.sia.bed_smoother.range", 0.0);
65 config.
set_flag(
"geometry.update.use_basal_melt_rate",
false);
71 config.
set_number(
"energy.bedrock_thermal.density",
73 config.
set_number(
"energy.bedrock_thermal.conductivity",
74 config.
get_number(
"constants.ice.thermal_conductivity"));
75 config.
set_number(
"energy.bedrock_thermal.specific_heat_capacity",
76 config.
get_number(
"constants.ice.specific_heat_capacity"));
79 config.
set_string(
"stress_balance.model",
"sia");
86std::shared_ptr<Context>
context(MPI_Comm com,
const std::string &prefix) {
88 auto sys = std::make_shared<units::System>();
96 config->set_string(
"grid.periodicity",
"none");
97 config->set_string(
"grid.registration",
"corner");
100 config->resolve_filenames();
104 auto time = std::make_shared<Time>(com, config, *logger, sys);
106 auto EC = std::make_shared<ColdEnthalpyConverter>(*config);
108 return std::make_shared<Context>(com, sys, config, EC, time, logger, prefix);
86std::shared_ptr<Context>
context(MPI_Comm com,
const std::string &prefix) {
…}
114 int Mx = 61, My = 61;
115 double Lx = 1e3, Ly = 1e3;
125 double Lz = config->get_number(
"grid.Lz");
126 unsigned int Mz = config->get_number(
"grid.Mz");
155 config->set_number(
"grid.Mbz", 2);
156 config->set_number(
"grid.Lbz", 1000);
176std::shared_ptr<Grid>
grid(std::shared_ptr<Context> ctx,
char testname) {
177 auto config = ctx->config();
179 auto input_file_name = config->get_string(
"input.file");
181 if (config->get_flag(
"input.bootstrap")) {
185 if (not input_file_name.empty()) {
191 return Grid::FromFile(ctx, input_file, {
"enthalpy",
"temp" }, r);
197 P.horizontal_size_and_extent_from_options(*config);
198 P.vertical_grid_from_options(*config);
199 P.ownership_ranges_from_options(*config, ctx->size());
201 return std::make_shared<Grid>(ctx, P);
176std::shared_ptr<Grid>
grid(std::shared_ptr<Context> ctx,
char testname) {
…}
205int main(
int argc,
char *argv[]) {
207 MPI_Comm com = MPI_COMM_WORLD;
210 com = PETSC_COMM_WORLD;
216 "EISMINT II experiment name",
217 "A,B,C,D,E,F,I,J,K,L",
"A");
219 auto verification_test =
220 options::Keyword(
"-test",
"Specifies PISM verification test",
"A,B,C,D,F,G,H,K,L,V",
"A");
222 if (eisII.is_set() and verification_test.is_set()) {
226 std::shared_ptr<Context> ctx;
227 if (verification_test.is_set()) {
236 std::vector<std::string> required_options{};
237 if (eisII.is_set()) {
245 ctx->unit_system()));
246 overrides->init(*ctx->log());
247 config->import_from(*overrides);
250 config->resolve_filenames();
251 }
else if (not verification_test.is_set()) {
252 required_options.emplace_back(
"-i");
258 " pism -i IN.nc [-bootstrap] [-regional] [OTHER PISM & PETSc OPTIONS]\n"
260 " -i IN.nc is input file in NetCDF format: contains PISM-written model state\n"
261 " -bootstrap enable heuristics to produce an initial state from an incomplete input\n"
262 " -regional enable \"regional mode\"\n"
263 " -eisII [experiment] enable EISMINT II mode\n"
264 " -test [verification_test] enable verification mode\n"
266 " * option -i is required\n"
267 " * if -bootstrap is used then also '-Mx A -My B -Mz C -Lz D' are required\n";
270 required_options, usage);
277 "Save detailed profiling data to a file.");
279 if (profiling_log.
is_set()) {
280 ctx->profiling().start();
283 std::shared_ptr<Grid> grid;
284 std::shared_ptr<IceModel> model;
285 std::shared_ptr<IceCompModel> verification_model;
287 if (verification_test.is_set()) {
288 char test = verification_test.value()[0];
291 verification_model = std::make_shared<IceCompModel>(grid, ctx, test);
292 model = verification_model;
296 if (
options::Bool(
"-regional",
"enable regional (outlet glacier) mode")) {
297 model = std::make_shared<IceRegionalModel>(grid, ctx);
298 }
else if (eisII.is_set()) {
299 char experiment = eisII.value()[0];
301 model = std::make_shared<IceEISModel>(grid, ctx, experiment);
303 model = std::make_shared<IceModel>(grid, ctx);
310 "List available diagnostic quantities and stop.",
311 "all,spatial,scalar,json",
314 if (list_type.is_set()) {
315 model->list_diagnostics(list_type);
317 auto termination_reason = model->run();
319 switch (termination_reason) {
322 exit_code =
static_cast<int>(config->get_number(
"output.checkpoint.exit_code"));
323 log->message(2,
"... stopping (exit_code=%d) after saving the checkpoint file\n",
334 log->message(2,
"... done with the run\n");
335 model->save_results();
338 if (verification_model and
339 not
options::Bool(
"-no_report",
"do not print the error report")) {
340 verification_model->reportErrors();
348 if (profiling_log.
is_set()) {
349 ctx->profiling().report(profiling_log);
std::shared_ptr< Config > Ptr
void set_string(const std::string &name, const std::string &value, ConfigSettingFlag flag=CONFIG_FORCE)
double get_number(const std::string &name, UseFlag flag=REMEMBER_THIS_USE) const
void set_flag(const std::string &name, bool value, ConfigSettingFlag flag=CONFIG_FORCE)
void set_number(const std::string &name, double value, ConfigSettingFlag flag=CONFIG_FORCE)
A class for storing and accessing PISM configuration flags and parameters.
std::shared_ptr< DefaultConfig > Ptr
Default PISM configuration database: uses NetCDF files; can be initialized from a file specified usin...
High-level PISM I/O class.
static std::shared_ptr< Grid > FromFile(std::shared_ptr< const Context > ctx, const File &file, const std::vector< std::string > &var_names, grid::Registration r)
Create a grid using one of variables in var_names in file.
static std::shared_ptr< Grid > FromOptions(std::shared_ptr< const Context > ctx)
Create a grid using command-line options and (possibly) an input file.
std::shared_ptr< Logger > Ptr
static RuntimeError formatted(const ErrorLocation &location, const char format[],...) __attribute__((format(printf
build a RuntimeError with a formatted message
Periodicity periodicity
Grid periodicity.
std::vector< double > z
Vertical levels.
Registration registration
Grid registration.
double Ly
Domain half-width in the Y direction.
double Lx
Domain half-width in the X direction.
unsigned int My
Number of grid points in the Y direction.
Grid parameters; used to collect defaults before an Grid is allocated.
#define PISM_ERROR_LOCATION
static void set_config_defaults(Config &config)
Registration string_to_registration(const std::string &keyword)
std::vector< double > compute_vertical_levels(double new_Lz, size_t new_Mz, grid::VerticalSpacing spacing, double lambda)
Set the vertical levels in the ice according to values in Mz (number of levels), Lz (domain height),...
@ PISM_READONLY
open an existing file for reading only
bool Bool(const std::string &option, const std::string &description)
std::shared_ptr< Context > context_from_options(MPI_Comm com, const std::string &prefix, bool print)
Create a default context using options.
Logger::Ptr logger_from_options(MPI_Comm com)
Config::Ptr config_from_options(MPI_Comm com, const Logger &log, units::System::Ptr unit_system)
Create a configuration database using command-line options.
void handle_fatal_errors(MPI_Comm com)
void set_config_from_options(units::System::Ptr unit_system, Config &config)
Set configuration parameters using command-line options.
bool show_usage_check_req_opts(const Logger &log, const std::string &execname, const std::vector< std::string > &required_options, const std::string &usage)
In a single call a driver program can provide a usage string to the user and check if required option...
void print_unused_parameters(const Logger &log, int verbosity_threshhold, const Config &config)
Report unused configuration parameters to stdout.
void print_config(const Logger &log, int verbosity_threshhold, const Config &config)
Report configuration parameters to stdout.
std::shared_ptr< Context > context(MPI_Comm com, const std::string &prefix)
Allocate the verification mode context. Uses ColdEnthalpyConverter.
std::shared_ptr< Grid > grid(std::shared_ptr< Context > ctx, char testname)
grid::Parameters grid_defaults(Config::Ptr config, char testname)
int main(int argc, char *argv[])