point.hpp array concepts cstddef tuple type_traits serif/discretization/forms/value.hpp serif/utils/types/type_list.hpp src/compile_time_checks/serif/discretization/fields_meanfield.cpp src/compile_time_checks/serif/operators/computation_owners.cpp src/include/serif/equations/angular_momentum.hpp src/include/serif/equations/barotropic_density.hpp src/include/serif/equations/barycenter.hpp src/include/serif/equations/concepts.hpp src/include/serif/equations/equations.hpp src/include/serif/equations/mass_normalization.hpp src/include/serif/equations/primal_gravity.hpp src/include/serif/equations/surface_potential.hpp src/include/serif/geometry/surface/linearization.hpp serif::equations::OperandValues< utils::types::TypeList< Operands... >, OutputT > serif::equations::EquationPoint serif::equations::PointLinearization serif serif::equations File containing the definitions of the EquationPoint and PointLinearization structs, which are used to represent the values and derivatives of operands at a given point in space. Emily M. Boudreaux Effectively every equation returns a PointLinearization from evaluate. Generally, you likely do not need to touch this file if you are trying to just add new physics. #pragmaonce #include<array> #include<concepts> #include<cstddef> #include<tuple> #include<type_traits> #include"serif/discretization/forms/value.hpp" #include"serif/utils/types/type_list.hpp" namespaceserif::equations{ template<typenameOperandsT,typenameOutputT=void> structOperandValues; template<typenameOutputT,discretization::forms::IsOperand...Operands> structOperandValues<utils::types::TypeList<Operands...>,OutputT>{ staticconstexprstd::size_tcount=sizeof...(Operands); template<typenameOperandT> usingEntry=std::conditional_t<std::is_void_v<OutputT>,discretization::forms::OperandValue<OperandT>,discretization::forms::PartialDerivative<OutputT, discretization::forms::OperandValue<OperandT>>>; usingStorage=std::conditional_t<(std::same_as<Entry<Operands>,double>&&...),std::array<double,count>,std::tuple<Entry<Operands>...>>; Storagevalues{}; template<typenameKeyT> staticconstevalstd::size_tindex(){ constexprstd::array<bool,count>matches{([]{ ifconstexpr(discretization::forms::IsOperand<KeyT>){ returnstd::same_as<KeyT,Operands>; }else{ returnstd::same_as<KeyT,typenameOperands::term_type>; } }())...}; constexprautocount_matches=[&]{ intn=0; for(constboolmatch:matches){ n+=match; } returnn; }(); static_assert(count_matches==1,"Therequestedoperandmustoccurexactlyonce;useOperand<Term,Operation>whenatermhasmultiplesampledoperations."); for(std::size_ti=0;i<count;++i){ if(matches[i]){ returni; } } returncount; } template<typenameKeyT> decltype(auto)get(){ returnstd::get<index<KeyT>()>(values); } template<typenameKeyT> decltype(auto)get()const{ returnstd::get<index<KeyT>()>(values); } }; template<typenameOperandsT> structEquationPoint{ OperandValues<OperandsT>fields; std::array<double,3>position{}; }; template<typenameOperandsT,typenameResultT=double> structPointLinearization{ ResultTresidual{}; OperandValues<OperandsT, ResultT>field_derivatives; discretization::forms::PartialDerivative<ResultT, discretization::forms::VectorValue>position_derivative{}; }; }//namespaceserif::equations