potential_infinity.hpp serif/backend/mfem/discretization/dof_selection.hpp serif/backend/mfem/model/computations/interior.hpp src/include/serif/backend/mfem/model/graph.hpp serif::model::computations::PotentialInfinityContribution serif serif::model serif::model::computations #pragmaonce #include"serif/backend/mfem/discretization/dof_selection.hpp" #include"serif/backend/mfem/model/computations/interior.hpp" namespaceserif::model::computations{ structPotentialInfinityContribution{}; template<typenameLayout,typenameBinding> [[nodiscard]]autopotential_infinity_contribution(Layoutlayout,constBinding&binding){ usingnamespaceutils::dependencies; usingnamespacediscretization::blocks; usingnamespaceutils::errors; //Normalizationselectsthissamefixedboundaryonthesamepotentialbinding. constautoselected=discretization::backend::mfem::select_boundary_dofs<discretization::domain::InfinitySurfaceBoundary>(binding); returnmake_computation<PotentialInfinityContribution,InputList<gravity::potential>>( [layout,selected](constauto&potential){ selected.validate(); serif_ensure<SERiFErrorCode::CACHE_FE_BINDING_ERROR>(&potential.binding==&selected.binding()&&potential.values.Size()==potential.binding.size(), "Infinitytracecoefficientsmustusetheselectedpotentialbinding."); constauto&reduced=selected.reduced_dofs(); constintrow_offset=static_cast<int>(layout.templateoffset<RepresentedValueKind::residual,gravity::potential>()); autotrace=std::make_shared<::mfem::SparseMatrix>(reduced.Size(),potential.binding.size()); backend::mfem::RowReplacementreplacement; for(intindex=0;index<reduced.Size();++index){ replacement.selected_rows.push_back(row_offset+reduced[index]); replacement.residual.push_back(potential.values[reduced[index]]); trace->Add(index,reduced[index],1.0); } trace->Finalize(); replacement.jacobian.push_back({.column_offset=static_cast<int>(layout.templateoffset<RepresentedValueKind::value,gravity::potential>()), .block=operators::backend::mfem::linearized_block(std::move(trace))}); Contributionsresult; result.replacements.push_back(std::move(replacement)); returnresult; }); } }