91 const std::string &formulation,
93 const bool is_optimization)
95 if (args.value(
"/space/remesh/enabled"_json_pointer,
false))
98 const bool homogenization = args.contains(
"/constraints/macro_displacement_gradient"_json_pointer);
99 const bool has_contact = args.value(
"/contact/enabled"_json_pointer,
false);
100 const bool has_periodic_constraints =
101 has_non_empty_entries(args,
"/boundary_conditions/periodic"_json_pointer);
102 const bool periodic_contact = args.value(
"/contact/periodic"_json_pointer,
false);
103 if (periodic_contact)
109 if (!has_periodic_constraints)
113 if (homogenization && !is_elastic_formulation(formulation))
115 if (homogenization && args.contains(
"time") && !args[
"time"].is_null())
117 if (is_optimization || !args.value(
"/time/quasistatic"_json_pointer,
false))
121 const bool has_file_constraints =
122 has_non_empty_entries(args,
"/constraints/hard"_json_pointer)
123 || has_non_empty_entries(args,
"/constraints/soft"_json_pointer);
124 const json zero_mean = args.contains(
"/constraints/zero_mean"_json_pointer)
125 ? args.at(
"/constraints/zero_mean"_json_pointer)
127 const bool has_zero_mean_constraints =
128 (zero_mean.is_boolean() && zero_mean.get<
bool>())
129 || (zero_mean.is_array() && !zero_mean.empty());
130 const bool has_constraints =
131 has_file_constraints || has_periodic_constraints || has_zero_mean_constraints;
133 if (formulation ==
"ThermoElasticity")
134 return !is_optimization && !has_constraints;
136 if (formulation ==
"Stokes")
137 return !is_optimization && !has_contact && !has_constraints;
138 if (formulation ==
"NavierStokes")
139 return !is_optimization && !has_contact && !has_constraints;
140 if (formulation ==
"NavierStokesFSI")
141 return !is_optimization
142 && args.contains(
"time") && !args[
"time"].is_null()
143 && (!has_contact || has_two_mesh_fsi_material(args)) && !has_constraints;
144 if (formulation ==
"OperatorSplitting")
145 return !is_optimization
146 && args.contains(
"time") && !args[
"time"].is_null()
147 && !has_contact && !has_constraints;
148 if (formulation ==
"IncompressibleLinearElasticity")
149 return !is_optimization && !has_contact && !has_constraints;
150 if (formulation ==
"Bilaplacian")
151 return !is_optimization && !has_contact && !has_constraints;
153 if (is_scalar_formulation(formulation))
155 return !homogenization && !has_contact && !has_file_constraints;
158 return is_elastic_formulation(formulation);
162 const std::string &formulation,
165 const bool is_optimization)
167 if (!
supports(formulation, args, is_optimization))
170 if (formulation ==
"ThermoElasticity")
171 return std::make_shared<ThermoElasticVarForm>(resources);
172 if (formulation ==
"Stokes")
173 return std::make_shared<StokesVarForm>(resources);
174 if (formulation ==
"NavierStokes")
175 return std::make_shared<NavierStokesVarForm>(resources);
176 if (formulation ==
"NavierStokesFSI")
177 return std::make_shared<NavierStokesFSIVarForm>(resources);
178 if (formulation ==
"OperatorSplitting")
179 return std::make_shared<OperatorSplittingVarForm>(resources);
180 if (formulation ==
"IncompressibleLinearElasticity")
181 return std::make_shared<IncompressibleElasticVarForm>(resources);
182 if (formulation ==
"Bilaplacian")
183 return std::make_shared<BilaplacianVarForm>(resources);
185 if (is_scalar_formulation(formulation))
186 return is_optimization
187 ? std::static_pointer_cast<VarForm>(std::make_shared<DifferentiableScalarVarForm>(resources))
188 : std::make_shared<ScalarVarForm>(resources);
190 const bool homogenization = args.contains(
"/constraints/macro_displacement_gradient"_json_pointer);
194 if (args.contains(
"time") && !args[
"time"].is_null())
195 return std::make_shared<NonlinearElasticTransientVarForm>(resources);
196 return is_optimization
197 ? std::static_pointer_cast<VarForm>(std::make_shared<DifferentiableNonlinearElasticStaticVarForm>(resources))
198 : std::make_shared<NonlinearElasticStaticVarForm>(resources);
201 const bool has_contact = args.value(
"/contact/enabled"_json_pointer,
false);
202 const bool has_pressure = has_non_empty_entries(args,
"/boundary_conditions/pressure_boundary"_json_pointer)
203 || has_non_empty_entries(args,
"/boundary_conditions/pressure_cavity"_json_pointer);
204 const bool has_file_constraints =
205 has_non_empty_entries(args,
"/constraints/hard"_json_pointer)
206 || has_non_empty_entries(args,
"/constraints/soft"_json_pointer);
207 const bool has_periodic_constraints =
208 has_non_empty_entries(args,
"/boundary_conditions/periodic"_json_pointer);
209 const json zero_mean = args.contains(
"/constraints/zero_mean"_json_pointer)
210 ? args.at(
"/constraints/zero_mean"_json_pointer)
212 const bool has_zero_mean_constraints =
213 (zero_mean.is_boolean() && zero_mean.get<
bool>())
214 || (zero_mean.is_array() && !zero_mean.empty());
215 const bool has_constraints =
216 has_file_constraints || has_periodic_constraints || has_zero_mean_constraints;
218 if (is_linear_elastic_formulation(formulation)
219 && !has_contact && !has_pressure && !has_constraints)
221 return is_optimization
222 ? std::static_pointer_cast<VarForm>(std::make_shared<DifferentiableLinearElasticVarForm>(resources))
223 : std::make_shared<LinearElasticVarForm>(resources);
226 if (args.contains(
"time") && !args[
"time"].is_null())
228 return is_optimization
229 ? std::static_pointer_cast<VarForm>(std::make_shared<DifferentiableNonlinearElasticTransientVarForm>(resources))
230 : std::make_shared<NonlinearElasticTransientVarForm>(resources);
233 return is_optimization
234 ? std::static_pointer_cast<VarForm>(std::make_shared<DifferentiableNonlinearElasticStaticVarForm>(resources))
235 : std::make_shared<NonlinearElasticStaticVarForm>(resources);