diff --git a/packages/stk/CHANGELOG.md b/packages/stk/CHANGELOG.md index f8931f947e61..57f2d9d358e1 100644 --- a/packages/stk/CHANGELOG.md +++ b/packages/stk/CHANGELOG.md @@ -1,5 +1,8 @@ # CHANGELOG +5.21.4-1 (STK_VERSION 5210401) 9/04/2024 + Fix cmake configuration errors that occurred on AMD MI300A platform + 5.21.4 (STK_VERSION 5210400) 8/29/2024 minor fixes, no signficant API changes diff --git a/packages/stk/cmake/Dependencies.cmake b/packages/stk/cmake/Dependencies.cmake index 4c973a5c278e..0193382a3723 100644 --- a/packages/stk/cmake/Dependencies.cmake +++ b/packages/stk/cmake/Dependencies.cmake @@ -12,7 +12,7 @@ SET(SUBPACKAGES_DIRS_CLASSIFICATIONS_OPTREQS Middle_mesh stk_middle_mesh EX OPTIONAL Transfer stk_transfer PT OPTIONAL Mesh stk_mesh PT OPTIONAL - SearchUtil stk_search_util EX OPTIONAL + SearchUtil stk_search_util PT OPTIONAL TransferUtil stk_transfer_util EX OPTIONAL IO stk_io PT OPTIONAL Middle_mesh_util stk_middle_mesh_util EX OPTIONAL diff --git a/packages/stk/stk_balance/stk_balance/balanceUtils.cpp b/packages/stk/stk_balance/stk_balance/balanceUtils.cpp index 5222e9780e23..9bbb9a121181 100644 --- a/packages/stk/stk_balance/stk_balance/balanceUtils.cpp +++ b/packages/stk/stk_balance/stk_balance/balanceUtils.cpp @@ -532,12 +532,24 @@ int GraphCreationSettings::getGraphVertexWeight(stk::topology type) const return 4; case stk::topology::SHELL_TRI_6: return 8; + case stk::topology::SHELL_TRI_3_ALL_FACE_SIDES: + return 3; + case stk::topology::SHELL_TRI_4_ALL_FACE_SIDES: + return 4; + case stk::topology::SHELL_TRI_6_ALL_FACE_SIDES: + return 8; case stk::topology::SHELL_QUAD_4: return 6; case stk::topology::SHELL_QUAD_8: return 8; case stk::topology::SHELL_QUAD_9: return 9; + case stk::topology::SHELL_QUAD_4_ALL_FACE_SIDES: + return 6; + case stk::topology::SHELL_QUAD_8_ALL_FACE_SIDES: + return 8; + case stk::topology::SHELL_QUAD_9_ALL_FACE_SIDES: + return 9; case stk::topology::TET_4: return 1; case stk::topology::TET_8: @@ -680,8 +692,11 @@ int GraphCreationSettings::getConnectionTableIndex(stk::topology elementTopology case stk::topology::TRI_4_2D: case stk::topology::QUAD_4_2D: case stk::topology::SHELL_TRI_3: + case stk::topology::SHELL_TRI_3_ALL_FACE_SIDES: case stk::topology::SHELL_TRI_4: + case stk::topology::SHELL_TRI_4_ALL_FACE_SIDES: case stk::topology::SHELL_QUAD_4: + case stk::topology::SHELL_QUAD_4_ALL_FACE_SIDES: tableIndex = 2; break; case stk::topology::TET_4: @@ -694,8 +709,11 @@ int GraphCreationSettings::getConnectionTableIndex(stk::topology elementTopology case stk::topology::QUAD_8_2D: case stk::topology::QUAD_9_2D: case stk::topology::SHELL_TRI_6: + case stk::topology::SHELL_TRI_6_ALL_FACE_SIDES: case stk::topology::SHELL_QUAD_8: + case stk::topology::SHELL_QUAD_8_ALL_FACE_SIDES: case stk::topology::SHELL_QUAD_9: + case stk::topology::SHELL_QUAD_9_ALL_FACE_SIDES: tableIndex = 4; break; case stk::topology::TET_8: @@ -746,8 +764,11 @@ int GraphCreationSettings::getEdgeWeightTableIndex(stk::topology elementTopology case stk::topology::TRI_4_2D: case stk::topology::QUAD_4_2D: case stk::topology::SHELL_TRI_3: + case stk::topology::SHELL_TRI_3_ALL_FACE_SIDES: case stk::topology::SHELL_TRI_4: + case stk::topology::SHELL_TRI_4_ALL_FACE_SIDES: case stk::topology::SHELL_QUAD_4: + case stk::topology::SHELL_QUAD_4_ALL_FACE_SIDES: tableIndex = 2; break; case stk::topology::TET_4: @@ -762,10 +783,13 @@ int GraphCreationSettings::getEdgeWeightTableIndex(stk::topology elementTopology case stk::topology::QUAD_8_2D: case stk::topology::QUAD_9_2D: case stk::topology::SHELL_TRI_6: + case stk::topology::SHELL_TRI_6_ALL_FACE_SIDES: case stk::topology::SHELL_QUAD_9: + case stk::topology::SHELL_QUAD_9_ALL_FACE_SIDES: tableIndex = 5; break; case stk::topology::SHELL_QUAD_8: + case stk::topology::SHELL_QUAD_8_ALL_FACE_SIDES: case stk::topology::TET_8: case stk::topology::TET_10: case stk::topology::TET_11: diff --git a/packages/stk/stk_doc_tests/stk_io/CMakeLists.txt b/packages/stk/stk_doc_tests/stk_io/CMakeLists.txt index e6b488265330..31f248f4718b 100644 --- a/packages/stk/stk_doc_tests/stk_io/CMakeLists.txt +++ b/packages/stk/stk_doc_tests/stk_io/CMakeLists.txt @@ -60,7 +60,9 @@ else() add_test(NAME "stk_io_doc_tests" COMMAND stk_io_doc_tests) endif() -target_include_directories(stk_io_doc_tests PRIVATE - $ - $ -) +if(TARGET stk_io_doc_tests) + target_include_directories(stk_io_doc_tests PRIVATE + $ + $ + ) +endif() diff --git a/packages/stk/stk_doc_tests/stk_mesh/CMakeLists.txt b/packages/stk/stk_doc_tests/stk_mesh/CMakeLists.txt index 267584d712d4..c4d76d0a4811 100644 --- a/packages/stk/stk_doc_tests/stk_mesh/CMakeLists.txt +++ b/packages/stk/stk_doc_tests/stk_mesh/CMakeLists.txt @@ -56,8 +56,10 @@ else() add_test("stk_mesh_doc_tests" sh -c "mpiexec --np 1 ${CMAKE_CURRENT_BINARY_DIR}/stk_mesh_doc_tests --gtest_filter=StkMeshHowTo.iterate*") endif() -target_include_directories(stk_mesh_doc_tests PRIVATE - $ - $ -) +if(TARGET stk_mesh_doc_tests) + target_include_directories(stk_mesh_doc_tests PRIVATE + $ + $ + ) +endif() diff --git a/packages/stk/stk_doc_tests/stk_middle_mesh/CMakeLists.txt b/packages/stk/stk_doc_tests/stk_middle_mesh/CMakeLists.txt index 96070f6aeeea..4aa0e8d72bf2 100644 --- a/packages/stk/stk_doc_tests/stk_middle_mesh/CMakeLists.txt +++ b/packages/stk/stk_doc_tests/stk_middle_mesh/CMakeLists.txt @@ -24,7 +24,9 @@ else() add_test(NAME "stk_middle_mesh_doc_tests" COMMAND stk_middle_mesh_doc_tests) endif() -target_include_directories(stk_middle_mesh_doc_tests PRIVATE - $ - $ -) +if(TARGET stk_middle_mesh_doc_tests) + target_include_directories(stk_middle_mesh_doc_tests PRIVATE + $ + $ + ) +endif() diff --git a/packages/stk/stk_doc_tests/stk_search/CMakeLists.txt b/packages/stk/stk_doc_tests/stk_search/CMakeLists.txt index 2eddf3a8b94a..ef8d33d3a69f 100644 --- a/packages/stk/stk_doc_tests/stk_search/CMakeLists.txt +++ b/packages/stk/stk_doc_tests/stk_search/CMakeLists.txt @@ -58,7 +58,9 @@ else() add_test(NAME "stk_search_doc_tests" COMMAND stk_search_doc_tests) endif() -target_include_directories(stk_search_doc_tests PRIVATE - $ - $ -) +if(TARGET stk_search_doc_tests) + target_include_directories(stk_search_doc_tests PRIVATE + $ + $ + ) +endif() diff --git a/packages/stk/stk_doc_tests/stk_simd/CMakeLists.txt b/packages/stk/stk_doc_tests/stk_simd/CMakeLists.txt index ec2c7c338cef..a18161c1c687 100644 --- a/packages/stk/stk_doc_tests/stk_simd/CMakeLists.txt +++ b/packages/stk/stk_doc_tests/stk_simd/CMakeLists.txt @@ -26,7 +26,9 @@ else() target_link_libraries(stk_simd_doc_test stk_unit_main) endif() -target_include_directories(stk_simd_doc_test PRIVATE - $ - $ -) +if(TARGET stk_simd_doc_test) + target_include_directories(stk_simd_doc_test PRIVATE + $ + $ + ) +endif() diff --git a/packages/stk/stk_expreval/stk_expreval/Function.hpp b/packages/stk/stk_expreval/stk_expreval/Function.hpp index d8b91f959bdb..d04d74632406 100644 --- a/packages/stk/stk_expreval/stk_expreval/Function.hpp +++ b/packages/stk/stk_expreval/stk_expreval/Function.hpp @@ -121,6 +121,15 @@ enum class FunctionType { UNDEFINED }; +constexpr bool is_function_supported_on_device(FunctionType type) +{ + return type != FunctionType::RAND && + type != FunctionType::SRAND && + type != FunctionType::RANDOM && + type != FunctionType::TIME && + type != FunctionType::UNDEFINED; +} + KOKKOS_INLINE_FUNCTION double cycloidal_ramp(double t, double t1, double t2) { diff --git a/packages/stk/stk_expreval/stk_expreval/ParsedEval.hpp b/packages/stk/stk_expreval/stk_expreval/ParsedEval.hpp index 48d917a4c5f3..911901045355 100644 --- a/packages/stk/stk_expreval/stk_expreval/ParsedEval.hpp +++ b/packages/stk/stk_expreval/stk_expreval/ParsedEval.hpp @@ -36,6 +36,7 @@ #define PARSEDEVAL_HPP #include "Kokkos_Core.hpp" +#include "stk_expreval/Function.hpp" #include "stk_util/ngp/NgpSpaces.hpp" #include "stk_expreval/Eval.hpp" #include "stk_expreval/ParsedEvalBase.hpp" @@ -80,6 +81,20 @@ class ParsedEval : public ParsedEvalBase virtual int get_result_buffer_size() override { return RESULT_BUFFER_SIZE; } + void check_for_errors(bool will_run_on_device) const override + { + for (size_t i=0; i < m_hostNodes.size(); ++i) + { + const NgpNode& node = m_hostNodes(i); + if (node.m_opcode == OPCODE_FUNCTION) + { + FunctionType funcType = node.m_data.function.functionType; + STK_ThrowRequireMsg(funcType != FunctionType::UNDEFINED, "user defined functions are not supported by ParsedEval"); + STK_ThrowRequireMsg(will_run_on_device && is_function_supported_on_device(funcType), "random number generation and time functions not supported on device"); + } + } + } + KOKKOS_INLINE_FUNCTION int get_num_variables() const { return m_numVariables; } diff --git a/packages/stk/stk_expreval/stk_expreval/ParsedEvalBase.hpp b/packages/stk/stk_expreval/stk_expreval/ParsedEvalBase.hpp index 0eaba0ca1a3d..5f54b52ed888 100644 --- a/packages/stk/stk_expreval/stk_expreval/ParsedEvalBase.hpp +++ b/packages/stk/stk_expreval/stk_expreval/ParsedEvalBase.hpp @@ -50,6 +50,8 @@ class ParsedEvalBase KOKKOS_DEFAULTED_FUNCTION virtual ~ParsedEvalBase() = default; virtual int get_result_buffer_size() = 0; + + virtual void check_for_errors(bool will_run_on_device) const = 0; }; } diff --git a/packages/stk/stk_integration_tests/cmake_install_test/build_stk_no_stk_io_using_cmake b/packages/stk/stk_integration_tests/cmake_install_test/build_stk_no_stk_io_using_cmake index 39c3a1164915..52ebf2186893 100755 --- a/packages/stk/stk_integration_tests/cmake_install_test/build_stk_no_stk_io_using_cmake +++ b/packages/stk/stk_integration_tests/cmake_install_test/build_stk_no_stk_io_using_cmake @@ -74,7 +74,7 @@ if [ $? -ne 0 ] ; then fi printf "Now building trilinos/stk using make...\n"; -exe "make VERBOSE=1 -j8 >& ${stk_make_log}"; +exe "make VERBOSE=1 -j16 >& ${stk_make_log}"; if [ $? -ne 0 ] ; then echo "!! error in make, check output in ${stk_make_log} !!"; exit 1; diff --git a/packages/stk/stk_integration_tests/cmake_install_test/build_stk_using_cmake b/packages/stk/stk_integration_tests/cmake_install_test/build_stk_using_cmake index 503fa56863b3..bfdbb7887dc4 100755 --- a/packages/stk/stk_integration_tests/cmake_install_test/build_stk_using_cmake +++ b/packages/stk/stk_integration_tests/cmake_install_test/build_stk_using_cmake @@ -72,7 +72,7 @@ fi fi printf "Now building trilinos/stk using make...\n"; -exe "make VERBOSE=1 -j8 >& ${stk_make_log}"; +exe "make VERBOSE=1 -j16 >& ${stk_make_log}"; if [ $? -ne 0 ] ; then echo "!! error in make, check output in ${stk_make_log} !!"; exit 1; diff --git a/packages/stk/stk_integration_tests/cmake_install_test/run_cmake_stk_no_stk_io b/packages/stk/stk_integration_tests/cmake_install_test/run_cmake_stk_no_stk_io index 9943a53ae203..323dda3ef606 100755 --- a/packages/stk/stk_integration_tests/cmake_install_test/run_cmake_stk_no_stk_io +++ b/packages/stk/stk_integration_tests/cmake_install_test/run_cmake_stk_no_stk_io @@ -42,6 +42,7 @@ cmake \ -DKokkos_ARCH_VOLTA70=${cuda_on_or_off} \ -DTpetra_ENABLE_CUDA:BOOL=${cuda_on_or_off} \ -DSTK_ENABLE_TESTS:BOOL=ON \ +-DTrilinos_ENABLE_Intrepid2:BOOL=ON \ -DTrilinos_ENABLE_STK:BOOL=ON \ -DTrilinos_ENABLE_STKMesh:BOOL=ON \ -DTrilinos_ENABLE_STKIO:BOOL=OFF \ diff --git a/packages/stk/stk_mesh/stk_mesh/base/MetaData.cpp b/packages/stk/stk_mesh/stk_mesh/base/MetaData.cpp index 4d7995f8e1e8..67ac6017ab89 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/MetaData.cpp +++ b/packages/stk/stk_mesh/stk_mesh/base/MetaData.cpp @@ -606,9 +606,16 @@ void MetaData::internal_declare_known_cell_topology_parts() register_topology(stk::topology::SHELL_TRI_3); register_topology(stk::topology::SHELL_TRI_6); + register_topology(stk::topology::SHELL_TRI_3_ALL_FACE_SIDES); + register_topology(stk::topology::SHELL_TRI_6_ALL_FACE_SIDES); + register_topology(stk::topology::SHELL_QUAD_4); register_topology(stk::topology::SHELL_QUAD_8); register_topology(stk::topology::SHELL_QUAD_9); + + register_topology(stk::topology::SHELL_QUAD_4_ALL_FACE_SIDES); + register_topology(stk::topology::SHELL_QUAD_8_ALL_FACE_SIDES); + register_topology(stk::topology::SHELL_QUAD_9_ALL_FACE_SIDES); } } @@ -1261,22 +1268,32 @@ stk::topology get_topology( shards::CellTopology shards_topology, unsigned spati //else if ( shards_topology == shards::CellTopology(shards::getCellTopologyData< shards::Spring<3> >()) ) // t = stk::topology::SPRING_3; - else if ( shards_topology == shards::CellTopology(shards::getCellTopologyData< shards::ShellTriangle<3> >()) ) + else if ( shards_topology == shards::CellTopology(shards::getCellTopologyData< shards::ShellTriangle<3> >()) ) { t = stk::topology::SHELL_TRI_3; + // t = stk::topology::SHELL_TRI_3_ALL_FACE_SIDES; + } //NOTE: shards does not define a shell triangle 4 //else if ( shards_topology == shards::CellTopology(shards::getCellTopologyData< shards::ShellTriangle<4> >()) ) // t = stk::topology::SHELL_TRI_4; - else if ( shards_topology == shards::CellTopology(shards::getCellTopologyData< shards::ShellTriangle<6> >()) ) + else if ( shards_topology == shards::CellTopology(shards::getCellTopologyData< shards::ShellTriangle<6> >()) ) { t = stk::topology::SHELL_TRI_6; + // t = stk::topology::SHELL_TRI_6_ALL_FACE_SIDES; + } - else if ( shards_topology == shards::CellTopology(shards::getCellTopologyData< shards::ShellQuadrilateral<4> >()) ) + else if ( shards_topology == shards::CellTopology(shards::getCellTopologyData< shards::ShellQuadrilateral<4> >()) ) { t = stk::topology::SHELL_QUAD_4; - else if ( shards_topology == shards::CellTopology(shards::getCellTopologyData< shards::ShellQuadrilateral<8> >()) ) + // t = stk::topology::SHELL_QUAD_4_ALL_FACE_SIDES; + } + else if ( shards_topology == shards::CellTopology(shards::getCellTopologyData< shards::ShellQuadrilateral<8> >()) ) { t = stk::topology::SHELL_QUAD_8; - else if ( shards_topology == shards::CellTopology(shards::getCellTopologyData< shards::ShellQuadrilateral<9> >()) ) + // t = stk::topology::SHELL_QUAD_8_ALL_FACE_SIDES; + } + else if ( shards_topology == shards::CellTopology(shards::getCellTopologyData< shards::ShellQuadrilateral<9> >()) ) { t = stk::topology::SHELL_QUAD_9; + // t = stk::topology::SHELL_QUAD_9_ALL_FACE_SIDES; + } else if ( shards_topology == shards::CellTopology(shards::getCellTopologyData< shards::Tetrahedron<4> >()) ) t = stk::topology::TET_4; @@ -1389,12 +1406,25 @@ shards::CellTopology get_cell_topology(stk::topology t) //return shards::CellTopology(shards::getCellTopologyData>()); case stk::topology::SHELL_TRI_6: return shards::CellTopology(shards::getCellTopologyData>()); + case stk::topology::SHELL_TRI_3_ALL_FACE_SIDES: + return shards::CellTopology(shards::getCellTopologyData>()); + case stk::topology::SHELL_TRI_4_ALL_FACE_SIDES: break; + //NOTE: shards does not define a topology for a 4-noded triangular shell + //return shards::CellTopology(shards::getCellTopologyData>()); + case stk::topology::SHELL_TRI_6_ALL_FACE_SIDES: + return shards::CellTopology(shards::getCellTopologyData>()); case stk::topology::SHELL_QUAD_4: return shards::CellTopology(shards::getCellTopologyData>()); case stk::topology::SHELL_QUAD_8: return shards::CellTopology(shards::getCellTopologyData>()); case stk::topology::SHELL_QUAD_9: return shards::CellTopology(shards::getCellTopologyData>()); + case stk::topology::SHELL_QUAD_4_ALL_FACE_SIDES: + return shards::CellTopology(shards::getCellTopologyData>()); + case stk::topology::SHELL_QUAD_8_ALL_FACE_SIDES: + return shards::CellTopology(shards::getCellTopologyData>()); + case stk::topology::SHELL_QUAD_9_ALL_FACE_SIDES: + return shards::CellTopology(shards::getCellTopologyData>()); case stk::topology::TET_4: return shards::CellTopology(shards::getCellTopologyData>()); case stk::topology::TET_8: diff --git a/packages/stk/stk_mesh/stk_mesh/base/NgpFieldBLAS.hpp b/packages/stk/stk_mesh/stk_mesh/base/NgpFieldBLAS.hpp index ff94b25073f0..84d8132f08bf 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/NgpFieldBLAS.hpp +++ b/packages/stk/stk_mesh/stk_mesh/base/NgpFieldBLAS.hpp @@ -110,6 +110,37 @@ void field_copy(const FieldBase& xField, ngp_field_blas::impl::field_copy_impl(xField, yField, &selector, execSpace, isDeviceExecSpaceUserOverride); } +template +inline void field_axpby(const stk::mesh::BulkData& mesh, + const DataType alpha, + const stk::mesh::FieldBase & xField, + const DataType beta, + const stk::mesh::FieldBase & yField, + const stk::mesh::Selector & selector, + const EXEC_SPACE& execSpace, + bool IsDeviceExecSpaceUserOverride = (!std::is_same_v)) +{ + // y = a*x + b*y + + if constexpr (ngp_field_blas::impl::operate_on_ngp_mesh()) { + ngp_field_blas::impl::apply_functor_on_field( + mesh, yField, xField, yField, alpha, beta, selector); + } + else { + xField.sync_to_host(); + yField.sync_to_host(); + stk::mesh::field_axpby(alpha, xField, beta, yField, selector); + } + + yField.clear_sync_state(); + if (ngp_field_blas::impl::mark_modified_on_device(execSpace, IsDeviceExecSpaceUserOverride)) { + yField.modify_on_device(); + } + else { + yField.modify_on_host(); + } +} + template inline void field_axpbyz(const stk::mesh::BulkData& mesh, const DataType alpha, diff --git a/packages/stk/stk_search_util/Jamfile b/packages/stk/stk_search_util/Jamfile index dd020dab7fd5..133dca0e88d5 100644 --- a/packages/stk/stk_search_util/Jamfile +++ b/packages/stk/stk_search_util/Jamfile @@ -143,6 +143,7 @@ lib stk_search_util_base /sierra/stk_search//stk_search /sierra/stk_mesh//stk_mesh_base /sierra/stk_util//stk_util_diag + /tpl/trilinos//intrepid2 : [ ifuserbuild # Any parameters within this 'ifuserbuild' block apply to user diff --git a/packages/stk/stk_tools/stk_tools/CMakeLists.txt b/packages/stk/stk_tools/stk_tools/CMakeLists.txt index 0881245011ee..1e23d08ad8e2 100644 --- a/packages/stk/stk_tools/stk_tools/CMakeLists.txt +++ b/packages/stk/stk_tools/stk_tools/CMakeLists.txt @@ -133,7 +133,9 @@ if (STK_HAS_SEACAS_NEMESIS) ${${PROJECT_NAME}_INSTALL_INCLUDE_DIR}/stk_tools/pmesh_lib) endif() -INSTALL(TARGETS stk_block_extractor COMPONENT ${PACKAGE_NAME} RUNTIME DESTINATION ${${PROJECT_NAME}_INSTALL_RUNTIME_DIR}) +if(TARGET stk_block_extractor) + INSTALL(TARGETS stk_block_extractor COMPONENT ${PACKAGE_NAME} RUNTIME DESTINATION ${${PROJECT_NAME}_INSTALL_RUNTIME_DIR}) +endif() if(NOT HAVE_STK_Trilinos) INSTALL(TARGETS stk_transfer_utils_lib EXPORT stkTargets DESTINATION ${STK_INSTALL_LIBDIR}) diff --git a/packages/stk/stk_topology/stk_topology/apply_functor.hpp b/packages/stk/stk_topology/stk_topology/apply_functor.hpp index b9b1a73e8360..299d5972a1fb 100644 --- a/packages/stk/stk_topology/stk_topology/apply_functor.hpp +++ b/packages/stk/stk_topology/stk_topology/apply_functor.hpp @@ -60,54 +60,60 @@ struct topology::apply_host_functor { switch(t) { - case INVALID_TOPOLOGY: return m_functor( topology_type< INVALID_TOPOLOGY >() ); - case NODE: return m_functor( topology_type< NODE >() ); - case LINE_2: return m_functor( topology_type< LINE_2 >() ); - case LINE_3: return m_functor( topology_type< LINE_3 >() ); - case TRI_3: return m_functor( topology_type< TRI_3 >() ); - case TRI_4: return m_functor( topology_type< TRI_4 >() ); - case TRI_6: return m_functor( topology_type< TRI_6 >() ); - case QUAD_4: return m_functor( topology_type< QUAD_4 >() ); - case QUAD_6: return m_functor( topology_type< QUAD_6 >() ); - case QUAD_8: return m_functor( topology_type< QUAD_8 >() ); - case QUAD_9: return m_functor( topology_type< QUAD_9 >() ); - case PARTICLE: return m_functor( topology_type< PARTICLE >() ); - case LINE_2_1D: return m_functor( topology_type< LINE_2_1D >() ); - case LINE_3_1D: return m_functor( topology_type< LINE_3_1D >() ); - case BEAM_2: return m_functor( topology_type< BEAM_2 >() ); - case BEAM_3: return m_functor( topology_type< BEAM_3 >() ); - case SHELL_LINE_2: return m_functor( topology_type< SHELL_LINE_2 >() ); - case SHELL_LINE_3: return m_functor( topology_type< SHELL_LINE_3 >() ); - case SHELL_SIDE_BEAM_2: return m_functor( topology_type< SHELL_SIDE_BEAM_2 >() ); - case SHELL_SIDE_BEAM_3: return m_functor( topology_type< SHELL_SIDE_BEAM_3 >() ); - case SPRING_2: return m_functor( topology_type< SPRING_2 >() ); - case SPRING_3: return m_functor( topology_type< SPRING_3 >() ); - case TRI_3_2D: return m_functor( topology_type< TRI_3_2D >() ); - case TRI_4_2D: return m_functor( topology_type< TRI_4_2D >() ); - case TRI_6_2D: return m_functor( topology_type< TRI_6_2D >() ); - case QUAD_4_2D: return m_functor( topology_type< QUAD_4_2D >() ); - case QUAD_8_2D: return m_functor( topology_type< QUAD_8_2D >() ); - case QUAD_9_2D: return m_functor( topology_type< QUAD_9_2D >() ); - case SHELL_TRI_3: return m_functor( topology_type< SHELL_TRI_3 >() ); - case SHELL_TRI_4: return m_functor( topology_type< SHELL_TRI_4 >() ); - case SHELL_TRI_6: return m_functor( topology_type< SHELL_TRI_6 >() ); - case SHELL_QUAD_4: return m_functor( topology_type< SHELL_QUAD_4 >() ); - case SHELL_QUAD_8: return m_functor( topology_type< SHELL_QUAD_8 >() ); - case SHELL_QUAD_9: return m_functor( topology_type< SHELL_QUAD_9 >() ); - case TET_4: return m_functor( topology_type< TET_4 >() ); - case TET_8: return m_functor( topology_type< TET_8 >() ); - case TET_10: return m_functor( topology_type< TET_10 >() ); - case TET_11: return m_functor( topology_type< TET_11 >() ); - case PYRAMID_5: return m_functor( topology_type< PYRAMID_5 >() ); - case PYRAMID_13: return m_functor( topology_type< PYRAMID_13 >() ); - case PYRAMID_14: return m_functor( topology_type< PYRAMID_14 >() ); - case WEDGE_6: return m_functor( topology_type< WEDGE_6 >() ); - case WEDGE_12: return m_functor( topology_type< WEDGE_12 >() ); - case WEDGE_15: return m_functor( topology_type< WEDGE_15 >() ); - case WEDGE_18: return m_functor( topology_type< WEDGE_18 >() ); - case HEX_8: return m_functor( topology_type< HEX_8 >() ); - case HEX_20: return m_functor( topology_type< HEX_20 >() ); - case HEX_27: return m_functor( topology_type< HEX_27 >() ); + case INVALID_TOPOLOGY: return m_functor( topology_type< INVALID_TOPOLOGY >() ); + case NODE: return m_functor( topology_type< NODE >() ); + case LINE_2: return m_functor( topology_type< LINE_2 >() ); + case LINE_3: return m_functor( topology_type< LINE_3 >() ); + case TRI_3: return m_functor( topology_type< TRI_3 >() ); + case TRI_4: return m_functor( topology_type< TRI_4 >() ); + case TRI_6: return m_functor( topology_type< TRI_6 >() ); + case QUAD_4: return m_functor( topology_type< QUAD_4 >() ); + case QUAD_6: return m_functor( topology_type< QUAD_6 >() ); + case QUAD_8: return m_functor( topology_type< QUAD_8 >() ); + case QUAD_9: return m_functor( topology_type< QUAD_9 >() ); + case PARTICLE: return m_functor( topology_type< PARTICLE >() ); + case LINE_2_1D: return m_functor( topology_type< LINE_2_1D >() ); + case LINE_3_1D: return m_functor( topology_type< LINE_3_1D >() ); + case BEAM_2: return m_functor( topology_type< BEAM_2 >() ); + case BEAM_3: return m_functor( topology_type< BEAM_3 >() ); + case SHELL_LINE_2: return m_functor( topology_type< SHELL_LINE_2 >() ); + case SHELL_LINE_3: return m_functor( topology_type< SHELL_LINE_3 >() ); + case SHELL_SIDE_BEAM_2: return m_functor( topology_type< SHELL_SIDE_BEAM_2 >() ); + case SHELL_SIDE_BEAM_3: return m_functor( topology_type< SHELL_SIDE_BEAM_3 >() ); + case SPRING_2: return m_functor( topology_type< SPRING_2 >() ); + case SPRING_3: return m_functor( topology_type< SPRING_3 >() ); + case TRI_3_2D: return m_functor( topology_type< TRI_3_2D >() ); + case TRI_4_2D: return m_functor( topology_type< TRI_4_2D >() ); + case TRI_6_2D: return m_functor( topology_type< TRI_6_2D >() ); + case QUAD_4_2D: return m_functor( topology_type< QUAD_4_2D >() ); + case QUAD_8_2D: return m_functor( topology_type< QUAD_8_2D >() ); + case QUAD_9_2D: return m_functor( topology_type< QUAD_9_2D >() ); + case SHELL_TRI_3: return m_functor( topology_type< SHELL_TRI_3 >() ); + case SHELL_TRI_4: return m_functor( topology_type< SHELL_TRI_4 >() ); + case SHELL_TRI_6: return m_functor( topology_type< SHELL_TRI_6 >() ); + case SHELL_TRI_3_ALL_FACE_SIDES: return m_functor( topology_type< SHELL_TRI_3_ALL_FACE_SIDES >() ); + case SHELL_TRI_4_ALL_FACE_SIDES: return m_functor( topology_type< SHELL_TRI_4_ALL_FACE_SIDES >() ); + case SHELL_TRI_6_ALL_FACE_SIDES: return m_functor( topology_type< SHELL_TRI_6_ALL_FACE_SIDES >() ); + case SHELL_QUAD_4: return m_functor( topology_type< SHELL_QUAD_4 >() ); + case SHELL_QUAD_8: return m_functor( topology_type< SHELL_QUAD_8 >() ); + case SHELL_QUAD_9: return m_functor( topology_type< SHELL_QUAD_9 >() ); + case SHELL_QUAD_4_ALL_FACE_SIDES: return m_functor( topology_type< SHELL_QUAD_4_ALL_FACE_SIDES >() ); + case SHELL_QUAD_8_ALL_FACE_SIDES: return m_functor( topology_type< SHELL_QUAD_8_ALL_FACE_SIDES >() ); + case SHELL_QUAD_9_ALL_FACE_SIDES: return m_functor( topology_type< SHELL_QUAD_9_ALL_FACE_SIDES >() ); + case TET_4: return m_functor( topology_type< TET_4 >() ); + case TET_8: return m_functor( topology_type< TET_8 >() ); + case TET_10: return m_functor( topology_type< TET_10 >() ); + case TET_11: return m_functor( topology_type< TET_11 >() ); + case PYRAMID_5: return m_functor( topology_type< PYRAMID_5 >() ); + case PYRAMID_13: return m_functor( topology_type< PYRAMID_13 >() ); + case PYRAMID_14: return m_functor( topology_type< PYRAMID_14 >() ); + case WEDGE_6: return m_functor( topology_type< WEDGE_6 >() ); + case WEDGE_12: return m_functor( topology_type< WEDGE_12 >() ); + case WEDGE_15: return m_functor( topology_type< WEDGE_15 >() ); + case WEDGE_18: return m_functor( topology_type< WEDGE_18 >() ); + case HEX_8: return m_functor( topology_type< HEX_8 >() ); + case HEX_20: return m_functor( topology_type< HEX_20 >() ); + case HEX_27: return m_functor( topology_type< HEX_27 >() ); default: break; } return m_functor( topology_type() ); @@ -117,54 +123,60 @@ struct topology::apply_host_functor { switch(t) { - case INVALID_TOPOLOGY: return m_functor( topology_type< INVALID_TOPOLOGY >() ); - case NODE: return m_functor( topology_type< NODE >() ); - case LINE_2: return m_functor( topology_type< LINE_2 >() ); - case LINE_3: return m_functor( topology_type< LINE_3 >() ); - case TRI_3: return m_functor( topology_type< TRI_3 >() ); - case TRI_4: return m_functor( topology_type< TRI_4 >() ); - case TRI_6: return m_functor( topology_type< TRI_6 >() ); - case QUAD_4: return m_functor( topology_type< QUAD_4 >() ); - case QUAD_6: return m_functor( topology_type< QUAD_6 >() ); - case QUAD_8: return m_functor( topology_type< QUAD_8 >() ); - case QUAD_9: return m_functor( topology_type< QUAD_9 >() ); - case PARTICLE: return m_functor( topology_type< PARTICLE >() ); - case LINE_2_1D: return m_functor( topology_type< LINE_2_1D >() ); - case LINE_3_1D: return m_functor( topology_type< LINE_3_1D >() ); - case BEAM_2: return m_functor( topology_type< BEAM_2 >() ); - case BEAM_3: return m_functor( topology_type< BEAM_3 >() ); - case SHELL_LINE_2: return m_functor( topology_type< SHELL_LINE_2 >() ); - case SHELL_LINE_3: return m_functor( topology_type< SHELL_LINE_3 >() ); - case SHELL_SIDE_BEAM_2: return m_functor( topology_type< SHELL_SIDE_BEAM_2 >() ); - case SHELL_SIDE_BEAM_3: return m_functor( topology_type< SHELL_SIDE_BEAM_3 >() ); - case SPRING_2: return m_functor( topology_type< SPRING_2 >() ); - case SPRING_3: return m_functor( topology_type< SPRING_3 >() ); - case TRI_3_2D: return m_functor( topology_type< TRI_3_2D >() ); - case TRI_4_2D: return m_functor( topology_type< TRI_4_2D >() ); - case TRI_6_2D: return m_functor( topology_type< TRI_6_2D >() ); - case QUAD_4_2D: return m_functor( topology_type< QUAD_4_2D >() ); - case QUAD_8_2D: return m_functor( topology_type< QUAD_8_2D >() ); - case QUAD_9_2D: return m_functor( topology_type< QUAD_9_2D >() ); - case SHELL_TRI_3: return m_functor( topology_type< SHELL_TRI_3 >() ); - case SHELL_TRI_4: return m_functor( topology_type< SHELL_TRI_4 >() ); - case SHELL_TRI_6: return m_functor( topology_type< SHELL_TRI_6 >() ); - case SHELL_QUAD_4: return m_functor( topology_type< SHELL_QUAD_4 >() ); - case SHELL_QUAD_8: return m_functor( topology_type< SHELL_QUAD_8 >() ); - case SHELL_QUAD_9: return m_functor( topology_type< SHELL_QUAD_9 >() ); - case TET_4: return m_functor( topology_type< TET_4 >() ); - case TET_8: return m_functor( topology_type< TET_8 >() ); - case TET_10: return m_functor( topology_type< TET_10 >() ); - case TET_11: return m_functor( topology_type< TET_11 >() ); - case PYRAMID_5: return m_functor( topology_type< PYRAMID_5 >() ); - case PYRAMID_13: return m_functor( topology_type< PYRAMID_13 >() ); - case PYRAMID_14: return m_functor( topology_type< PYRAMID_14 >() ); - case WEDGE_6: return m_functor( topology_type< WEDGE_6 >() ); - case WEDGE_12: return m_functor( topology_type< WEDGE_12 >() ); - case WEDGE_15: return m_functor( topology_type< WEDGE_15 >() ); - case WEDGE_18: return m_functor( topology_type< WEDGE_18 >() ); - case HEX_8: return m_functor( topology_type< HEX_8 >() ); - case HEX_20: return m_functor( topology_type< HEX_20 >() ); - case HEX_27: return m_functor( topology_type< HEX_27 >() ); + case INVALID_TOPOLOGY: return m_functor( topology_type< INVALID_TOPOLOGY >() ); + case NODE: return m_functor( topology_type< NODE >() ); + case LINE_2: return m_functor( topology_type< LINE_2 >() ); + case LINE_3: return m_functor( topology_type< LINE_3 >() ); + case TRI_3: return m_functor( topology_type< TRI_3 >() ); + case TRI_4: return m_functor( topology_type< TRI_4 >() ); + case TRI_6: return m_functor( topology_type< TRI_6 >() ); + case QUAD_4: return m_functor( topology_type< QUAD_4 >() ); + case QUAD_6: return m_functor( topology_type< QUAD_6 >() ); + case QUAD_8: return m_functor( topology_type< QUAD_8 >() ); + case QUAD_9: return m_functor( topology_type< QUAD_9 >() ); + case PARTICLE: return m_functor( topology_type< PARTICLE >() ); + case LINE_2_1D: return m_functor( topology_type< LINE_2_1D >() ); + case LINE_3_1D: return m_functor( topology_type< LINE_3_1D >() ); + case BEAM_2: return m_functor( topology_type< BEAM_2 >() ); + case BEAM_3: return m_functor( topology_type< BEAM_3 >() ); + case SHELL_LINE_2: return m_functor( topology_type< SHELL_LINE_2 >() ); + case SHELL_LINE_3: return m_functor( topology_type< SHELL_LINE_3 >() ); + case SHELL_SIDE_BEAM_2: return m_functor( topology_type< SHELL_SIDE_BEAM_2 >() ); + case SHELL_SIDE_BEAM_3: return m_functor( topology_type< SHELL_SIDE_BEAM_3 >() ); + case SPRING_2: return m_functor( topology_type< SPRING_2 >() ); + case SPRING_3: return m_functor( topology_type< SPRING_3 >() ); + case TRI_3_2D: return m_functor( topology_type< TRI_3_2D >() ); + case TRI_4_2D: return m_functor( topology_type< TRI_4_2D >() ); + case TRI_6_2D: return m_functor( topology_type< TRI_6_2D >() ); + case QUAD_4_2D: return m_functor( topology_type< QUAD_4_2D >() ); + case QUAD_8_2D: return m_functor( topology_type< QUAD_8_2D >() ); + case QUAD_9_2D: return m_functor( topology_type< QUAD_9_2D >() ); + case SHELL_TRI_3: return m_functor( topology_type< SHELL_TRI_3 >() ); + case SHELL_TRI_4: return m_functor( topology_type< SHELL_TRI_4 >() ); + case SHELL_TRI_6: return m_functor( topology_type< SHELL_TRI_6 >() ); + case SHELL_TRI_3_ALL_FACE_SIDES: return m_functor( topology_type< SHELL_TRI_3_ALL_FACE_SIDES >() ); + case SHELL_TRI_4_ALL_FACE_SIDES: return m_functor( topology_type< SHELL_TRI_4_ALL_FACE_SIDES >() ); + case SHELL_TRI_6_ALL_FACE_SIDES: return m_functor( topology_type< SHELL_TRI_6_ALL_FACE_SIDES >() ); + case SHELL_QUAD_4: return m_functor( topology_type< SHELL_QUAD_4 >() ); + case SHELL_QUAD_8: return m_functor( topology_type< SHELL_QUAD_8 >() ); + case SHELL_QUAD_9: return m_functor( topology_type< SHELL_QUAD_9 >() ); + case SHELL_QUAD_4_ALL_FACE_SIDES: return m_functor( topology_type< SHELL_QUAD_4_ALL_FACE_SIDES >() ); + case SHELL_QUAD_8_ALL_FACE_SIDES: return m_functor( topology_type< SHELL_QUAD_8_ALL_FACE_SIDES >() ); + case SHELL_QUAD_9_ALL_FACE_SIDES: return m_functor( topology_type< SHELL_QUAD_9_ALL_FACE_SIDES >() ); + case TET_4: return m_functor( topology_type< TET_4 >() ); + case TET_8: return m_functor( topology_type< TET_8 >() ); + case TET_10: return m_functor( topology_type< TET_10 >() ); + case TET_11: return m_functor( topology_type< TET_11 >() ); + case PYRAMID_5: return m_functor( topology_type< PYRAMID_5 >() ); + case PYRAMID_13: return m_functor( topology_type< PYRAMID_13 >() ); + case PYRAMID_14: return m_functor( topology_type< PYRAMID_14 >() ); + case WEDGE_6: return m_functor( topology_type< WEDGE_6 >() ); + case WEDGE_12: return m_functor( topology_type< WEDGE_12 >() ); + case WEDGE_15: return m_functor( topology_type< WEDGE_15 >() ); + case WEDGE_18: return m_functor( topology_type< WEDGE_18 >() ); + case HEX_8: return m_functor( topology_type< HEX_8 >() ); + case HEX_20: return m_functor( topology_type< HEX_20 >() ); + case HEX_27: return m_functor( topology_type< HEX_27 >() ); default: break; } return m_functor( topology_type() ); @@ -193,54 +205,60 @@ struct topology::apply_functor { switch(t) { - case INVALID_TOPOLOGY: return m_functor( topology_type< INVALID_TOPOLOGY >() ); - case NODE: return m_functor( topology_type< NODE >() ); - case LINE_2: return m_functor( topology_type< LINE_2 >() ); - case LINE_3: return m_functor( topology_type< LINE_3 >() ); - case TRI_3: return m_functor( topology_type< TRI_3 >() ); - case TRI_4: return m_functor( topology_type< TRI_4 >() ); - case TRI_6: return m_functor( topology_type< TRI_6 >() ); - case QUAD_4: return m_functor( topology_type< QUAD_4 >() ); - case QUAD_6: return m_functor( topology_type< QUAD_6 >() ); - case QUAD_8: return m_functor( topology_type< QUAD_8 >() ); - case QUAD_9: return m_functor( topology_type< QUAD_9 >() ); - case PARTICLE: return m_functor( topology_type< PARTICLE >() ); - case LINE_2_1D: return m_functor( topology_type< LINE_2_1D >() ); - case LINE_3_1D: return m_functor( topology_type< LINE_3_1D >() ); - case BEAM_2: return m_functor( topology_type< BEAM_2 >() ); - case BEAM_3: return m_functor( topology_type< BEAM_3 >() ); - case SHELL_LINE_2: return m_functor( topology_type< SHELL_LINE_2 >() ); - case SHELL_LINE_3: return m_functor( topology_type< SHELL_LINE_3 >() ); - case SHELL_SIDE_BEAM_2: return m_functor( topology_type< SHELL_SIDE_BEAM_2 >() ); - case SHELL_SIDE_BEAM_3: return m_functor( topology_type< SHELL_SIDE_BEAM_3 >() ); - case SPRING_2: return m_functor( topology_type< SPRING_2 >() ); - case SPRING_3: return m_functor( topology_type< SPRING_3 >() ); - case TRI_3_2D: return m_functor( topology_type< TRI_3_2D >() ); - case TRI_4_2D: return m_functor( topology_type< TRI_4_2D >() ); - case TRI_6_2D: return m_functor( topology_type< TRI_6_2D >() ); - case QUAD_4_2D: return m_functor( topology_type< QUAD_4_2D >() ); - case QUAD_8_2D: return m_functor( topology_type< QUAD_8_2D >() ); - case QUAD_9_2D: return m_functor( topology_type< QUAD_9_2D >() ); - case SHELL_TRI_3: return m_functor( topology_type< SHELL_TRI_3 >() ); - case SHELL_TRI_4: return m_functor( topology_type< SHELL_TRI_4 >() ); - case SHELL_TRI_6: return m_functor( topology_type< SHELL_TRI_6 >() ); - case SHELL_QUAD_4: return m_functor( topology_type< SHELL_QUAD_4 >() ); - case SHELL_QUAD_8: return m_functor( topology_type< SHELL_QUAD_8 >() ); - case SHELL_QUAD_9: return m_functor( topology_type< SHELL_QUAD_9 >() ); - case TET_4: return m_functor( topology_type< TET_4 >() ); - case TET_8: return m_functor( topology_type< TET_8 >() ); - case TET_10: return m_functor( topology_type< TET_10 >() ); - case TET_11: return m_functor( topology_type< TET_11 >() ); - case PYRAMID_5: return m_functor( topology_type< PYRAMID_5 >() ); - case PYRAMID_13: return m_functor( topology_type< PYRAMID_13 >() ); - case PYRAMID_14: return m_functor( topology_type< PYRAMID_14 >() ); - case WEDGE_6: return m_functor( topology_type< WEDGE_6 >() ); - case WEDGE_12: return m_functor( topology_type< WEDGE_12 >() ); - case WEDGE_15: return m_functor( topology_type< WEDGE_15 >() ); - case WEDGE_18: return m_functor( topology_type< WEDGE_18 >() ); - case HEX_8: return m_functor( topology_type< HEX_8 >() ); - case HEX_20: return m_functor( topology_type< HEX_20 >() ); - case HEX_27: return m_functor( topology_type< HEX_27 >() ); + case INVALID_TOPOLOGY: return m_functor( topology_type< INVALID_TOPOLOGY >() ); + case NODE: return m_functor( topology_type< NODE >() ); + case LINE_2: return m_functor( topology_type< LINE_2 >() ); + case LINE_3: return m_functor( topology_type< LINE_3 >() ); + case TRI_3: return m_functor( topology_type< TRI_3 >() ); + case TRI_4: return m_functor( topology_type< TRI_4 >() ); + case TRI_6: return m_functor( topology_type< TRI_6 >() ); + case QUAD_4: return m_functor( topology_type< QUAD_4 >() ); + case QUAD_6: return m_functor( topology_type< QUAD_6 >() ); + case QUAD_8: return m_functor( topology_type< QUAD_8 >() ); + case QUAD_9: return m_functor( topology_type< QUAD_9 >() ); + case PARTICLE: return m_functor( topology_type< PARTICLE >() ); + case LINE_2_1D: return m_functor( topology_type< LINE_2_1D >() ); + case LINE_3_1D: return m_functor( topology_type< LINE_3_1D >() ); + case BEAM_2: return m_functor( topology_type< BEAM_2 >() ); + case BEAM_3: return m_functor( topology_type< BEAM_3 >() ); + case SHELL_LINE_2: return m_functor( topology_type< SHELL_LINE_2 >() ); + case SHELL_LINE_3: return m_functor( topology_type< SHELL_LINE_3 >() ); + case SHELL_SIDE_BEAM_2: return m_functor( topology_type< SHELL_SIDE_BEAM_2 >() ); + case SHELL_SIDE_BEAM_3: return m_functor( topology_type< SHELL_SIDE_BEAM_3 >() ); + case SPRING_2: return m_functor( topology_type< SPRING_2 >() ); + case SPRING_3: return m_functor( topology_type< SPRING_3 >() ); + case TRI_3_2D: return m_functor( topology_type< TRI_3_2D >() ); + case TRI_4_2D: return m_functor( topology_type< TRI_4_2D >() ); + case TRI_6_2D: return m_functor( topology_type< TRI_6_2D >() ); + case QUAD_4_2D: return m_functor( topology_type< QUAD_4_2D >() ); + case QUAD_8_2D: return m_functor( topology_type< QUAD_8_2D >() ); + case QUAD_9_2D: return m_functor( topology_type< QUAD_9_2D >() ); + case SHELL_TRI_3: return m_functor( topology_type< SHELL_TRI_3 >() ); + case SHELL_TRI_4: return m_functor( topology_type< SHELL_TRI_4 >() ); + case SHELL_TRI_6: return m_functor( topology_type< SHELL_TRI_6 >() ); + case SHELL_TRI_3_ALL_FACE_SIDES: return m_functor( topology_type< SHELL_TRI_3_ALL_FACE_SIDES >() ); + case SHELL_TRI_4_ALL_FACE_SIDES: return m_functor( topology_type< SHELL_TRI_4_ALL_FACE_SIDES >() ); + case SHELL_TRI_6_ALL_FACE_SIDES: return m_functor( topology_type< SHELL_TRI_6_ALL_FACE_SIDES >() ); + case SHELL_QUAD_4: return m_functor( topology_type< SHELL_QUAD_4 >() ); + case SHELL_QUAD_8: return m_functor( topology_type< SHELL_QUAD_8 >() ); + case SHELL_QUAD_9: return m_functor( topology_type< SHELL_QUAD_9 >() ); + case SHELL_QUAD_4_ALL_FACE_SIDES: return m_functor( topology_type< SHELL_QUAD_4_ALL_FACE_SIDES >() ); + case SHELL_QUAD_8_ALL_FACE_SIDES: return m_functor( topology_type< SHELL_QUAD_8_ALL_FACE_SIDES >() ); + case SHELL_QUAD_9_ALL_FACE_SIDES: return m_functor( topology_type< SHELL_QUAD_9_ALL_FACE_SIDES >() ); + case TET_4: return m_functor( topology_type< TET_4 >() ); + case TET_8: return m_functor( topology_type< TET_8 >() ); + case TET_10: return m_functor( topology_type< TET_10 >() ); + case TET_11: return m_functor( topology_type< TET_11 >() ); + case PYRAMID_5: return m_functor( topology_type< PYRAMID_5 >() ); + case PYRAMID_13: return m_functor( topology_type< PYRAMID_13 >() ); + case PYRAMID_14: return m_functor( topology_type< PYRAMID_14 >() ); + case WEDGE_6: return m_functor( topology_type< WEDGE_6 >() ); + case WEDGE_12: return m_functor( topology_type< WEDGE_12 >() ); + case WEDGE_15: return m_functor( topology_type< WEDGE_15 >() ); + case WEDGE_18: return m_functor( topology_type< WEDGE_18 >() ); + case HEX_8: return m_functor( topology_type< HEX_8 >() ); + case HEX_20: return m_functor( topology_type< HEX_20 >() ); + case HEX_27: return m_functor( topology_type< HEX_27 >() ); default: break; } return m_functor( topology_type() ); @@ -251,54 +269,60 @@ struct topology::apply_functor { switch(t) { - case INVALID_TOPOLOGY: return m_functor( topology_type< INVALID_TOPOLOGY >() ); - case NODE: return m_functor( topology_type< NODE >() ); - case LINE_2: return m_functor( topology_type< LINE_2 >() ); - case LINE_3: return m_functor( topology_type< LINE_3 >() ); - case TRI_3: return m_functor( topology_type< TRI_3 >() ); - case TRI_4: return m_functor( topology_type< TRI_4 >() ); - case TRI_6: return m_functor( topology_type< TRI_6 >() ); - case QUAD_4: return m_functor( topology_type< QUAD_4 >() ); - case QUAD_6: return m_functor( topology_type< QUAD_6 >() ); - case QUAD_8: return m_functor( topology_type< QUAD_8 >() ); - case QUAD_9: return m_functor( topology_type< QUAD_9 >() ); - case PARTICLE: return m_functor( topology_type< PARTICLE >() ); - case LINE_2_1D: return m_functor( topology_type< LINE_2_1D >() ); - case LINE_3_1D: return m_functor( topology_type< LINE_3_1D >() ); - case BEAM_2: return m_functor( topology_type< BEAM_2 >() ); - case BEAM_3: return m_functor( topology_type< BEAM_3 >() ); - case SHELL_LINE_2: return m_functor( topology_type< SHELL_LINE_2 >() ); - case SHELL_LINE_3: return m_functor( topology_type< SHELL_LINE_3 >() ); - case SHELL_SIDE_BEAM_2: return m_functor( topology_type< SHELL_SIDE_BEAM_2 >() ); - case SHELL_SIDE_BEAM_3: return m_functor( topology_type< SHELL_SIDE_BEAM_3 >() ); - case SPRING_2: return m_functor( topology_type< SPRING_2 >() ); - case SPRING_3: return m_functor( topology_type< SPRING_3 >() ); - case TRI_3_2D: return m_functor( topology_type< TRI_3_2D >() ); - case TRI_4_2D: return m_functor( topology_type< TRI_4_2D >() ); - case TRI_6_2D: return m_functor( topology_type< TRI_6_2D >() ); - case QUAD_4_2D: return m_functor( topology_type< QUAD_4_2D >() ); - case QUAD_8_2D: return m_functor( topology_type< QUAD_8_2D >() ); - case QUAD_9_2D: return m_functor( topology_type< QUAD_9_2D >() ); - case SHELL_TRI_3: return m_functor( topology_type< SHELL_TRI_3 >() ); - case SHELL_TRI_4: return m_functor( topology_type< SHELL_TRI_4 >() ); - case SHELL_TRI_6: return m_functor( topology_type< SHELL_TRI_6 >() ); - case SHELL_QUAD_4: return m_functor( topology_type< SHELL_QUAD_4 >() ); - case SHELL_QUAD_8: return m_functor( topology_type< SHELL_QUAD_8 >() ); - case SHELL_QUAD_9: return m_functor( topology_type< SHELL_QUAD_9 >() ); - case TET_4: return m_functor( topology_type< TET_4 >() ); - case TET_8: return m_functor( topology_type< TET_8 >() ); - case TET_10: return m_functor( topology_type< TET_10 >() ); - case TET_11: return m_functor( topology_type< TET_11 >() ); - case PYRAMID_5: return m_functor( topology_type< PYRAMID_5 >() ); - case PYRAMID_13: return m_functor( topology_type< PYRAMID_13 >() ); - case PYRAMID_14: return m_functor( topology_type< PYRAMID_14 >() ); - case WEDGE_6: return m_functor( topology_type< WEDGE_6 >() ); - case WEDGE_12: return m_functor( topology_type< WEDGE_12 >() ); - case WEDGE_15: return m_functor( topology_type< WEDGE_15 >() ); - case WEDGE_18: return m_functor( topology_type< WEDGE_18 >() ); - case HEX_8: return m_functor( topology_type< HEX_8 >() ); - case HEX_20: return m_functor( topology_type< HEX_20 >() ); - case HEX_27: return m_functor( topology_type< HEX_27 >() ); + case INVALID_TOPOLOGY: return m_functor( topology_type< INVALID_TOPOLOGY >() ); + case NODE: return m_functor( topology_type< NODE >() ); + case LINE_2: return m_functor( topology_type< LINE_2 >() ); + case LINE_3: return m_functor( topology_type< LINE_3 >() ); + case TRI_3: return m_functor( topology_type< TRI_3 >() ); + case TRI_4: return m_functor( topology_type< TRI_4 >() ); + case TRI_6: return m_functor( topology_type< TRI_6 >() ); + case QUAD_4: return m_functor( topology_type< QUAD_4 >() ); + case QUAD_6: return m_functor( topology_type< QUAD_6 >() ); + case QUAD_8: return m_functor( topology_type< QUAD_8 >() ); + case QUAD_9: return m_functor( topology_type< QUAD_9 >() ); + case PARTICLE: return m_functor( topology_type< PARTICLE >() ); + case LINE_2_1D: return m_functor( topology_type< LINE_2_1D >() ); + case LINE_3_1D: return m_functor( topology_type< LINE_3_1D >() ); + case BEAM_2: return m_functor( topology_type< BEAM_2 >() ); + case BEAM_3: return m_functor( topology_type< BEAM_3 >() ); + case SHELL_LINE_2: return m_functor( topology_type< SHELL_LINE_2 >() ); + case SHELL_LINE_3: return m_functor( topology_type< SHELL_LINE_3 >() ); + case SHELL_SIDE_BEAM_2: return m_functor( topology_type< SHELL_SIDE_BEAM_2 >() ); + case SHELL_SIDE_BEAM_3: return m_functor( topology_type< SHELL_SIDE_BEAM_3 >() ); + case SPRING_2: return m_functor( topology_type< SPRING_2 >() ); + case SPRING_3: return m_functor( topology_type< SPRING_3 >() ); + case TRI_3_2D: return m_functor( topology_type< TRI_3_2D >() ); + case TRI_4_2D: return m_functor( topology_type< TRI_4_2D >() ); + case TRI_6_2D: return m_functor( topology_type< TRI_6_2D >() ); + case QUAD_4_2D: return m_functor( topology_type< QUAD_4_2D >() ); + case QUAD_8_2D: return m_functor( topology_type< QUAD_8_2D >() ); + case QUAD_9_2D: return m_functor( topology_type< QUAD_9_2D >() ); + case SHELL_TRI_3: return m_functor( topology_type< SHELL_TRI_3 >() ); + case SHELL_TRI_4: return m_functor( topology_type< SHELL_TRI_4 >() ); + case SHELL_TRI_6: return m_functor( topology_type< SHELL_TRI_6 >() ); + case SHELL_TRI_3_ALL_FACE_SIDES: return m_functor( topology_type< SHELL_TRI_3_ALL_FACE_SIDES >() ); + case SHELL_TRI_4_ALL_FACE_SIDES: return m_functor( topology_type< SHELL_TRI_4_ALL_FACE_SIDES >() ); + case SHELL_TRI_6_ALL_FACE_SIDES: return m_functor( topology_type< SHELL_TRI_6_ALL_FACE_SIDES >() ); + case SHELL_QUAD_4: return m_functor( topology_type< SHELL_QUAD_4 >() ); + case SHELL_QUAD_8: return m_functor( topology_type< SHELL_QUAD_8 >() ); + case SHELL_QUAD_9: return m_functor( topology_type< SHELL_QUAD_9 >() ); + case SHELL_QUAD_4_ALL_FACE_SIDES: return m_functor( topology_type< SHELL_QUAD_4_ALL_FACE_SIDES >() ); + case SHELL_QUAD_8_ALL_FACE_SIDES: return m_functor( topology_type< SHELL_QUAD_8_ALL_FACE_SIDES >() ); + case SHELL_QUAD_9_ALL_FACE_SIDES: return m_functor( topology_type< SHELL_QUAD_9_ALL_FACE_SIDES >() ); + case TET_4: return m_functor( topology_type< TET_4 >() ); + case TET_8: return m_functor( topology_type< TET_8 >() ); + case TET_10: return m_functor( topology_type< TET_10 >() ); + case TET_11: return m_functor( topology_type< TET_11 >() ); + case PYRAMID_5: return m_functor( topology_type< PYRAMID_5 >() ); + case PYRAMID_13: return m_functor( topology_type< PYRAMID_13 >() ); + case PYRAMID_14: return m_functor( topology_type< PYRAMID_14 >() ); + case WEDGE_6: return m_functor( topology_type< WEDGE_6 >() ); + case WEDGE_12: return m_functor( topology_type< WEDGE_12 >() ); + case WEDGE_15: return m_functor( topology_type< WEDGE_15 >() ); + case WEDGE_18: return m_functor( topology_type< WEDGE_18 >() ); + case HEX_8: return m_functor( topology_type< HEX_8 >() ); + case HEX_20: return m_functor( topology_type< HEX_20 >() ); + case HEX_27: return m_functor( topology_type< HEX_27 >() ); default: break; } return m_functor( topology_type() ); diff --git a/packages/stk/stk_topology/stk_topology/topology.cpp b/packages/stk/stk_topology/stk_topology/topology.cpp index 5977cc282822..ed32cd86f0e8 100644 --- a/packages/stk/stk_topology/stk_topology/topology.cpp +++ b/packages/stk/stk_topology/stk_topology/topology.cpp @@ -67,54 +67,60 @@ const char * topology::char_name() const { switch (m_value) { - case INVALID_TOPOLOGY: return "INVALID_TOPOLOGY"; - case NODE: return "NODE"; - case LINE_2: return "LINE_2"; - case LINE_3: return "LINE_3"; - case SHELL_LINE_2: return "SHELL_LINE_2"; - case SHELL_LINE_3: return "SHELL_LINE_3"; - case TRI_3: return "TRIANGLE_3"; - case TRI_4: return "TRIANGLE_4"; - case TRI_6: return "TRIANGLE_6"; - case QUAD_4: return "QUADRILATERAL_4"; - case QUAD_6: return "QUADRILATERAL_6"; - case QUAD_8: return "QUADRILATERAL_8"; - case QUAD_9: return "QUADRILATERAL_9"; - case SHELL_SIDE_BEAM_2: return "SHELL_SIDE_BEAM_2"; - case SHELL_SIDE_BEAM_3: return "SHELL_SIDE_BEAM_3"; - case PARTICLE: return "PARTICLE"; - case LINE_2_1D: return "LINE_2_1D"; - case LINE_3_1D: return "LINE_3_1D"; - case BEAM_2: return "BEAM_2"; - case BEAM_3: return "BEAM_3"; - case SPRING_2: return "SPRING_2"; - case SPRING_3: return "SPRING_3"; - case TRI_3_2D: return "TRIANGLE_3_2D"; - case TRI_4_2D: return "TRIANGLE_4_2D"; - case TRI_6_2D: return "TRIANGLE_6_2D"; - case QUAD_4_2D: return "QUADRILATERAL_4_2D"; - case QUAD_8_2D: return "QUADRILATERAL_8_2D"; - case QUAD_9_2D: return "QUADRILATERAL_9_2D"; - case SHELL_TRI_3: return "SHELL_TRIANGLE_3"; - case SHELL_TRI_4: return "SHELL_TRIANGLE_4"; - case SHELL_TRI_6: return "SHELL_TRIANGLE_6"; - case SHELL_QUAD_4: return "SHELL_QUADRILATERAL_4"; - case SHELL_QUAD_8: return "SHELL_QUADRILATERAL_8"; - case SHELL_QUAD_9: return "SHELL_QUADRILATERAL_9"; - case TET_4: return "TETRAHEDRON_4"; - case TET_8: return "TETRAHEDRON_8"; - case TET_10: return "TETRAHEDRON_10"; - case TET_11: return "TETRAHEDRON_11"; - case PYRAMID_5: return "PYRAMID_5"; - case PYRAMID_13: return "PYRAMID_13"; - case PYRAMID_14: return "PYRAMID_14"; - case WEDGE_6: return "WEDGE_6"; - case WEDGE_12: return "WEDGE_12"; - case WEDGE_15: return "WEDGE_15"; - case WEDGE_18: return "WEDGE_18"; - case HEX_8: return "HEXAHEDRON_8"; - case HEX_20: return "HEXAHEDRON_20"; - case HEX_27: return "HEXAHEDRON_27"; + case INVALID_TOPOLOGY: return "INVALID_TOPOLOGY"; + case NODE: return "NODE"; + case LINE_2: return "LINE_2"; + case LINE_3: return "LINE_3"; + case SHELL_LINE_2: return "SHELL_LINE_2"; + case SHELL_LINE_3: return "SHELL_LINE_3"; + case TRI_3: return "TRIANGLE_3"; + case TRI_4: return "TRIANGLE_4"; + case TRI_6: return "TRIANGLE_6"; + case QUAD_4: return "QUADRILATERAL_4"; + case QUAD_6: return "QUADRILATERAL_6"; + case QUAD_8: return "QUADRILATERAL_8"; + case QUAD_9: return "QUADRILATERAL_9"; + case SHELL_SIDE_BEAM_2: return "SHELL_SIDE_BEAM_2"; + case SHELL_SIDE_BEAM_3: return "SHELL_SIDE_BEAM_3"; + case PARTICLE: return "PARTICLE"; + case LINE_2_1D: return "LINE_2_1D"; + case LINE_3_1D: return "LINE_3_1D"; + case BEAM_2: return "BEAM_2"; + case BEAM_3: return "BEAM_3"; + case SPRING_2: return "SPRING_2"; + case SPRING_3: return "SPRING_3"; + case TRI_3_2D: return "TRIANGLE_3_2D"; + case TRI_4_2D: return "TRIANGLE_4_2D"; + case TRI_6_2D: return "TRIANGLE_6_2D"; + case QUAD_4_2D: return "QUADRILATERAL_4_2D"; + case QUAD_8_2D: return "QUADRILATERAL_8_2D"; + case QUAD_9_2D: return "QUADRILATERAL_9_2D"; + case SHELL_TRI_3: return "SHELL_TRIANGLE_3"; + case SHELL_TRI_4: return "SHELL_TRIANGLE_4"; + case SHELL_TRI_6: return "SHELL_TRIANGLE_6"; + case SHELL_TRI_3_ALL_FACE_SIDES: return "SHELL_TRIANGLE_3_ALL_FACE_SIDES"; + case SHELL_TRI_4_ALL_FACE_SIDES: return "SHELL_TRIANGLE_4_ALL_FACE_SIDES"; + case SHELL_TRI_6_ALL_FACE_SIDES: return "SHELL_TRIANGLE_6_ALL_FACE_SIDES"; + case SHELL_QUAD_4: return "SHELL_QUADRILATERAL_4"; + case SHELL_QUAD_8: return "SHELL_QUADRILATERAL_8"; + case SHELL_QUAD_9: return "SHELL_QUADRILATERAL_9"; + case SHELL_QUAD_4_ALL_FACE_SIDES: return "SHELL_QUADRILATERAL_4_ALL_FACE_SIDES"; + case SHELL_QUAD_8_ALL_FACE_SIDES: return "SHELL_QUADRILATERAL_8_ALL_FACE_SIDES"; + case SHELL_QUAD_9_ALL_FACE_SIDES: return "SHELL_QUADRILATERAL_9_ALL_FACE_SIDES"; + case TET_4: return "TETRAHEDRON_4"; + case TET_8: return "TETRAHEDRON_8"; + case TET_10: return "TETRAHEDRON_10"; + case TET_11: return "TETRAHEDRON_11"; + case PYRAMID_5: return "PYRAMID_5"; + case PYRAMID_13: return "PYRAMID_13"; + case PYRAMID_14: return "PYRAMID_14"; + case WEDGE_6: return "WEDGE_6"; + case WEDGE_12: return "WEDGE_12"; + case WEDGE_15: return "WEDGE_15"; + case WEDGE_18: return "WEDGE_18"; + case HEX_8: return "HEXAHEDRON_8"; + case HEX_20: return "HEXAHEDRON_20"; + case HEX_27: return "HEXAHEDRON_27"; default: break; } diff --git a/packages/stk/stk_topology/stk_topology/topology_decl.hpp b/packages/stk/stk_topology/stk_topology/topology_decl.hpp index 75f7937c358d..1eba9ead4cff 100644 --- a/packages/stk/stk_topology/stk_topology/topology_decl.hpp +++ b/packages/stk/stk_topology/stk_topology/topology_decl.hpp @@ -83,9 +83,15 @@ struct topology SHELL_TRI_3, SHELL_TRIANGLE_3 = SHELL_TRI_3, SHELL_TRI_4, SHELL_TRIANGLE_4 = SHELL_TRI_4, SHELL_TRI_6, SHELL_TRIANGLE_6 = SHELL_TRI_6, + SHELL_TRI_3_ALL_FACE_SIDES, SHELL_TRIANGLE_3_ALL_FACE_SIDES = SHELL_TRI_3_ALL_FACE_SIDES, + SHELL_TRI_4_ALL_FACE_SIDES, SHELL_TRIANGLE_4_ALL_FACE_SIDES = SHELL_TRI_4_ALL_FACE_SIDES, + SHELL_TRI_6_ALL_FACE_SIDES, SHELL_TRIANGLE_6_ALL_FACE_SIDES = SHELL_TRI_6_ALL_FACE_SIDES, SHELL_QUAD_4, SHELL_QUADRILATERAL_4 = SHELL_QUAD_4, SHELL_QUAD_8, SHELL_QUADRILATERAL_8 = SHELL_QUAD_8, SHELL_QUAD_9, SHELL_QUADRILATERAL_9 = SHELL_QUAD_9, + SHELL_QUAD_4_ALL_FACE_SIDES, SHELL_QUADRILATERAL_4_ALL_FACE_SIDES = SHELL_QUAD_4_ALL_FACE_SIDES, + SHELL_QUAD_8_ALL_FACE_SIDES, SHELL_QUADRILATERAL_8_ALL_FACE_SIDES = SHELL_QUAD_8_ALL_FACE_SIDES, + SHELL_QUAD_9_ALL_FACE_SIDES, SHELL_QUADRILATERAL_9_ALL_FACE_SIDES = SHELL_QUAD_9_ALL_FACE_SIDES, TET_4, TETRAHEDRON_4 = TET_4, TET_8, TETRAHEDRON_8 = TET_8, TET_10, TETRAHEDRON_10 = TET_10, diff --git a/packages/stk/stk_topology/stk_topology/topology_defn.hpp b/packages/stk/stk_topology/stk_topology/topology_defn.hpp index 8e113f69d2e6..201ab5cc41a9 100644 --- a/packages/stk/stk_topology/stk_topology/topology_defn.hpp +++ b/packages/stk/stk_topology/stk_topology/topology_defn.hpp @@ -10,6 +10,21 @@ namespace stk { +namespace impl { + +// Temporary function used to identify the new SHELL_[TRI|QUAD]_ALL_FACE_SIDES +// Will be removed once a proper conversion is available +STK_INLINE_FUNCTION +bool is_temporary_shell_with_all_face_sides(topology::topology_t m_value) { + return (m_value == topology::topology_t::SHELL_QUAD_4_ALL_FACE_SIDES || + m_value == topology::topology_t::SHELL_QUAD_8_ALL_FACE_SIDES || + m_value == topology::topology_t::SHELL_QUAD_9_ALL_FACE_SIDES || + m_value == topology::topology_t::SHELL_TRI_3_ALL_FACE_SIDES || + m_value == topology::topology_t::SHELL_TRI_4_ALL_FACE_SIDES || + m_value == topology::topology_t::SHELL_TRI_6_ALL_FACE_SIDES); +} +} + STK_INLINE_FUNCTION unsigned topology::num_nodes() const { @@ -165,7 +180,8 @@ unsigned topology::num_sides() const if (side_rank() != INVALID_RANK) { num_sides_out = side_rank() > NODE_RANK? num_sub_topology(side_rank()) : num_vertices(); - if (is_shell_with_face_sides()) + if (is_shell_with_face_sides() && + !impl::is_temporary_shell_with_all_face_sides(m_value)) num_sides_out += num_sub_topology(EDGE_RANK); } return num_sides_out; @@ -174,7 +190,7 @@ unsigned topology::num_sides() const STK_INLINE_FUNCTION topology topology::side_topology(unsigned side_ordinal) const { - if (is_shell_side_ordinal(side_ordinal)) + if (is_shell_side_ordinal(side_ordinal) && !impl::is_temporary_shell_with_all_face_sides(m_value)) return shell_side_topology(side_ordinal-num_faces()); return sub_topology(side_rank(), side_ordinal); diff --git a/packages/stk/stk_topology/stk_topology/topology_detail/meta_functions.hpp b/packages/stk/stk_topology/stk_topology/topology_detail/meta_functions.hpp index 545b87ba0353..282b669ae220 100644 --- a/packages/stk/stk_topology/stk_topology/topology_detail/meta_functions.hpp +++ b/packages/stk/stk_topology/stk_topology/topology_detail/meta_functions.hpp @@ -41,6 +41,21 @@ namespace stk::topology_detail { +namespace impl { +// Temporary function used to identify the new SHELL_[TRI|QUAD]_ALL_FACE_SIDES +// Will be removed once a proper conversion is available +template +STK_INLINE_FUNCTION +constexpr bool is_temporary_shell_with_all_face_sides() { + return (Topology::value == topology::SHELL_QUAD_4_ALL_FACE_SIDES || + Topology::value == topology::SHELL_QUAD_8_ALL_FACE_SIDES || + Topology::value == topology::SHELL_QUAD_9_ALL_FACE_SIDES || + Topology::value == topology::SHELL_TRI_3_ALL_FACE_SIDES || + Topology::value == topology::SHELL_TRI_4_ALL_FACE_SIDES || + Topology::value == topology::SHELL_TRI_6_ALL_FACE_SIDES); +} +} + //------------------------------------------------------------------------------ template STK_INLINE_FUNCTION @@ -119,7 +134,8 @@ constexpr topology::topology_t shell_side_topology_() { if constexpr (Topology::is_shell && Topology::dimension == 3 && ShellSideOrdinal < Topology::num_edges) { - return Topology::shell_side_topology_vector[ShellSideOrdinal]; + if constexpr (!impl::is_temporary_shell_with_all_face_sides()) + return Topology::shell_side_topology_vector[ShellSideOrdinal]; } return topology::INVALID_TOPOLOGY; } diff --git a/packages/stk/stk_topology/stk_topology/topology_detail/topology_data.cpp b/packages/stk/stk_topology/stk_topology/topology_detail/topology_data.cpp index a961440390a3..9bedb1ffede3 100644 --- a/packages/stk/stk_topology/stk_topology/topology_detail/topology_data.cpp +++ b/packages/stk/stk_topology/stk_topology/topology_detail/topology_data.cpp @@ -96,90 +96,108 @@ constexpr topology::topology_t topology_data::edge constexpr topology::topology_t topology_data::edge_topology_vector[]; constexpr topology::topology_t topology_data::edge_topology_vector[]; -constexpr topology::topology_t topology_data::face_topology_vector[]; -constexpr topology::topology_t topology_data::face_topology_vector[]; -constexpr topology::topology_t topology_data::face_topology_vector[]; -constexpr topology::topology_t topology_data::face_topology_vector[]; -constexpr topology::topology_t topology_data::face_topology_vector[]; -constexpr topology::topology_t topology_data::face_topology_vector[]; -constexpr topology::topology_t topology_data::face_topology_vector[]; -constexpr topology::topology_t topology_data::face_topology_vector[]; -constexpr topology::topology_t topology_data::face_topology_vector[]; -constexpr topology::topology_t topology_data::face_topology_vector[]; -constexpr topology::topology_t topology_data::face_topology_vector[]; -constexpr topology::topology_t topology_data::face_topology_vector[]; -constexpr topology::topology_t topology_data::face_topology_vector[]; -constexpr topology::topology_t topology_data::face_topology_vector[]; -constexpr topology::topology_t topology_data::face_topology_vector[]; -constexpr topology::topology_t topology_data::face_topology_vector[]; -constexpr topology::topology_t topology_data::face_topology_vector[]; -constexpr topology::topology_t topology_data::face_topology_vector[]; -constexpr topology::topology_t topology_data::face_topology_vector[]; -constexpr topology::topology_t topology_data::face_topology_vector[]; -constexpr topology::topology_t topology_data::face_topology_vector[]; -constexpr topology::topology_t topology_data::face_topology_vector[]; -constexpr topology::topology_t topology_data::face_topology_vector[]; -constexpr topology::topology_t topology_data::face_topology_vector[]; -constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; +constexpr topology::topology_t topology_data::face_topology_vector[]; -constexpr topology::topology_t topology_data::shell_side_topology_vector[]; -constexpr topology::topology_t topology_data::shell_side_topology_vector[]; -constexpr topology::topology_t topology_data::shell_side_topology_vector[]; -constexpr topology::topology_t topology_data::shell_side_topology_vector[]; -constexpr topology::topology_t topology_data::shell_side_topology_vector[]; -constexpr topology::topology_t topology_data::shell_side_topology_vector[]; +constexpr topology::topology_t topology_data::shell_side_topology_vector[]; +constexpr topology::topology_t topology_data::shell_side_topology_vector[]; +constexpr topology::topology_t topology_data::shell_side_topology_vector[]; +constexpr topology::topology_t topology_data::shell_side_topology_vector[]; +constexpr topology::topology_t topology_data::shell_side_topology_vector[]; +constexpr topology::topology_t topology_data::shell_side_topology_vector[]; -constexpr uint8_t topology_data::face_node_ordinals_offsets[]; -constexpr uint8_t topology_data::face_node_ordinals_offsets[]; -constexpr uint8_t topology_data::face_node_ordinals_offsets[]; -constexpr uint8_t topology_data::face_node_ordinals_offsets[]; -constexpr uint8_t topology_data::face_node_ordinals_offsets[]; -constexpr uint8_t topology_data::face_node_ordinals_offsets[]; -constexpr uint8_t topology_data::face_node_ordinals_offsets[]; -constexpr uint8_t topology_data::face_node_ordinals_offsets[]; -constexpr uint8_t topology_data::face_node_ordinals_offsets[]; -constexpr uint8_t topology_data::face_node_ordinals_offsets[]; -constexpr uint8_t topology_data::face_node_ordinals_offsets[]; -constexpr uint8_t topology_data::face_node_ordinals_offsets[]; -constexpr uint8_t topology_data::face_node_ordinals_offsets[]; -constexpr uint8_t topology_data::face_node_ordinals_offsets[]; -constexpr uint8_t topology_data::face_node_ordinals_offsets[]; -constexpr uint8_t topology_data::face_node_ordinals_offsets[]; -constexpr uint8_t topology_data::face_node_ordinals_offsets[]; -constexpr uint8_t topology_data::face_node_ordinals_offsets[]; -constexpr uint8_t topology_data::face_node_ordinals_offsets[]; -constexpr uint8_t topology_data::face_node_ordinals_offsets[]; -constexpr uint8_t topology_data::face_node_ordinals_offsets[]; -constexpr uint8_t topology_data::face_node_ordinals_offsets[]; -constexpr uint8_t topology_data::face_node_ordinals_offsets[]; -constexpr uint8_t topology_data::face_node_ordinals_offsets[]; -constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; +constexpr uint8_t topology_data::face_node_ordinals_offsets[]; -constexpr uint8_t topology_data::face_node_ordinals_vector[]; -constexpr uint8_t topology_data::face_node_ordinals_vector[]; -constexpr uint8_t topology_data::face_node_ordinals_vector[]; -constexpr uint8_t topology_data::face_node_ordinals_vector[]; -constexpr uint8_t topology_data::face_node_ordinals_vector[]; -constexpr uint8_t topology_data::face_node_ordinals_vector[]; -constexpr uint8_t topology_data::face_node_ordinals_vector[]; -constexpr uint8_t topology_data::face_node_ordinals_vector[]; -constexpr uint8_t topology_data::face_node_ordinals_vector[]; -constexpr uint8_t topology_data::face_node_ordinals_vector[]; -constexpr uint8_t topology_data::face_node_ordinals_vector[]; -constexpr uint8_t topology_data::face_node_ordinals_vector[]; -constexpr uint8_t topology_data::face_node_ordinals_vector[]; -constexpr uint8_t topology_data::face_node_ordinals_vector[]; -constexpr uint8_t topology_data::face_node_ordinals_vector[]; -constexpr uint8_t topology_data::face_node_ordinals_vector[]; -constexpr uint8_t topology_data::face_node_ordinals_vector[]; -constexpr uint8_t topology_data::face_node_ordinals_vector[]; -constexpr uint8_t topology_data::face_node_ordinals_vector[]; -constexpr uint8_t topology_data::face_node_ordinals_vector[]; -constexpr uint8_t topology_data::face_node_ordinals_vector[]; -constexpr uint8_t topology_data::face_node_ordinals_vector[]; -constexpr uint8_t topology_data::face_node_ordinals_vector[]; -constexpr uint8_t topology_data::face_node_ordinals_vector[]; -constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; +constexpr uint8_t topology_data::face_node_ordinals_vector[]; constexpr uint8_t topology_data::edge_node_ordinals_offsets[]; constexpr uint8_t topology_data::edge_node_ordinals_offsets[]; diff --git a/packages/stk/stk_topology/stk_topology/topology_detail/topology_data.hpp b/packages/stk/stk_topology/stk_topology/topology_detail/topology_data.hpp index 7e2c416711f7..ce22512c7afe 100644 --- a/packages/stk/stk_topology/stk_topology/topology_detail/topology_data.hpp +++ b/packages/stk/stk_topology/stk_topology/topology_detail/topology_data.hpp @@ -829,6 +829,89 @@ struct topology_data 0, 2, 1, 5, 4, 3}; }; +//*************************************************************************** + +template <> +struct topology_data + : public topology_data +{ + static constexpr topology::topology_t value = topology::SHELL_TRI_3_ALL_FACE_SIDES; + static constexpr topology::topology_t base = topology::SHELL_TRI_3_ALL_FACE_SIDES; + static constexpr topology::topology_t face_topology_vector[] = {topology::TRI_3, + topology::TRI_3, + topology::SHELL_SIDE_BEAM_2, + topology::SHELL_SIDE_BEAM_2, + topology::SHELL_SIDE_BEAM_2}; + + static constexpr topology::rank_t rank = topology::ELEMENT_RANK; + static constexpr topology::rank_t side_rank = topology::FACE_RANK; + static constexpr bool is_shell = true; + static constexpr bool has_homogeneous_faces = true; + static constexpr uint8_t dimension = 3; + static constexpr uint8_t num_faces = 5; + + static constexpr uint8_t face_node_ordinals_offsets[] = {0, 3, 6, 8, 10, 12}; + static constexpr uint8_t face_node_ordinals_vector[] = {0, 1, 2, + 0, 2, 1, + 0, 1, + 1, 2, + 2, 0}; +}; + +template <> +struct topology_data + : public topology_data +{ + static constexpr topology::topology_t value = topology::SHELL_TRI_4_ALL_FACE_SIDES; + static constexpr topology::topology_t base = topology::SHELL_TRI_3_ALL_FACE_SIDES; + static constexpr topology::topology_t face_topology_vector[] = {topology::TRI_4, + topology::TRI_4, + topology::SHELL_SIDE_BEAM_2, + topology::SHELL_SIDE_BEAM_2, + topology::SHELL_SIDE_BEAM_2}; + + static constexpr topology::rank_t rank = topology::ELEMENT_RANK; + static constexpr topology::rank_t side_rank = topology::FACE_RANK; + static constexpr bool is_shell = true; + static constexpr bool has_homogeneous_faces = true; + static constexpr uint8_t dimension = 3; + static constexpr uint8_t num_faces = 5; + + static constexpr uint8_t face_node_ordinals_offsets[] = {0, 4, 8, 10, 12, 14}; + static constexpr uint8_t face_node_ordinals_vector[] = {0, 1, 2, 3, + 0, 2, 1, 3, + 0, 1, + 1, 2, + 2, 0}; +}; + +template <> +struct topology_data + : public topology_data +{ + static constexpr topology::topology_t value = topology::SHELL_TRI_6_ALL_FACE_SIDES; + static constexpr topology::topology_t base = topology::SHELL_TRI_3_ALL_FACE_SIDES; + static constexpr topology::topology_t face_topology_vector[] = {topology::TRI_6, + topology::TRI_6, + topology::SHELL_SIDE_BEAM_3, + topology::SHELL_SIDE_BEAM_3, + topology::SHELL_SIDE_BEAM_3}; + + static constexpr topology::rank_t rank = topology::ELEMENT_RANK; + static constexpr topology::rank_t side_rank = topology::FACE_RANK; + static constexpr bool is_shell = true; + static constexpr bool has_homogeneous_faces = true; + static constexpr uint8_t dimension = 3; + static constexpr uint8_t num_faces = 5; + + static constexpr uint8_t face_node_ordinals_offsets[] = {0, 6, 12, 15, 18, 21}; + static constexpr uint8_t face_node_ordinals_vector[] = {0, 1, 2, 3, 4, 5, + 0, 2, 1, 5, 4, 3, + 0, 1, 3, + 1, 2, 4, + 2, 0, 5}; +}; + //*************************************************************************** // topology::QUADRILATERAL -- topology::FACE_RANK // defined on spatial dimension 3d @@ -1151,6 +1234,94 @@ struct topology_data 0, 3, 2, 1, 7, 6, 5, 4, 8}; }; +//*************************************************************************** + +template <> +struct topology_data + : public topology_data +{ + static constexpr topology::topology_t value = topology::SHELL_QUAD_4_ALL_FACE_SIDES; + static constexpr topology::topology_t base = topology::SHELL_QUAD_4_ALL_FACE_SIDES; + static constexpr topology::topology_t face_topology_vector[] = {topology::QUAD_4, + topology::QUAD_4, + topology::SHELL_SIDE_BEAM_2, + topology::SHELL_SIDE_BEAM_2, + topology::SHELL_SIDE_BEAM_2, + topology::SHELL_SIDE_BEAM_2}; + + static constexpr topology::rank_t rank = topology::ELEMENT_RANK; + static constexpr topology::rank_t side_rank = topology::FACE_RANK; + static constexpr bool is_shell = true; + static constexpr bool has_homogeneous_faces = true; + static constexpr uint8_t dimension = 3; + static constexpr uint8_t num_faces = 6; + + static constexpr uint8_t face_node_ordinals_offsets[] = {0, 4, 8, 10, 12, 14, 16}; + static constexpr uint8_t face_node_ordinals_vector[] = {0, 1, 2, 3, + 0, 3, 2, 1, + 0, 1, + 1, 2, + 2, 3, + 3, 0}; +}; + +template <> +struct topology_data + : public topology_data +{ + static constexpr topology::topology_t value = topology::SHELL_QUAD_8_ALL_FACE_SIDES; + static constexpr topology::topology_t base = topology::SHELL_QUAD_4_ALL_FACE_SIDES; + static constexpr topology::topology_t face_topology_vector[] = {topology::QUAD_8, + topology::QUAD_8, + topology::SHELL_SIDE_BEAM_3, + topology::SHELL_SIDE_BEAM_3, + topology::SHELL_SIDE_BEAM_3, + topology::SHELL_SIDE_BEAM_3}; + static constexpr topology::rank_t rank = topology::ELEMENT_RANK; + static constexpr topology::rank_t side_rank = topology::FACE_RANK; + static constexpr bool is_shell = true; + static constexpr bool has_homogeneous_faces = true; + static constexpr uint8_t dimension = 3; + static constexpr uint8_t num_faces = 6; + + static constexpr uint8_t face_node_ordinals_offsets[] = {0, 8, 16, 19, 22, 25, 28}; + static constexpr uint8_t face_node_ordinals_vector[] = {0, 1, 2, 3, 4, 5, 6, 7, + 0, 3, 2, 1, 7, 6, 5, 4, + 0, 1, 4, + 1, 2, 5, + 2, 3, 6, + 3, 0, 7}; +}; + +template <> +struct topology_data + : public topology_data +{ + static constexpr topology::topology_t value = topology::SHELL_QUAD_9_ALL_FACE_SIDES; + static constexpr topology::topology_t base = topology::SHELL_QUAD_4_ALL_FACE_SIDES; + static constexpr topology::topology_t face_topology_vector[] = {topology::QUAD_9, + topology::QUAD_9, + topology::SHELL_SIDE_BEAM_3, + topology::SHELL_SIDE_BEAM_3, + topology::SHELL_SIDE_BEAM_3, + topology::SHELL_SIDE_BEAM_3}; + + static constexpr topology::rank_t rank = topology::ELEMENT_RANK; + static constexpr topology::rank_t side_rank = topology::FACE_RANK; + static constexpr bool is_shell = true; + static constexpr bool has_homogeneous_faces = true; + static constexpr uint8_t dimension = 3; + static constexpr uint8_t num_faces = 6; + + static constexpr uint8_t face_node_ordinals_offsets[] = {0, 9, 18, 21, 24, 27, 30}; + static constexpr uint8_t face_node_ordinals_vector[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, + 0, 3, 2, 1, 7, 6, 5, 4, 8, + 0, 1, 4, + 1, 2, 5, + 2, 3, 6, + 3, 0, 7}; +}; + //*************************************************************************** // topology::TETRAHEDRON //*************************************************************************** diff --git a/packages/stk/stk_topology/stk_topology/types.hpp b/packages/stk/stk_topology/stk_topology/types.hpp index 897427e94c7f..282678530d84 100644 --- a/packages/stk/stk_topology/stk_topology/types.hpp +++ b/packages/stk/stk_topology/stk_topology/types.hpp @@ -39,50 +39,53 @@ namespace stk { struct topology::types { - typedef topology_type node; - typedef topology_type line_2; - typedef topology_type line_3; - typedef topology_type tri_3; - typedef topology_type tri_4; - typedef topology_type tri_6; - typedef topology_type quad_4; - typedef topology_type quad_6; - typedef topology_type quad_8; - typedef topology_type quad_9; - typedef topology_type particle; - typedef topology_type line_2_1d; - typedef topology_type line_3_1d; - typedef topology_type beam_2; - typedef topology_type beam_3; - typedef topology_type shell_line_2; - typedef topology_type shell_line_3; - typedef topology_type shell_side_beam_2; - typedef topology_type shell_side_beam_3; - typedef topology_type tri_3_2d; - typedef topology_type tri_4_2d; - typedef topology_type tri_6_2d; - typedef topology_type quad_4_2d; - typedef topology_type quad_8_2d; - typedef topology_type quad_9_2d; - typedef topology_type shell_tri_3; - typedef topology_type shell_tri_4; - typedef topology_type shell_tri_6; - typedef topology_type shell_quad_4; - typedef topology_type shell_quad_8; - typedef topology_type shell_quad_9; - typedef topology_type tet_4; - typedef topology_type tet_8; - typedef topology_type tet_10; - typedef topology_type tet_11; - typedef topology_type pyramid_5; - typedef topology_type pyramid_13; - typedef topology_type pyramid_14; - typedef topology_type wedge_6; - typedef topology_type wedge_15; - typedef topology_type wedge_18; - typedef topology_type hex_8; - typedef topology_type hex_20; - typedef topology_type hex_27; + typedef topology_type node; + typedef topology_type line_2; + typedef topology_type line_3; + typedef topology_type tri_3; + typedef topology_type tri_4; + typedef topology_type tri_6; + typedef topology_type quad_4; + typedef topology_type quad_6; + typedef topology_type quad_8; + typedef topology_type quad_9; + typedef topology_type particle; + typedef topology_type line_2_1d; + typedef topology_type line_3_1d; + typedef topology_type beam_2; + typedef topology_type beam_3; + typedef topology_type shell_line_2; + typedef topology_type shell_line_3; + typedef topology_type shell_side_beam_2; + typedef topology_type shell_side_beam_3; + typedef topology_type tri_3_2d; + typedef topology_type tri_4_2d; + typedef topology_type tri_6_2d; + typedef topology_type quad_4_2d; + typedef topology_type quad_8_2d; + typedef topology_type quad_9_2d; + typedef topology_type shell_tri_3; + typedef topology_type shell_tri_4; + typedef topology_type shell_tri_6; + typedef topology_type shell_quad_4; + typedef topology_type shell_quad_8; + typedef topology_type shell_quad_9; + typedef topology_type shell_quad_4_all_face_sides; + typedef topology_type shell_quad_8_all_face_sides; + typedef topology_type shell_quad_9_all_face_sides; + typedef topology_type tet_4; + typedef topology_type tet_8; + typedef topology_type tet_10; + typedef topology_type tet_11; + typedef topology_type pyramid_5; + typedef topology_type pyramid_13; + typedef topology_type pyramid_14; + typedef topology_type wedge_6; + typedef topology_type wedge_15; + typedef topology_type wedge_18; + typedef topology_type hex_8; + typedef topology_type hex_20; + typedef topology_type hex_27; }; } //namespace stk diff --git a/packages/stk/stk_unit_tests/stk_expreval/UnitTestEvaluator.cpp b/packages/stk/stk_unit_tests/stk_expreval/UnitTestEvaluator.cpp index 12fe09008b9b..fe69dbaca5c5 100644 --- a/packages/stk/stk_unit_tests/stk_expreval/UnitTestEvaluator.cpp +++ b/packages/stk/stk_unit_tests/stk_expreval/UnitTestEvaluator.cpp @@ -1196,6 +1196,21 @@ TEST(UnitTestEvaluator, testFunctionArgumentCountCheck) EXPECT_TRUE(isInvalidFunction("my_function(1, 2)")); } +TEST(UnitTestEvaluator, testParsedEvalNoUserDefinedFunctions) +{ + stk::expreval::addFunction("my_function", new OneArgFunction()); + stk::expreval::Eval eval("my_function(1)"); + EXPECT_ANY_THROW(eval.get_parsed_eval().check_for_errors(false)); + EXPECT_ANY_THROW(eval.get_parsed_eval().check_for_errors(true)); +} + +TEST(UnitTestEvaluator, testParsedEvalNoRandom) +{ + stk::expreval::Eval eval("rand()"); + EXPECT_ANY_THROW(eval.get_parsed_eval().check_for_errors(false)); + EXPECT_ANY_THROW(eval.get_parsed_eval().check_for_errors(true)); +} + #if !defined(STK_ENABLE_GPU) && !defined(KOKKOS_ENABLE_SYCL) && !defined(KOKKOS_ENABLE_OPENMP) TEST(UnitTestEvaluator, deviceVariableMap_too_small) diff --git a/packages/stk/stk_unit_tests/stk_mesh/CMakeLists.txt b/packages/stk/stk_unit_tests/stk_mesh/CMakeLists.txt index dbd6c77761de..e5ad470e6aef 100644 --- a/packages/stk/stk_unit_tests/stk_mesh/CMakeLists.txt +++ b/packages/stk/stk_unit_tests/stk_mesh/CMakeLists.txt @@ -106,6 +106,7 @@ LIST(REMOVE_ITEM SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/UnitTest3Tets3Procs.cpp") LIST(REMOVE_ITEM SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/change_parts/CustomGhostEntities.cpp") LIST(REMOVE_ITEM SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/entitySorting/UnitTestEntitySorting.cpp") LIST(REMOVE_ITEM SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/edge_creation/UnitTestEdgeConnection.cpp") +LIST(REMOVE_ITEM SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/edge_creation/UnitTestEdgesOnFaces.cpp") LIST(REMOVE_ITEM SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/face_creation/FaceCreatorFixture.cpp") LIST(REMOVE_ITEM SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/face_creation/TwoHexesTwoProcs.cpp") LIST(REMOVE_ITEM SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/face_creation/TwoHexesTwoProcsEGWithPermutations.cpp") diff --git a/packages/stk/stk_unit_tests/stk_mesh/UnitTestMetaData.cpp b/packages/stk/stk_unit_tests/stk_mesh/UnitTestMetaData.cpp index cc4b335fcf74..3cfccd81b1d8 100644 --- a/packages/stk/stk_unit_tests/stk_mesh/UnitTestMetaData.cpp +++ b/packages/stk/stk_unit_tests/stk_mesh/UnitTestMetaData.cpp @@ -506,7 +506,7 @@ TEST(UnitTestMetaData, InconsistentParallelDebugCheck_BadPartSubset) meta.declare_part_subset(part_1, part_2); } - STK_EXPECT_THROW_MSG(bulk.modification_begin(), bulk.parallel_rank(), 1, "[p1] Part part_1 subset ordinals (41 ) does not match Part part_1 subset ordinals () on root processor\n"); + STK_EXPECT_THROW_MSG(bulk.modification_begin(), bulk.parallel_rank(), 1, "[p1] Part part_1 subset ordinals (46 ) does not match Part part_1 subset ordinals () on root processor\n"); } TEST(UnitTestMetaData, InconsistentParallelDebugCheck_BadNumberOfParts_RootTooFew) diff --git a/packages/stk/stk_unit_tests/stk_mesh/ngp/ngpFieldBLASTest.cpp b/packages/stk/stk_unit_tests/stk_mesh/ngp/ngpFieldBLASTest.cpp index 23fba07f811f..84207b6180b7 100644 --- a/packages/stk/stk_unit_tests/stk_mesh/ngp/ngpFieldBLASTest.cpp +++ b/packages/stk/stk_unit_tests/stk_mesh/ngp/ngpFieldBLASTest.cpp @@ -425,5 +425,24 @@ TEST_F(NgpFieldBLAS, field_axpbyz) ngp_field_test_utils::check_field_data_on_host(get_bulk(), *stkField3, selector, expectedValue); } +TEST_F(NgpFieldBLAS, field_axpby) +{ + if (get_parallel_size() != 1) GTEST_SKIP(); + + stk::mesh::field_fill(3.0, *stkField1, stk::ngp::ExecSpace()); + stk::mesh::field_fill(10.0, *stkField2, stk::ngp::ExecSpace()); + + double alpha = 2.0; + double beta = 5.0; + stk::mesh::Selector selectRule(*stkField1); + + stk::mesh::field_axpby(get_bulk(), alpha, *stkField1, beta, *stkField2, selectRule, stk::ngp::ExecSpace()); + + stkField2->sync_to_host(); + stk::mesh::Selector selector(*stkField2); + constexpr double expectedValue = 56.0; + ngp_field_test_utils::check_field_data_on_host(get_bulk(), *stkField2, selector, expectedValue); +} + } diff --git a/packages/stk/stk_unit_tests/stk_middle_mesh/CMakeLists.txt b/packages/stk/stk_unit_tests/stk_middle_mesh/CMakeLists.txt index cd48669ad8d3..58e04969d3e0 100644 --- a/packages/stk/stk_unit_tests/stk_middle_mesh/CMakeLists.txt +++ b/packages/stk/stk_unit_tests/stk_middle_mesh/CMakeLists.txt @@ -24,7 +24,9 @@ else() add_test(NAME "stk_middle_mesh_utest" COMMAND stk_middle_mesh_utest) endif() -target_include_directories(stk_middle_mesh_utest PRIVATE - $ - $ -) +if(TARGET stk_middle_mesh_utest) + target_include_directories(stk_middle_mesh_utest PRIVATE + $ + $ + ) +endif() diff --git a/packages/stk/stk_unit_tests/stk_search_util/CMakeLists.txt b/packages/stk/stk_unit_tests/stk_search_util/CMakeLists.txt index e2c6e42acf4f..c3830fe00aa5 100644 --- a/packages/stk/stk_unit_tests/stk_search_util/CMakeLists.txt +++ b/packages/stk/stk_unit_tests/stk_search_util/CMakeLists.txt @@ -5,7 +5,7 @@ if(HAVE_STK_Trilinos) TRIBITS_ADD_EXECUTABLE_AND_TEST(stk_search_util_utest SOURCES ${SOURCES} TESTONLYLIBS stk_unit_main - ARGS "" + ARGS "--gtest_filter=-SearchUtil.Intrepid2*" COMM serial mpi NUM_MPI_PROCS 1 ) diff --git a/packages/stk/stk_unit_tests/stk_topology/CMakeLists.txt b/packages/stk/stk_unit_tests/stk_topology/CMakeLists.txt index d69dcf09e901..c88d5aede14e 100644 --- a/packages/stk/stk_unit_tests/stk_topology/CMakeLists.txt +++ b/packages/stk/stk_unit_tests/stk_topology/CMakeLists.txt @@ -60,15 +60,23 @@ else() add_test(NAME "stk_topology_unit_tests_c" COMMAND stk_topology_unit_tests_c) endif() +if(TARGET stk_topology_unit_tests_a) target_include_directories(stk_topology_unit_tests_a PUBLIC $ $ ) +endif() + +if(TARGET stk_topology_unit_tests_b) target_include_directories(stk_topology_unit_tests_b PUBLIC $ $ ) +endif() + +if(TARGET stk_topology_unit_tests_c) target_include_directories(stk_topology_unit_tests_c PUBLIC $ $ ) +endif() diff --git a/packages/stk/stk_unit_tests/stk_topology/utest_b/unit_test_validate_topology_data.cpp b/packages/stk/stk_unit_tests/stk_topology/utest_b/unit_test_validate_topology_data.cpp index 62673827d698..ed7ffa782dee 100644 --- a/packages/stk/stk_unit_tests/stk_topology/utest_b/unit_test_validate_topology_data.cpp +++ b/packages/stk/stk_unit_tests/stk_topology/utest_b/unit_test_validate_topology_data.cpp @@ -165,53 +165,59 @@ bool validate_topology_data() TEST( stk_topology, validate_topology) { - EXPECT_TRUE( validate_topology_data< topology::NODE >() ); - EXPECT_TRUE( validate_topology_data< topology::LINE_2 >() ); - EXPECT_TRUE( validate_topology_data< topology::LINE_3 >() ); - EXPECT_TRUE( validate_topology_data< topology::TRI_3 >() ); - EXPECT_TRUE( validate_topology_data< topology::TRI_4 >() ); - EXPECT_TRUE( validate_topology_data< topology::TRI_6 >() ); - EXPECT_TRUE( validate_topology_data< topology::QUAD_4 >() ); - EXPECT_TRUE( validate_topology_data< topology::QUAD_6 >() ); - EXPECT_TRUE( validate_topology_data< topology::QUAD_8 >() ); - EXPECT_TRUE( validate_topology_data< topology::QUAD_9 >() ); - EXPECT_TRUE( validate_topology_data< topology::PARTICLE >() ); - EXPECT_TRUE( validate_topology_data< topology::LINE_2_1D >() ); - EXPECT_TRUE( validate_topology_data< topology::LINE_3_1D >() ); - EXPECT_TRUE( validate_topology_data< topology::BEAM_2 >() ); - EXPECT_TRUE( validate_topology_data< topology::BEAM_3 >() ); - EXPECT_TRUE( validate_topology_data< topology::SHELL_LINE_2 >() ); - EXPECT_TRUE( validate_topology_data< topology::SHELL_LINE_3 >() ); - EXPECT_TRUE( validate_topology_data< topology::SHELL_SIDE_BEAM_2 >() ); - EXPECT_TRUE( validate_topology_data< topology::SHELL_SIDE_BEAM_3 >() ); - EXPECT_TRUE( validate_topology_data< topology::SPRING_2 >() ); - EXPECT_TRUE( validate_topology_data< topology::SPRING_3 >() ); - EXPECT_TRUE( validate_topology_data< topology::TRI_3_2D >() ); - EXPECT_TRUE( validate_topology_data< topology::TRI_4_2D >() ); - EXPECT_TRUE( validate_topology_data< topology::TRI_6_2D >() ); - EXPECT_TRUE( validate_topology_data< topology::QUAD_4_2D >() ); - EXPECT_TRUE( validate_topology_data< topology::QUAD_8_2D >() ); - EXPECT_TRUE( validate_topology_data< topology::QUAD_9_2D >() ); - EXPECT_TRUE( validate_topology_data< topology::SHELL_TRI_3 >() ); - EXPECT_TRUE( validate_topology_data< topology::SHELL_TRI_4 >() ); - EXPECT_TRUE( validate_topology_data< topology::SHELL_TRI_6 >() ); - EXPECT_TRUE( validate_topology_data< topology::SHELL_QUAD_4 >() ); - EXPECT_TRUE( validate_topology_data< topology::SHELL_QUAD_8 >() ); - EXPECT_TRUE( validate_topology_data< topology::SHELL_QUAD_9 >() ); - EXPECT_TRUE( validate_topology_data< topology::TET_4 >() ); - EXPECT_TRUE( validate_topology_data< topology::TET_8 >() ); - EXPECT_TRUE( validate_topology_data< topology::TET_10 >() ); - EXPECT_TRUE( validate_topology_data< topology::TET_11 >() ); - EXPECT_TRUE( validate_topology_data< topology::PYRAMID_5 >() ); - EXPECT_TRUE( validate_topology_data< topology::PYRAMID_13 >() ); - EXPECT_TRUE( validate_topology_data< topology::PYRAMID_14 >() ); - EXPECT_TRUE( validate_topology_data< topology::WEDGE_6 >() ); - EXPECT_TRUE( validate_topology_data< topology::WEDGE_12 >() ); - EXPECT_TRUE( validate_topology_data< topology::WEDGE_15 >() ); - EXPECT_TRUE( validate_topology_data< topology::WEDGE_18 >() ); - EXPECT_TRUE( validate_topology_data< topology::HEX_8 >() ); - EXPECT_TRUE( validate_topology_data< topology::HEX_20 >() ); - EXPECT_TRUE( validate_topology_data< topology::HEX_27 >() ); + EXPECT_TRUE( validate_topology_data< topology::NODE >() ); + EXPECT_TRUE( validate_topology_data< topology::LINE_2 >() ); + EXPECT_TRUE( validate_topology_data< topology::LINE_3 >() ); + EXPECT_TRUE( validate_topology_data< topology::TRI_3 >() ); + EXPECT_TRUE( validate_topology_data< topology::TRI_4 >() ); + EXPECT_TRUE( validate_topology_data< topology::TRI_6 >() ); + EXPECT_TRUE( validate_topology_data< topology::QUAD_4 >() ); + EXPECT_TRUE( validate_topology_data< topology::QUAD_6 >() ); + EXPECT_TRUE( validate_topology_data< topology::QUAD_8 >() ); + EXPECT_TRUE( validate_topology_data< topology::QUAD_9 >() ); + EXPECT_TRUE( validate_topology_data< topology::PARTICLE >() ); + EXPECT_TRUE( validate_topology_data< topology::LINE_2_1D >() ); + EXPECT_TRUE( validate_topology_data< topology::LINE_3_1D >() ); + EXPECT_TRUE( validate_topology_data< topology::BEAM_2 >() ); + EXPECT_TRUE( validate_topology_data< topology::BEAM_3 >() ); + EXPECT_TRUE( validate_topology_data< topology::SHELL_LINE_2 >() ); + EXPECT_TRUE( validate_topology_data< topology::SHELL_LINE_3 >() ); + EXPECT_TRUE( validate_topology_data< topology::SHELL_SIDE_BEAM_2 >() ); + EXPECT_TRUE( validate_topology_data< topology::SHELL_SIDE_BEAM_3 >() ); + EXPECT_TRUE( validate_topology_data< topology::SPRING_2 >() ); + EXPECT_TRUE( validate_topology_data< topology::SPRING_3 >() ); + EXPECT_TRUE( validate_topology_data< topology::TRI_3_2D >() ); + EXPECT_TRUE( validate_topology_data< topology::TRI_4_2D >() ); + EXPECT_TRUE( validate_topology_data< topology::TRI_6_2D >() ); + EXPECT_TRUE( validate_topology_data< topology::QUAD_4_2D >() ); + EXPECT_TRUE( validate_topology_data< topology::QUAD_8_2D >() ); + EXPECT_TRUE( validate_topology_data< topology::QUAD_9_2D >() ); + EXPECT_TRUE( validate_topology_data< topology::SHELL_TRI_3 >() ); + EXPECT_TRUE( validate_topology_data< topology::SHELL_TRI_4 >() ); + EXPECT_TRUE( validate_topology_data< topology::SHELL_TRI_6 >() ); + EXPECT_TRUE( validate_topology_data< topology::SHELL_TRI_3_ALL_FACE_SIDES >() ); + EXPECT_TRUE( validate_topology_data< topology::SHELL_TRI_4_ALL_FACE_SIDES >() ); + EXPECT_TRUE( validate_topology_data< topology::SHELL_TRI_6_ALL_FACE_SIDES >() ); + EXPECT_TRUE( validate_topology_data< topology::SHELL_QUAD_4 >() ); + EXPECT_TRUE( validate_topology_data< topology::SHELL_QUAD_8 >() ); + EXPECT_TRUE( validate_topology_data< topology::SHELL_QUAD_9 >() ); + EXPECT_TRUE( validate_topology_data< topology::SHELL_QUAD_4_ALL_FACE_SIDES >() ); + EXPECT_TRUE( validate_topology_data< topology::SHELL_QUAD_8_ALL_FACE_SIDES >() ); + EXPECT_TRUE( validate_topology_data< topology::SHELL_QUAD_9_ALL_FACE_SIDES >() ); + EXPECT_TRUE( validate_topology_data< topology::TET_4 >() ); + EXPECT_TRUE( validate_topology_data< topology::TET_8 >() ); + EXPECT_TRUE( validate_topology_data< topology::TET_10 >() ); + EXPECT_TRUE( validate_topology_data< topology::TET_11 >() ); + EXPECT_TRUE( validate_topology_data< topology::PYRAMID_5 >() ); + EXPECT_TRUE( validate_topology_data< topology::PYRAMID_13 >() ); + EXPECT_TRUE( validate_topology_data< topology::PYRAMID_14 >() ); + EXPECT_TRUE( validate_topology_data< topology::WEDGE_6 >() ); + EXPECT_TRUE( validate_topology_data< topology::WEDGE_12 >() ); + EXPECT_TRUE( validate_topology_data< topology::WEDGE_15 >() ); + EXPECT_TRUE( validate_topology_data< topology::WEDGE_18 >() ); + EXPECT_TRUE( validate_topology_data< topology::HEX_8 >() ); + EXPECT_TRUE( validate_topology_data< topology::HEX_20 >() ); + EXPECT_TRUE( validate_topology_data< topology::HEX_27 >() ); // check that the permutations define the same sides for (stk::topology topo = stk::topology::BEGIN_TOPOLOGY; topo < stk::topology::END_TOPOLOGY; ++topo) { diff --git a/packages/stk/stk_unit_tests/stk_topology/utest_c/unit_test_shell_quad_all_face_sides.cpp b/packages/stk/stk_unit_tests/stk_topology/utest_c/unit_test_shell_quad_all_face_sides.cpp new file mode 100644 index 000000000000..2f47304494f7 --- /dev/null +++ b/packages/stk/stk_unit_tests/stk_topology/utest_c/unit_test_shell_quad_all_face_sides.cpp @@ -0,0 +1,495 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// +// * Neither the name of NTESS nor the names of its contributors +// may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#include "Kokkos_Core.hpp" // for parallel_for, KOKKOS_LAMBDA +#include "gtest/gtest.h" // for AssertionResult, Message, TestPartResult +#include "stk_ngp_test/ngp_test.hpp" // for NGP_EXPECT_EQ, NGP_EXPECT_FALSE, NGP_EXPECT_... +#include "stk_topology/topology.hpp" // for topology, topology::QUAD_4, topology::QUAD_8 +#include "topology_test_utils.hpp" // for check_edge_node_ordinals, check_edge_node_or... +#include // for size_t +#include // for operator<<, basic_ostream, basic_ostream<>::... +#include // for vector + +namespace { + +std::vector> get_gold_edge_node_ordinals_shell_quad4() { + return std::vector> { + {0, 1}, + {1, 2}, + {2, 3}, + {3, 0} + }; +} + +std::vector> get_gold_face_node_ordinals_shell_quad4() { + return std::vector> { + {0, 1, 2, 3}, + {0, 3, 2, 1}, + {0, 1}, + {1, 2}, + {2, 3}, + {3, 0} + }; +} + +std::vector> get_gold_side_node_ordinals_shell_quad4() { + return std::vector> { + {0, 1, 2, 3}, + {0, 3, 2, 1}, + {0, 1}, + {1, 2}, + {2, 3}, + {3, 0} + }; +} + +TEST(stk_topology, shell_shell_quad4_all_face_sides) +{ + stk::topology t = stk::topology::SHELL_QUAD_4_ALL_FACE_SIDES; + + EXPECT_TRUE(t.is_valid()); + EXPECT_TRUE(t.has_homogeneous_faces()); + EXPECT_TRUE(t.is_shell()); + + EXPECT_EQ(t.rank(),stk::topology::ELEMENT_RANK); + EXPECT_EQ(t.side_rank(), stk::topology::FACE_RANK); + + EXPECT_EQ(t.num_nodes(),4u); + EXPECT_EQ(t.num_vertices(),4u); + EXPECT_EQ(t.num_edges(),4u); + EXPECT_EQ(t.num_faces(),6u); + EXPECT_EQ(t.num_sides(),6u); + + EXPECT_FALSE(t.defined_on_spatial_dimension(1)); + EXPECT_FALSE(t.defined_on_spatial_dimension(2)); + EXPECT_TRUE(t.defined_on_spatial_dimension(3)); + + EXPECT_EQ(t.base(),stk::topology::SHELL_QUAD_4_ALL_FACE_SIDES); + + EXPECT_EQ(t.edge_topology(0), stk::topology::LINE_2); + EXPECT_EQ(t.edge_topology(1), stk::topology::LINE_2); + EXPECT_EQ(t.edge_topology(2), stk::topology::LINE_2); + EXPECT_EQ(t.edge_topology(3), stk::topology::LINE_2); + + EXPECT_EQ(t.face_topology(0), stk::topology::QUAD_4); + EXPECT_EQ(t.face_topology(1), stk::topology::QUAD_4); + EXPECT_EQ(t.face_topology(2), stk::topology::SHELL_SIDE_BEAM_2); + EXPECT_EQ(t.face_topology(3), stk::topology::SHELL_SIDE_BEAM_2); + EXPECT_EQ(t.face_topology(4), stk::topology::SHELL_SIDE_BEAM_2); + EXPECT_EQ(t.face_topology(5), stk::topology::SHELL_SIDE_BEAM_2); + + EXPECT_EQ(t.side_topology(0), stk::topology::QUAD_4); + EXPECT_EQ(t.side_topology(1), stk::topology::QUAD_4); + EXPECT_EQ(t.side_topology(2), stk::topology::SHELL_SIDE_BEAM_2); + EXPECT_EQ(t.side_topology(3), stk::topology::SHELL_SIDE_BEAM_2); + EXPECT_EQ(t.side_topology(4), stk::topology::SHELL_SIDE_BEAM_2); + EXPECT_EQ(t.side_topology(5), stk::topology::SHELL_SIDE_BEAM_2); + + check_edge_node_ordinals(t, get_gold_edge_node_ordinals_shell_quad4()); + check_edge_nodes(t, get_gold_edge_node_ordinals_shell_quad4()); + + check_face_node_ordinals(t, get_gold_face_node_ordinals_shell_quad4()); + check_face_nodes(t, get_gold_face_node_ordinals_shell_quad4()); + + check_side_node_ordinals(t, get_gold_side_node_ordinals_shell_quad4()); + check_side_nodes(t, get_gold_side_node_ordinals_shell_quad4()); +} + +void check_shell_quad_4_all_face_sides_on_device() +{ + OrdinalType goldEdgeNodeOrdinals = fillGoldOrdinals(get_gold_edge_node_ordinals_shell_quad4()); + OrdinalType goldFaceNodeOrdinals = fillGoldOrdinals(get_gold_face_node_ordinals_shell_quad4()); + OrdinalType goldSideNodeOrdinals = fillGoldOrdinals(get_gold_side_node_ordinals_shell_quad4()); + + stk::topology t = stk::topology::SHELL_QUAD_4_ALL_FACE_SIDES; + constexpr unsigned numNodes = stk::topology_detail::topology_data::num_nodes; + EXPECT_EQ(4u, numNodes); + + Kokkos::parallel_for(stk::ngp::DeviceRangePolicy(0, 1), KOKKOS_LAMBDA(const int i) + { + NGP_EXPECT_TRUE(t.is_valid()); + NGP_EXPECT_TRUE(t.has_homogeneous_faces()); + NGP_EXPECT_TRUE(t.is_shell()); + + NGP_EXPECT_EQ(t.rank(),stk::topology::ELEMENT_RANK); + NGP_EXPECT_EQ(t.side_rank(),stk::topology::FACE_RANK); + + NGP_EXPECT_EQ(t.num_nodes(),4u); + NGP_EXPECT_EQ(t.num_vertices(),4u); + NGP_EXPECT_EQ(t.num_edges(),4u); + NGP_EXPECT_EQ(t.num_faces(),6u); + NGP_EXPECT_EQ(t.num_sides(),6u); + + NGP_EXPECT_FALSE(t.defined_on_spatial_dimension(1)); + NGP_EXPECT_FALSE(t.defined_on_spatial_dimension(2)); + NGP_EXPECT_TRUE(t.defined_on_spatial_dimension(3)); + + NGP_EXPECT_EQ(t.base(),stk::topology::SHELL_QUAD_4_ALL_FACE_SIDES); + + NGP_EXPECT_EQ(t.edge_topology(0), stk::topology::LINE_2); + NGP_EXPECT_EQ(t.edge_topology(1), stk::topology::LINE_2); + NGP_EXPECT_EQ(t.edge_topology(2), stk::topology::LINE_2); + + NGP_EXPECT_EQ(t.face_topology(0), stk::topology::QUAD_4); + NGP_EXPECT_EQ(t.face_topology(1), stk::topology::QUAD_4); + NGP_EXPECT_EQ(t.face_topology(2), stk::topology::SHELL_SIDE_BEAM_2); + NGP_EXPECT_EQ(t.face_topology(3), stk::topology::SHELL_SIDE_BEAM_2); + NGP_EXPECT_EQ(t.face_topology(4), stk::topology::SHELL_SIDE_BEAM_2); + NGP_EXPECT_EQ(t.face_topology(5), stk::topology::SHELL_SIDE_BEAM_2); + + NGP_EXPECT_EQ(t.side_topology(0), stk::topology::QUAD_4); + NGP_EXPECT_EQ(t.side_topology(1), stk::topology::QUAD_4); + NGP_EXPECT_EQ(t.side_topology(2), stk::topology::SHELL_SIDE_BEAM_2); + NGP_EXPECT_EQ(t.side_topology(3), stk::topology::SHELL_SIDE_BEAM_2); + NGP_EXPECT_EQ(t.side_topology(4), stk::topology::SHELL_SIDE_BEAM_2); + NGP_EXPECT_EQ(t.side_topology(5), stk::topology::SHELL_SIDE_BEAM_2); + + check_edge_node_ordinals_ngp(t, goldEdgeNodeOrdinals); + check_edge_nodes_ngp(t, goldEdgeNodeOrdinals); + }); + + Kokkos::parallel_for(stk::ngp::DeviceRangePolicy(0, 1), KOKKOS_LAMBDA(const int i) + { + check_face_node_ordinals_ngp(t, goldFaceNodeOrdinals); + check_face_nodes_ngp(t, goldFaceNodeOrdinals); + + check_side_node_ordinals_ngp(t, goldSideNodeOrdinals); + check_side_nodes_ngp(t, goldSideNodeOrdinals); + }); +} + +NGP_TEST(stk_topology_ngp, shell_quad_4_all_face_sides) +{ + check_shell_quad_4_all_face_sides_on_device(); +} + +std::vector> get_gold_edge_node_ordinals_shell_quad8() { + return std::vector> { + {0, 1, 4}, + {1, 2, 5}, + {2, 3, 6}, + {3, 0, 7} + }; +} + +std::vector> get_gold_face_node_ordinals_shell_quad8() { + return std::vector> { + {0, 1, 2, 3, 4, 5, 6, 7}, + {0, 3, 2, 1, 7, 6, 5, 4}, + {0, 1, 4}, + {1, 2, 5}, + {2, 3, 6}, + {3, 0, 7} + }; +} + +std::vector> get_gold_side_node_ordinals_shell_quad8() { + return std::vector> { + {0, 1, 2, 3, 4, 5, 6, 7}, + {0, 3, 2, 1, 7, 6, 5, 4}, + {0, 1, 4}, + {1, 2, 5}, + {2, 3, 6}, + {3, 0, 7} + }; +} + +TEST(stk_topology, shell_shell_quad8_all_face_sides) +{ + stk::topology t = stk::topology::SHELL_QUAD_8_ALL_FACE_SIDES; + + EXPECT_TRUE(t.is_valid()); + EXPECT_TRUE(t.has_homogeneous_faces()); + EXPECT_TRUE(t.is_shell()); + + EXPECT_EQ(t.rank(),stk::topology::ELEMENT_RANK); + EXPECT_EQ(t.side_rank(),stk::topology::FACE_RANK); + + EXPECT_EQ(t.num_nodes(),8u); + EXPECT_EQ(t.num_vertices(),4u); + EXPECT_EQ(t.num_edges(),4u); + EXPECT_EQ(t.num_faces(),6u); + EXPECT_EQ(t.num_sides(),6u); + + EXPECT_FALSE(t.defined_on_spatial_dimension(1)); + EXPECT_FALSE(t.defined_on_spatial_dimension(2)); + EXPECT_TRUE(t.defined_on_spatial_dimension(3)); + + EXPECT_EQ(t.base(),stk::topology::SHELL_QUAD_4_ALL_FACE_SIDES); + + EXPECT_EQ(t.edge_topology(0), stk::topology::LINE_3); + EXPECT_EQ(t.edge_topology(1), stk::topology::LINE_3); + EXPECT_EQ(t.edge_topology(2), stk::topology::LINE_3); + EXPECT_EQ(t.edge_topology(3), stk::topology::LINE_3); + + EXPECT_EQ(t.face_topology(0), stk::topology::QUAD_8); + EXPECT_EQ(t.face_topology(1), stk::topology::QUAD_8); + EXPECT_EQ(t.face_topology(2), stk::topology::SHELL_SIDE_BEAM_3); + EXPECT_EQ(t.face_topology(3), stk::topology::SHELL_SIDE_BEAM_3); + EXPECT_EQ(t.face_topology(4), stk::topology::SHELL_SIDE_BEAM_3); + EXPECT_EQ(t.face_topology(5), stk::topology::SHELL_SIDE_BEAM_3); + + EXPECT_EQ(t.side_topology(0), stk::topology::QUAD_8); + EXPECT_EQ(t.side_topology(1), stk::topology::QUAD_8); + EXPECT_EQ(t.side_topology(2), stk::topology::SHELL_SIDE_BEAM_3); + EXPECT_EQ(t.side_topology(3), stk::topology::SHELL_SIDE_BEAM_3); + EXPECT_EQ(t.side_topology(4), stk::topology::SHELL_SIDE_BEAM_3); + EXPECT_EQ(t.side_topology(5), stk::topology::SHELL_SIDE_BEAM_3); + + check_edge_node_ordinals(t, get_gold_edge_node_ordinals_shell_quad8()); + check_edge_nodes(t, get_gold_edge_node_ordinals_shell_quad8()); + + check_face_node_ordinals(t, get_gold_face_node_ordinals_shell_quad8()); + check_face_nodes(t, get_gold_face_node_ordinals_shell_quad8()); + + check_side_node_ordinals(t, get_gold_side_node_ordinals_shell_quad8()); + check_side_nodes(t, get_gold_side_node_ordinals_shell_quad8()); +} + +void check_shell_quad_8_all_face_sides_on_device() +{ + OrdinalType goldEdgeNodeOrdinals = fillGoldOrdinals(get_gold_edge_node_ordinals_shell_quad8()); + OrdinalType goldFaceNodeOrdinals = fillGoldOrdinals(get_gold_face_node_ordinals_shell_quad8()); + OrdinalType goldSideNodeOrdinals = fillGoldOrdinals(get_gold_side_node_ordinals_shell_quad8()); + + stk::topology t = stk::topology::SHELL_QUAD_8_ALL_FACE_SIDES; + constexpr unsigned numNodes = stk::topology_detail::topology_data::num_nodes; + EXPECT_EQ(8u, numNodes); + + Kokkos::parallel_for(stk::ngp::DeviceRangePolicy(0, 1), KOKKOS_LAMBDA(const int i) + { + NGP_EXPECT_TRUE(t.is_valid()); + NGP_EXPECT_TRUE(t.has_homogeneous_faces()); + NGP_EXPECT_TRUE(t.is_shell()); + + NGP_EXPECT_EQ(t.rank(),stk::topology::ELEMENT_RANK); + NGP_EXPECT_EQ(t.side_rank(),stk::topology::FACE_RANK); + + NGP_EXPECT_EQ(t.num_nodes(),8u); + NGP_EXPECT_EQ(t.num_vertices(),4u); + NGP_EXPECT_EQ(t.num_edges(),4u); + NGP_EXPECT_EQ(t.num_faces(),6u); + NGP_EXPECT_EQ(t.num_sides(),6u); + + NGP_EXPECT_FALSE(t.defined_on_spatial_dimension(1)); + NGP_EXPECT_FALSE(t.defined_on_spatial_dimension(2)); + NGP_EXPECT_TRUE(t.defined_on_spatial_dimension(3)); + + NGP_EXPECT_EQ(t.base(),stk::topology::SHELL_QUAD_4_ALL_FACE_SIDES); + + NGP_EXPECT_EQ(t.edge_topology(0), stk::topology::LINE_3); + NGP_EXPECT_EQ(t.edge_topology(1), stk::topology::LINE_3); + NGP_EXPECT_EQ(t.edge_topology(2), stk::topology::LINE_3); + + NGP_EXPECT_EQ(t.face_topology(0), stk::topology::QUAD_8); + NGP_EXPECT_EQ(t.face_topology(1), stk::topology::QUAD_8); + + NGP_EXPECT_EQ(t.side_topology(0), stk::topology::QUAD_8); + NGP_EXPECT_EQ(t.side_topology(1), stk::topology::QUAD_8); + NGP_EXPECT_EQ(t.side_topology(2), stk::topology::SHELL_SIDE_BEAM_3); + NGP_EXPECT_EQ(t.side_topology(3), stk::topology::SHELL_SIDE_BEAM_3); + NGP_EXPECT_EQ(t.side_topology(4), stk::topology::SHELL_SIDE_BEAM_3); + NGP_EXPECT_EQ(t.side_topology(5), stk::topology::SHELL_SIDE_BEAM_3); + + check_edge_node_ordinals_ngp(t, goldEdgeNodeOrdinals); + check_edge_nodes_ngp(t, goldEdgeNodeOrdinals); + }); + + Kokkos::parallel_for(stk::ngp::DeviceRangePolicy(0, 1), KOKKOS_LAMBDA(const int i) + { + check_face_node_ordinals_ngp(t, goldFaceNodeOrdinals); + check_face_nodes_ngp(t, goldFaceNodeOrdinals); + + check_side_node_ordinals_ngp(t, goldSideNodeOrdinals); + check_side_nodes_ngp(t, goldSideNodeOrdinals); + }); +} + +NGP_TEST(stk_topology_ngp, shell_quad_8_all_face_sides) +{ + check_shell_quad_8_all_face_sides_on_device(); +} + +std::vector> get_gold_edge_node_ordinals_shell_quad9() { + return std::vector> { + {0, 1, 4}, + {1, 2, 5}, + {2, 3, 6}, + {3, 0, 7} + }; +} + +std::vector> get_gold_face_node_ordinals_shell_quad9() { + return std::vector> { + {0, 1, 2, 3, 4, 5, 6, 7, 8}, + {0, 3, 2, 1, 7, 6, 5, 4, 8}, + {0, 1, 4}, + {1, 2, 5}, + {2, 3, 6}, + {3, 0, 7} + }; +} + +std::vector> get_gold_side_node_ordinals_shell_quad9() { + return std::vector> { + {0, 1, 2, 3, 4, 5, 6, 7, 8}, + {0, 3, 2, 1, 7, 6, 5, 4, 8}, + {0, 1, 4}, + {1, 2, 5}, + {2, 3, 6}, + {3, 0, 7} + }; +} + +TEST(stk_topology, shell_shell_quad9_all_face_sides) +{ + stk::topology t = stk::topology::SHELL_QUAD_9_ALL_FACE_SIDES; + + EXPECT_TRUE(t.is_valid()); + EXPECT_TRUE(t.has_homogeneous_faces()); + EXPECT_TRUE(t.is_shell()); + + EXPECT_EQ(t.rank(),stk::topology::ELEMENT_RANK); + EXPECT_EQ(t.side_rank(),stk::topology::FACE_RANK); + + EXPECT_EQ(t.num_nodes(),9u); + EXPECT_EQ(t.num_vertices(),4u); + EXPECT_EQ(t.num_edges(),4u); + EXPECT_EQ(t.num_faces(),6u); + EXPECT_EQ(t.num_sides(),6u); + + EXPECT_FALSE(t.defined_on_spatial_dimension(1)); + EXPECT_FALSE(t.defined_on_spatial_dimension(2)); + EXPECT_TRUE(t.defined_on_spatial_dimension(3)); + + EXPECT_EQ(t.base(),stk::topology::SHELL_QUAD_4_ALL_FACE_SIDES); + + EXPECT_EQ(t.edge_topology(0), stk::topology::LINE_3); + EXPECT_EQ(t.edge_topology(1), stk::topology::LINE_3); + EXPECT_EQ(t.edge_topology(2), stk::topology::LINE_3); + EXPECT_EQ(t.edge_topology(3), stk::topology::LINE_3); + + EXPECT_EQ(t.face_topology(0), stk::topology::QUAD_9); + EXPECT_EQ(t.face_topology(1), stk::topology::QUAD_9); + EXPECT_EQ(t.face_topology(2), stk::topology::SHELL_SIDE_BEAM_3); + EXPECT_EQ(t.face_topology(3), stk::topology::SHELL_SIDE_BEAM_3); + EXPECT_EQ(t.face_topology(4), stk::topology::SHELL_SIDE_BEAM_3); + EXPECT_EQ(t.face_topology(5), stk::topology::SHELL_SIDE_BEAM_3); + + EXPECT_EQ(t.side_topology(0), stk::topology::QUAD_9); + EXPECT_EQ(t.side_topology(1), stk::topology::QUAD_9); + EXPECT_EQ(t.side_topology(2), stk::topology::SHELL_SIDE_BEAM_3); + EXPECT_EQ(t.side_topology(3), stk::topology::SHELL_SIDE_BEAM_3); + EXPECT_EQ(t.side_topology(4), stk::topology::SHELL_SIDE_BEAM_3); + EXPECT_EQ(t.side_topology(5), stk::topology::SHELL_SIDE_BEAM_3); + + check_edge_node_ordinals(t, get_gold_edge_node_ordinals_shell_quad9()); + check_edge_nodes(t, get_gold_edge_node_ordinals_shell_quad9()); + + check_face_node_ordinals(t, get_gold_face_node_ordinals_shell_quad9()); + check_face_nodes(t, get_gold_face_node_ordinals_shell_quad9()); + + check_side_node_ordinals(t, get_gold_side_node_ordinals_shell_quad9()); + check_side_nodes(t, get_gold_side_node_ordinals_shell_quad9()); +} + +void check_shell_quad_9_all_face_sides_on_device() +{ + OrdinalType goldEdgeNodeOrdinals = fillGoldOrdinals(get_gold_edge_node_ordinals_shell_quad9()); + OrdinalType goldFaceNodeOrdinals = fillGoldOrdinals(get_gold_face_node_ordinals_shell_quad9()); + OrdinalType goldSideNodeOrdinals = fillGoldOrdinals(get_gold_side_node_ordinals_shell_quad9()); + + stk::topology t = stk::topology::SHELL_QUAD_9_ALL_FACE_SIDES; + constexpr unsigned numNodes = stk::topology_detail::topology_data::num_nodes; + EXPECT_EQ(9u, numNodes); + + Kokkos::parallel_for(stk::ngp::DeviceRangePolicy(0, 1), KOKKOS_LAMBDA(const int i) + { + NGP_EXPECT_TRUE(t.is_valid()); + NGP_EXPECT_TRUE(t.has_homogeneous_faces()); + NGP_EXPECT_TRUE(t.is_shell()); + + NGP_EXPECT_EQ(t.rank(),stk::topology::ELEMENT_RANK); + NGP_EXPECT_EQ(t.side_rank(),stk::topology::FACE_RANK); + + NGP_EXPECT_EQ(t.num_nodes(),9u); + NGP_EXPECT_EQ(t.num_vertices(),4u); + NGP_EXPECT_EQ(t.num_edges(),4u); + NGP_EXPECT_EQ(t.num_faces(),6u); + NGP_EXPECT_EQ(t.num_sides(),6u); + + NGP_EXPECT_FALSE(t.defined_on_spatial_dimension(1)); + NGP_EXPECT_FALSE(t.defined_on_spatial_dimension(2)); + NGP_EXPECT_TRUE(t.defined_on_spatial_dimension(3)); + + NGP_EXPECT_EQ(t.base(),stk::topology::SHELL_QUAD_4_ALL_FACE_SIDES); + + NGP_EXPECT_EQ(t.edge_topology(0), stk::topology::LINE_3); + NGP_EXPECT_EQ(t.edge_topology(1), stk::topology::LINE_3); + NGP_EXPECT_EQ(t.edge_topology(2), stk::topology::LINE_3); + + NGP_EXPECT_EQ(t.face_topology(0), stk::topology::QUAD_9); + NGP_EXPECT_EQ(t.face_topology(1), stk::topology::QUAD_9); + NGP_EXPECT_EQ(t.face_topology(2), stk::topology::SHELL_SIDE_BEAM_3); + NGP_EXPECT_EQ(t.face_topology(3), stk::topology::SHELL_SIDE_BEAM_3); + NGP_EXPECT_EQ(t.face_topology(4), stk::topology::SHELL_SIDE_BEAM_3); + NGP_EXPECT_EQ(t.face_topology(5), stk::topology::SHELL_SIDE_BEAM_3); + + NGP_EXPECT_EQ(t.side_topology(0), stk::topology::QUAD_9); + NGP_EXPECT_EQ(t.side_topology(1), stk::topology::QUAD_9); + NGP_EXPECT_EQ(t.side_topology(2), stk::topology::SHELL_SIDE_BEAM_3); + NGP_EXPECT_EQ(t.side_topology(3), stk::topology::SHELL_SIDE_BEAM_3); + NGP_EXPECT_EQ(t.side_topology(4), stk::topology::SHELL_SIDE_BEAM_3); + NGP_EXPECT_EQ(t.side_topology(5), stk::topology::SHELL_SIDE_BEAM_3); + + check_edge_node_ordinals_ngp(t, goldEdgeNodeOrdinals); + check_edge_nodes_ngp(t, goldEdgeNodeOrdinals); + }); + + Kokkos::parallel_for(stk::ngp::DeviceRangePolicy(0, 1), KOKKOS_LAMBDA(const int i) + { + check_face_node_ordinals_ngp(t, goldFaceNodeOrdinals); + check_face_nodes_ngp(t, goldFaceNodeOrdinals); + + check_side_node_ordinals_ngp(t, goldSideNodeOrdinals); + check_side_nodes_ngp(t, goldSideNodeOrdinals); + }); +} + +NGP_TEST(stk_topology_ngp, shell_quad_9_all_face_sides) +{ + check_shell_quad_9_all_face_sides_on_device(); +} + +} diff --git a/packages/stk/stk_unit_tests/stk_topology/utest_c/unit_test_shell_tri_all_face_sides.cpp b/packages/stk/stk_unit_tests/stk_topology/utest_c/unit_test_shell_tri_all_face_sides.cpp new file mode 100644 index 000000000000..f0678301ecd6 --- /dev/null +++ b/packages/stk/stk_unit_tests/stk_topology/utest_c/unit_test_shell_tri_all_face_sides.cpp @@ -0,0 +1,477 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// +// * Neither the name of NTESS nor the names of its contributors +// may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#include "Kokkos_Core.hpp" // for parallel_for, KOKKOS_LAMBDA +#include "gtest/gtest.h" // for AssertionResult, Message, TestPartResult +#include "stk_ngp_test/ngp_test.hpp" // for NGP_EXPECT_EQ, NGP_EXPECT_FALSE, NGP_EXPECT_... +#include "stk_topology/topology.hpp" // for topology, topology::QUAD_4, topology::QUAD_8 +#include "topology_test_utils.hpp" // for check_edge_node_ordinals, check_edge_node_or... +#include // for size_t +#include // for operator<<, basic_ostream, basic_ostream<>::... +#include // for vector + +namespace { + +std::vector> get_gold_edge_node_ordinals_shell_tri3() { + return std::vector> { + {0, 1}, + {1, 2}, + {2, 0} + }; +} + +std::vector> get_gold_face_node_ordinals_shell_tri3() { + return std::vector> { + {0, 1, 2}, + {0, 2, 1}, + {0, 1}, + {1, 2}, + {2, 0} + }; +} + +std::vector> get_gold_side_node_ordinals_shell_tri3() { + return std::vector> { + {0, 1, 2}, + {0, 2, 1}, + {0, 1}, + {1, 2}, + {2, 0} + }; +} + +TEST(stk_topology, shell_tri_3_all_face_sides) +{ + stk::topology t = stk::topology::SHELL_TRI_3_ALL_FACE_SIDES; + + EXPECT_TRUE(t.is_valid()); + EXPECT_TRUE(t.has_homogeneous_faces()); + EXPECT_TRUE(t.is_shell()); + + EXPECT_EQ(t.rank(),stk::topology::ELEMENT_RANK); + EXPECT_EQ(t.side_rank(),stk::topology::FACE_RANK); + + EXPECT_EQ(t.num_nodes(),3u); + EXPECT_EQ(t.num_vertices(),3u); + EXPECT_EQ(t.num_edges(),3u); + EXPECT_EQ(t.num_faces(),5u); + EXPECT_EQ(t.num_sides(),5u); + + EXPECT_FALSE(t.defined_on_spatial_dimension(1)); + EXPECT_FALSE(t.defined_on_spatial_dimension(2)); + EXPECT_TRUE(t.defined_on_spatial_dimension(3)); + + EXPECT_EQ(t.base(),stk::topology::SHELL_TRI_3_ALL_FACE_SIDES); + + EXPECT_EQ(t.edge_topology(0), stk::topology::LINE_2); + EXPECT_EQ(t.edge_topology(1), stk::topology::LINE_2); + EXPECT_EQ(t.edge_topology(2), stk::topology::LINE_2); + + EXPECT_EQ(t.face_topology(0), stk::topology::TRI_3); + EXPECT_EQ(t.face_topology(1), stk::topology::TRI_3); + EXPECT_EQ(t.face_topology(2), stk::topology::SHELL_SIDE_BEAM_2); + EXPECT_EQ(t.face_topology(3), stk::topology::SHELL_SIDE_BEAM_2); + EXPECT_EQ(t.face_topology(4), stk::topology::SHELL_SIDE_BEAM_2); + + EXPECT_EQ(t.side_topology(0), stk::topology::TRI_3); + EXPECT_EQ(t.side_topology(1), stk::topology::TRI_3); + EXPECT_EQ(t.side_topology(2), stk::topology::SHELL_SIDE_BEAM_2); + EXPECT_EQ(t.side_topology(3), stk::topology::SHELL_SIDE_BEAM_2); + EXPECT_EQ(t.side_topology(4), stk::topology::SHELL_SIDE_BEAM_2); + + check_edge_node_ordinals(t, get_gold_edge_node_ordinals_shell_tri3()); + check_edge_nodes(t, get_gold_edge_node_ordinals_shell_tri3()); + + check_face_node_ordinals(t, get_gold_face_node_ordinals_shell_tri3()); + check_face_nodes(t, get_gold_face_node_ordinals_shell_tri3()); + + check_side_node_ordinals(t, get_gold_side_node_ordinals_shell_tri3()); + check_side_nodes(t, get_gold_side_node_ordinals_shell_tri3()); +} + +void check_shell_tri_3_all_face_sides_on_device() +{ + OrdinalType goldEdgeNodeOrdinals = fillGoldOrdinals(get_gold_edge_node_ordinals_shell_tri3()); + OrdinalType goldFaceNodeOrdinals = fillGoldOrdinals(get_gold_face_node_ordinals_shell_tri3()); + OrdinalType goldSideNodeOrdinals = fillGoldOrdinals(get_gold_side_node_ordinals_shell_tri3()); + + stk::topology t = stk::topology::SHELL_TRI_3_ALL_FACE_SIDES; + constexpr unsigned numNodes = stk::topology_detail::topology_data::num_nodes; + EXPECT_EQ(3u, numNodes); + + Kokkos::parallel_for(stk::ngp::DeviceRangePolicy(0, 1), KOKKOS_LAMBDA(const int i) + { + NGP_EXPECT_TRUE(t.is_valid()); + NGP_EXPECT_TRUE(t.has_homogeneous_faces()); + NGP_EXPECT_TRUE(t.is_shell()); + + NGP_EXPECT_EQ(t.rank(),stk::topology::ELEMENT_RANK); + NGP_EXPECT_EQ(t.side_rank(),stk::topology::FACE_RANK); + + NGP_EXPECT_EQ(t.num_nodes(),3u); + NGP_EXPECT_EQ(t.num_vertices(),3u); + NGP_EXPECT_EQ(t.num_edges(),3u); + NGP_EXPECT_EQ(t.num_faces(),5u); + NGP_EXPECT_EQ(t.num_sides(),5u); + + NGP_EXPECT_FALSE(t.defined_on_spatial_dimension(1)); + NGP_EXPECT_FALSE(t.defined_on_spatial_dimension(2)); + NGP_EXPECT_TRUE(t.defined_on_spatial_dimension(3)); + + NGP_EXPECT_EQ(t.base(),stk::topology::SHELL_TRI_3_ALL_FACE_SIDES); + + NGP_EXPECT_EQ(t.edge_topology(0), stk::topology::LINE_2); + NGP_EXPECT_EQ(t.edge_topology(1), stk::topology::LINE_2); + NGP_EXPECT_EQ(t.edge_topology(2), stk::topology::LINE_2); + + NGP_EXPECT_EQ(t.face_topology(0), stk::topology::TRI_3); + NGP_EXPECT_EQ(t.face_topology(1), stk::topology::TRI_3); + NGP_EXPECT_EQ(t.face_topology(2), stk::topology::SHELL_SIDE_BEAM_2); + NGP_EXPECT_EQ(t.face_topology(3), stk::topology::SHELL_SIDE_BEAM_2); + NGP_EXPECT_EQ(t.face_topology(4), stk::topology::SHELL_SIDE_BEAM_2); + + NGP_EXPECT_EQ(t.side_topology(0), stk::topology::TRI_3); + NGP_EXPECT_EQ(t.side_topology(1), stk::topology::TRI_3); + NGP_EXPECT_EQ(t.side_topology(2), stk::topology::SHELL_SIDE_BEAM_2); + NGP_EXPECT_EQ(t.side_topology(3), stk::topology::SHELL_SIDE_BEAM_2); + NGP_EXPECT_EQ(t.side_topology(4), stk::topology::SHELL_SIDE_BEAM_2); + + check_edge_node_ordinals_ngp(t, goldEdgeNodeOrdinals); + check_edge_nodes_ngp(t, goldEdgeNodeOrdinals); + }); + + Kokkos::parallel_for(stk::ngp::DeviceRangePolicy(0, 1), KOKKOS_LAMBDA(const int i) + { + check_face_node_ordinals_ngp(t, goldFaceNodeOrdinals); + check_face_nodes_ngp(t, goldFaceNodeOrdinals); + + check_side_node_ordinals_ngp(t, goldSideNodeOrdinals); + check_side_nodes_ngp(t, goldSideNodeOrdinals); + }); +} + +NGP_TEST(stk_topology_ngp, shell_tri_3_all_face_sides) +{ + check_shell_tri_3_all_face_sides_on_device(); +} + +std::vector> get_gold_edge_node_ordinals_shell_tri4() { + return std::vector> { + {0, 1}, + {1, 2}, + {2, 0} + }; +} + +std::vector> get_gold_face_node_ordinals_shell_tri4() { + return std::vector> { + {0, 1, 2, 3}, + {0, 2, 1, 3}, + {0, 1}, + {1, 2}, + {2, 0} + }; +} + +std::vector> get_gold_side_node_ordinals_shell_tri4() { + return std::vector> { + {0, 1, 2, 3}, + {0, 2, 1, 3}, + {0, 1}, + {1, 2}, + {2, 0} + }; +} + +TEST(stk_topology, shell_tri_4_all_face_sides) +{ + stk::topology t = stk::topology::SHELL_TRI_4_ALL_FACE_SIDES; + + EXPECT_TRUE(t.is_valid()); + EXPECT_TRUE(t.has_homogeneous_faces()); + EXPECT_TRUE(t.is_shell()); + + EXPECT_EQ(t.rank(),stk::topology::ELEMENT_RANK); + EXPECT_EQ(t.side_rank(),stk::topology::FACE_RANK); + + EXPECT_EQ(t.num_nodes(),4u); + EXPECT_EQ(t.num_vertices(),3u); + EXPECT_EQ(t.num_faces(),5u); + EXPECT_EQ(t.num_edges(),3u); + EXPECT_EQ(t.num_sides(),5u); + + EXPECT_FALSE(t.defined_on_spatial_dimension(1)); + EXPECT_FALSE(t.defined_on_spatial_dimension(2)); + EXPECT_TRUE(t.defined_on_spatial_dimension(3)); + + EXPECT_EQ(t.base(),stk::topology::SHELL_TRI_3_ALL_FACE_SIDES); + + EXPECT_EQ(t.edge_topology(0), stk::topology::LINE_2); + EXPECT_EQ(t.edge_topology(1), stk::topology::LINE_2); + EXPECT_EQ(t.edge_topology(2), stk::topology::LINE_2); + + EXPECT_EQ(t.face_topology(0), stk::topology::TRI_4); + EXPECT_EQ(t.face_topology(1), stk::topology::TRI_4); + EXPECT_EQ(t.face_topology(2), stk::topology::SHELL_SIDE_BEAM_2); + EXPECT_EQ(t.face_topology(3), stk::topology::SHELL_SIDE_BEAM_2); + EXPECT_EQ(t.face_topology(4), stk::topology::SHELL_SIDE_BEAM_2); + + EXPECT_EQ(t.side_topology(0), stk::topology::TRI_4); + EXPECT_EQ(t.side_topology(1), stk::topology::TRI_4); + EXPECT_EQ(t.side_topology(2), stk::topology::SHELL_SIDE_BEAM_2); + EXPECT_EQ(t.side_topology(3), stk::topology::SHELL_SIDE_BEAM_2); + EXPECT_EQ(t.side_topology(4), stk::topology::SHELL_SIDE_BEAM_2); + + check_edge_node_ordinals(t, get_gold_edge_node_ordinals_shell_tri4()); + check_edge_nodes(t, get_gold_edge_node_ordinals_shell_tri4()); + + check_face_node_ordinals(t, get_gold_face_node_ordinals_shell_tri4()); + check_face_nodes(t, get_gold_face_node_ordinals_shell_tri4()); + + check_side_node_ordinals(t, get_gold_side_node_ordinals_shell_tri4()); + check_side_nodes(t, get_gold_side_node_ordinals_shell_tri4()); +} + +void check_shell_tri_4_all_face_sides_on_device() +{ + OrdinalType goldEdgeNodeOrdinals = fillGoldOrdinals(get_gold_edge_node_ordinals_shell_tri4()); + OrdinalType goldFaceNodeOrdinals = fillGoldOrdinals(get_gold_face_node_ordinals_shell_tri4()); + OrdinalType goldSideNodeOrdinals = fillGoldOrdinals(get_gold_side_node_ordinals_shell_tri4()); + + stk::topology t = stk::topology::SHELL_TRI_4_ALL_FACE_SIDES; + constexpr unsigned numNodes = stk::topology_detail::topology_data::num_nodes; + EXPECT_EQ(4u, numNodes); + + Kokkos::parallel_for(stk::ngp::DeviceRangePolicy(0, 1), KOKKOS_LAMBDA(const int i) + { + NGP_EXPECT_TRUE(t.is_valid()); + NGP_EXPECT_TRUE(t.has_homogeneous_faces()); + NGP_EXPECT_TRUE(t.is_shell()); + + NGP_EXPECT_EQ(t.rank(),stk::topology::ELEMENT_RANK); + NGP_EXPECT_EQ(t.side_rank(),stk::topology::FACE_RANK); + + NGP_EXPECT_EQ(t.num_nodes(),4u); + NGP_EXPECT_EQ(t.num_vertices(),3u); + NGP_EXPECT_EQ(t.num_edges(),3u); + NGP_EXPECT_EQ(t.num_faces(),5u); + NGP_EXPECT_EQ(t.num_sides(),5u); + + NGP_EXPECT_FALSE(t.defined_on_spatial_dimension(1)); + NGP_EXPECT_FALSE(t.defined_on_spatial_dimension(2)); + NGP_EXPECT_TRUE(t.defined_on_spatial_dimension(3)); + + NGP_EXPECT_EQ(t.base(),stk::topology::SHELL_TRI_3_ALL_FACE_SIDES); + + NGP_EXPECT_EQ(t.edge_topology(0), stk::topology::LINE_2); + NGP_EXPECT_EQ(t.edge_topology(1), stk::topology::LINE_2); + NGP_EXPECT_EQ(t.edge_topology(2), stk::topology::LINE_2); + + NGP_EXPECT_EQ(t.face_topology(0), stk::topology::TRI_4); + NGP_EXPECT_EQ(t.face_topology(1), stk::topology::TRI_4); + NGP_EXPECT_EQ(t.face_topology(2), stk::topology::SHELL_SIDE_BEAM_2); + NGP_EXPECT_EQ(t.face_topology(3), stk::topology::SHELL_SIDE_BEAM_2); + NGP_EXPECT_EQ(t.face_topology(4), stk::topology::SHELL_SIDE_BEAM_2); + + NGP_EXPECT_EQ(t.side_topology(0), stk::topology::TRI_4); + NGP_EXPECT_EQ(t.side_topology(1), stk::topology::TRI_4); + NGP_EXPECT_EQ(t.side_topology(2), stk::topology::SHELL_SIDE_BEAM_2); + NGP_EXPECT_EQ(t.side_topology(3), stk::topology::SHELL_SIDE_BEAM_2); + NGP_EXPECT_EQ(t.side_topology(4), stk::topology::SHELL_SIDE_BEAM_2); + + check_edge_node_ordinals_ngp(t, goldEdgeNodeOrdinals); + check_edge_nodes_ngp(t, goldEdgeNodeOrdinals); + }); + + Kokkos::parallel_for(stk::ngp::DeviceRangePolicy(0, 1), KOKKOS_LAMBDA(const int i) + { + check_face_node_ordinals_ngp(t, goldFaceNodeOrdinals); + check_face_nodes_ngp(t, goldFaceNodeOrdinals); + + check_side_node_ordinals_ngp(t, goldSideNodeOrdinals); + check_side_nodes_ngp(t, goldSideNodeOrdinals); + }); +} + +NGP_TEST(stk_topology_ngp, shell_tri_4_all_face_sides) +{ + check_shell_tri_4_all_face_sides_on_device(); +} + +std::vector> get_gold_edge_node_ordinals_shell_tri6() { + return std::vector> { + {0, 1, 3}, + {1, 2, 4}, + {2, 0, 5} + }; +} + +std::vector> get_gold_face_node_ordinals_shell_tri6() { + return std::vector> { + {0, 1, 2, 3, 4, 5}, + {0, 2, 1, 5, 4, 3}, + {0, 1, 3}, + {1, 2, 4}, + {2, 0, 5} + }; +} + +std::vector> get_gold_side_node_ordinals_shell_tri6() { + return std::vector> { + {0, 1, 2, 3, 4, 5}, + {0, 2, 1, 5, 4, 3}, + {0, 1, 3}, + {1, 2, 4}, + {2, 0, 5} + }; +} + +TEST(stk_topology, shell_tri_6_all_face_sides) +{ + stk::topology t = stk::topology::SHELL_TRI_6_ALL_FACE_SIDES; + + EXPECT_TRUE(t.is_valid()); + EXPECT_TRUE(t.has_homogeneous_faces()); + EXPECT_TRUE(t.is_shell()); + + EXPECT_EQ(t.rank(),stk::topology::ELEMENT_RANK); + EXPECT_EQ(t.side_rank(),stk::topology::FACE_RANK); + + EXPECT_EQ(t.num_nodes(),6u); + EXPECT_EQ(t.num_vertices(),3u); + EXPECT_EQ(t.num_faces(),5u); + EXPECT_EQ(t.num_edges(),3u); + EXPECT_EQ(t.num_sides(),5u); + + EXPECT_FALSE(t.defined_on_spatial_dimension(1)); + EXPECT_FALSE(t.defined_on_spatial_dimension(2)); + EXPECT_TRUE(t.defined_on_spatial_dimension(3)); + + EXPECT_EQ(t.base(),stk::topology::SHELL_TRI_3_ALL_FACE_SIDES); + + EXPECT_EQ(t.edge_topology(0), stk::topology::LINE_3); + EXPECT_EQ(t.edge_topology(1), stk::topology::LINE_3); + EXPECT_EQ(t.edge_topology(2), stk::topology::LINE_3); + + EXPECT_EQ(t.face_topology(0), stk::topology::TRI_6); + EXPECT_EQ(t.face_topology(1), stk::topology::TRI_6); + EXPECT_EQ(t.face_topology(2), stk::topology::SHELL_SIDE_BEAM_3); + EXPECT_EQ(t.face_topology(3), stk::topology::SHELL_SIDE_BEAM_3); + EXPECT_EQ(t.face_topology(4), stk::topology::SHELL_SIDE_BEAM_3); + + EXPECT_EQ(t.side_topology(0), stk::topology::TRI_6); + EXPECT_EQ(t.side_topology(1), stk::topology::TRI_6); + EXPECT_EQ(t.side_topology(2), stk::topology::SHELL_SIDE_BEAM_3); + EXPECT_EQ(t.side_topology(3), stk::topology::SHELL_SIDE_BEAM_3); + EXPECT_EQ(t.side_topology(4), stk::topology::SHELL_SIDE_BEAM_3); + + check_edge_node_ordinals(t, get_gold_edge_node_ordinals_shell_tri6()); + check_edge_nodes(t, get_gold_edge_node_ordinals_shell_tri6()); + + check_face_node_ordinals(t, get_gold_face_node_ordinals_shell_tri6()); + check_face_nodes(t, get_gold_face_node_ordinals_shell_tri6()); + + check_side_node_ordinals(t, get_gold_side_node_ordinals_shell_tri6()); + check_side_nodes(t, get_gold_side_node_ordinals_shell_tri6()); +} + +void check_shell_tri_6_all_face_sides_on_device() +{ + OrdinalType goldEdgeNodeOrdinals = fillGoldOrdinals(get_gold_edge_node_ordinals_shell_tri6()); + OrdinalType goldFaceNodeOrdinals = fillGoldOrdinals(get_gold_face_node_ordinals_shell_tri6()); + OrdinalType goldSideNodeOrdinals = fillGoldOrdinals(get_gold_side_node_ordinals_shell_tri6()); + + stk::topology t = stk::topology::SHELL_TRI_6_ALL_FACE_SIDES; + constexpr unsigned numNodes = stk::topology_detail::topology_data::num_nodes; + EXPECT_EQ(6u, numNodes); + + Kokkos::parallel_for(stk::ngp::DeviceRangePolicy(0, 1), KOKKOS_LAMBDA(const int i) + { + NGP_EXPECT_TRUE(t.is_valid()); + NGP_EXPECT_TRUE(t.has_homogeneous_faces()); + NGP_EXPECT_TRUE(t.is_shell()); + + NGP_EXPECT_EQ(t.rank(),stk::topology::ELEMENT_RANK); + NGP_EXPECT_EQ(t.side_rank(),stk::topology::FACE_RANK); + + NGP_EXPECT_EQ(t.num_nodes(),6u); + NGP_EXPECT_EQ(t.num_vertices(),3u); + NGP_EXPECT_EQ(t.num_edges(),3u); + NGP_EXPECT_EQ(t.num_faces(),5u); + NGP_EXPECT_EQ(t.num_sides(),5u); + + NGP_EXPECT_FALSE(t.defined_on_spatial_dimension(1)); + NGP_EXPECT_FALSE(t.defined_on_spatial_dimension(2)); + NGP_EXPECT_TRUE(t.defined_on_spatial_dimension(3)); + + NGP_EXPECT_EQ(t.base(),stk::topology::SHELL_TRI_3_ALL_FACE_SIDES); + + NGP_EXPECT_EQ(t.edge_topology(0), stk::topology::LINE_3); + NGP_EXPECT_EQ(t.edge_topology(1), stk::topology::LINE_3); + NGP_EXPECT_EQ(t.edge_topology(2), stk::topology::LINE_3); + + NGP_EXPECT_EQ(t.face_topology(0), stk::topology::TRI_6); + NGP_EXPECT_EQ(t.face_topology(1), stk::topology::TRI_6); + NGP_EXPECT_EQ(t.face_topology(2), stk::topology::SHELL_SIDE_BEAM_3); + NGP_EXPECT_EQ(t.face_topology(3), stk::topology::SHELL_SIDE_BEAM_3); + NGP_EXPECT_EQ(t.face_topology(4), stk::topology::SHELL_SIDE_BEAM_3); + + NGP_EXPECT_EQ(t.side_topology(0), stk::topology::TRI_6); + NGP_EXPECT_EQ(t.side_topology(1), stk::topology::TRI_6); + NGP_EXPECT_EQ(t.side_topology(2), stk::topology::SHELL_SIDE_BEAM_3); + NGP_EXPECT_EQ(t.side_topology(3), stk::topology::SHELL_SIDE_BEAM_3); + NGP_EXPECT_EQ(t.side_topology(4), stk::topology::SHELL_SIDE_BEAM_3); + + check_edge_node_ordinals_ngp(t, goldEdgeNodeOrdinals); + check_edge_nodes_ngp(t, goldEdgeNodeOrdinals); + }); + + Kokkos::parallel_for(stk::ngp::DeviceRangePolicy(0, 1), KOKKOS_LAMBDA(const int i) + { + check_face_node_ordinals_ngp(t, goldFaceNodeOrdinals); + check_face_nodes_ngp(t, goldFaceNodeOrdinals); + + check_side_node_ordinals_ngp(t, goldSideNodeOrdinals); + check_side_nodes_ngp(t, goldSideNodeOrdinals); + }); +} + +NGP_TEST(stk_topology_ngp, shell_tri_6_all_face_sides) +{ + check_shell_tri_6_all_face_sides_on_device(); +} + +} + + diff --git a/packages/stk/stk_util/stk_util/Version.hpp b/packages/stk/stk_util/stk_util/Version.hpp index 12be53701b43..fd0d003e2e0a 100644 --- a/packages/stk/stk_util/stk_util/Version.hpp +++ b/packages/stk/stk_util/stk_util/Version.hpp @@ -44,7 +44,7 @@ //See the file CHANGELOG.md for a listing that shows the //correspondence between version numbers and API changes. -#define STK_VERSION 5210400 +#define STK_VERSION 5210401 namespace stk diff --git a/packages/stk/stk_util/stk_util/registry/ProductRegistry.cpp b/packages/stk/stk_util/stk_util/registry/ProductRegistry.cpp index 975965501caa..33d28485af59 100644 --- a/packages/stk/stk_util/stk_util/registry/ProductRegistry.cpp +++ b/packages/stk/stk_util/stk_util/registry/ProductRegistry.cpp @@ -42,7 +42,7 @@ //In Sierra, STK_VERSION_STRING is provided on the compile line by bake. //For Trilinos stk snapshots, the following macro definition gets populated with //the real version string by the trilinos_snapshot.sh script. -#define STK_VERSION_STRING "5.21.3-738-g0d57d6ac" +#define STK_VERSION_STRING "5.21.4-85-gd1ee7818" #endif namespace stk {