39std::shared_ptr<StressBalance>
create(
const std::string &model,
40 std::shared_ptr<const Grid> grid,
43 auto config = grid->ctx()->config();
45 if (model ==
"blatter") {
46 int Mz = config->get_number(
"stress_balance.blatter.Mz");
47 int C = config->get_number(
"stress_balance.blatter.coarsening_factor");
49 auto blatter = std::make_shared<Blatter>(grid, Mz, C);
50 auto mod = std::make_shared<BlatterMod>(blatter);
52 return std::make_shared<StressBalance>(grid, blatter, mod);
55 auto ssa_method = config->get_string(
"stress_balance.ssa.method");
56 std::shared_ptr<ShallowStressBalance> sliding;
57 if (
member(model, {
"none",
"sia"})) {
58 sliding = std::make_shared<ZeroSliding>(grid);
59 }
else if (
member(model, {
"prescribed_sliding",
"prescribed_sliding+sia"})) {
60 sliding = std::make_shared<PrescribedSliding>(grid);
61 }
else if (
member(model, {
"weertman_sliding",
"weertman_sliding+sia"})) {
62 sliding = std::make_shared<WeertmanSliding>(grid);
63 }
else if (
member(model, {
"ssa",
"ssa+sia"})) {
64 if (ssa_method ==
"fd") {
65 sliding = std::make_shared<SSAFD>(grid, regional);
66 }
else if (ssa_method ==
"fd_snes") {
67 sliding = std::make_shared<SSAFD_SNES>(grid, regional);
69 sliding = std::make_shared<SSAFEM>(grid);
73 "invalid stress balance model: %s", model.c_str());
76 std::shared_ptr<SSB_Modifier> modifier;
77 if (
member(model, {
"none",
"ssa",
"prescribed_sliding",
"weertman_sliding"})) {
78 modifier = std::make_shared<ConstantInColumn>(grid);
79 }
else if (
member(model, {
"prescribed_sliding+sia",
"weertman_sliding+sia",
"ssa+sia",
"sia"})) {
81 modifier = std::make_shared<SIAFD_Regional>(grid);
83 modifier = std::make_shared<SIAFD>(grid);
87 "invalid stress balance model: %s", model.c_str());
90 return std::make_shared<StressBalance>(grid, sliding, modifier);