configuration.hpp exception string tuple type_traits utility serif/backend/mfem/serialize/discretization.hpp serif/model/configured_discretization.hpp serif/utils/serialize/numerics.hpp serif serif::backend serif::backend::mfem serif::backend::mfem::serialize #pragmaonce #include<exception> #include<string> #include<tuple> #include<type_traits> #include<utility> #include"serif/backend/mfem/serialize/discretization.hpp" #include"serif/model/configured_discretization.hpp" #include"serif/utils/serialize/numerics.hpp" namespaceserif::backend::mfem::serialize{ template<typenameOriginal> usingRestoredConfiguration=decltype(model::make_discretization(model::DiscretizationOptions{ .model=std::declval<utils::serialize::RestoredStellarModel<std::remove_cvref_t<decltype(std::declval<Original>().model)>>>(), .finite_elements=std::declval<RestoredDiscretization<std::remove_cvref_t<decltype(std::declval<Original>().finite_elements)>>>(), .normalization=std::declval<std::remove_cvref_t<decltype(std::declval<Original>().normalization)>>(), .preconditioner=std::declval<std::remove_cvref_t<decltype(std::declval<Original>().preconditioner)>>() })); template<typenameOriginal> [[nodiscard]]utils::serialize::Result<RestoredConfiguration<Original>>restore_configuration(constutils::serialize::Node&node, constMeshResolver&resolver={}){ usingnamespaceutils::serialize; usingModel=std::remove_cvref_t<decltype(std::declval<Original>().model)>; usingFiniteElements=std::remove_cvref_t<decltype(std::declval<Original>().finite_elements)>; usingNormalization=std::remove_cvref_t<decltype(std::declval<Original>().normalization)>; usingPreconditioner=std::remove_cvref_t<decltype(std::declval<Original>().preconditioner)>; if(node.version!=1){ returnstd::unexpected(Error{"configuration","Unsupportedconfigureddiscretizationversion."}); } autocomponents=read_object(node,"model.configured_discretization",[](Nodemodel,Nodefinite_elements,Normalizationnormalization,Preconditionerpreconditioner){ returnstd::tuple{std::move(model),std::move(finite_elements),std::move(normalization),std::move(preconditioner)}; },member<Node>("model"),member<Node>("finite_elements"),member<Normalization>("normalization"),member<Preconditioner>("preconditioner")); if(!components){ returnstd::unexpected(components.error()); } auto&[model_node,finite_elements_node,normalization,preconditioner]=*components; autostellar_model=restore_stellar_model<Model>(model_node); if(!stellar_model){ returnstd::unexpected(stellar_model.error()); } autofinite_elements=restore_discretization<FiniteElements>(finite_elements_node,resolver); if(!finite_elements){ returnstd::unexpected(finite_elements.error()); } try{ returnmodel::make_discretization(model::DiscretizationOptions{ .model=std::move(*stellar_model),.finite_elements=std::move(*finite_elements), .normalization=std::move(normalization),.preconditioner=std::move(preconditioner) }); }catch(conststd::exception&error){ returnstd::unexpected(Error{"configuration","Savednumericalconfigurationisinvalid:"+std::string{error.what()}}); } } }