jacobian_operator.hpp mfem/linalg/operator.hpp serif/backend/mfem/operators/volume_application.hpp src/compile_time_checks/serif/operators/computation_owners.cpp serif::operators::backend::mfem::JacobianOperator serif serif::operators serif::operators::backend serif::operators::backend::mfem #pragmaonce #include"mfem/linalg/operator.hpp" #include"serif/backend/mfem/operators/volume_application.hpp" namespaceserif::operators::backend::mfem{ template<typenameCacheT> classJacobianOperatorfinal:public::mfem::Operator{ public: explicitJacobianOperator(constCacheT&cache): Operator(volume_height(cache.templateget<volume_keys::Linearization>()),volume_width(cache.templateget<volume_keys::Linearization>())), m_cache(cache){} JacobianOperator(CacheT&&)=delete; JacobianOperator(constCacheT&&)=delete; voidMult(const::mfem::Vector&direction,::mfem::Vector&result)constoverride{ constauto&data=checked_data(); apply_jacobian(data,direction,m_workspace,result); } voidMultTranspose(const::mfem::Vector&dual,::mfem::Vector&result)constoverride{ constauto&data=checked_data(); apply_jacobian_transpose(data,dual,m_workspace,result); } private: [[nodiscard]]constauto&checked_data()const{ usingnamespaceutils::errors; constauto&data=m_cache.templateget<volume_keys::Linearization>(); serif_ensure<SERiFErrorCode::CACHE_FE_BINDING_ERROR>( volume_width(data)==Width()&&volume_height(data)==Height(), "Equationoperatordimensionschangedunexpectedly."); returndata; } constCacheT&m_cache; mutableWorkspacem_workspace; }; }//namespaceserif::operators::backend::mfem