101 const bool has_contact = args.value(
"/contact/enabled"_json_pointer,
false);
102 const bool has_pressure = has_entries(args,
"/boundary_conditions/pressure_boundary"_json_pointer)
103 || has_entries(args,
"/boundary_conditions/pressure_cavity"_json_pointer);
104 const bool has_constraints =
105 has_entries(args,
"/constraints/hard"_json_pointer)
106 || has_entries(args,
"/constraints/soft"_json_pointer);
108 if (formulation ==
"Stokes")
109 return (!has_contact && !has_constraints) ? std::make_shared<StokesVarForm>() :
nullptr;
110 if (formulation ==
"NavierStokes")
111 return (!has_contact && !has_constraints) ? std::make_shared<NavierStokesVarForm>() :
nullptr;
112 if (formulation ==
"IncompressibleLinearElasticity")
113 return (!has_contact && !has_pressure && !has_constraints) ? std::make_shared<IncompressibleElasticVarForm>() :
nullptr;
114 if (formulation ==
"Bilaplacian")
115 return (!has_contact && !has_constraints) ? std::make_shared<BilaplacianVarForm>() :
nullptr;
117 if (!assembler->is_tensor())
118 return (!has_contact && !has_pressure && !has_constraints) ? std::make_shared<ScalarVarForm>() :
nullptr;
120 if (assembler->is_linear() && !has_contact && !has_pressure && !has_constraints)
121 return std::make_shared<LinearElasticVarForm>();
123 if (args.contains(
"time") && !args[
"time"].is_null())
124 return std::make_shared<NonlinearElasticTransientVarForm>();
126 return std::make_shared<NonlinearElasticStaticVarForm>();