fields_meanfield.cpp tuple type_traits utility serif/discretization/blocks/blocks.hpp serif/discretization/forms/runtime.hpp serif/backend/mfem/discretization/quadrature/order.hpp serif/equations/point.hpp serif/utils/dependencies/dependency_context.hpp serif serif::compile_time_checks serif::compile_time_checks::fields_meanfield //MeanFieldfield/base/registry/blockcontractsexpressedthroughSERiF'sproductiondescriptors. #include<tuple> #include<type_traits> #include<utility> #include"serif/discretization/blocks/blocks.hpp" #include"serif/discretization/forms/runtime.hpp" #include"serif/backend/mfem/discretization/quadrature/order.hpp" #include"serif/equations/point.hpp" #include"serif/utils/dependencies/dependency_context.hpp" namespaceserif::compile_time_checks::fields_meanfield { namespaceblocks=discretization::blocks; namespacespaces=discretization::functional_space; namespaceforms=discretization::forms; namespacedomain=discretization::domain; namespacedependencies=utils::dependencies; usingDensity=blocks::density::mass; usingPotential=blocks::gravity::potential; usingDisplacement=blocks::displacement::vector; usingConstant=blocks::barotropic_constant::mass_normalization; usingAngularVelocity=blocks::rotation::angular_velocity; static_assert(blocks::Field<blocks::density>&&blocks::Field<blocks::gravity>&&blocks::Field<blocks::displacement>&&blocks::Field<blocks::barotropic_constant>&&blocks::Field<blocks::rotation>); static_assert(blocks::SpatialTerm<Density>&&blocks::SpatialTerm<Potential>&&blocks::SpatialTerm<Displacement>); static_assert(blocks::GlobalScalarTerm<Constant>&&blocks::GlobalScalarTerm<AngularVelocity>); static_assert(!blocks::SpatialTerm<Constant>&&!blocks::HasFunctionalSpace<Constant>); static_assert(!blocks::SpatialTerm<AngularVelocity>&&!blocks::HasFunctionalSpace<AngularVelocity>); static_assert(!blocks::Term<int>&&!blocks::SpatialTerm<int>&&!blocks::GlobalScalarTerm<int>); static_assert(std::same_as<blocks::SupportOf<Density>,domain::StellarDomains>); static_assert(std::same_as<blocks::SupportOf<Potential>,domain::AllDomains>); static_assert(std::same_as<blocks::SupportOf<Displacement>,domain::AllDomains>); static_assert(Constant::value::static_block_size==1&&Constant::residual::static_block_size==1); static_assert(AngularVelocity::value::static_block_size==1&&AngularVelocity::residual::static_block_size==1); static_assert(Density::value::static_block_size==blocks::DYNAMIC_BLOCK_SIZE); static_assert(std::derived_from<Density::value,blocks::value_block_base>&&std::derived_from<Density::residual,blocks::residual_block_base>); static_assert(!std::derived_from<Density::value,blocks::residual_block_base>); static_assert(std::derived_from<blocks::value_block_base,blocks::block>&&std::derived_from<blocks::residual_block_base,blocks::block>); static_assert(static_cast<int>(blocks::value_block<2>{})==2); static_assert(static_cast<int>(blocks::residual_block<3>{})==3); usingScalarL2=spaces::DiscreteFunctionalSpace<spaces::L2,2,0>; usingVectorH1=spaces::DiscreteFunctionalSpace<spaces::H1,3,1>; usingVectorRT=spaces::DiscreteFunctionalSpace<spaces::Hdiv,2,1>; usingVectorND=spaces::DiscreteFunctionalSpace<spaces::Hcurl,2,1>; static_assert(ScalarL2::rank::value==0&&ScalarL2::order==2&&ScalarL2::functional_space.family==spaces::Family::l2); static_assert(VectorH1::rank::value==1&&VectorH1::order==3&&VectorH1::functional_space.trace==spaces::Trace::value); static_assert(VectorRT::rank::value==1&&VectorRT::functional_space.mapping==spaces::Mapping::contravariant_piola); static_assert(VectorND::rank::value==1&&VectorND::functional_space.mapping==spaces::Mapping::covariant_piola); static_assert(blocks::SpatialTermTraits<Density>::order==3&&blocks::SpatialTermTraits<Potential>::order==4); static_assert(blocks::SpatialTermTraits<Displacement>::family==spaces::Family::h1&&blocks::SpatialTermTraits<Potential>::family==spaces::Family::h1); usingGradientOperand=forms::Operand<Density,forms::Operation::Gradient>; usingDivergenceOperand=forms::Operand<Displacement,forms::Operation::Divergence>; static_assert(forms::IsOperation<forms::Operation::Value>&&forms::IsOperation<forms::Operation::Gradient>&&forms::IsOperation<forms::Operation::Divergence>&&forms::IsOperation<forms::Operation::Curl>&&forms::IsOperation<forms::Operation::NormalTrace>); static_assert(!forms::IsOperation<int>&&!forms::IsOperand<int>); static_assert(std::same_as<GradientOperand::term_type,Density>&&std::same_as<GradientOperand::operation_type,forms::Operation::Gradient>); static_assert(std::same_as<DivergenceOperand::term_type,Displacement>); static_assert(discretization::quadrature::backend::mfem::resolve_operand_order<forms::Operand<Displacement>>()==3); static_assert(discretization::quadrature::backend::mfem::resolve_operand_order<DivergenceOperand>()==2); static_assert(discretization::quadrature::backend::mfem::resolve_operand_order<GradientOperand>()==2); static_assert(discretization::quadrature::backend::mfem::resolve_operand_order<forms::Operand<Constant>>()==0); static_assert(forms::form_descriptor<forms::mass<Potential,Potential>>!=forms::form_descriptor<forms::mass<Density,Density>>); static_assert(forms::form_descriptor<forms::source<Density,Potential>>.trial==blocks::term_descriptor<Density>); static_assert(forms::form_descriptor<forms::source<Density,Potential>>.test==blocks::term_descriptor<Potential>); usingKeys=dependencies::Bindings<dependencies::Binding<int,int>,dependencies::Binding<double,double>,dependencies::Binding<char,char>>; static_assert(dependencies::SatisfiesKeyList<Keys,dependencies::KeyList<int,double,char>>); static_assert(!dependencies::SatisfiesKeyList<Keys,dependencies::KeyList<float>>); static_assert(!dependencies::SatisfiesKeyList<dependencies::Bindings<>,dependencies::KeyList<int>>); static_assert(std::same_as<dependencies::bound_type_t<Keys,double>,double>); //OrderedphysicaloperandsretainpositionalidentitywithoutreintroducingageneraltypelistindexingAPI. usingDensityOperand=forms::Operand<Density>; usingDisplacementOperand=forms::Operand<Displacement>; usingDivergenceSample=forms::Operand<Displacement,forms::Operation::Divergence>; usingPotentialOperand=forms::Operand<Potential>; usingOrderedSamples=equations::OperandValues<utils::types::TypeList<DensityOperand, DisplacementOperand, DivergenceSample, PotentialOperand>>; static_assert(OrderedSamples::count==4); static_assert(OrderedSamples::index<DensityOperand>()==0); static_assert(OrderedSamples::index<DisplacementOperand>()==1); static_assert(OrderedSamples::index<DivergenceSample>()==2); static_assert(OrderedSamples::index<PotentialOperand>()==3); static_assert(OrderedSamples::index<Density>()==0&&OrderedSamples::index<Potential>()==3); static_assert(std::same_as<decltype(std::declval<OrderedSamples&>().get<DensityOperand>()),double&>); static_assert(std::same_as<decltype(std::declval<constOrderedSamples&>().get<DisplacementOperand>()),constforms::VectorValue&>); static_assert(std::same_as<std::tuple_element_t<1,OrderedSamples::Storage>,forms::VectorValue>); static_assert(std::same_as<std::tuple_element_t<2,OrderedSamples::Storage>,double>); static_assert(std::same_as<std::tuple_element_t<3,OrderedSamples::Storage>,double>); }//namespaceserif::compile_time_checks::fields_meanfield