pressure_boundary.hpp cmath limits serif/discretization/blocks/system_layout.hpp serif/backend/mfem/geometry/surface/boundary_inputs.hpp serif/backend/mfem/model/computations/interior.hpp serif/backend/mfem/geometry/surface/pressure_field_block.hpp src/include/serif/backend/mfem/model/graph.hpp serif::model::computations::PressureBoundaryContribution serif serif::model serif::model::computations #pragmaonce #include<cmath> #include<limits> #include"serif/discretization/blocks/system_layout.hpp" #include"serif/backend/mfem/geometry/surface/boundary_inputs.hpp" #include"serif/backend/mfem/model/computations/interior.hpp" #include"serif/backend/mfem/geometry/surface/pressure_field_block.hpp" namespaceserif::model::computations { structPressureBoundaryContribution { }; template<geometry::surface::backend::mfem::PressureBoundaryFormulationFormulation,discretization::blocks::SystemLayoutTypeLayout> requiresutils::dependencies::ContainsKey<typename Formulation::CarrierTerm, typename Layout::Residuals> [[nodiscard]]autopressure_boundary_contribution(Layoutlayout) { usingnamespaceutils::dependencies; usingnamespaceutils::errors; usingnamespacediscretization::blocks; namespacesurface=geometry::surface; namespaceexecution=operators::backend::mfem; usingCarrier=typenameFormulation::CarrierTerm; serif_ensure<SERiFErrorCode::INVALID_DOF_COUNT>(layout.templatetotal_size<RepresentedValueKind::value>()<=static_cast<std::size_t>(std::numeric_limits<int>::max())&&layout.templatetotal_size<RepresentedValueKind::residual>()<=static_cast<std::size_t>(std::numeric_limits<int>::max()),"Pressure-boundarysystemcoordinatesmustfitMFEM'sintegerindexrange."); returnmake_computation<PressureBoundaryContribution,InputList<surface::keys::Linearization,surface::backend::mfem::keys::BoundaryDiscretization>>( [layout](conststd::vector<surface::SurfaceLinearization<Formulation>>&linearizations,constauto&boundary) { serif_ensure<SERiFErrorCode::INVALID_ARGUMENT>(boundary!=nullptr,"Pressure-boundaryassemblyrequiresitscompiledtraceowner."); boundary->validate(); surface::backend::mfem::detail::validate_boundary_samples(*boundary,linearizations); serif_ensure<SERiFErrorCode::MATRIX_SHAPE_ERROR>(layout.templatesize<RepresentedValueKind::residual,Carrier>()==static_cast<std::size_t>(boundary->selected_rows->binding().size()),"Thepressurecarrier'sresiduallayoutmustmatchitsfinite-elementrowbinding."); constintrow_offset=static_cast<int>(layout.templateoffset<RepresentedValueKind::residual,Carrier>()); backend::mfem::RowReplacementreplacement; replacement.selected_rows.reserve(linearizations.size()); replacement.residual.reserve(linearizations.size()); for(intindex=0;index<boundary->selected_rows->size();++index) { serif_ensure<SERiFErrorCode::NON_FINITE_VALUE_ERROR>(std::isfinite(linearizations[index].residual),"Apressurereplacementmustcontainfiniteacceptedresiduals."); replacement.selected_rows.push_back(row_offset+boundary->selected_rows->reduced_dofs()[index]); replacement.residual.push_back(linearizations[index].residual); } [&]<typename...Fields>(KeyList<Fields...>) { constautoadd_column=[&]<typenameField>() { ifconstexpr(ContainsKey<Field,typenameLayout::Values>) { automatrix=surface::backend::mfem::pressure_field_trace<Field>(*boundary,linearizations); serif_ensure<SERiFErrorCode::MATRIX_SHAPE_ERROR>(layout.templatesize<RepresentedValueKind::value,Field>()==static_cast<std::size_t>(matrix->Width()),"Asolvedpressureinput'scoordinatecountmustmatchitsfinite-elementtrace."); replacement.jacobian.push_back({.column_offset=static_cast<int>(layout.templateoffset<RepresentedValueKind::value,Field>()),.block=execution::linearized_block(std::move(matrix))}); } }; (add_column.templateoperator()<Fields>(),...); }(typenameFormulation::StateTerms{}); Contributionsresult; result.replacements.push_back(std::move(replacement)); returnresult; }); } }//namespaceserif::model::computations