19using namespace std::string_literals;
26template <
short_t d,
typename T>
29 static_assert(d >= 1 && d <= 3,
"Spatial dimension must be between 1 and 3");
39 gismo::gsBoundaryConditions<T>
bc_;
46 std::array<gismo::gsFunctionExpr<T>, 2 * d>
bcFunc_;
49 std::array<gismo::condition_type::type, 2 * d>
bcType_;
64 assembler.options().setInt(
"MaterialLaw", gismo::material_law::hooke);
65 assembler.options().setInt(
"DirichletStrategy", gismo::dirichlet::elimination);
71 typename gismo::gsSparseSolver<T>::CGDiagonal solver(assembler.matrix());
72 gismo::gsMatrix<T> solution(solver.solve(assembler.rhs()));
75 assembler.constructSolution(solution, assembler.allFixedDofs(),
85 const std::array<int64_t, d> ncoeffs,
86 const std::array<int64_t, d> npatches,
87 const std::array<T, d> dimensions)
93 for (
const auto &
side : GismoBoundarySides<d>) {
94 bcType_[
side - 1] = gismo::condition_type::unknownType;
95 bcFunc_[
side - 1] = gismo::give(gismo::gsFunctionExpr<T>(
"0",
"0",
"0", 3));
99 bc_.addCondition(0, gismo::boundary::west, gismo::condition_type::dirichlet,
101 bc_.addCondition(0, gismo::boundary::west, gismo::condition_type::dirichlet,
103 bc_.addCondition(0, gismo::boundary::west, gismo::condition_type::dirichlet,
106 bc_.addCondition(0, gismo::boundary::east, gismo::condition_type::neumann,
121 return "GismoLinearElasticity" + std::to_string(d) +
"d";
126 return "G+Smo linear elasticity model in " + std::to_string(d) +
141 "name" : "Displacement",
142 "description" : "Displament magnitude",
144 "name" : "Displacement_x",
145 "description" : "Displacement x-component",
147 "name" : "Displacement_y",
148 "description" : "Displacement x-component",
150 "name" : "Displacement_z",
151 "description" : "Displacement z-component",
155 json.push_back(output);
163 auto json = nlohmann::json::array();
167 auto add_json = [&json, &uiid]<
typename Type,
typename Value>(
168 const std::string &name,
const std::string &label,
169 const std::string &group,
170 const std::string &description,
const Type &type,
171 const Value &value) {
174 item[
"label"] = label;
175 item[
"description"] = description;
176 item[
"group"] = group;
178 item[
"value"] = value;
179 item[
"default"] = value;
180 item[
"uuid"] = uiid++;
181 json.push_back(item);
185 auto add_json_default =
186 [&json, &uiid]<
typename Type,
typename Value,
typename DefaultValue>(
187 const std::string &name,
const std::string &label,
188 const std::string &group,
const std::string &description,
189 const Type &type,
const Value &value,
190 const DefaultValue &defaultValue) {
193 item[
"label"] = label;
194 item[
"description"] = description;
195 item[
"group"] = group;
197 item[
"value"] = value;
198 item[
"default"] = defaultValue;
199 item[
"uuid"] = uiid++;
200 json.push_back(item);
203 add_json(
"YoungModulus",
"Young",
"",
"Young's modulus",
"float",
205 add_json(
"PoissonRatio",
"Poisson",
"",
"Poisson's ratio",
"float",
219 const std::string &component,
220 const std::string &attribute,
221 const nlohmann::json &json)
override {
223 nlohmann::json result = R
"({})"_json;
225 if (attribute ==
"YoungModulus") {
226 if (!json.contains(
"data"))
228 if (!json[
"data"].contains(
"YoungModulus"))
234 else if (attribute ==
"PoissonRatio") {
235 if (!json.contains(
"data"))
237 if (!json[
"data"].contains(
"PoissonRatio"))
253 nlohmann::json
eval(
const std::string &patch,
const std::string &component,
254 const nlohmann::json &json)
const override {
259 patchIndex = stoi(patch);
262 return R
"({ INVALID REQUEST })"_json;
265 if (component ==
"Displacement" ||
266 component ==
"Displacement_x" ||
267 component ==
"Displacement_y" ||
268 component ==
"Displacement_z") {
270 nlohmann::json result;
273 result[
"degrees"] = nlohmann::json::array();
275 for (std::size_t i = 0; i <
Base::solution_.patch(patchIndex).parDim(); ++i)
279 result[
"ncoeffs"] = nlohmann::json::array();
282 dynamic_cast<const gismo::gsBSpline<T> *
>(&
Base::solution_.patch(patchIndex)))
283 for (std::size_t i = 0; i < bspline->parDim(); ++i)
284 result[
"ncoeffs"].push_back(bspline->basis().size(i));
285 else if (
auto bspline =
dynamic_cast<const gismo::gsTensorBSpline<d, T> *
>(
287 for (std::size_t i = 0; i < bspline->parDim(); ++i)
288 result[
"ncoeffs"].push_back(bspline->basis().size(i));
290 return R
"({ INVALID REQUEST })"_json;
293 result[
"nknots"] = nlohmann::json::array();
296 dynamic_cast<const gismo::gsBSpline<T> *
>(&
Base::solution_.patch(patchIndex)))
297 for (std::size_t i = 0; i < bspline->parDim(); ++i)
298 result[
"nknots"].push_back(bspline->knots(i).size());
299 else if (
auto bspline =
dynamic_cast<const gismo::gsTensorBSpline<d, T> *
>(
301 for (std::size_t i = 0; i < bspline->parDim(); ++i)
302 result[
"nknots"].push_back(bspline->knots(i).size());
304 return R
"({ INVALID REQUEST })"_json;
307 result[
"knots"] = nlohmann::json::array();
310 dynamic_cast<const gismo::gsBSpline<T> *
>(&
Base::solution_.patch(patchIndex)))
311 for (std::size_t i = 0; i < bspline->parDim(); ++i)
312 result[
"knots"].push_back(bspline->knots(i));
313 else if (
auto bspline =
dynamic_cast<const gismo::gsTensorBSpline<d, T> *
>(
315 for (std::size_t i = 0; i < bspline->parDim(); ++i)
316 result[
"knots"].push_back(bspline->knots(i));
318 return R
"({ INVALID REQUEST })"_json;
321 gismo::gsMatrix<T> coeffs;
322 if (component ==
"Displacement") {
324 }
else if (component ==
"Displacement_x") {
326 }
else if (component ==
"Displacement_y") {
328 }
else if (component ==
"Displacement_z") {
341 void elevate(
const nlohmann::json &json = NULL)
override {
343 bool geometry =
true;
345 if (json.contains(
"data"))
346 if (json[
"data"].contains(
"num"))
347 geometry = json[
"data"][
"geometry"].get<
bool>();
357 int num(1), dim(-1), patchIndex(-1);
359 if (json.contains(
"data")) {
360 if (json[
"data"].contains(
"num"))
361 num = json[
"data"][
"num"].get<
int>();
363 if (json[
"data"].contains(
"dim"))
364 dim = json[
"data"][
"dim"].get<int>();
366 if (json[
"data"].contains(
"patch"))
367 patchIndex = json[
"data"][
"patch"].get<int>();
371 if (patchIndex == -1)
372 basis_.degreeElevate(num, dim);
374 basis_.basis(patchIndex).degreeElevate(num, dim);
381 void increase(
const nlohmann::json &json = NULL)
override {
383 bool geometry =
true;
385 if (json.contains(
"data"))
386 if (json[
"data"].contains(
"num"))
387 geometry = json[
"data"][
"geometry"].get<
bool>();
397 int num(1), dim(-1), patchIndex(-1);
399 if (json.contains(
"data")) {
400 if (json[
"data"].contains(
"num"))
401 num = json[
"data"][
"num"].get<
int>();
403 if (json[
"data"].contains(
"dim"))
404 dim = json[
"data"][
"dim"].get<int>();
406 if (json[
"data"].contains(
"patch"))
407 patchIndex = json[
"data"][
"patch"].get<int>();
411 if (patchIndex == -1)
412 basis_.degreeIncrease(num, dim);
414 basis_.basis(patchIndex).degreeIncrease(num, dim);
421 void refine(
const nlohmann::json &json = NULL)
override {
423 bool geometry =
true;
425 if (json.contains(
"data"))
426 if (json[
"data"].contains(
"num"))
427 geometry = json[
"data"][
"geometry"].get<
bool>();
437 int num(1), dim(-1), patchIndex(-1);
439 if (json.contains(
"data")) {
440 if (json[
"data"].contains(
"num"))
441 num = json[
"data"][
"num"].get<
int>();
443 if (json[
"data"].contains(
"dim"))
444 dim = json[
"data"][
"dim"].get<int>();
446 if (json[
"data"].contains(
"patch"))
447 patchIndex = json[
"data"][
"patch"].get<int>();
451 if (patchIndex == -1)
452 basis_.uniformRefine(num, 1, dim);
454 basis_.basis(patchIndex).uniformRefine(num, 1, dim);
461 void addPatch(
const nlohmann::json &json = NULL)
override {
469 throw std::runtime_error(
"Adding patches is not yet implemented in G+Smo");
477 const nlohmann::json &json = NULL)
override {
487 if (json.contains(
"data")) {
488 if (json[
"data"].contains(
"patch"))
489 patchIndex = json[
"data"][
"patch"].get<
int>();
virtual void addPatch(const nlohmann::json &json)=0
Adds a patch to a model.
virtual void elevate(const nlohmann::json &json)=0
Elevates the model's degrees, preserves smoothness.
virtual nlohmann::json eval(const std::string &patch, const std::string &component, const nlohmann::json &json) const =0
Evaluates model.
virtual nlohmann::json getOutputs() const =0
Returns the model's outputs.
virtual nlohmann::json getOptions() const =0
Returns the model's options.
virtual nlohmann::json updateAttribute(const std::string &patch, const std::string &component, const std::string &attribute, const nlohmann::json &json)
Updates the attributes of the model.
Definition model.hpp:297
virtual void increase(const nlohmann::json &json)=0
Increases the model's degrees, preserves multiplicity.
virtual void refine(const nlohmann::json &json)=0
Refines model.
virtual void removePatch(const std::string &patch, const nlohmann::json &json)=0
Adds a patch to a model.
gismo::gsMultiPatch< T > geo_
Multi-patch geometry.
Definition GismoGeometryModel.hpp:39
G+Smo Linear elasticity model.
Definition GismoLinearElasticityModel.hpp:27
void refine(const nlohmann::json &json=NULL) override
Refines the model.
Definition GismoLinearElasticityModel.hpp:421
nlohmann::json getParameters() const override
Returns the model's parameters.
Definition GismoLinearElasticityModel.hpp:161
void solve()
Solve the Linear elasticity problem.
Definition GismoLinearElasticityModel.hpp:58
std::array< gismo::condition_type::type, 2 *d > bcType_
Boundary condition type.
Definition GismoLinearElasticityModel.hpp:49
std::array< gismo::gsFunctionExpr< T >, 2 *d > bcFunc_
Boundary condition values.
Definition GismoLinearElasticityModel.hpp:46
gismo::gsFunctionExpr< T > loadFunc_
Definition GismoLinearElasticityModel.hpp:43
GismoLinearElasticityModel(const std::array< short_t, d > degrees, const std::array< int64_t, d > ncoeffs, const std::array< int64_t, d > npatches, const std::array< T, d > dimensions)
Constructor for equidistant knot vectors.
Definition GismoLinearElasticityModel.hpp:84
nlohmann::json updateAttribute(const std::string &patch, const std::string &component, const std::string &attribute, const nlohmann::json &json) override
Updates the attributes of the model.
Definition GismoLinearElasticityModel.hpp:218
std::string getDescription() const override
Returns the model's description.
Definition GismoLinearElasticityModel.hpp:125
gismo::gsBoundaryConditions< T > bc_
Boundary conditions.
Definition GismoLinearElasticityModel.hpp:39
gismo::gsMultiBasis< T > basis_
Multi-patch basis.
Definition GismoLinearElasticityModel.hpp:36
void increase(const nlohmann::json &json=NULL) override
Increases the model's degrees, preserves multiplicity.
Definition GismoLinearElasticityModel.hpp:381
T YoungsModulus_
Young's modulus.
Definition GismoLinearElasticityModel.hpp:52
nlohmann::json getOutputs() const override
Returns the model's outputs.
Definition GismoLinearElasticityModel.hpp:139
nlohmann::json eval(const std::string &patch, const std::string &component, const nlohmann::json &json) const override
Evaluates the model.
Definition GismoLinearElasticityModel.hpp:253
void addPatch(const nlohmann::json &json=NULL) override
Add new patch to the model.
Definition GismoLinearElasticityModel.hpp:461
std::string getName() const override
Returns the model's name.
Definition GismoLinearElasticityModel.hpp:120
T PoissonsRatio_
Poisson's ratio.
Definition GismoLinearElasticityModel.hpp:55
void removePatch(const std::string &patch, const nlohmann::json &json=NULL) override
Remove existing patch from the model.
Definition GismoLinearElasticityModel.hpp:476
nlohmann::json getOptions() const override
Returns the model's options.
Definition GismoLinearElasticityModel.hpp:131
GismoLinearElasticityModel()=delete
Default constructor.
~GismoLinearElasticityModel()
Destructor.
Definition GismoLinearElasticityModel.hpp:117
void elevate(const nlohmann::json &json=NULL) override
Elevates the model's degrees, preserves smoothness.
Definition GismoLinearElasticityModel.hpp:341
gismo::gsFunctionExpr< T > rhsFunc_
Right-hand side function.
Definition GismoLinearElasticityModel.hpp:42
G+Smo PDE model.
Definition GismoPdeModel.hpp:58
gismo::gsMultiPatch< T > solution_
Solution.
Definition GismoPdeModel.hpp:190
auto to_json(const torch::TensorAccessor< T, N > &accessor)
Converts a torch::TensorAccessor object to a JSON object.
Definition serialize.hpp:41
degree
Enumerator for specifying the degree of B-splines.
Definition BSplineModel.hpp:23
Definition boundary.hpp:22
side
Identifiers for topological sides.
Definition boundary.hpp:25
InvalidModelAttribute exception.
Definition model.hpp:42