diff --git a/hyteg_integration_tests/src/CMakeLists.txt b/hyteg_integration_tests/src/CMakeLists.txt index 2f35d5237e78e50ceec81848daf40a44570a91ae..03c3b8ffd7cd957450c4b75a313a43085105c822 100644 --- a/hyteg_integration_tests/src/CMakeLists.txt +++ b/hyteg_integration_tests/src/CMakeLists.txt @@ -37,35 +37,6 @@ endfunction() # tests without blending -add_operator_test(FILE CurlCurl.cpp DEF TEST_ASSEMBLE FORM CurlCurl ABBR noopts GEN_ARGS --quad-degree 0 0) -add_operator_test(FILE CurlCurl.cpp FORM CurlCurl ABBR VIQ GEN_ARGS --quad-degree 0 0 -o MOVECONSTANTS VECTORIZE QUADLOOPS) -add_operator_test(FILE CurlCurl.cpp FORM CurlCurl ABBR CVIP GEN_ARGS --quad-degree 0 0 --loop-strategy CUBES -o MOVECONSTANTS VECTORIZE POLYCSE) -add_operator_test(FILE CurlCurlPlusMass.cpp DEF TEST_ASSEMBLE FORM CurlCurlPlusMass ABBR noopts GEN_ARGS --quad-degree 2 2) -add_operator_test(FILE CurlCurlPlusMass.cpp FORM CurlCurlPlusMass ABBR VI GEN_ARGS --quad-degree 2 2 -o MOVECONSTANTS VECTORIZE) - -add_operator_test(FILE DiffusionP1.cpp DEF TEST_ASSEMBLE FORM Diffusion ABBR 1 GEN_ARGS -s P1 --quad-degree 0 0) -add_operator_test(FILE DiffusionP1.cpp FORM Diffusion ABBR 1VIP GEN_ARGS -s P1 --quad-degree 0 0 -o MOVECONSTANTS VECTORIZE POLYCSE) -add_operator_test(FILE DiffusionP1.cpp FORM Diffusion ABBR 1CVI GEN_ARGS -s P1 --quad-degree 0 0 --loop-strategy CUBES -o MOVECONSTANTS VECTORIZE) -add_operator_test(FILE DiffusionP2.cpp DEF TEST_ASSEMBLE FORM Diffusion ABBR 2 GEN_ARGS -s P2 --quad-degree 2 2) -add_operator_test(FILE DiffusionP1Vector.cpp DEF TEST_ASSEMBLE FORM Diffusion ABBR 1Vec GEN_ARGS -s P1Vector --quad-degree 0 0 LIBS mixed_operator) - -add_operator_test(FILE DivKGrad.cpp DEF TEST_ASSEMBLE FORM DivKGrad ABBR noopts GEN_ARGS -s P2 --quad-degree 4 4) -add_operator_test(FILE DivKGrad.cpp FORM DivKGrad ABBR VIQ GEN_ARGS -s P2 --quad-degree 4 4 -o MOVECONSTANTS VECTORIZE QUADLOOPS ) -add_operator_test(FILE DivKGrad.cpp DEF TEST_ASSEMBLE FORM DivKGrad ABBR IQT GEN_ARGS -s P2 --quad-degree 4 4 -o MOVECONSTANTS QUADLOOPS TABULATE ) - -add_operator_test(FILE Div.cpp DEF REF_OP=P2ToP1ElementwiseDivxOperator FORM Div_0 ABBR VIQT GEN_ARGS -s P2ToP1 -o MOVECONSTANTS QUADLOOPS TABULATE VECTORIZE --quad-degree 2 2) -add_operator_test(FILE DivT.cpp DEF REF_OP=P1ToP2ElementwiseDivTzOperator FORM DivT_2 ABBR VIQT GEN_ARGS -s P1ToP2 -o MOVECONSTANTS QUADLOOPS TABULATE VECTORIZE --quad-degree 2 2) - -add_operator_test(FILE Epsilon.cpp DEF TEST_DIAG FORM=forms::p2_epsilonvar_0_0_affine_q4 FORM Epsilon_0_0 ABBR 00VIQT GEN_ARGS -s P2 -o MOVECONSTANTS QUADLOOPS TABULATE VECTORIZE --quad-degree 4 4 ) -add_operator_test(FILE Epsilon.cpp DEF FORM=forms::p2_epsilonvar_2_1_affine_q4 FORM Epsilon_2_1 ABBR 21VIQT GEN_ARGS -s P2 -o MOVECONSTANTS QUADLOOPS TABULATE VECTORIZE --quad-degree 4 4 ) -add_operator_test(FILE EpsilonVector.cpp DEF FORM Epsilon ABBR VecVIQT GEN_ARGS -s P2Vector -o MOVECONSTANTS QUADLOOPS TABULATE VECTORIZE --quad-degree 2 2 --dimensions 2 LIBS constant_stencil_operator) - -# tests with blending - -add_operator_test(FILE DiffusionP1Annulus.cpp DEF TEST_ASSEMBLE FORM Diffusion ABBR b2 GEN_ARGS -s P1 -b AnnulusMap --quad-rule hillion_07 yu_3) -add_operator_test(FILE DiffusionP1Annulus.cpp FORM Diffusion ABBR b2VIQT GEN_ARGS -s P1 -b AnnulusMap -o MOVECONSTANTS QUADLOOPS TABULATE VECTORIZE --quad-rule hillion_07 yu_3) -add_operator_test(FILE DiffusionP1IcosahedralShell.cpp FORM Diffusion ABBR b3VIQT GEN_ARGS -s P1 -b IcosahedralShellMap -o MOVECONSTANTS QUADLOOPS TABULATE VECTORIZE --quad-rule hillion_07 yu_3) - -add_operator_test(FILE FullStokes.cpp DEF TEST_DIAG FORM=forms::p2_full_stokesvar_0_0_blending_q3 FORM FullStokes_0_0 ABBR 00b3VIQT GEN_ARGS -s P2 -b IcosahedralShellMap -o MOVECONSTANTS QUADLOOPS TABULATE VECTORIZE --quad-rule yu_3 yu_3) -add_operator_test(FILE FullStokes.cpp DEF FORM=forms::p2_full_stokesvar_2_1_blending_q3 FORM FullStokes_2_1 ABBR 21b3VIQT GEN_ARGS -s P2 -b IcosahedralShellMap -o MOVECONSTANTS QUADLOOPS TABULATE VECTORIZE --quad-rule yu_3 yu_3) +add_operator_test(FILE EpsilonVector.cpp DEF FORM Epsilon ABBR VecVIQT GEN_ARGS -s P2Vector -o MOVECONSTANTS QUADLOOPS TABULATE --quad-degree 2 2 --dimensions 2 LIBS constant_stencil_operator) +add_operator_test(FILE EpsilonVectorAnnulus.cpp DEF FORM Epsilon ABBR VecbVIQT GEN_ARGS -s P2Vector -b AnnulusMap -o MOVECONSTANTS QUADLOOPS TABULATE --quad-degree 2 2 --dimensions 2 LIBS constant_stencil_operator) diff --git a/hyteg_integration_tests/src/EpsilonVectorAnnulus.cpp b/hyteg_integration_tests/src/EpsilonVectorAnnulus.cpp new file mode 100644 index 0000000000000000000000000000000000000000..89a053ae77ecbea569aa3e8b5a4d555618195cf4 --- /dev/null +++ b/hyteg_integration_tests/src/EpsilonVectorAnnulus.cpp @@ -0,0 +1,106 @@ +/* + * HyTeG Operator Generator + * Copyright (C) 2017-2024 Nils Kohl, Fabian BĂśhm, Daniel Bauer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include <type_traits> + +#include "core/DataTypes.h" + +#include "hyteg/elementwiseoperators/P2ElementwiseOperator.hpp" +#include "constant_stencil_operator/P2ConstantEpsilonOperator.hpp" +#include "hyteg/forms/form_hyteg_generated/p2/p2_epsilonvar_affine_q4.hpp" +#include "hyteg/p2functionspace/P2Function.hpp" + +#include "Epsilon/TestOpEpsilon.hpp" +#include "OperatorGenerationTest.hpp" + +using namespace hyteg; +using walberla::real_t; + +real_t k( const hyteg::Point3D& x ) +{ + // The operator also works with a non-constant viscosity. + // However, the reference operator seems to have such a low quadrature order that the difference between the + // reference and generated operator is relatively large. + // Under refinement that error vanishes, but not quickly enough that we can afford refinement in this (quick) test. + // For simplicity, the viscosity is therefore set to 1 here, such that the comparison succeeds (just blending, no var + // viscosity). Note that there is a dedicated test with a variable viscosity, but without blending. + return 1.0; +} + +P2ElementwiseBlendingEpsilonOperator makeRefOp( std::shared_ptr< PrimitiveStorage > storage, uint_t minLevel, uint_t maxLevel ) +{ + return P2ElementwiseBlendingEpsilonOperator( storage, minLevel, maxLevel, k ); +}; + +template < class Op > +Op makeTestOp( std::shared_ptr< PrimitiveStorage > storage, uint_t minLevel, uint_t maxLevel ) +{ + P2Function< real_t > k( "k", storage, minLevel, maxLevel ); + for ( size_t lvl = minLevel; lvl <= maxLevel; ++lvl ) + { + k.interpolate( ::k, lvl ); + } + return Op( storage, minLevel, maxLevel, k ); +}; + +int main( int argc, char* argv[] ) +{ + walberla::MPIManager::instance()->initializeMPI( &argc, &argv ); + walberla::MPIManager::instance()->useWorldComm(); + + const uint_t level = 3; + + real_t thresholdOverMachineEpsApply = 2e3; + real_t thresholdOverMachineEpsInvDiag = 9.0e6; + real_t thresholdOverMachineEpsAssembly = 360; + + // Testing only 2D since generation of 3D operator just takes too long. + + StorageSetup storageSetup( + "Annulus", MeshInfo::meshAnnulus( 1.0, 2.0, MeshInfo::CRISS, 12, 2 ), GeometryMap::Type::ANNULUS ); + + compareApply< P2ElementwiseBlendingEpsilonOperator, operatorgeneration::TestOpEpsilon >( + makeRefOp, + makeTestOp< operatorgeneration::TestOpEpsilon >, + level, + storageSetup, + storageSetup.description() + " Apply", + thresholdOverMachineEpsApply ); + +#ifdef TEST_DIAG + compareInvDiag< P2Function< real_t >, P2ElementwiseBlendingEpsilonOperator, operatorgeneration::TestOpEpsilon >( + makeRefOp, + makeTestOp< operatorgeneration::TestOpEpsilon >, + level, + storageSetup, + storageSetup.description() + " Inverse Diagonal", + thresholdOverMachineEpsInvDiag ); +#endif + +#ifdef TEST_ASSEMBLE + compareAssembledMatrix< P2ElementwiseBlendingEpsilonOperator, operatorgeneration::TestOpEpsilon >( + makeRefOp, + makeTestOp< operatorgeneration::TestOpEpsilon >, + level, + storageSetup, + storageSetup.description() + " Assembly", + thresholdOverMachineEpsAssembly ); +#endif + + return EXIT_SUCCESS; +}