132 const std::string &formulation,
134 const bool is_optimization)
136 if (args.value(
"/space/remesh/enabled"_json_pointer,
false))
139 const bool homogenization = args.contains(
"/constraints/macro_displacement_gradient"_json_pointer);
140 const bool has_contact = args.value(
"/contact/enabled"_json_pointer,
false);
141 const bool has_periodic_constraints =
142 has_non_empty_entries(args,
"/boundary_conditions/periodic"_json_pointer);
143 const bool periodic_contact = args.value(
"/contact/periodic"_json_pointer,
false);
144 if (periodic_contact)
150 if (!has_periodic_constraints)
154 if (homogenization && !is_optimization)
156 if (homogenization && args.contains(
"time") && !args[
"time"].is_null())
159 const bool has_pressure = has_non_empty_entries(args,
"/boundary_conditions/pressure_boundary"_json_pointer)
160 || has_non_empty_entries(args,
"/boundary_conditions/pressure_cavity"_json_pointer);
161 const bool has_file_constraints =
162 has_non_empty_entries(args,
"/constraints/hard"_json_pointer)
163 || has_non_empty_entries(args,
"/constraints/soft"_json_pointer);
164 const json zero_mean = args.contains(
"/constraints/zero_mean"_json_pointer)
165 ? args.at(
"/constraints/zero_mean"_json_pointer)
167 const bool has_zero_mean_constraints =
168 (zero_mean.is_boolean() && zero_mean.get<
bool>())
169 || (zero_mean.is_array() && !zero_mean.empty());
170 const bool has_constraints =
171 has_file_constraints || has_periodic_constraints || has_zero_mean_constraints;
173 if (formulation ==
"ThermoElasticity")
174 return !is_optimization && !has_pressure && !has_constraints;
176 if (formulation ==
"Stokes")
177 return !is_optimization && !has_contact && !has_constraints;
178 if (formulation ==
"NavierStokes")
179 return !is_optimization && !has_contact && !has_constraints;
180 if (formulation ==
"NavierStokesFSI")
181 return !is_optimization
182 && args.contains(
"time") && !args[
"time"].is_null()
183 && (!has_contact || has_two_mesh_fsi_material(args)) && !has_constraints;
184 if (formulation ==
"OperatorSplitting")
185 return !is_optimization
186 && args.contains(
"time") && !args[
"time"].is_null()
187 && !has_contact && !has_constraints;
188 if (formulation ==
"IncompressibleLinearElasticity")
189 return !is_optimization && !has_contact && !has_pressure && !has_constraints;
190 if (formulation ==
"Bilaplacian")
191 return !is_optimization && !has_contact && !has_constraints;
193 if (is_scalar_formulation(formulation))
195 return !homogenization && !has_contact && !has_pressure && !has_file_constraints;
198 return is_elastic_formulation(formulation);
202 const std::string &formulation,
204 const bool is_optimization)
206 if (!
supports(formulation, args, is_optimization))
209 if (formulation ==
"ThermoElasticity")
210 return std::make_shared<ThermoElasticVarForm>();
211 if (formulation ==
"Stokes")
212 return std::make_shared<StokesVarForm>();
213 if (formulation ==
"NavierStokes")
214 return std::make_shared<NavierStokesVarForm>();
215 if (formulation ==
"NavierStokesFSI")
216 return std::make_shared<NavierStokesFSIVarForm>();
217 if (formulation ==
"OperatorSplitting")
218 return std::make_shared<OperatorSplittingVarForm>();
219 if (formulation ==
"IncompressibleLinearElasticity")
220 return std::make_shared<IncompressibleElasticVarForm>();
221 if (formulation ==
"Bilaplacian")
222 return std::make_shared<BilaplacianVarForm>();
224 if (is_scalar_formulation(formulation))
225 return is_optimization
226 ? std::static_pointer_cast<VarForm>(std::make_shared<DifferentiableScalarVarForm>())
227 : std::make_shared<ScalarVarForm>();
229 const bool homogenization = args.contains(
"/constraints/macro_displacement_gradient"_json_pointer);
232 return std::make_shared<DifferentiableNonlinearElasticStaticVarForm>();
234 const bool has_contact = args.value(
"/contact/enabled"_json_pointer,
false);
235 const bool has_pressure = has_non_empty_entries(args,
"/boundary_conditions/pressure_boundary"_json_pointer)
236 || has_non_empty_entries(args,
"/boundary_conditions/pressure_cavity"_json_pointer);
237 const bool has_file_constraints =
238 has_non_empty_entries(args,
"/constraints/hard"_json_pointer)
239 || has_non_empty_entries(args,
"/constraints/soft"_json_pointer);
240 const bool has_periodic_constraints =
241 has_non_empty_entries(args,
"/boundary_conditions/periodic"_json_pointer);
242 const json zero_mean = args.contains(
"/constraints/zero_mean"_json_pointer)
243 ? args.at(
"/constraints/zero_mean"_json_pointer)
245 const bool has_zero_mean_constraints =
246 (zero_mean.is_boolean() && zero_mean.get<
bool>())
247 || (zero_mean.is_array() && !zero_mean.empty());
248 const bool has_constraints =
249 has_file_constraints || has_periodic_constraints || has_zero_mean_constraints;
251 if (is_linear_elastic_formulation(formulation)
252 && !has_contact && !has_pressure && !has_constraints)
254 return is_optimization
255 ? std::static_pointer_cast<VarForm>(std::make_shared<DifferentiableLinearElasticVarForm>())
256 : std::make_shared<LinearElasticVarForm>();
259 if (args.contains(
"time") && !args[
"time"].is_null())
261 return is_optimization
262 ? std::static_pointer_cast<VarForm>(std::make_shared<DifferentiableNonlinearElasticTransientVarForm>())
263 : std::make_shared<NonlinearElasticTransientVarForm>();
266 return is_optimization
267 ? std::static_pointer_cast<VarForm>(std::make_shared<DifferentiableNonlinearElasticStaticVarForm>())
268 : std::make_shared<NonlinearElasticStaticVarForm>();