33template <
class Spline>
59 if constexpr (Spline::parDim() == 1)
61 [](
const std::array<typename Spline::value_type, 1>
xi) {
62 return std::array<
typename Spline::value_type, Spline::geoDim()>{
63 static_cast<iganet::real_t
>(std::sin(
M_PI *
xi[0])), 0.0, 0.0};
66 else if constexpr (Spline::parDim() == 2)
68 [](
const std::array<typename Spline::value_type, 2>
xi) {
69 return std::array<
typename Spline::value_type, Spline::geoDim()>{
70 static_cast<iganet::real_t
>(std::sin(
M_PI *
xi[0]) *
75 else if constexpr (Spline::parDim() == 3)
77 [](
const std::array<typename Spline::value_type, 3>
xi) {
78 return std::array<
typename Spline::value_type, Spline::geoDim()>{
79 static_cast<iganet::real_t
>(std::sin(
M_PI *
xi[0]) *
91 if constexpr (Spline::parDim() == 1)
92 return "BSplineCurve";
93 else if constexpr (Spline::parDim() == 2)
94 return "BSplineSurface";
95 else if constexpr (Spline::parDim() == 3)
96 return "BSplineVolume";
97 else if constexpr (Spline::parDim() == 4)
98 return "BSplineHyperVolume";
100 return "invalidName";
105 if constexpr (Spline::parDim() == 1)
106 return "B-spline curve";
107 else if constexpr (Spline::parDim() == 2)
108 return "B-spline surface";
109 else if constexpr (Spline::parDim() == 3)
110 return "B-spline volume";
111 else if constexpr (Spline::parDim() == 4)
112 return "B-spline hypervolume";
114 return "invalidDescription";
119 if constexpr (Spline::parDim() == 1)
122 "label" : "Spline degree",
123 "description" : "Spline degree",
125 "value" : ["constant", "linear", "quadratic", "cubic", "quartic", "quintic"],
129 "label" : "Number of coefficients",
130 "description" : "Number of coefficients",
136 "label" : "Initialization of the coefficients",
137 "description" : "Initialization of the coefficients",
139 "value" : ["zeros", "ones", "linear", "random", "greville"],
142 "name" : "nonuniform",
143 "label" : "Create non-uniform knot vector",
144 "description" : "Create non-uniform knot vector",
146 "value" : ["false", "true"],
150 else if constexpr (Spline::parDim() == 2)
153 "label" : "Spline degrees",
154 "description" : "Spline degrees per parametric dimension",
156 "value" : ["constant", "linear", "quadratic", "cubic", "quartic", "quintic"],
160 "label" : "Number of coefficients",
161 "description" : "Number of coefficients per parametric dimension",
162 "type" : ["int","int"],
167 "label" : "Initialization of the coefficients",
168 "description" : "Initialization of the coefficients",
170 "value" : ["zeros", "ones", "linear", "random", "greville"],
173 "name" : "nonuniform",
174 "label" : "Create non-uniform knot vectors",
175 "description" : "Create non-uniform knot vectors",
177 "value" : ["false", "true"],
181 else if constexpr (Spline::parDim() == 3)
184 "label" : "Spline degrees",
185 "description" : "Spline degrees per parametric dimension",
187 "value" : ["constant", "linear", "quadratic", "cubic", "quartic", "quintic"],
191 "label" : "Number of coefficients",
192 "description" : "Number of coefficients per parametric dimension",
193 "type" : ["int","int","int"],
198 "label" : "Initialization of the coefficients",
199 "description" : "Initialization of the coefficients",
201 "value" : ["zeros", "ones", "linear", "random", "greville"],
204 "name" : "nonuniform",
205 "label" : "Create non-uniform knot vectors",
206 "description" : "Create non-uniform knot vectors",
208 "value" : ["false", "true"],
212 else if constexpr (Spline::parDim() == 4)
215 "label" : "Spline degrees",
216 "description" : "Spline degrees per parametric dimension",
218 "value" : ["constant", "linear", "quadratic", "cubic", "quartic", "quintic"],
222 "label" : "Number of coefficients",
223 "description" : "Number of coefficients per parametric dimension",
224 "type" : [int,int,int,int],
226 "default" : [3,3,3,3],
229 "label" : "Initialization of the coefficients",
230 "description" : "Initialization of the coefficients",
232 "value" : ["zeros", "ones", "linear", "random", "greville"],
235 "name" : "nonuniform",
236 "label" : "Create non-uniform knot vectors",
237 "description" : "Create non-uniform knot vectors",
239 "value" : ["false", "true"],
244 return R
"({ INVALID REQUEST })"_json;
251 "description" : "Geometry",
257 if constexpr (Spline::geoDim() == 1)
259 "name" : "ValueFieldMagnitude",
260 "description" : "Magnitude of the B-spline values",
264 "name" : "ValueFieldMagnitude",
265 "description" : "Magnitude of the B-spline values",
267 "name" : "ValueField",
268 "description" : "B-spline values",
277 const std::string &
attribute)
const override {
285 json[
"degrees"] = this->degrees();
287 json[
"geoDim"] = this->geoDim();
289 json[
"parDim"] = this->parDim();
291 json[
"ncoeffs"] = this->ncoeffs();
293 json[
"nknots"] = this->nknots();
295 json[
"coeffs"] = this->coeffs_to_json();
297 json[
"knots"] = this->knots_to_json();
303 return Spline::to_json();
339 const nlohmann::json &
json)
override {
344 if (!
json.contains(
"data"))
349 auto indices =
json[
"data"][
"indices"].get<std::vector<int64_t>>();
351 utils::to_tensorAccessor<typename Spline::value_type, 1>(
352 Spline::coeffs(), torch::kCPU);
354 switch (Spline::geoDim()) {
357 json[
"data"][
"coeffs"]
358 .get<std::vector<std::tuple<typename Spline::value_type>>>();
370 json[
"data"][
"coeffs"]
371 .get<std::vector<std::tuple<
typename Spline::value_type,
372 typename Spline::value_type>>>();
387 json[
"data"][
"coeffs"]
388 .get<std::vector<std::tuple<
typename Spline::value_type,
389 typename Spline::value_type,
390 typename Spline::value_type>>>();
407 json[
"data"][
"coeffs"]
408 .get<std::vector<std::tuple<
typename Spline::value_type,
409 typename Spline::value_type,
410 typename Spline::value_type,
411 typename Spline::value_type>>>();
438 const nlohmann::json &
json)
const override {
442 if constexpr (Spline::parDim() == 1) {
444 std::array<int64_t, 1>
res({25});
445 if (
json.contains(
"data"))
447 res =
json[
"data"][
"resolution"].get<std::array<int64_t, 1>>();
451 if (
component ==
"ValueFieldMagnitude") {
452 return nlohmann::json::array().emplace_back(
453 utils::to_json<iganet::real_t, 1>(*(
solution_.eval(
xi)[0])));
456 auto result = nlohmann::json::array();
457 for (
short_t dim = 0; dim < Spline::geoDim(); ++dim)
459 utils::to_json<iganet::real_t, 1>(*(
values[dim])));
462 return R
"({ INVALID REQUEST })"_json;
465 else if constexpr (Spline::parDim() == 2) {
467 std::array<int64_t, 2>
res({25, 25});
468 if (
json.contains(
"data"))
470 res =
json[
"data"][
"resolution"].get<std::array<int64_t, 2>>();
473 {torch::linspace(0, 1,
res[0],
475 torch::linspace(0, 1,
res[1],
479 if (
component ==
"ValueFieldMagnitude") {
480 return nlohmann::json::array().emplace_back(
481 utils::to_json<iganet::real_t, 2>(*(
solution_.eval(
xi)[0])));
484 auto result = nlohmann::json::array();
485 for (
short_t dim = 0; dim < Spline::geoDim(); ++dim)
487 utils::to_json<iganet::real_t, 2>(*(
values[dim])));
490 return R
"({ INVALID REQUEST })"_json;
493 else if constexpr (Spline::parDim() == 3) {
495 std::array<int64_t, 3>
res({25, 25, 25});
496 if (
json.contains(
"data"))
498 res =
json[
"data"][
"resolution"].get<std::array<int64_t, 3>>();
501 {torch::linspace(0, 1,
res[0],
503 torch::linspace(0, 1,
res[1],
505 torch::linspace(0, 1,
res[2],
509 if (
component ==
"ValueFieldMagnitude") {
510 return nlohmann::json::array().emplace_back(
511 utils::to_json<iganet::real_t, 3>(*(
solution_.eval(
xi)[0])));
514 auto result = nlohmann::json::array();
515 for (
short_t dim = 0; dim < Spline::geoDim(); ++dim)
517 utils::to_json<iganet::real_t, 3>(*(
values[dim])));
520 return R
"({ INVALID REQUEST })"_json;
523 else if constexpr (Spline::parDim() == 4) {
525 std::array<int64_t, 4>
res({25, 25, 25, 25});
526 if (
json.contains(
"data"))
528 res =
json[
"data"][
"resolution"].get<std::array<int64_t, 4>>();
531 {torch::linspace(0, 1,
res[0],
533 torch::linspace(0, 1,
res[1],
535 torch::linspace(0, 1,
res[2],
537 torch::linspace(0, 1,
res[3],
541 if (
component ==
"ValueFieldMagnitude") {
542 return nlohmann::json::array().emplace_back(
543 utils::to_json<iganet::real_t, 4>(*(
solution_.eval(
xi)[0])));
546 auto result = nlohmann::json::array();
547 for (
short_t dim = 0; dim < Spline::geoDim(); ++dim)
549 utils::to_json<iganet::real_t, 4>(*(
values[dim])));
552 return R
"({ INVALID REQUEST })"_json;
558 int num = 1, dim = -1;
560 if (
json.contains(
"data")) {
562 num =
json[
"data"][
"num"].get<
int>();
568 Spline::uniform_refine(
num, dim);
571 if constexpr (Spline::parDim() == 1)
573 [](
const std::array<typename Spline::value_type, 1>
xi) {
574 return std::array<
typename Spline::value_type, Spline::geoDim()>{
575 static_cast<iganet::real_t
>(std::sin(
M_PI *
xi[0])), 0.0, 0.0};
578 else if constexpr (Spline::parDim() == 2)
580 [](
const std::array<typename Spline::value_type, 2>
xi) {
581 return std::array<
typename Spline::value_type, Spline::geoDim()>{
582 static_cast<iganet::real_t
>(std::sin(
M_PI *
xi[0]) *
587 else if constexpr (Spline::parDim() == 3)
589 [](
const std::array<typename Spline::value_type, 3>
xi) {
590 return std::array<
typename Spline::value_type, Spline::geoDim()>{
591 static_cast<iganet::real_t
>(std::sin(
M_PI *
xi[0]) *
611 if (
json.contains(
"data")) {
615 std::vector<std::uint8_t>
binary =
json[
"data"][
"binary"];
618 torch::serialize::InputArchive
archive;
619 archive.load_from(
reinterpret_cast<const char *
>(
binary.data()),
622 Spline::read(
archive,
"geometry");
633 nlohmann::json
save()
const override {
636 torch::serialize::OutputArchive
archive;
639 archive.write(
"nonuniform",
static_cast<bool>(Spline::is_nonuniform()));
641 Spline::write(
archive,
"geometry");
645 std::vector<std::uint8_t>
binary;
648 [&
binary](
const void *data,
size_t size)
mutable -> std::size_t {
649 auto data_ =
reinterpret_cast<const std::uint8_t *
>(data);
651 for (std::size_t
i = 0;
i < size; ++
i)
667 const nlohmann::json &
json,
668 int id = 0)
override {
670 if (
json.contains(
"data")) {
673 std::string
xml =
json[
"data"][
"xml"].get<std::string>();
675 pugi::xml_document
doc;
676 pugi::xml_parse_result
result =
677 doc.load_buffer(
xml.c_str(),
xml.size());
679 if (pugi::xml_node
root =
doc.child(
"xml"))
682 throw std::runtime_error(
"No \"xml\" node in XML object");
688 throw std::runtime_error(
"No XML node in JSON object");
694 const pugi::xml_node &
xml,
695 int id = 0)
override {
698 Spline::from_xml(
xml,
id,
"geometry");
702 Spline::from_xml(
xml,
id,
"geometry");
706 throw std::runtime_error(
"Unsupported component");
713 int id = 0)
override {
716 pugi::xml_document
doc;
717 pugi::xml_node
xml =
doc.append_child(
"xml");
721 std::ostringstream
oss;
731 int id = 0)
override {
734 Spline::to_xml(
xml,
id,
"geometry");
738 Spline::to_xml(
xml,
id,
"geometry");
742 throw std::runtime_error(
"Unsupported component");
Model evaluator.
Definition model.hpp:98
Model interface.
Definition model.hpp:195
virtual nlohmann::json to_json(const std::string &patch, const std::string &component, const std::string &attribute) const
Serializes the model to JSON.
Definition model.hpp:289
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
Model refinement.
Definition model.hpp:124
Model reparameterization.
Definition model.hpp:136
Model serialization.
Definition model.hpp:148
Model XML serialization.
Definition model.hpp:163
The Options class handles the automated determination of dtype from the template argument and the sel...
Definition options.hpp:90
B-spline model.
Definition BSplineModel.hpp:40
nlohmann::json getOptions() const override
Returns the model's options.
Definition BSplineModel.hpp:118
void importXML(const std::string &patch, const std::string &component, const nlohmann::json &json, int id=0) override
Imports the model from XML (as JSON object)
Definition BSplineModel.hpp:665
nlohmann::json eval(const std::string &patch, const std::string &component, const nlohmann::json &json) const override
Evaluates the model.
Definition BSplineModel.hpp:437
BSplineModel()
Default constructor.
Definition BSplineModel.hpp:53
void load(const nlohmann::json &json) override
Loads model from LibTorch file.
Definition BSplineModel.hpp:609
std::string getDescription() const override
Returns the model's description.
Definition BSplineModel.hpp:104
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 BSplineModel.hpp:336
nlohmann::json getOutputs() const override
Returns the model's outputs.
Definition BSplineModel.hpp:256
nlohmann::json getInputs() const override
Returns the model's inputs.
Definition BSplineModel.hpp:248
void importXML(const std::string &patch, const std::string &component, const pugi::xml_node &xml, int id=0) override
Imports the model from XML (as XML object)
Definition BSplineModel.hpp:692
nlohmann::json to_json(const std::string &patch, const std::string &component, const std::string &attribute) const override
Serializes the model to JSON.
Definition BSplineModel.hpp:276
Spline solution_
"fake" solution vector
Definition BSplineModel.hpp:49
std::string getName() const override
Returns the model's name.
Definition BSplineModel.hpp:90
pugi::xml_node & exportXML(const std::string &patch, const std::string &component, pugi::xml_node &xml, int id=0) override
Exports the model to XML (as XML object)
Definition BSplineModel.hpp:728
nlohmann::json exportXML(const std::string &patch, const std::string &component, int id=0) override
Exports the model to XML (as JSON object)
Definition BSplineModel.hpp:711
void reparameterize(const std::string &patch, const nlohmann::json &json=NULL) override
Reparameterize the model.
Definition BSplineModel.hpp:599
nlohmann::json save() const override
Saves model to LibTorch file.
Definition BSplineModel.hpp:633
void refine(const nlohmann::json &json=NULL) override
Refines the model.
Definition BSplineModel.hpp:557
~BSplineModel()
Destructor.
Definition BSplineModel.hpp:87
nlohmann::json getParameters() const override
Returns the model's parameters.
Definition BSplineModel.hpp:273
BSplineModel(const std::array< int64_t, Spline::parDim()> ncoeffs, enum iganet::init init=iganet::init::zeros)
Constructor for equidistant knot vectors.
Definition BSplineModel.hpp:56
Isogeometric analysis network main header file.
TensorArray< 4 > TensorArray4
Definition tensorarray.hpp:34
auto zip(T &&...seqs)
Definition zip.hpp:97
TensorArray< 3 > TensorArray3
Definition tensorarray.hpp:33
TensorArray< 1 > TensorArray1
Definition tensorarray.hpp:31
TensorArray< 2 > TensorArray2
Definition tensorarray.hpp:32
degree
Enumerator for specifying the degree of B-splines.
Definition BSplineModel.hpp:23
Definition boundary.hpp:22
constexpr bool is_SplineType_v
Alias to the value of is_SplineType.
Definition bspline.hpp:3243
init
Enumerator for specifying the initialization of B-spline coefficients.
Definition bspline.hpp:55
short int short_t
Definition core.hpp:74
IndexOutOfBounds exception.
Definition model.hpp:32
InvalidModelAttribute exception.
Definition model.hpp:42
InvalidModel exception.
Definition model.hpp:37