forms.hpp concepts type_traits serif/discretization/blocks/concepts.hpp serif/discretization/forms/operands.hpp serif/utils/types/type_list.hpp serif/meta/names.hpp src/compile_time_checks/serif/backend/mfem/discretization/quadrature/mfem_static_order.cpp src/compile_time_checks/serif/discretization/forms/forms.cpp src/include/serif/discretization/forms/concept.hpp src/include/serif/discretization/forms/form_traits.hpp src/include/serif/operators/plan.hpp serif::discretization::forms::form serif::discretization::forms::mass serif::discretization::forms::divergence serif::discretization::forms::source serif::discretization::forms::force serif::discretization::forms::boundary_flux serif::discretization::forms::projection serif serif::discretization serif::discretization::forms This file defines the forms used in the discretization framework, including mass, divergence, source, force, boundary flux, and projection forms. Emily M. Boudreaux If you are a developer tasked with the likely horrid task of adding some new equation that cannot be represented within the current framework that SERiF provides, this should probably be your first stop. This file essentially defines the mathematical operations that SERiF can perform. As you can see below none of these forms are particularly complex, and they certainly do not actually describe how to perform these operations. Rather, these form the base of a chain of compile-time probability that SERiF knows how to do something. Effectively this file is a contract with the rest of the code that says "If someone asks for the divergence of a trial field against some test field that is okay because I have claimed in this file that I know how to do that". The actual implementation lives elsewhere. TodoCome back and fill in more information about elsewhere. If you are the developer from above and you are reading this todo, then I am, and I mean this truly, very sorry.... #pragmaonce #include<concepts> #include<type_traits> #include"serif/discretization/blocks/concepts.hpp" #include"serif/discretization/forms/operands.hpp" #include"serif/utils/types/type_list.hpp" #include"serif/meta/names.hpp" namespaceserif::discretization::forms{ structform{}; template<blocks::TermTrialT,blocks::TermTestT> structmassfinal:form{ staticconstexprstd::string_viewname=meta::template_name<mass>(); usingtrial_type=TrialT; usingtest_type=TestT; usingoperand_types=utils::types::TypeList<Operand<TrialT>,Operand<TestT>>; }; template<blocks::TermTrialT,blocks::TermTestT> structdivergencefinal:form{ staticconstexprstd::string_viewname=meta::template_name<divergence>(); usingtrial_type=TrialT; usingtest_type=TestT; usingoperand_types=utils::types::TypeList<Operand<TrialT, Operation::Divergence>,Operand<TestT>>; }; template<blocks::TermTrialT,blocks::TermTestT> structsourcefinal:form{ staticconstexprstd::string_viewname=meta::template_name<source>(); usingtrial_type=TrialT; usingtest_type=TestT; usingoperand_types=utils::types::TypeList<Operand<TrialT>,Operand<TestT>>; }; template<blocks::TermTrialT,blocks::TermTestT> structforcefinal:form{ staticconstexprstd::string_viewname=meta::template_name<force>(); usingtrial_type=TrialT; usingtest_type=TestT; usingoperand_types=utils::types::TypeList<Operand<TrialT>,Operand<TestT>>; }; template<blocks::TermTrialT,blocks::TermTestT> structboundary_fluxfinal:form{ staticconstexprstd::string_viewname=meta::template_name<boundary_flux>(); usingtrial_type=TrialT; usingtest_type=TestT; usingoperand_types=utils::types::TypeList<Operand<TrialT, Operation::NormalTrace>,Operand<TestT, Operation::NormalTrace>>; }; template<blocks::TermTrialT,blocks::TermTestT> structprojectionfinal:form{ staticconstexprstd::string_viewname=meta::template_name<projection>(); usingtrial_type=TrialT; usingtest_type=TestT; usingoperand_types=utils::types::TypeList<Operand<TrialT>,Operand<TestT>>; }; }