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,
205 const bool is_optimization)
207 if (!
supports(formulation, args, is_optimization))
210 if (formulation ==
"ThermoElasticity")
211 return std::make_shared<ThermoElasticVarForm>(resources);
212 if (formulation ==
"Stokes")
213 return std::make_shared<StokesVarForm>(resources);
214 if (formulation ==
"NavierStokes")
215 return std::make_shared<NavierStokesVarForm>(resources);
216 if (formulation ==
"NavierStokesFSI")
217 return std::make_shared<NavierStokesFSIVarForm>(resources);
218 if (formulation ==
"OperatorSplitting")
219 return std::make_shared<OperatorSplittingVarForm>(resources);
220 if (formulation ==
"IncompressibleLinearElasticity")
221 return std::make_shared<IncompressibleElasticVarForm>(resources);
222 if (formulation ==
"Bilaplacian")
223 return std::make_shared<BilaplacianVarForm>(resources);
225 if (is_scalar_formulation(formulation))
226 return is_optimization
227 ? std::static_pointer_cast<VarForm>(std::make_shared<DifferentiableScalarVarForm>(resources))
228 : std::make_shared<ScalarVarForm>(resources);
230 const bool homogenization = args.contains(
"/constraints/macro_displacement_gradient"_json_pointer);
233 return std::make_shared<DifferentiableNonlinearElasticStaticVarForm>(resources);
235 const bool has_contact = args.value(
"/contact/enabled"_json_pointer,
false);
236 const bool has_pressure = has_non_empty_entries(args,
"/boundary_conditions/pressure_boundary"_json_pointer)
237 || has_non_empty_entries(args,
"/boundary_conditions/pressure_cavity"_json_pointer);
238 const bool has_file_constraints =
239 has_non_empty_entries(args,
"/constraints/hard"_json_pointer)
240 || has_non_empty_entries(args,
"/constraints/soft"_json_pointer);
241 const bool has_periodic_constraints =
242 has_non_empty_entries(args,
"/boundary_conditions/periodic"_json_pointer);
243 const json zero_mean = args.contains(
"/constraints/zero_mean"_json_pointer)
244 ? args.at(
"/constraints/zero_mean"_json_pointer)
246 const bool has_zero_mean_constraints =
247 (zero_mean.is_boolean() && zero_mean.get<
bool>())
248 || (zero_mean.is_array() && !zero_mean.empty());
249 const bool has_constraints =
250 has_file_constraints || has_periodic_constraints || has_zero_mean_constraints;
252 if (is_linear_elastic_formulation(formulation)
253 && !has_contact && !has_pressure && !has_constraints)
255 return is_optimization
256 ? std::static_pointer_cast<VarForm>(std::make_shared<DifferentiableLinearElasticVarForm>(resources))
257 : std::make_shared<LinearElasticVarForm>(resources);
260 if (args.contains(
"time") && !args[
"time"].is_null())
262 return is_optimization
263 ? std::static_pointer_cast<VarForm>(std::make_shared<DifferentiableNonlinearElasticTransientVarForm>(resources))
264 : std::make_shared<NonlinearElasticTransientVarForm>(resources);
267 return is_optimization
268 ? std::static_pointer_cast<VarForm>(std::make_shared<DifferentiableNonlinearElasticStaticVarForm>(resources))
269 : std::make_shared<NonlinearElasticStaticVarForm>(resources);