From: Cédric Aguerre Date: Tue, 27 Oct 2015 13:23:34 +0000 (+0100) Subject: add mpi part X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=52ee209e3bf07fc723d330e9726786654490c55f;p=tools%2Fmedcoupling.git add mpi part --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 4bbaae984..ba75c06cb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -86,16 +86,10 @@ IF(NOT SALOME_MED_MICROMED) #FIND_PACKAGE(SalomeLibXml2) #SALOME_LOG_OPTIONAL_PACKAGE(LibXml2 SALOME_MED_ENABLE_PARTITIONER) IF(DEFINED ENV{LIBXML2_ROOT_DIR}) - SET(CMAKE_PREFIX_PATH "$ENV{LIBXML2_ROOT_DIR}") + SET(LIBXML2_ROOT_DIR $ENV{LIBXML2_ROOT_DIR} CACHE PATH "Path to the LibXml2.") + LIST(APPEND CMAKE_PREFIX_PATH "${LIBXML2_ROOT_DIR}") ENDIF() FIND_PACKAGE(LibXml2) - MESSAGE("LIBXML2_FOUND: ${LIBXML2_FOUND}") - MESSAGE("LIBXML2_INCLUDE_DIR: ${LIBXML2_INCLUDE_DIR}") - MESSAGE("LIBXML2_LIBRARIES: ${LIBXML2_LIBRARIES}") - MESSAGE("LIBXML2_DEFINITIONS: ${LIBXML2_DEFINITIONS}") - MESSAGE("LIBXML2_XMLLINT_EXECUTABLE: ${LIBXML2_XMLLINT_EXECUTABLE}") - MESSAGE("LIBXML2_VERSION_STRING: ${LIBXML2_VERSION_STRING}") - IF(SALOME_MED_PARTITIONER_METIS) #FIND_PACKAGE(SalomeMetis) #SALOME_LOG_OPTIONAL_PACKAGE(Metis SALOME_MED_PARTITIONER_METIS) @@ -120,11 +114,17 @@ IF(SALOME_BUILD_TESTS) ENDIF(SALOME_BUILD_TESTS) IF(SALOME_USE_MPI) - FIND_PACKAGE(SalomeMPI REQUIRED) + #FIND_PACKAGE(SalomeMPI REQUIRED) + FIND_PACKAGE(MPI REQUIRED) ADD_DEFINITIONS("-DHAVE_MPI") + SET(MPI_INCLUDE_DIRS ${MPI_C_INCLUDE_PATH} ${MPI_CXX_INCLUDE_PATH}) + SET(MPI_LIBRARIES ${MPI_C_LIBRARIES} ${MPI_CXX_LIBRARIES}) + SET(MPI_DEFINITIONS "${MPI_CXX_COMPILE_FLAGS}") + IF(SALOME_MED_PARTITIONER_PARMETIS) - FIND_PACKAGE(SalomeParMetis) - SALOME_LOG_OPTIONAL_PACKAGE(ParMetis SALOME_MED_PARTITIONER_PARMETIS) + #FIND_PACKAGE(SalomeParMetis) + FIND_PACKAGE(ParMetis) + #SALOME_LOG_OPTIONAL_PACKAGE(ParMetis SALOME_MED_PARTITIONER_PARMETIS) ADD_DEFINITIONS("-DMED_ENABLE_PARMETIS") ENDIF(SALOME_MED_PARTITIONER_PARMETIS) ENDIF(SALOME_USE_MPI) @@ -133,7 +133,8 @@ IF(SALOME_MED_ENABLE_RENUMBER) #FIND_PACKAGE(SalomeBoost) #SALOME_LOG_OPTIONAL_PACKAGE(Boost SALOME_MED_ENABLE_RENUMBER) IF(DEFINED ENV{BOOST_ROOT_DIR}) - SET(CMAKE_PREFIX_PATH "$ENV{BOOST_ROOT_DIR}") + SET(BOOST_ROOT_DIR $ENV{BOOST_ROOT_DIR} CACHE PATH "Path to the Boost.") + LIST(APPEND CMAKE_PREFIX_PATH "${BOOST_ROOT_DIR}") ENDIF() SET(Boost_USE_STATIC_LIBS OFF) SET(Boost_USE_MULTITHREADED ON) @@ -152,7 +153,8 @@ IF(SALOME_BUILD_DOC) #SALOME_LOG_OPTIONAL_PACKAGE(Sphinx SALOME_BUILD_DOC) FIND_PACKAGE(Doxygen) IF(DEFINED ENV{GRAPHVIZ_ROOT_DIR}) - SET(CMAKE_PREFIX_PATH "$ENV{GRAPHVIZ_ROOT_DIR}") + SET(GRAPHVIZ_ROOT_DIR $ENV{GRAPHVIZ_ROOT_DIR} CACHE PATH "Path to the Graphviz.") + LIST(APPEND CMAKE_PREFIX_PATH "${GRAPHVIZ_ROOT_DIR}") ENDIF() FIND_PACKAGE(Graphviz) FIND_PACKAGE(Sphinx) @@ -245,6 +247,7 @@ IF(WIN32) ADD_DEFINITIONS("-D_USE_MATH_DEFINES") ENDIF(WIN32) +#ADD_DEFINITIONS("-DMEDTOOL_ROOT_DIR=${CMAKE_INSTALL_PREFIX}") ADD_SUBDIRECTORY(src) #ADD_SUBDIRECTORY(adm_local) diff --git a/cmake_files/FindMEDFile.cmake b/cmake_files/FindMEDFile.cmake index 82b8eee53..546969240 100644 --- a/cmake_files/FindMEDFile.cmake +++ b/cmake_files/FindMEDFile.cmake @@ -50,5 +50,10 @@ ELSE(MEDFILE_F_LIBRARIES) SET(MEDFILE_LIBRARIES ${MEDFILE_C_LIBRARIES}) ENDIF(MEDFILE_F_LIBRARIES) +IF(NOT MEDFILE_INCLUDE_DIRS + OR (NOT MEDFILE_C_LIBRARIES AND NOT MEDFILE_F_LIBRARIES)) + MESSAGE(FATAL_ERROR "MEDFile not found; please set MEDFILE_ROOT_DIR and check target directory.") +ENDIF() + INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(MEDFile REQUIRED_VARS MEDFILE_INCLUDE_DIRS MEDFILE_LIBRARIES) diff --git a/cmake_files/FindMetis.cmake b/cmake_files/FindMetis.cmake index 5173cba6d..c4f627362 100644 --- a/cmake_files/FindMetis.cmake +++ b/cmake_files/FindMetis.cmake @@ -32,6 +32,10 @@ ENDIF(METIS_ROOT_DIR) FIND_LIBRARY(METIS_LIBRARIES metis) FIND_PATH(METIS_INCLUDE_DIRS metis.h) +IF(NOT METIS_LIBRARIES OR NOT METIS_INCLUDE_DIRS) + MESSAGE(FATAL_ERROR "Metis not found; please set METIS_ROOT_DIR and check target directory.") +ENDIF() + INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(Metis REQUIRED_VARS METIS_INCLUDE_DIRS METIS_LIBRARIES) FILE(READ ${METIS_INCLUDE_DIRS}/metis.h metis_h_content) diff --git a/cmake_files/FindParMetis.cmake b/cmake_files/FindParMetis.cmake new file mode 100644 index 000000000..7eb0701a3 --- /dev/null +++ b/cmake_files/FindParMetis.cmake @@ -0,0 +1,39 @@ +# Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# ------ + +MESSAGE(STATUS "Check for parmetis ...") + +SET(PARMETIS_ROOT_DIR $ENV{PARMETIS_ROOT_DIR} CACHE PATH "Path to the PARMETIS.") +IF(PARMETIS_ROOT_DIR) + LIST(APPEND CMAKE_PREFIX_PATH "${PARMETIS_ROOT_DIR}") +ENDIF(PARMETIS_ROOT_DIR) + +FIND_LIBRARY(PARMETIS_LIBRARIES parmetis) +FIND_LIBRARY(PARMETIS_SEQ_LIBRARIES metis) +SET(PARMETIS_LIBRARIES ${PARMETIS_LIBRARIES} ${PARMETIS_SEQ_LIBRARIES}) +FIND_PATH(PARMETIS_INCLUDE_DIRS parmetis.h) + +IF(NOT PARMETIS_LIBRARIES OR NOT PARMETIS_INCLUDE_DIRS) + MESSAGE(FATAL_ERROR "Parallel Metis not found; please set PARMETIS_ROOT_DIR and check target directory.") +ENDIF() + +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(ParMetis REQUIRED_VARS PARMETIS_INCLUDE_DIRS PARMETIS_LIBRARIES) diff --git a/cmake_files/FindScotch.cmake b/cmake_files/FindScotch.cmake index b63d30dcb..351c3e92e 100644 --- a/cmake_files/FindScotch.cmake +++ b/cmake_files/FindScotch.cmake @@ -31,5 +31,9 @@ FIND_LIBRARY(SCOTCH_ERR_LIBRARIES scotcherr) SET(SCOTCH_LIBRARIES ${SCOTCH_LIBRARIES} ${SCOTCH_ERR_LIBRARIES}) FIND_PATH(SCOTCH_INCLUDE_DIRS scotch.h PATH_SUFFIXES "/scotch") +IF(NOT SCOTCH_LIBRARIES OR NOT SCOTCH_ERR_LIBRARIES OR NOT SCOTCH_INCLUDE_DIRS) + MESSAGE(FATAL_ERROR "Scotch not found; please set SCOTCH_ROOT_DIR and check target directory.") +ENDIF() + INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(Scotch REQUIRED_VARS SCOTCH_INCLUDE_DIRS SCOTCH_LIBRARIES) diff --git a/resources/BDC-714.sauv b/resources/BDC-714.sauv new file mode 100644 index 000000000..fe8063076 Binary files /dev/null and b/resources/BDC-714.sauv differ diff --git a/resources/Box1.med b/resources/Box1.med new file mode 100644 index 000000000..d1687755a Binary files /dev/null and b/resources/Box1.med differ diff --git a/resources/Box1Moderate.med b/resources/Box1Moderate.med new file mode 100644 index 000000000..28d53d567 Binary files /dev/null and b/resources/Box1Moderate.med differ diff --git a/resources/Box2.med b/resources/Box2.med new file mode 100644 index 000000000..a7c9e049f Binary files /dev/null and b/resources/Box2.med differ diff --git a/resources/Box2Moderate.med b/resources/Box2Moderate.med new file mode 100644 index 000000000..c68570b46 Binary files /dev/null and b/resources/Box2Moderate.med differ diff --git a/resources/Box3.med b/resources/Box3.med new file mode 100644 index 000000000..d9158ff61 Binary files /dev/null and b/resources/Box3.med differ diff --git a/resources/BoxEvenSmaller1.med b/resources/BoxEvenSmaller1.med new file mode 100644 index 000000000..79a495abc Binary files /dev/null and b/resources/BoxEvenSmaller1.med differ diff --git a/resources/BoxHexa1.med b/resources/BoxHexa1.med new file mode 100644 index 000000000..da4ba0ebe Binary files /dev/null and b/resources/BoxHexa1.med differ diff --git a/resources/BoxHexa2.med b/resources/BoxHexa2.med new file mode 100644 index 000000000..f76852e74 Binary files /dev/null and b/resources/BoxHexa2.med differ diff --git a/resources/BoxModSmall1.med b/resources/BoxModSmall1.med new file mode 100644 index 000000000..7b0ebc77b Binary files /dev/null and b/resources/BoxModSmall1.med differ diff --git a/resources/BoxModSmall2.med b/resources/BoxModSmall2.med new file mode 100644 index 000000000..4d2e505ac Binary files /dev/null and b/resources/BoxModSmall2.med differ diff --git a/resources/BoxTetra2.med b/resources/BoxTetra2.med new file mode 100644 index 000000000..3d21669bf Binary files /dev/null and b/resources/BoxTetra2.med differ diff --git a/resources/CMakeLists.txt b/resources/CMakeLists.txt index 6d185dc17..e891af65c 100644 --- a/resources/CMakeLists.txt +++ b/resources/CMakeLists.txt @@ -134,51 +134,51 @@ SET(MED_RESOURCES_FILES # TimeStamps.med # zzzz121b.med # zzzz121b_without_tr6.med - # UnitTetra.med - # GeneralTetra.med - # NudgedSimpler.med - # NudgedTetra.med - # CornerTetra.med - # SimpleIncludedTetra.med - # SimpleIncludingTetra.med + UnitTetra.med + GeneralTetra.med + NudgedSimpler.med + NudgedTetra.med + CornerTetra.med + SimpleIncludedTetra.med + SimpleIncludingTetra.med Test2D.med Test2Dpoly.med Test3D.med Test3Dpoly.med - #UnitTetraDegenT.med - # DegenEdgeXY.med - # DegenFaceXYZ.med - # DegenTranslatedInPlane.med - # ComplexIncludedTetra.med - # ComplexIncludingTetra.med - # HalfstripOnly.med - # HalfstripOnly2.med - #SimpleHalfstripOnly.med - #GenTetra1.med - #GenTetra2.med - #TrickyTetra1.med + UnitTetraDegenT.med + DegenEdgeXY.med + DegenFaceXYZ.med + DegenTranslatedInPlane.med + ComplexIncludedTetra.med + ComplexIncludingTetra.med + HalfstripOnly.med + HalfstripOnly2.med + SimpleHalfstripOnly.med + GenTetra1.med + GenTetra2.med + TrickyTetra1.med LargeUnitTetra.med # LargeInconsistentTetra.med - # DividedUnitTetraSimpler.med - # DividedUnitTetra.med - # NudgedDividedUnitTetra.med - # NudgedDividedUnitTetraSimpler.med - # DividedGenTetra1.med - # DividedGenTetra2.med - # Box1.med - # Box2.med - # Box3.med - # Box1Moderate.med - # Box2Moderate.med - # BoxModSmall1.med - # BoxModSmall2.med - # BoxEvenSmaller1.med - # TinyBox.med - # BoxHexa1.med - # BoxHexa2.med - # MovedHexaBox1.med - # MovedHexaBox2.med - # BoxTetra2.med + DividedUnitTetraSimpler.med + DividedUnitTetra.med + NudgedDividedUnitTetra.med + NudgedDividedUnitTetraSimpler.med + DividedGenTetra1.med + DividedGenTetra2.med + Box1.med + Box2.med + Box3.med + Box1Moderate.med + Box2Moderate.med + BoxModSmall1.med + BoxModSmall2.med + BoxEvenSmaller1.med + TinyBox.med + BoxHexa1.med + BoxHexa2.med + MovedHexaBox1.med + MovedHexaBox2.med + BoxTetra2.med square1.med # square1_split # square1_split1.med @@ -203,9 +203,9 @@ SET(MED_RESOURCES_FILES # blow5_ascii_pd_displacement # blow5_ascii_pd_thickness #test_2D.sauve - #allPillesTest.sauv - #BDC-714.sauv - #portico_3subs.sauv + allPillesTest.sauv + BDC-714.sauv + portico_3subs.sauv agitateur.med ) @@ -225,6 +225,10 @@ SET(MED_RESOURCES_FILES # ) # ENDIF(MED_ENABLE_GUI) +FOREACH(resfile ${MED_RESOURCES_FILES}) + CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/${resfile}" "${CMAKE_CURRENT_BINARY_DIR}/${resfile}" COPYONLY) +ENDFOREACH(resfile) + INSTALL(FILES ${MED_RESOURCES_FILES} DESTINATION ${MEDTOOL_INSTALL_RES_DATA}) #MESSAGE(STATUS "Creation of ${CMAKE_CURRENT_BINARY_DIR}/MEDCatalog.xml") diff --git a/resources/ComplexIncludedTetra.med b/resources/ComplexIncludedTetra.med new file mode 100644 index 000000000..09a59279c Binary files /dev/null and b/resources/ComplexIncludedTetra.med differ diff --git a/resources/ComplexIncludingTetra.med b/resources/ComplexIncludingTetra.med new file mode 100644 index 000000000..e6aedf5aa Binary files /dev/null and b/resources/ComplexIncludingTetra.med differ diff --git a/resources/CornerTetra.med b/resources/CornerTetra.med new file mode 100644 index 000000000..f006c1756 Binary files /dev/null and b/resources/CornerTetra.med differ diff --git a/resources/DegenEdgeXY.med b/resources/DegenEdgeXY.med new file mode 100644 index 000000000..bd42d14f0 Binary files /dev/null and b/resources/DegenEdgeXY.med differ diff --git a/resources/DegenFaceXYZ.med b/resources/DegenFaceXYZ.med new file mode 100644 index 000000000..f0ecdd61e Binary files /dev/null and b/resources/DegenFaceXYZ.med differ diff --git a/resources/DegenTranslatedInPlane.med b/resources/DegenTranslatedInPlane.med new file mode 100644 index 000000000..d83f96c6d Binary files /dev/null and b/resources/DegenTranslatedInPlane.med differ diff --git a/resources/DividedGenTetra1.med b/resources/DividedGenTetra1.med new file mode 100644 index 000000000..71274ea70 Binary files /dev/null and b/resources/DividedGenTetra1.med differ diff --git a/resources/DividedGenTetra2.med b/resources/DividedGenTetra2.med new file mode 100644 index 000000000..14f63cd5f Binary files /dev/null and b/resources/DividedGenTetra2.med differ diff --git a/resources/DividedUnitTetra.med b/resources/DividedUnitTetra.med new file mode 100644 index 000000000..320bdfa3d Binary files /dev/null and b/resources/DividedUnitTetra.med differ diff --git a/resources/DividedUnitTetraSimpler.med b/resources/DividedUnitTetraSimpler.med new file mode 100644 index 000000000..a826cfbeb Binary files /dev/null and b/resources/DividedUnitTetraSimpler.med differ diff --git a/resources/GenTetra1.med b/resources/GenTetra1.med new file mode 100644 index 000000000..629b29928 Binary files /dev/null and b/resources/GenTetra1.med differ diff --git a/resources/GenTetra2.med b/resources/GenTetra2.med new file mode 100644 index 000000000..32e3bb51e Binary files /dev/null and b/resources/GenTetra2.med differ diff --git a/resources/GeneralTetra.med b/resources/GeneralTetra.med new file mode 100644 index 000000000..11b2e2785 Binary files /dev/null and b/resources/GeneralTetra.med differ diff --git a/resources/HalfstripOnly.med b/resources/HalfstripOnly.med new file mode 100644 index 000000000..11dee6434 Binary files /dev/null and b/resources/HalfstripOnly.med differ diff --git a/resources/HalfstripOnly2.med b/resources/HalfstripOnly2.med new file mode 100644 index 000000000..67bca2377 Binary files /dev/null and b/resources/HalfstripOnly2.med differ diff --git a/resources/MovedHexaBox1.med b/resources/MovedHexaBox1.med new file mode 100644 index 000000000..6d826aef1 Binary files /dev/null and b/resources/MovedHexaBox1.med differ diff --git a/resources/MovedHexaBox2.med b/resources/MovedHexaBox2.med new file mode 100644 index 000000000..c0bdb6d7a Binary files /dev/null and b/resources/MovedHexaBox2.med differ diff --git a/resources/NudgedDividedUnitTetra.med b/resources/NudgedDividedUnitTetra.med new file mode 100644 index 000000000..67aabde0b Binary files /dev/null and b/resources/NudgedDividedUnitTetra.med differ diff --git a/resources/NudgedDividedUnitTetraSimpler.med b/resources/NudgedDividedUnitTetraSimpler.med new file mode 100644 index 000000000..2eb145e5e Binary files /dev/null and b/resources/NudgedDividedUnitTetraSimpler.med differ diff --git a/resources/NudgedSimpler.med b/resources/NudgedSimpler.med new file mode 100644 index 000000000..a0fb4ea20 Binary files /dev/null and b/resources/NudgedSimpler.med differ diff --git a/resources/NudgedTetra.med b/resources/NudgedTetra.med new file mode 100644 index 000000000..0672d1a7a Binary files /dev/null and b/resources/NudgedTetra.med differ diff --git a/resources/SimpleHalfstripOnly.med b/resources/SimpleHalfstripOnly.med new file mode 100644 index 000000000..f15aedb63 Binary files /dev/null and b/resources/SimpleHalfstripOnly.med differ diff --git a/resources/SimpleIncludedTetra.med b/resources/SimpleIncludedTetra.med new file mode 100644 index 000000000..9ac90ee1b Binary files /dev/null and b/resources/SimpleIncludedTetra.med differ diff --git a/resources/SimpleIncludingTetra.med b/resources/SimpleIncludingTetra.med new file mode 100644 index 000000000..e0d6066d0 Binary files /dev/null and b/resources/SimpleIncludingTetra.med differ diff --git a/resources/TinyBox.med b/resources/TinyBox.med new file mode 100644 index 000000000..2ae80ef4f Binary files /dev/null and b/resources/TinyBox.med differ diff --git a/resources/TrickyTetra1.med b/resources/TrickyTetra1.med new file mode 100644 index 000000000..50c0aa98a Binary files /dev/null and b/resources/TrickyTetra1.med differ diff --git a/resources/UnitTetra.med b/resources/UnitTetra.med new file mode 100644 index 000000000..d4548f23c Binary files /dev/null and b/resources/UnitTetra.med differ diff --git a/resources/UnitTetraDegenT.med b/resources/UnitTetraDegenT.med new file mode 100644 index 000000000..5a0800615 Binary files /dev/null and b/resources/UnitTetraDegenT.med differ diff --git a/resources/allPillesTest.sauv b/resources/allPillesTest.sauv new file mode 100644 index 000000000..99efda1a5 --- /dev/null +++ b/resources/allPillesTest.sauv @@ -0,0 +1,11246 @@ + ENREGISTREMENT DE TYPE 4 + NIVEAU 16 NIVEAU ERREUR 0 DIMENSION 2 + DENSITE 0.00000E+00 + ENREGISTREMENT DE TYPE 7 + NOMBRE INFO CASTEM2000 8 + IFOUR -1 NIFOUR 0 IFOMOD -1 IECHO 0 IIMPI 0 IOSPI 0 ISOTYP 1 + NSDPGE 0 + ENREGISTREMENT DE TYPE 2 + PILE NUMERO 1NBRE OBJETS NOMMES 17NBRE OBJETS 43 + BOTTOM C_3D C_5F C_6 C_65 C_6F C_75 FAM_LEFT + FAM_STOT FAM_TOP GE_1 GE_3 LEFT RIGHT TOP C_5 + C_9 + 1 2 3 4 5 6 7 8 9 10 + 11 12 13 14 15 4 16 + 2 0 0 2 1 + 0 + 11 12 + 8 0 0 4 100 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 12 13 14 11 14 13 15 16 16 15 + 17 18 18 17 19 20 20 19 21 22 + 22 21 23 24 24 23 25 26 26 25 + 27 28 28 27 29 30 30 29 31 32 + 32 31 33 34 34 33 35 36 36 35 + 37 38 38 37 39 40 40 39 41 42 + 42 41 43 44 44 43 45 46 46 45 + 47 48 48 47 49 50 50 49 51 52 + 52 51 53 54 54 53 55 56 56 55 + 57 58 58 57 59 60 60 59 61 62 + 62 61 63 64 64 63 65 66 66 65 + 67 68 68 67 69 70 70 69 71 72 + 72 71 73 74 74 73 75 76 76 75 + 77 78 78 77 79 80 79 81 82 80 + 81 83 84 82 83 85 86 84 85 87 + 88 86 87 89 90 88 89 91 92 90 + 91 93 94 92 93 95 96 94 95 97 + 98 96 97 99 100 98 99 101 102 100 + 101 103 104 102 103 105 106 104 105 107 + 108 106 107 109 110 108 109 111 112 110 + 111 113 114 112 113 115 116 114 115 117 + 118 116 117 119 120 118 119 121 122 120 + 121 123 124 122 123 125 126 124 125 127 + 128 126 127 129 130 128 129 131 132 130 + 131 133 134 132 133 135 136 134 135 137 + 138 136 137 139 140 138 139 141 142 140 + 141 143 144 142 143 145 146 144 145 147 + 148 146 147 149 150 148 149 151 152 150 + 151 153 154 152 153 155 156 154 155 157 + 158 156 157 159 160 158 159 161 162 160 + 161 163 164 162 163 165 166 164 165 167 + 168 166 167 169 170 168 169 171 172 170 + 171 173 174 172 173 175 176 174 175 177 + 178 176 177 179 180 178 179 181 182 180 + 181 183 184 182 183 185 186 184 185 187 + 188 186 187 189 190 188 189 191 192 190 + 191 193 194 192 193 195 196 194 195 197 + 198 196 197 199 200 198 199 201 202 200 + 201 203 204 202 203 205 206 204 205 207 + 208 206 207 209 210 208 209 211 212 210 + 2 0 0 2 1 + 0 + 11 12 + 8 0 0 4 100 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 12 13 14 11 14 13 15 16 16 15 + 17 18 18 17 19 20 20 19 21 22 + 22 21 23 24 24 23 25 26 26 25 + 27 28 28 27 29 30 30 29 31 32 + 32 31 33 34 34 33 35 36 36 35 + 37 38 38 37 39 40 40 39 41 42 + 42 41 43 44 44 43 45 46 46 45 + 47 48 48 47 49 50 50 49 51 52 + 52 51 53 54 54 53 55 56 56 55 + 57 58 58 57 59 60 60 59 61 62 + 62 61 63 64 64 63 65 66 66 65 + 67 68 68 67 69 70 70 69 71 72 + 72 71 73 74 74 73 75 76 76 75 + 77 78 78 77 79 80 79 81 82 80 + 81 83 84 82 83 85 86 84 85 87 + 88 86 87 89 90 88 89 91 92 90 + 91 93 94 92 93 95 96 94 95 97 + 98 96 97 99 100 98 99 101 102 100 + 101 103 104 102 103 105 106 104 105 107 + 108 106 107 109 110 108 109 111 112 110 + 111 113 114 112 113 115 116 114 115 117 + 118 116 117 119 120 118 119 121 122 120 + 121 123 124 122 123 125 126 124 125 127 + 128 126 127 129 130 128 129 131 132 130 + 131 133 134 132 133 135 136 134 135 137 + 138 136 137 139 140 138 139 141 142 140 + 141 143 144 142 143 145 146 144 145 147 + 148 146 147 149 150 148 149 151 152 150 + 151 153 154 152 153 155 156 154 155 157 + 158 156 157 159 160 158 159 161 162 160 + 161 163 164 162 163 165 166 164 165 167 + 168 166 167 169 170 168 169 171 172 170 + 171 173 174 172 173 175 176 174 175 177 + 178 176 177 179 180 178 179 181 182 180 + 181 183 184 182 183 185 186 184 185 187 + 188 186 187 189 190 188 189 191 192 190 + 191 193 194 192 193 195 196 194 195 197 + 198 196 197 199 200 198 199 201 202 200 + 201 203 204 202 203 205 206 204 205 207 + 208 206 207 209 210 208 209 211 212 210 + 2 0 0 2 1 + 0 + 211 212 + 2 0 0 2 100 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 12 13 13 15 15 17 17 19 19 21 + 21 23 23 25 25 27 27 29 29 31 + 31 33 33 35 35 37 37 39 39 41 + 41 43 43 45 45 47 47 49 49 51 + 51 53 53 55 55 57 57 59 59 61 + 61 63 63 65 65 67 67 69 69 71 + 71 73 73 75 75 77 77 79 79 81 + 81 83 83 85 85 87 87 89 89 91 + 91 93 93 95 95 97 97 99 99 101 + 101 103 103 105 105 107 107 109 109 111 + 111 113 113 115 115 117 117 119 119 121 + 121 123 123 125 125 127 127 129 129 131 + 131 133 133 135 135 137 137 139 139 141 + 141 143 143 145 145 147 147 149 149 151 + 151 153 153 155 155 157 157 159 159 161 + 161 163 163 165 165 167 167 169 169 171 + 171 173 173 175 175 177 177 179 179 181 + 181 183 183 185 185 187 187 189 189 191 + 191 193 193 195 195 197 197 199 199 201 + 201 203 203 205 205 207 207 209 209 211 + 2 0 0 2 100 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 14 11 16 14 18 16 20 18 22 20 + 24 22 26 24 28 26 30 28 32 30 + 34 32 36 34 38 36 40 38 42 40 + 44 42 46 44 48 46 50 48 52 50 + 54 52 56 54 58 56 60 58 62 60 + 64 62 66 64 68 66 70 68 72 70 + 74 72 76 74 78 76 80 78 82 80 + 84 82 86 84 88 86 90 88 92 90 + 94 92 96 94 98 96 100 98 102 100 + 104 102 106 104 108 106 110 108 112 110 + 114 112 116 114 118 116 120 118 122 120 + 124 122 126 124 128 126 130 128 132 130 + 134 132 136 134 138 136 140 138 142 140 + 144 142 146 144 148 146 150 148 152 150 + 154 152 156 154 158 156 160 158 162 160 + 164 162 166 164 168 166 170 168 172 170 + 174 172 176 174 178 176 180 178 182 180 + 184 182 186 184 188 186 190 188 192 190 + 194 192 196 194 198 196 200 198 202 200 + 204 202 206 204 208 206 210 208 212 210 + 2 0 0 2 100 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 12 13 13 15 15 17 17 19 19 21 + 21 23 23 25 25 27 27 29 29 31 + 31 33 33 35 35 37 37 39 39 41 + 41 43 43 45 45 47 47 49 49 51 + 51 53 53 55 55 57 57 59 59 61 + 61 63 63 65 65 67 67 69 69 71 + 71 73 73 75 75 77 77 79 79 81 + 81 83 83 85 85 87 87 89 89 91 + 91 93 93 95 95 97 97 99 99 101 + 101 103 103 105 105 107 107 109 109 111 + 111 113 113 115 115 117 117 119 119 121 + 121 123 123 125 125 127 127 129 129 131 + 131 133 133 135 135 137 137 139 139 141 + 141 143 143 145 145 147 147 149 149 151 + 151 153 153 155 155 157 157 159 159 161 + 161 163 163 165 165 167 167 169 169 171 + 171 173 173 175 175 177 177 179 179 181 + 181 183 183 185 185 187 187 189 189 191 + 191 193 193 195 195 197 197 199 199 201 + 201 203 203 205 205 207 207 209 209 211 + 8 0 0 4 100 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 12 13 14 11 14 13 15 16 16 15 + 17 18 18 17 19 20 20 19 21 22 + 22 21 23 24 24 23 25 26 26 25 + 27 28 28 27 29 30 30 29 31 32 + 32 31 33 34 34 33 35 36 36 35 + 37 38 38 37 39 40 40 39 41 42 + 42 41 43 44 44 43 45 46 46 45 + 47 48 48 47 49 50 50 49 51 52 + 52 51 53 54 54 53 55 56 56 55 + 57 58 58 57 59 60 60 59 61 62 + 62 61 63 64 64 63 65 66 66 65 + 67 68 68 67 69 70 70 69 71 72 + 72 71 73 74 74 73 75 76 76 75 + 77 78 78 77 79 80 79 81 82 80 + 81 83 84 82 83 85 86 84 85 87 + 88 86 87 89 90 88 89 91 92 90 + 91 93 94 92 93 95 96 94 95 97 + 98 96 97 99 100 98 99 101 102 100 + 101 103 104 102 103 105 106 104 105 107 + 108 106 107 109 110 108 109 111 112 110 + 111 113 114 112 113 115 116 114 115 117 + 118 116 117 119 120 118 119 121 122 120 + 121 123 124 122 123 125 126 124 125 127 + 128 126 127 129 130 128 129 131 132 130 + 131 133 134 132 133 135 136 134 135 137 + 138 136 137 139 140 138 139 141 142 140 + 141 143 144 142 143 145 146 144 145 147 + 148 146 147 149 150 148 149 151 152 150 + 151 153 154 152 153 155 156 154 155 157 + 158 156 157 159 160 158 159 161 162 160 + 161 163 164 162 163 165 166 164 165 167 + 168 166 167 169 170 168 169 171 172 170 + 171 173 174 172 173 175 176 174 175 177 + 178 176 177 179 180 178 179 181 182 180 + 181 183 184 182 183 185 186 184 185 187 + 188 186 187 189 190 188 189 191 192 190 + 191 193 194 192 193 195 196 194 195 197 + 198 196 197 199 200 198 199 201 202 200 + 201 203 204 202 203 205 206 204 205 207 + 208 206 207 209 210 208 209 211 212 210 + 2 0 0 2 1 + 0 + 211 212 + 2 0 0 2 1 + 0 + 11 12 + 2 0 0 2 100 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 14 11 16 14 18 16 20 18 22 20 + 24 22 26 24 28 26 30 28 32 30 + 34 32 36 34 38 36 40 38 42 40 + 44 42 46 44 48 46 50 48 52 50 + 54 52 56 54 58 56 60 58 62 60 + 64 62 66 64 68 66 70 68 72 70 + 74 72 76 74 78 76 80 78 82 80 + 84 82 86 84 88 86 90 88 92 90 + 94 92 96 94 98 96 100 98 102 100 + 104 102 106 104 108 106 110 108 112 110 + 114 112 116 114 118 116 120 118 122 120 + 124 122 126 124 128 126 130 128 132 130 + 134 132 136 134 138 136 140 138 142 140 + 144 142 146 144 148 146 150 148 152 150 + 154 152 156 154 158 156 160 158 162 160 + 164 162 166 164 168 166 170 168 172 170 + 174 172 176 174 178 176 180 178 182 180 + 184 182 186 184 188 186 190 188 192 190 + 194 192 196 194 198 196 200 198 202 200 + 204 202 206 204 208 206 210 208 212 210 + 2 0 0 2 100 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 12 13 13 15 15 17 17 19 19 21 + 21 23 23 25 25 27 27 29 29 31 + 31 33 33 35 35 37 37 39 39 41 + 41 43 43 45 45 47 47 49 49 51 + 51 53 53 55 55 57 57 59 59 61 + 61 63 63 65 65 67 67 69 69 71 + 71 73 73 75 75 77 77 79 79 81 + 81 83 83 85 85 87 87 89 89 91 + 91 93 93 95 95 97 97 99 99 101 + 101 103 103 105 105 107 107 109 109 111 + 111 113 113 115 115 117 117 119 119 121 + 121 123 123 125 125 127 127 129 129 131 + 131 133 133 135 135 137 137 139 139 141 + 141 143 143 145 145 147 147 149 149 151 + 151 153 153 155 155 157 157 159 159 161 + 161 163 163 165 165 167 167 169 169 171 + 171 173 173 175 175 177 177 179 179 181 + 181 183 183 185 185 187 187 189 189 191 + 191 193 193 195 195 197 197 199 199 201 + 201 203 203 205 205 207 207 209 209 211 + 2 0 0 2 100 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 14 11 16 14 18 16 20 18 22 20 + 24 22 26 24 28 26 30 28 32 30 + 34 32 36 34 38 36 40 38 42 40 + 44 42 46 44 48 46 50 48 52 50 + 54 52 56 54 58 56 60 58 62 60 + 64 62 66 64 68 66 70 68 72 70 + 74 72 76 74 78 76 80 78 82 80 + 84 82 86 84 88 86 90 88 92 90 + 94 92 96 94 98 96 100 98 102 100 + 104 102 106 104 108 106 110 108 112 110 + 114 112 116 114 118 116 120 118 122 120 + 124 122 126 124 128 126 130 128 132 130 + 134 132 136 134 138 136 140 138 142 140 + 144 142 146 144 148 146 150 148 152 150 + 154 152 156 154 158 156 160 158 162 160 + 164 162 166 164 168 166 170 168 172 170 + 174 172 176 174 178 176 180 178 182 180 + 184 182 186 184 188 186 190 188 192 190 + 194 192 196 194 198 196 200 198 202 200 + 204 202 206 204 208 206 210 208 212 210 + 2 0 0 2 1 + 0 + 211 212 + 1 0 0 1 202 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 + 11 12 211 212 13 15 17 19 21 23 + 25 27 29 31 33 35 37 39 41 43 + 45 47 49 51 53 55 57 59 61 63 + 65 67 69 71 73 75 77 79 81 83 + 85 87 89 91 93 95 97 99 101 103 + 105 107 109 111 113 115 117 119 121 123 + 125 127 129 131 133 135 137 139 141 143 + 145 147 149 151 153 155 157 159 161 163 + 165 167 169 171 173 175 177 179 181 183 + 185 187 189 191 193 195 197 199 201 203 + 205 207 209 210 208 206 204 202 200 198 + 196 194 192 190 188 186 184 182 180 178 + 176 174 172 170 168 166 164 162 160 158 + 156 154 152 150 148 146 144 142 140 138 + 136 134 132 130 128 126 124 122 120 118 + 116 114 112 110 108 106 104 102 100 98 + 96 94 92 90 88 86 84 82 80 78 + 76 74 72 70 68 66 64 62 60 58 + 56 54 52 50 48 46 44 42 40 38 + 36 34 32 30 28 26 24 22 20 18 + 16 14 + 11 0 0 9 100 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 12 213 13 214 14 215 11 216 217 14 + 214 13 218 15 219 16 220 221 16 219 + 15 222 17 223 18 224 225 18 223 17 + 226 19 227 20 228 229 20 227 19 230 + 21 231 22 232 233 22 231 21 234 23 + 235 24 236 237 24 235 23 238 25 239 + 26 240 241 26 239 25 242 27 243 28 + 244 245 28 243 27 246 29 247 30 248 + 249 30 247 29 250 31 251 32 252 253 + 32 251 31 254 33 255 34 256 257 34 + 255 33 258 35 259 36 260 261 36 259 + 35 262 37 263 38 264 265 38 263 37 + 266 39 267 40 268 269 40 267 39 270 + 41 271 42 272 273 42 271 41 274 43 + 275 44 276 277 44 275 43 278 45 279 + 46 280 281 46 279 45 282 47 283 48 + 284 285 48 283 47 286 49 287 50 288 + 289 50 287 49 290 51 291 52 292 293 + 52 291 51 294 53 295 54 296 297 54 + 295 53 298 55 299 56 300 301 56 299 + 55 302 57 303 58 304 305 58 303 57 + 306 59 307 60 308 309 60 307 59 310 + 61 311 62 312 313 62 311 61 314 63 + 315 64 316 317 64 315 63 318 65 319 + 66 320 321 66 319 65 322 67 323 68 + 324 325 68 323 67 326 69 327 70 328 + 329 70 327 69 330 71 331 72 332 333 + 72 331 71 334 73 335 74 336 337 74 + 335 73 338 75 339 76 340 341 76 339 + 75 342 77 343 78 344 345 78 343 77 + 346 79 347 80 348 349 79 350 81 351 + 82 352 80 347 353 81 354 83 355 84 + 356 82 351 357 83 358 85 359 86 360 + 84 355 361 85 362 87 363 88 364 86 + 359 365 87 366 89 367 90 368 88 363 + 369 89 370 91 371 92 372 90 367 373 + 91 374 93 375 94 376 92 371 377 93 + 378 95 379 96 380 94 375 381 95 382 + 97 383 98 384 96 379 385 97 386 99 + 387 100 388 98 383 389 99 390 101 391 + 102 392 100 387 393 101 394 103 395 104 + 396 102 391 397 103 398 105 399 106 400 + 104 395 401 105 402 107 403 108 404 106 + 399 405 107 406 109 407 110 408 108 403 + 409 109 410 111 411 112 412 110 407 413 + 111 414 113 415 114 416 112 411 417 113 + 418 115 419 116 420 114 415 421 115 422 + 117 423 118 424 116 419 425 117 426 119 + 427 120 428 118 423 429 119 430 121 431 + 122 432 120 427 433 121 434 123 435 124 + 436 122 431 437 123 438 125 439 126 440 + 124 435 441 125 442 127 443 128 444 126 + 439 445 127 446 129 447 130 448 128 443 + 449 129 450 131 451 132 452 130 447 453 + 131 454 133 455 134 456 132 451 457 133 + 458 135 459 136 460 134 455 461 135 462 + 137 463 138 464 136 459 465 137 466 139 + 467 140 468 138 463 469 139 470 141 471 + 142 472 140 467 473 141 474 143 475 144 + 476 142 471 477 143 478 145 479 146 480 + 144 475 481 145 482 147 483 148 484 146 + 479 485 147 486 149 487 150 488 148 483 + 489 149 490 151 491 152 492 150 487 493 + 151 494 153 495 154 496 152 491 497 153 + 498 155 499 156 500 154 495 501 155 502 + 157 503 158 504 156 499 505 157 506 159 + 507 160 508 158 503 509 159 510 161 511 + 162 512 160 507 513 161 514 163 515 164 + 516 162 511 517 163 518 165 519 166 520 + 164 515 521 165 522 167 523 168 524 166 + 519 525 167 526 169 527 170 528 168 523 + 529 169 530 171 531 172 532 170 527 533 + 171 534 173 535 174 536 172 531 537 173 + 538 175 539 176 540 174 535 541 175 542 + 177 543 178 544 176 539 545 177 546 179 + 547 180 548 178 543 549 179 550 181 551 + 182 552 180 547 553 181 554 183 555 184 + 556 182 551 557 183 558 185 559 186 560 + 184 555 561 185 562 187 563 188 564 186 + 559 565 187 566 189 567 190 568 188 563 + 569 189 570 191 571 192 572 190 567 573 + 191 574 193 575 194 576 192 571 577 193 + 578 195 579 196 580 194 575 581 195 582 + 197 583 198 584 196 579 585 197 586 199 + 587 200 588 198 583 589 199 590 201 591 + 202 592 200 587 593 201 594 203 595 204 + 596 202 591 597 203 598 205 599 206 600 + 204 595 601 205 602 207 603 208 604 206 + 599 605 207 606 209 607 210 608 208 603 + 609 209 610 211 611 212 612 210 607 613 + 11 0 0 9 100 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 12 213 13 214 14 215 11 216 217 14 + 214 13 218 15 219 16 220 221 16 219 + 15 222 17 223 18 224 225 18 223 17 + 226 19 227 20 228 229 20 227 19 230 + 21 231 22 232 233 22 231 21 234 23 + 235 24 236 237 24 235 23 238 25 239 + 26 240 241 26 239 25 242 27 243 28 + 244 245 28 243 27 246 29 247 30 248 + 249 30 247 29 250 31 251 32 252 253 + 32 251 31 254 33 255 34 256 257 34 + 255 33 258 35 259 36 260 261 36 259 + 35 262 37 263 38 264 265 38 263 37 + 266 39 267 40 268 269 40 267 39 270 + 41 271 42 272 273 42 271 41 274 43 + 275 44 276 277 44 275 43 278 45 279 + 46 280 281 46 279 45 282 47 283 48 + 284 285 48 283 47 286 49 287 50 288 + 289 50 287 49 290 51 291 52 292 293 + 52 291 51 294 53 295 54 296 297 54 + 295 53 298 55 299 56 300 301 56 299 + 55 302 57 303 58 304 305 58 303 57 + 306 59 307 60 308 309 60 307 59 310 + 61 311 62 312 313 62 311 61 314 63 + 315 64 316 317 64 315 63 318 65 319 + 66 320 321 66 319 65 322 67 323 68 + 324 325 68 323 67 326 69 327 70 328 + 329 70 327 69 330 71 331 72 332 333 + 72 331 71 334 73 335 74 336 337 74 + 335 73 338 75 339 76 340 341 76 339 + 75 342 77 343 78 344 345 78 343 77 + 346 79 347 80 348 349 79 350 81 351 + 82 352 80 347 353 81 354 83 355 84 + 356 82 351 357 83 358 85 359 86 360 + 84 355 361 85 362 87 363 88 364 86 + 359 365 87 366 89 367 90 368 88 363 + 369 89 370 91 371 92 372 90 367 373 + 91 374 93 375 94 376 92 371 377 93 + 378 95 379 96 380 94 375 381 95 382 + 97 383 98 384 96 379 385 97 386 99 + 387 100 388 98 383 389 99 390 101 391 + 102 392 100 387 393 101 394 103 395 104 + 396 102 391 397 103 398 105 399 106 400 + 104 395 401 105 402 107 403 108 404 106 + 399 405 107 406 109 407 110 408 108 403 + 409 109 410 111 411 112 412 110 407 413 + 111 414 113 415 114 416 112 411 417 113 + 418 115 419 116 420 114 415 421 115 422 + 117 423 118 424 116 419 425 117 426 119 + 427 120 428 118 423 429 119 430 121 431 + 122 432 120 427 433 121 434 123 435 124 + 436 122 431 437 123 438 125 439 126 440 + 124 435 441 125 442 127 443 128 444 126 + 439 445 127 446 129 447 130 448 128 443 + 449 129 450 131 451 132 452 130 447 453 + 131 454 133 455 134 456 132 451 457 133 + 458 135 459 136 460 134 455 461 135 462 + 137 463 138 464 136 459 465 137 466 139 + 467 140 468 138 463 469 139 470 141 471 + 142 472 140 467 473 141 474 143 475 144 + 476 142 471 477 143 478 145 479 146 480 + 144 475 481 145 482 147 483 148 484 146 + 479 485 147 486 149 487 150 488 148 483 + 489 149 490 151 491 152 492 150 487 493 + 151 494 153 495 154 496 152 491 497 153 + 498 155 499 156 500 154 495 501 155 502 + 157 503 158 504 156 499 505 157 506 159 + 507 160 508 158 503 509 159 510 161 511 + 162 512 160 507 513 161 514 163 515 164 + 516 162 511 517 163 518 165 519 166 520 + 164 515 521 165 522 167 523 168 524 166 + 519 525 167 526 169 527 170 528 168 523 + 529 169 530 171 531 172 532 170 527 533 + 171 534 173 535 174 536 172 531 537 173 + 538 175 539 176 540 174 535 541 175 542 + 177 543 178 544 176 539 545 177 546 179 + 547 180 548 178 543 549 179 550 181 551 + 182 552 180 547 553 181 554 183 555 184 + 556 182 551 557 183 558 185 559 186 560 + 184 555 561 185 562 187 563 188 564 186 + 559 565 187 566 189 567 190 568 188 563 + 569 189 570 191 571 192 572 190 567 573 + 191 574 193 575 194 576 192 571 577 193 + 578 195 579 196 580 194 575 581 195 582 + 197 583 198 584 196 579 585 197 586 199 + 587 200 588 198 583 589 199 590 201 591 + 202 592 200 587 593 201 594 203 595 204 + 596 202 591 597 203 598 205 599 206 600 + 204 595 601 205 602 207 603 208 604 206 + 599 605 207 606 209 607 210 608 208 603 + 609 209 610 211 611 212 612 210 607 613 + 8 0 0 4 100 + 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 + 213 214 215 216 214 218 219 220 219 222 + 223 224 223 226 227 228 227 230 231 232 + 231 234 235 236 235 238 239 240 239 242 + 243 244 243 246 247 248 247 250 251 252 + 251 254 255 256 255 258 259 260 259 262 + 263 264 263 266 267 268 267 270 271 272 + 271 274 275 276 275 278 279 280 279 282 + 283 284 283 286 287 288 287 290 291 292 + 291 294 295 296 295 298 299 300 299 302 + 303 304 303 306 307 308 307 310 311 312 + 311 314 315 316 315 318 319 320 319 322 + 323 324 323 326 327 328 327 330 331 332 + 331 334 335 336 335 338 339 340 339 342 + 343 344 343 346 347 348 350 351 352 347 + 354 355 356 351 358 359 360 355 362 363 + 364 359 366 367 368 363 370 371 372 367 + 374 375 376 371 378 379 380 375 382 383 + 384 379 386 387 388 383 390 391 392 387 + 394 395 396 391 398 399 400 395 402 403 + 404 399 406 407 408 403 410 411 412 407 + 414 415 416 411 418 419 420 415 422 423 + 424 419 426 427 428 423 430 431 432 427 + 434 435 436 431 438 439 440 435 442 443 + 444 439 446 447 448 443 450 451 452 447 + 454 455 456 451 458 459 460 455 462 463 + 464 459 466 467 468 463 470 471 472 467 + 474 475 476 471 478 479 480 475 482 483 + 484 479 486 487 488 483 490 491 492 487 + 494 495 496 491 498 499 500 495 502 503 + 504 499 506 507 508 503 510 511 512 507 + 514 515 516 511 518 519 520 515 522 523 + 524 519 526 527 528 523 530 531 532 527 + 534 535 536 531 538 539 540 535 542 543 + 544 539 546 547 548 543 550 551 552 547 + 554 555 556 551 558 559 560 555 562 563 + 564 559 566 567 568 563 570 571 572 567 + 574 575 576 571 578 579 580 575 582 583 + 584 579 586 587 588 583 590 591 592 587 + 594 595 596 591 598 599 600 595 602 603 + 604 599 606 607 608 603 610 611 612 607 + 8 0 0 4 100 + 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 + 213 214 215 216 214 218 219 220 219 222 + 223 224 223 226 227 228 227 230 231 232 + 231 234 235 236 235 238 239 240 239 242 + 243 244 243 246 247 248 247 250 251 252 + 251 254 255 256 255 258 259 260 259 262 + 263 264 263 266 267 268 267 270 271 272 + 271 274 275 276 275 278 279 280 279 282 + 283 284 283 286 287 288 287 290 291 292 + 291 294 295 296 295 298 299 300 299 302 + 303 304 303 306 307 308 307 310 311 312 + 311 314 315 316 315 318 319 320 319 322 + 323 324 323 326 327 328 327 330 331 332 + 331 334 335 336 335 338 339 340 339 342 + 343 344 343 346 347 348 350 351 352 347 + 354 355 356 351 358 359 360 355 362 363 + 364 359 366 367 368 363 370 371 372 367 + 374 375 376 371 378 379 380 375 382 383 + 384 379 386 387 388 383 390 391 392 387 + 394 395 396 391 398 399 400 395 402 403 + 404 399 406 407 408 403 410 411 412 407 + 414 415 416 411 418 419 420 415 422 423 + 424 419 426 427 428 423 430 431 432 427 + 434 435 436 431 438 439 440 435 442 443 + 444 439 446 447 448 443 450 451 452 447 + 454 455 456 451 458 459 460 455 462 463 + 464 459 466 467 468 463 470 471 472 467 + 474 475 476 471 478 479 480 475 482 483 + 484 479 486 487 488 483 490 491 492 487 + 494 495 496 491 498 499 500 495 502 503 + 504 499 506 507 508 503 510 511 512 507 + 514 515 516 511 518 519 520 515 522 523 + 524 519 526 527 528 523 530 531 532 527 + 534 535 536 531 538 539 540 535 542 543 + 544 539 546 547 548 543 550 551 552 547 + 554 555 556 551 558 559 560 555 562 563 + 564 559 566 567 568 563 570 571 572 567 + 574 575 576 571 578 579 580 575 582 583 + 584 579 586 587 588 583 590 591 592 587 + 594 595 596 591 598 599 600 595 602 603 + 604 599 606 607 608 603 610 611 612 607 + 8 0 0 4 100 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 12 13 14 11 14 13 15 16 16 15 + 17 18 18 17 19 20 20 19 21 22 + 22 21 23 24 24 23 25 26 26 25 + 27 28 28 27 29 30 30 29 31 32 + 32 31 33 34 34 33 35 36 36 35 + 37 38 38 37 39 40 40 39 41 42 + 42 41 43 44 44 43 45 46 46 45 + 47 48 48 47 49 50 50 49 51 52 + 52 51 53 54 54 53 55 56 56 55 + 57 58 58 57 59 60 60 59 61 62 + 62 61 63 64 64 63 65 66 66 65 + 67 68 68 67 69 70 70 69 71 72 + 72 71 73 74 74 73 75 76 76 75 + 77 78 78 77 79 80 79 81 82 80 + 81 83 84 82 83 85 86 84 85 87 + 88 86 87 89 90 88 89 91 92 90 + 91 93 94 92 93 95 96 94 95 97 + 98 96 97 99 100 98 99 101 102 100 + 101 103 104 102 103 105 106 104 105 107 + 108 106 107 109 110 108 109 111 112 110 + 111 113 114 112 113 115 116 114 115 117 + 118 116 117 119 120 118 119 121 122 120 + 121 123 124 122 123 125 126 124 125 127 + 128 126 127 129 130 128 129 131 132 130 + 131 133 134 132 133 135 136 134 135 137 + 138 136 137 139 140 138 139 141 142 140 + 141 143 144 142 143 145 146 144 145 147 + 148 146 147 149 150 148 149 151 152 150 + 151 153 154 152 153 155 156 154 155 157 + 158 156 157 159 160 158 159 161 162 160 + 161 163 164 162 163 165 166 164 165 167 + 168 166 167 169 170 168 169 171 172 170 + 171 173 174 172 173 175 176 174 175 177 + 178 176 177 179 180 178 179 181 182 180 + 181 183 184 182 183 185 186 184 185 187 + 188 186 187 189 190 188 189 191 192 190 + 191 193 194 192 193 195 196 194 195 197 + 198 196 197 199 200 198 199 201 202 200 + 201 203 204 202 203 205 206 204 205 207 + 208 206 207 209 210 208 209 211 212 210 + 2 0 0 2 301 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 + 12 13 13 14 14 11 11 12 13 15 + 15 16 16 14 15 17 17 18 18 16 + 17 19 19 20 20 18 19 21 21 22 + 22 20 21 23 23 24 24 22 23 25 + 25 26 26 24 25 27 27 28 28 26 + 27 29 29 30 30 28 29 31 31 32 + 32 30 31 33 33 34 34 32 33 35 + 35 36 36 34 35 37 37 38 38 36 + 37 39 39 40 40 38 39 41 41 42 + 42 40 41 43 43 44 44 42 43 45 + 45 46 46 44 45 47 47 48 48 46 + 47 49 49 50 50 48 49 51 51 52 + 52 50 51 53 53 54 54 52 53 55 + 55 56 56 54 55 57 57 58 58 56 + 57 59 59 60 60 58 59 61 61 62 + 62 60 61 63 63 64 64 62 63 65 + 65 66 66 64 65 67 67 68 68 66 + 67 69 69 70 70 68 69 71 71 72 + 72 70 71 73 73 74 74 72 73 75 + 75 76 76 74 75 77 77 78 78 76 + 77 79 79 80 80 78 79 81 81 82 + 82 80 81 83 83 84 84 82 83 85 + 85 86 86 84 85 87 87 88 88 86 + 87 89 89 90 90 88 89 91 91 92 + 92 90 91 93 93 94 94 92 93 95 + 95 96 96 94 95 97 97 98 98 96 + 97 99 99 100 100 98 99 101 101 102 + 102 100 101 103 103 104 104 102 103 105 + 105 106 106 104 105 107 107 108 108 106 + 107 109 109 110 110 108 109 111 111 112 + 112 110 111 113 113 114 114 112 113 115 + 115 116 116 114 115 117 117 118 118 116 + 117 119 119 120 120 118 119 121 121 122 + 122 120 121 123 123 124 124 122 123 125 + 125 126 126 124 125 127 127 128 128 126 + 127 129 129 130 130 128 129 131 131 132 + 132 130 131 133 133 134 134 132 133 135 + 135 136 136 134 135 137 137 138 138 136 + 137 139 139 140 140 138 139 141 141 142 + 142 140 141 143 143 144 144 142 143 145 + 145 146 146 144 145 147 147 148 148 146 + 147 149 149 150 150 148 149 151 151 152 + 152 150 151 153 153 154 154 152 153 155 + 155 156 156 154 155 157 157 158 158 156 + 157 159 159 160 160 158 159 161 161 162 + 162 160 161 163 163 164 164 162 163 165 + 165 166 166 164 165 167 167 168 168 166 + 167 169 169 170 170 168 169 171 171 172 + 172 170 171 173 173 174 174 172 173 175 + 175 176 176 174 175 177 177 178 178 176 + 177 179 179 180 180 178 179 181 181 182 + 182 180 181 183 183 184 184 182 183 185 + 185 186 186 184 185 187 187 188 188 186 + 187 189 189 190 190 188 189 191 191 192 + 192 190 191 193 193 194 194 192 193 195 + 195 196 196 194 195 197 197 198 198 196 + 197 199 199 200 200 198 199 201 201 202 + 202 200 201 203 203 204 204 202 203 205 + 205 206 206 204 205 207 207 208 208 206 + 207 209 209 210 210 208 209 211 211 212 + 212 210 + 1 0 0 1 100 + 6 6 6 6 6 6 6 6 6 6 + 6 6 6 6 6 6 6 6 6 6 + 6 6 6 6 6 6 6 6 6 6 + 6 6 6 6 6 6 6 6 6 6 + 6 6 6 6 6 6 6 6 6 6 + 6 6 6 6 6 6 6 6 6 6 + 6 6 6 6 6 6 6 6 6 6 + 6 6 6 6 6 6 6 6 6 6 + 6 6 6 6 6 6 6 6 6 6 + 6 6 6 6 6 6 6 6 6 6 + 217 221 225 229 233 237 241 245 249 253 + 257 261 265 269 273 277 281 285 289 293 + 297 301 305 309 313 317 321 325 329 333 + 337 341 345 349 353 357 361 365 369 373 + 377 381 385 389 393 397 401 405 409 413 + 417 421 425 429 433 437 441 445 449 453 + 457 461 465 469 473 477 481 485 489 493 + 497 501 505 509 513 517 521 525 529 533 + 537 541 545 549 553 557 561 565 569 573 + 577 581 585 589 593 597 601 605 609 613 + 1 0 0 1 100 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 217 221 225 229 233 237 241 245 249 253 + 257 261 265 269 273 277 281 285 289 293 + 297 301 305 309 313 317 321 325 329 333 + 337 341 345 349 353 357 361 365 369 373 + 377 381 385 389 393 397 401 405 409 413 + 417 421 425 429 433 437 441 445 449 453 + 457 461 465 469 473 477 481 485 489 493 + 497 501 505 509 513 517 521 525 529 533 + 537 541 545 549 553 557 561 565 569 573 + 577 581 585 589 593 597 601 605 609 613 + 1 0 0 1 100 + 6 6 6 6 6 6 6 6 6 6 + 6 6 6 6 6 6 6 6 6 6 + 6 6 6 6 6 6 6 6 6 6 + 6 6 6 6 6 6 6 6 6 6 + 6 6 6 6 6 6 6 6 6 6 + 6 6 6 6 6 6 6 6 6 6 + 6 6 6 6 6 6 6 6 6 6 + 6 6 6 6 6 6 6 6 6 6 + 6 6 6 6 6 6 6 6 6 6 + 6 6 6 6 6 6 6 6 6 6 + 217 221 225 229 233 237 241 245 249 253 + 257 261 265 269 273 277 281 285 289 293 + 297 301 305 309 313 317 321 325 329 333 + 337 341 345 349 353 357 361 365 369 373 + 377 381 385 389 393 397 401 405 409 413 + 417 421 425 429 433 437 441 445 449 453 + 457 461 465 469 473 477 481 485 489 493 + 497 501 505 509 513 517 521 525 529 533 + 537 541 545 549 553 557 561 565 569 573 + 577 581 585 589 593 597 601 605 609 613 + 8 0 0 4 100 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 12 13 14 11 14 13 15 16 16 15 + 17 18 18 17 19 20 20 19 21 22 + 22 21 23 24 24 23 25 26 26 25 + 27 28 28 27 29 30 30 29 31 32 + 32 31 33 34 34 33 35 36 36 35 + 37 38 38 37 39 40 40 39 41 42 + 42 41 43 44 44 43 45 46 46 45 + 47 48 48 47 49 50 50 49 51 52 + 52 51 53 54 54 53 55 56 56 55 + 57 58 58 57 59 60 60 59 61 62 + 62 61 63 64 64 63 65 66 66 65 + 67 68 68 67 69 70 70 69 71 72 + 72 71 73 74 74 73 75 76 76 75 + 77 78 78 77 79 80 79 81 82 80 + 81 83 84 82 83 85 86 84 85 87 + 88 86 87 89 90 88 89 91 92 90 + 91 93 94 92 93 95 96 94 95 97 + 98 96 97 99 100 98 99 101 102 100 + 101 103 104 102 103 105 106 104 105 107 + 108 106 107 109 110 108 109 111 112 110 + 111 113 114 112 113 115 116 114 115 117 + 118 116 117 119 120 118 119 121 122 120 + 121 123 124 122 123 125 126 124 125 127 + 128 126 127 129 130 128 129 131 132 130 + 131 133 134 132 133 135 136 134 135 137 + 138 136 137 139 140 138 139 141 142 140 + 141 143 144 142 143 145 146 144 145 147 + 148 146 147 149 150 148 149 151 152 150 + 151 153 154 152 153 155 156 154 155 157 + 158 156 157 159 160 158 159 161 162 160 + 161 163 164 162 163 165 166 164 165 167 + 168 166 167 169 170 168 169 171 172 170 + 171 173 174 172 173 175 176 174 175 177 + 178 176 177 179 180 178 179 181 182 180 + 181 183 184 182 183 185 186 184 185 187 + 188 186 187 189 190 188 189 191 192 190 + 191 193 194 192 193 195 196 194 195 197 + 198 196 197 199 200 198 199 201 202 200 + 201 203 204 202 203 205 206 204 205 207 + 208 206 207 209 210 208 209 211 212 210 + 1 0 0 1 301 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 + 213 214 215 216 218 219 220 222 223 224 + 226 227 228 230 231 232 234 235 236 238 + 239 240 242 243 244 246 247 248 250 251 + 252 254 255 256 258 259 260 262 263 264 + 266 267 268 270 271 272 274 275 276 278 + 279 280 282 283 284 286 287 288 290 291 + 292 294 295 296 298 299 300 302 303 304 + 306 307 308 310 311 312 314 315 316 318 + 319 320 322 323 324 326 327 328 330 331 + 332 334 335 336 338 339 340 342 343 344 + 346 347 348 350 351 352 354 355 356 358 + 359 360 362 363 364 366 367 368 370 371 + 372 374 375 376 378 379 380 382 383 384 + 386 387 388 390 391 392 394 395 396 398 + 399 400 402 403 404 406 407 408 410 411 + 412 414 415 416 418 419 420 422 423 424 + 426 427 428 430 431 432 434 435 436 438 + 439 440 442 443 444 446 447 448 450 451 + 452 454 455 456 458 459 460 462 463 464 + 466 467 468 470 471 472 474 475 476 478 + 479 480 482 483 484 486 487 488 490 491 + 492 494 495 496 498 499 500 502 503 504 + 506 507 508 510 511 512 514 515 516 518 + 519 520 522 523 524 526 527 528 530 531 + 532 534 535 536 538 539 540 542 543 544 + 546 547 548 550 551 552 554 555 556 558 + 559 560 562 563 564 566 567 568 570 571 + 572 574 575 576 578 579 580 582 583 584 + 586 587 588 590 591 592 594 595 596 598 + 599 600 602 603 604 606 607 608 610 611 + 612 + 3 0 0 3 301 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 + 217 213 217 217 214 221 217 215 217 217 + 216 217 221 218 221 221 219 225 221 220 + 221 225 222 225 225 223 229 225 224 225 + 229 226 229 229 227 233 229 228 229 233 + 230 233 233 231 237 233 232 233 237 234 + 237 237 235 241 237 236 237 241 238 241 + 241 239 245 241 240 241 245 242 245 245 + 243 249 245 244 245 249 246 249 249 247 + 253 249 248 249 253 250 253 253 251 257 + 253 252 253 257 254 257 257 255 261 257 + 256 257 261 258 261 261 259 265 261 260 + 261 265 262 265 265 263 269 265 264 265 + 269 266 269 269 267 273 269 268 269 273 + 270 273 273 271 277 273 272 273 277 274 + 277 277 275 281 277 276 277 281 278 281 + 281 279 285 281 280 281 285 282 285 285 + 283 289 285 284 285 289 286 289 289 287 + 293 289 288 289 293 290 293 293 291 297 + 293 292 293 297 294 297 297 295 301 297 + 296 297 301 298 301 301 299 305 301 300 + 301 305 302 305 305 303 309 305 304 305 + 309 306 309 309 307 313 309 308 309 313 + 310 313 313 311 317 313 312 313 317 314 + 317 317 315 321 317 316 317 321 318 321 + 321 319 325 321 320 321 325 322 325 325 + 323 329 325 324 325 329 326 329 329 327 + 333 329 328 329 333 330 333 333 331 337 + 333 332 333 337 334 337 337 335 341 337 + 336 337 341 338 341 341 339 345 341 340 + 341 345 342 345 345 343 349 345 344 345 + 349 346 349 349 347 353 349 348 349 353 + 350 353 353 351 357 353 352 353 357 354 + 357 357 355 361 357 356 357 361 358 361 + 361 359 365 361 360 361 365 362 365 365 + 363 369 365 364 365 369 366 369 369 367 + 373 369 368 369 373 370 373 373 371 377 + 373 372 373 377 374 377 377 375 381 377 + 376 377 381 378 381 381 379 385 381 380 + 381 385 382 385 385 383 389 385 384 385 + 389 386 389 389 387 393 389 388 389 393 + 390 393 393 391 397 393 392 393 397 394 + 397 397 395 401 397 396 397 401 398 401 + 401 399 405 401 400 401 405 402 405 405 + 403 409 405 404 405 409 406 409 409 407 + 413 409 408 409 413 410 413 413 411 417 + 413 412 413 417 414 417 417 415 421 417 + 416 417 421 418 421 421 419 425 421 420 + 421 425 422 425 425 423 429 425 424 425 + 429 426 429 429 427 433 429 428 429 433 + 430 433 433 431 437 433 432 433 437 434 + 437 437 435 441 437 436 437 441 438 441 + 441 439 445 441 440 441 445 442 445 445 + 443 449 445 444 445 449 446 449 449 447 + 453 449 448 449 453 450 453 453 451 457 + 453 452 453 457 454 457 457 455 461 457 + 456 457 461 458 461 461 459 465 461 460 + 461 465 462 465 465 463 469 465 464 465 + 469 466 469 469 467 473 469 468 469 473 + 470 473 473 471 477 473 472 473 477 474 + 477 477 475 481 477 476 477 481 478 481 + 481 479 485 481 480 481 485 482 485 485 + 483 489 485 484 485 489 486 489 489 487 + 493 489 488 489 493 490 493 493 491 497 + 493 492 493 497 494 497 497 495 501 497 + 496 497 501 498 501 501 499 505 501 500 + 501 505 502 505 505 503 509 505 504 505 + 509 506 509 509 507 513 509 508 509 513 + 510 513 513 511 517 513 512 513 517 514 + 517 517 515 521 517 516 517 521 518 521 + 521 519 525 521 520 521 525 522 525 525 + 523 529 525 524 525 529 526 529 529 527 + 533 529 528 529 533 530 533 533 531 537 + 533 532 533 537 534 537 537 535 541 537 + 536 537 541 538 541 541 539 545 541 540 + 541 545 542 545 545 543 549 545 544 545 + 549 546 549 549 547 553 549 548 549 553 + 550 553 553 551 557 553 552 553 557 554 + 557 557 555 561 557 556 557 561 558 561 + 561 559 565 561 560 561 565 562 565 565 + 563 569 565 564 565 569 566 569 569 567 + 573 569 568 569 573 570 573 573 571 577 + 573 572 573 577 574 577 577 575 581 577 + 576 577 581 578 581 581 579 585 581 580 + 581 585 582 585 585 583 589 585 584 585 + 589 586 589 589 587 593 589 588 589 593 + 590 593 593 591 597 593 592 593 597 594 + 597 597 595 601 597 596 597 601 598 601 + 601 599 605 601 600 601 605 602 605 605 + 603 609 605 604 605 609 606 609 609 607 + 613 609 608 609 613 610 613 613 611 613 + 613 612 613 + 3 0 0 3 301 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 + 12 13 213 13 14 214 14 11 215 11 + 12 216 13 15 218 15 16 219 16 14 + 220 15 17 222 17 18 223 18 16 224 + 17 19 226 19 20 227 20 18 228 19 + 21 230 21 22 231 22 20 232 21 23 + 234 23 24 235 24 22 236 23 25 238 + 25 26 239 26 24 240 25 27 242 27 + 28 243 28 26 244 27 29 246 29 30 + 247 30 28 248 29 31 250 31 32 251 + 32 30 252 31 33 254 33 34 255 34 + 32 256 33 35 258 35 36 259 36 34 + 260 35 37 262 37 38 263 38 36 264 + 37 39 266 39 40 267 40 38 268 39 + 41 270 41 42 271 42 40 272 41 43 + 274 43 44 275 44 42 276 43 45 278 + 45 46 279 46 44 280 45 47 282 47 + 48 283 48 46 284 47 49 286 49 50 + 287 50 48 288 49 51 290 51 52 291 + 52 50 292 51 53 294 53 54 295 54 + 52 296 53 55 298 55 56 299 56 54 + 300 55 57 302 57 58 303 58 56 304 + 57 59 306 59 60 307 60 58 308 59 + 61 310 61 62 311 62 60 312 61 63 + 314 63 64 315 64 62 316 63 65 318 + 65 66 319 66 64 320 65 67 322 67 + 68 323 68 66 324 67 69 326 69 70 + 327 70 68 328 69 71 330 71 72 331 + 72 70 332 71 73 334 73 74 335 74 + 72 336 73 75 338 75 76 339 76 74 + 340 75 77 342 77 78 343 78 76 344 + 77 79 346 79 80 347 80 78 348 79 + 81 350 81 82 351 82 80 352 81 83 + 354 83 84 355 84 82 356 83 85 358 + 85 86 359 86 84 360 85 87 362 87 + 88 363 88 86 364 87 89 366 89 90 + 367 90 88 368 89 91 370 91 92 371 + 92 90 372 91 93 374 93 94 375 94 + 92 376 93 95 378 95 96 379 96 94 + 380 95 97 382 97 98 383 98 96 384 + 97 99 386 99 100 387 100 98 388 99 + 101 390 101 102 391 102 100 392 101 103 + 394 103 104 395 104 102 396 103 105 398 + 105 106 399 106 104 400 105 107 402 107 + 108 403 108 106 404 107 109 406 109 110 + 407 110 108 408 109 111 410 111 112 411 + 112 110 412 111 113 414 113 114 415 114 + 112 416 113 115 418 115 116 419 116 114 + 420 115 117 422 117 118 423 118 116 424 + 117 119 426 119 120 427 120 118 428 119 + 121 430 121 122 431 122 120 432 121 123 + 434 123 124 435 124 122 436 123 125 438 + 125 126 439 126 124 440 125 127 442 127 + 128 443 128 126 444 127 129 446 129 130 + 447 130 128 448 129 131 450 131 132 451 + 132 130 452 131 133 454 133 134 455 134 + 132 456 133 135 458 135 136 459 136 134 + 460 135 137 462 137 138 463 138 136 464 + 137 139 466 139 140 467 140 138 468 139 + 141 470 141 142 471 142 140 472 141 143 + 474 143 144 475 144 142 476 143 145 478 + 145 146 479 146 144 480 145 147 482 147 + 148 483 148 146 484 147 149 486 149 150 + 487 150 148 488 149 151 490 151 152 491 + 152 150 492 151 153 494 153 154 495 154 + 152 496 153 155 498 155 156 499 156 154 + 500 155 157 502 157 158 503 158 156 504 + 157 159 506 159 160 507 160 158 508 159 + 161 510 161 162 511 162 160 512 161 163 + 514 163 164 515 164 162 516 163 165 518 + 165 166 519 166 164 520 165 167 522 167 + 168 523 168 166 524 167 169 526 169 170 + 527 170 168 528 169 171 530 171 172 531 + 172 170 532 171 173 534 173 174 535 174 + 172 536 173 175 538 175 176 539 176 174 + 540 175 177 542 177 178 543 178 176 544 + 177 179 546 179 180 547 180 178 548 179 + 181 550 181 182 551 182 180 552 181 183 + 554 183 184 555 184 182 556 183 185 558 + 185 186 559 186 184 560 185 187 562 187 + 188 563 188 186 564 187 189 566 189 190 + 567 190 188 568 189 191 570 191 192 571 + 192 190 572 191 193 574 193 194 575 194 + 192 576 193 195 578 195 196 579 196 194 + 580 195 197 582 197 198 583 198 196 584 + 197 199 586 199 200 587 200 198 588 199 + 201 590 201 202 591 202 200 592 201 203 + 594 203 204 595 204 202 596 203 205 598 + 205 206 599 206 204 600 205 207 602 207 + 208 603 208 206 604 207 209 606 209 210 + 607 210 208 608 209 211 610 211 212 611 + 212 210 612 + 0 2 0 0 0 + 40 41 + 3 0 0 3 301 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 + 12 213 13 13 214 14 14 215 11 11 + 216 12 13 218 15 15 219 16 16 220 + 14 15 222 17 17 223 18 18 224 16 + 17 226 19 19 227 20 20 228 18 19 + 230 21 21 231 22 22 232 20 21 234 + 23 23 235 24 24 236 22 23 238 25 + 25 239 26 26 240 24 25 242 27 27 + 243 28 28 244 26 27 246 29 29 247 + 30 30 248 28 29 250 31 31 251 32 + 32 252 30 31 254 33 33 255 34 34 + 256 32 33 258 35 35 259 36 36 260 + 34 35 262 37 37 263 38 38 264 36 + 37 266 39 39 267 40 40 268 38 39 + 270 41 41 271 42 42 272 40 41 274 + 43 43 275 44 44 276 42 43 278 45 + 45 279 46 46 280 44 45 282 47 47 + 283 48 48 284 46 47 286 49 49 287 + 50 50 288 48 49 290 51 51 291 52 + 52 292 50 51 294 53 53 295 54 54 + 296 52 53 298 55 55 299 56 56 300 + 54 55 302 57 57 303 58 58 304 56 + 57 306 59 59 307 60 60 308 58 59 + 310 61 61 311 62 62 312 60 61 314 + 63 63 315 64 64 316 62 63 318 65 + 65 319 66 66 320 64 65 322 67 67 + 323 68 68 324 66 67 326 69 69 327 + 70 70 328 68 69 330 71 71 331 72 + 72 332 70 71 334 73 73 335 74 74 + 336 72 73 338 75 75 339 76 76 340 + 74 75 342 77 77 343 78 78 344 76 + 77 346 79 79 347 80 80 348 78 79 + 350 81 81 351 82 82 352 80 81 354 + 83 83 355 84 84 356 82 83 358 85 + 85 359 86 86 360 84 85 362 87 87 + 363 88 88 364 86 87 366 89 89 367 + 90 90 368 88 89 370 91 91 371 92 + 92 372 90 91 374 93 93 375 94 94 + 376 92 93 378 95 95 379 96 96 380 + 94 95 382 97 97 383 98 98 384 96 + 97 386 99 99 387 100 100 388 98 99 + 390 101 101 391 102 102 392 100 101 394 + 103 103 395 104 104 396 102 103 398 105 + 105 399 106 106 400 104 105 402 107 107 + 403 108 108 404 106 107 406 109 109 407 + 110 110 408 108 109 410 111 111 411 112 + 112 412 110 111 414 113 113 415 114 114 + 416 112 113 418 115 115 419 116 116 420 + 114 115 422 117 117 423 118 118 424 116 + 117 426 119 119 427 120 120 428 118 119 + 430 121 121 431 122 122 432 120 121 434 + 123 123 435 124 124 436 122 123 438 125 + 125 439 126 126 440 124 125 442 127 127 + 443 128 128 444 126 127 446 129 129 447 + 130 130 448 128 129 450 131 131 451 132 + 132 452 130 131 454 133 133 455 134 134 + 456 132 133 458 135 135 459 136 136 460 + 134 135 462 137 137 463 138 138 464 136 + 137 466 139 139 467 140 140 468 138 139 + 470 141 141 471 142 142 472 140 141 474 + 143 143 475 144 144 476 142 143 478 145 + 145 479 146 146 480 144 145 482 147 147 + 483 148 148 484 146 147 486 149 149 487 + 150 150 488 148 149 490 151 151 491 152 + 152 492 150 151 494 153 153 495 154 154 + 496 152 153 498 155 155 499 156 156 500 + 154 155 502 157 157 503 158 158 504 156 + 157 506 159 159 507 160 160 508 158 159 + 510 161 161 511 162 162 512 160 161 514 + 163 163 515 164 164 516 162 163 518 165 + 165 519 166 166 520 164 165 522 167 167 + 523 168 168 524 166 167 526 169 169 527 + 170 170 528 168 169 530 171 171 531 172 + 172 532 170 171 534 173 173 535 174 174 + 536 172 173 538 175 175 539 176 176 540 + 174 175 542 177 177 543 178 178 544 176 + 177 546 179 179 547 180 180 548 178 179 + 550 181 181 551 182 182 552 180 181 554 + 183 183 555 184 184 556 182 183 558 185 + 185 559 186 186 560 184 185 562 187 187 + 563 188 188 564 186 187 566 189 189 567 + 190 190 568 188 189 570 191 191 571 192 + 192 572 190 191 574 193 193 575 194 194 + 576 192 193 578 195 195 579 196 196 580 + 194 195 582 197 197 583 198 198 584 196 + 197 586 199 199 587 200 200 588 198 199 + 590 201 201 591 202 202 592 200 201 594 + 203 203 595 204 204 596 202 203 598 205 + 205 599 206 206 600 204 205 602 207 207 + 603 208 208 604 206 207 606 209 209 607 + 210 210 608 208 209 610 211 211 611 212 + 212 612 210 + 1 0 0 1 202 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 + 12 14 16 18 20 22 24 26 28 30 + 32 34 36 38 40 42 44 46 48 50 + 52 54 56 58 60 62 64 66 68 70 + 72 74 76 78 79 81 83 85 87 89 + 91 93 95 97 99 101 103 105 107 109 + 111 113 115 117 119 121 123 125 127 129 + 131 133 135 137 139 141 143 145 147 149 + 151 153 155 157 159 161 163 165 167 169 + 171 173 175 177 179 181 183 185 187 189 + 191 193 195 197 199 201 203 205 207 209 + 13 15 17 19 21 23 25 27 29 31 + 33 35 37 39 41 43 45 47 49 51 + 53 55 57 59 61 63 65 67 69 71 + 73 75 77 211 82 84 86 88 90 92 + 94 96 98 100 102 104 106 108 110 112 + 114 116 118 120 122 124 126 128 130 132 + 134 136 138 140 142 144 146 148 150 152 + 154 156 158 160 162 164 166 168 170 172 + 174 176 178 180 182 184 186 188 190 192 + 194 196 198 200 202 204 206 208 210 212 + 11 80 + 8 0 0 4 100 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 12 13 14 11 14 13 15 16 16 15 + 17 18 18 17 19 20 20 19 21 22 + 22 21 23 24 24 23 25 26 26 25 + 27 28 28 27 29 30 30 29 31 32 + 32 31 33 34 34 33 35 36 36 35 + 37 38 38 37 39 40 40 39 41 42 + 42 41 43 44 44 43 45 46 46 45 + 47 48 48 47 49 50 50 49 51 52 + 52 51 53 54 54 53 55 56 56 55 + 57 58 58 57 59 60 60 59 61 62 + 62 61 63 64 64 63 65 66 66 65 + 67 68 68 67 69 70 70 69 71 72 + 72 71 73 74 74 73 75 76 76 75 + 77 78 78 77 79 80 79 81 82 80 + 81 83 84 82 83 85 86 84 85 87 + 88 86 87 89 90 88 89 91 92 90 + 91 93 94 92 93 95 96 94 95 97 + 98 96 97 99 100 98 99 101 102 100 + 101 103 104 102 103 105 106 104 105 107 + 108 106 107 109 110 108 109 111 112 110 + 111 113 114 112 113 115 116 114 115 117 + 118 116 117 119 120 118 119 121 122 120 + 121 123 124 122 123 125 126 124 125 127 + 128 126 127 129 130 128 129 131 132 130 + 131 133 134 132 133 135 136 134 135 137 + 138 136 137 139 140 138 139 141 142 140 + 141 143 144 142 143 145 146 144 145 147 + 148 146 147 149 150 148 149 151 152 150 + 151 153 154 152 153 155 156 154 155 157 + 158 156 157 159 160 158 159 161 162 160 + 161 163 164 162 163 165 166 164 165 167 + 168 166 167 169 170 168 169 171 172 170 + 171 173 174 172 173 175 176 174 175 177 + 178 176 177 179 180 178 179 181 182 180 + 181 183 184 182 183 185 186 184 185 187 + 188 186 187 189 190 188 189 191 192 190 + 191 193 194 192 193 195 196 194 195 197 + 198 196 197 199 200 198 199 201 202 200 + 201 203 204 202 203 205 206 204 205 207 + 208 206 207 209 210 208 209 211 212 210 + 1 0 0 1 301 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 + 4 + 213 214 215 216 218 219 220 222 223 224 + 226 227 228 230 231 232 234 235 236 238 + 239 240 242 243 244 246 247 248 250 251 + 252 254 255 256 258 259 260 262 263 264 + 266 267 268 270 271 272 274 275 276 278 + 279 280 282 283 284 286 287 288 290 291 + 292 294 295 296 298 299 300 302 303 304 + 306 307 308 310 311 312 314 315 316 318 + 319 320 322 323 324 326 327 328 330 331 + 332 334 335 336 338 339 340 342 343 344 + 346 347 348 350 351 352 354 355 356 358 + 359 360 362 363 364 366 367 368 370 371 + 372 374 375 376 378 379 380 382 383 384 + 386 387 388 390 391 392 394 395 396 398 + 399 400 402 403 404 406 407 408 410 411 + 412 414 415 416 418 419 420 422 423 424 + 426 427 428 430 431 432 434 435 436 438 + 439 440 442 443 444 446 447 448 450 451 + 452 454 455 456 458 459 460 462 463 464 + 466 467 468 470 471 472 474 475 476 478 + 479 480 482 483 484 486 487 488 490 491 + 492 494 495 496 498 499 500 502 503 504 + 506 507 508 510 511 512 514 515 516 518 + 519 520 522 523 524 526 527 528 530 531 + 532 534 535 536 538 539 540 542 543 544 + 546 547 548 550 551 552 554 555 556 558 + 559 560 562 563 564 566 567 568 570 571 + 572 574 575 576 578 579 580 582 583 584 + 586 587 588 590 591 592 594 595 596 598 + 599 600 602 603 604 606 607 608 610 611 + 612 + 3 0 0 3 301 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 2 2 2 2 2 2 2 2 2 + 2 + 217 213 217 217 214 221 217 215 217 217 + 216 217 221 218 221 221 219 225 221 220 + 221 225 222 225 225 223 229 225 224 225 + 229 226 229 229 227 233 229 228 229 233 + 230 233 233 231 237 233 232 233 237 234 + 237 237 235 241 237 236 237 241 238 241 + 241 239 245 241 240 241 245 242 245 245 + 243 249 245 244 245 249 246 249 249 247 + 253 249 248 249 253 250 253 253 251 257 + 253 252 253 257 254 257 257 255 261 257 + 256 257 261 258 261 261 259 265 261 260 + 261 265 262 265 265 263 269 265 264 265 + 269 266 269 269 267 273 269 268 269 273 + 270 273 273 271 277 273 272 273 277 274 + 277 277 275 281 277 276 277 281 278 281 + 281 279 285 281 280 281 285 282 285 285 + 283 289 285 284 285 289 286 289 289 287 + 293 289 288 289 293 290 293 293 291 297 + 293 292 293 297 294 297 297 295 301 297 + 296 297 301 298 301 301 299 305 301 300 + 301 305 302 305 305 303 309 305 304 305 + 309 306 309 309 307 313 309 308 309 313 + 310 313 313 311 317 313 312 313 317 314 + 317 317 315 321 317 316 317 321 318 321 + 321 319 325 321 320 321 325 322 325 325 + 323 329 325 324 325 329 326 329 329 327 + 333 329 328 329 333 330 333 333 331 337 + 333 332 333 337 334 337 337 335 341 337 + 336 337 341 338 341 341 339 345 341 340 + 341 345 342 345 345 343 349 345 344 345 + 349 346 349 349 347 353 349 348 349 353 + 350 353 353 351 357 353 352 353 357 354 + 357 357 355 361 357 356 357 361 358 361 + 361 359 365 361 360 361 365 362 365 365 + 363 369 365 364 365 369 366 369 369 367 + 373 369 368 369 373 370 373 373 371 377 + 373 372 373 377 374 377 377 375 381 377 + 376 377 381 378 381 381 379 385 381 380 + 381 385 382 385 385 383 389 385 384 385 + 389 386 389 389 387 393 389 388 389 393 + 390 393 393 391 397 393 392 393 397 394 + 397 397 395 401 397 396 397 401 398 401 + 401 399 405 401 400 401 405 402 405 405 + 403 409 405 404 405 409 406 409 409 407 + 413 409 408 409 413 410 413 413 411 417 + 413 412 413 417 414 417 417 415 421 417 + 416 417 421 418 421 421 419 425 421 420 + 421 425 422 425 425 423 429 425 424 425 + 429 426 429 429 427 433 429 428 429 433 + 430 433 433 431 437 433 432 433 437 434 + 437 437 435 441 437 436 437 441 438 441 + 441 439 445 441 440 441 445 442 445 445 + 443 449 445 444 445 449 446 449 449 447 + 453 449 448 449 453 450 453 453 451 457 + 453 452 453 457 454 457 457 455 461 457 + 456 457 461 458 461 461 459 465 461 460 + 461 465 462 465 465 463 469 465 464 465 + 469 466 469 469 467 473 469 468 469 473 + 470 473 473 471 477 473 472 473 477 474 + 477 477 475 481 477 476 477 481 478 481 + 481 479 485 481 480 481 485 482 485 485 + 483 489 485 484 485 489 486 489 489 487 + 493 489 488 489 493 490 493 493 491 497 + 493 492 493 497 494 497 497 495 501 497 + 496 497 501 498 501 501 499 505 501 500 + 501 505 502 505 505 503 509 505 504 505 + 509 506 509 509 507 513 509 508 509 513 + 510 513 513 511 517 513 512 513 517 514 + 517 517 515 521 517 516 517 521 518 521 + 521 519 525 521 520 521 525 522 525 525 + 523 529 525 524 525 529 526 529 529 527 + 533 529 528 529 533 530 533 533 531 537 + 533 532 533 537 534 537 537 535 541 537 + 536 537 541 538 541 541 539 545 541 540 + 541 545 542 545 545 543 549 545 544 545 + 549 546 549 549 547 553 549 548 549 553 + 550 553 553 551 557 553 552 553 557 554 + 557 557 555 561 557 556 557 561 558 561 + 561 559 565 561 560 561 565 562 565 565 + 563 569 565 564 565 569 566 569 569 567 + 573 569 568 569 573 570 573 573 571 577 + 573 572 573 577 574 577 577 575 581 577 + 576 577 581 578 581 581 579 585 581 580 + 581 585 582 585 585 583 589 585 584 585 + 589 586 589 589 587 593 589 588 589 593 + 590 593 593 591 597 593 592 593 597 594 + 597 597 595 601 597 596 597 601 598 601 + 601 599 605 601 600 601 605 602 605 605 + 603 609 605 604 605 609 606 609 609 607 + 613 609 608 609 613 610 613 613 611 613 + 613 612 613 + 3 0 0 3 301 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 + 12 13 213 13 14 214 14 11 215 11 + 12 216 13 15 218 15 16 219 16 14 + 220 15 17 222 17 18 223 18 16 224 + 17 19 226 19 20 227 20 18 228 19 + 21 230 21 22 231 22 20 232 21 23 + 234 23 24 235 24 22 236 23 25 238 + 25 26 239 26 24 240 25 27 242 27 + 28 243 28 26 244 27 29 246 29 30 + 247 30 28 248 29 31 250 31 32 251 + 32 30 252 31 33 254 33 34 255 34 + 32 256 33 35 258 35 36 259 36 34 + 260 35 37 262 37 38 263 38 36 264 + 37 39 266 39 40 267 40 38 268 39 + 41 270 41 42 271 42 40 272 41 43 + 274 43 44 275 44 42 276 43 45 278 + 45 46 279 46 44 280 45 47 282 47 + 48 283 48 46 284 47 49 286 49 50 + 287 50 48 288 49 51 290 51 52 291 + 52 50 292 51 53 294 53 54 295 54 + 52 296 53 55 298 55 56 299 56 54 + 300 55 57 302 57 58 303 58 56 304 + 57 59 306 59 60 307 60 58 308 59 + 61 310 61 62 311 62 60 312 61 63 + 314 63 64 315 64 62 316 63 65 318 + 65 66 319 66 64 320 65 67 322 67 + 68 323 68 66 324 67 69 326 69 70 + 327 70 68 328 69 71 330 71 72 331 + 72 70 332 71 73 334 73 74 335 74 + 72 336 73 75 338 75 76 339 76 74 + 340 75 77 342 77 78 343 78 76 344 + 77 79 346 79 80 347 80 78 348 79 + 81 350 81 82 351 82 80 352 81 83 + 354 83 84 355 84 82 356 83 85 358 + 85 86 359 86 84 360 85 87 362 87 + 88 363 88 86 364 87 89 366 89 90 + 367 90 88 368 89 91 370 91 92 371 + 92 90 372 91 93 374 93 94 375 94 + 92 376 93 95 378 95 96 379 96 94 + 380 95 97 382 97 98 383 98 96 384 + 97 99 386 99 100 387 100 98 388 99 + 101 390 101 102 391 102 100 392 101 103 + 394 103 104 395 104 102 396 103 105 398 + 105 106 399 106 104 400 105 107 402 107 + 108 403 108 106 404 107 109 406 109 110 + 407 110 108 408 109 111 410 111 112 411 + 112 110 412 111 113 414 113 114 415 114 + 112 416 113 115 418 115 116 419 116 114 + 420 115 117 422 117 118 423 118 116 424 + 117 119 426 119 120 427 120 118 428 119 + 121 430 121 122 431 122 120 432 121 123 + 434 123 124 435 124 122 436 123 125 438 + 125 126 439 126 124 440 125 127 442 127 + 128 443 128 126 444 127 129 446 129 130 + 447 130 128 448 129 131 450 131 132 451 + 132 130 452 131 133 454 133 134 455 134 + 132 456 133 135 458 135 136 459 136 134 + 460 135 137 462 137 138 463 138 136 464 + 137 139 466 139 140 467 140 138 468 139 + 141 470 141 142 471 142 140 472 141 143 + 474 143 144 475 144 142 476 143 145 478 + 145 146 479 146 144 480 145 147 482 147 + 148 483 148 146 484 147 149 486 149 150 + 487 150 148 488 149 151 490 151 152 491 + 152 150 492 151 153 494 153 154 495 154 + 152 496 153 155 498 155 156 499 156 154 + 500 155 157 502 157 158 503 158 156 504 + 157 159 506 159 160 507 160 158 508 159 + 161 510 161 162 511 162 160 512 161 163 + 514 163 164 515 164 162 516 163 165 518 + 165 166 519 166 164 520 165 167 522 167 + 168 523 168 166 524 167 169 526 169 170 + 527 170 168 528 169 171 530 171 172 531 + 172 170 532 171 173 534 173 174 535 174 + 172 536 173 175 538 175 176 539 176 174 + 540 175 177 542 177 178 543 178 176 544 + 177 179 546 179 180 547 180 178 548 179 + 181 550 181 182 551 182 180 552 181 183 + 554 183 184 555 184 182 556 183 185 558 + 185 186 559 186 184 560 185 187 562 187 + 188 563 188 186 564 187 189 566 189 190 + 567 190 188 568 189 191 570 191 192 571 + 192 190 572 191 193 574 193 194 575 194 + 192 576 193 195 578 195 196 579 196 194 + 580 195 197 582 197 198 583 198 196 584 + 197 199 586 199 200 587 200 198 588 199 + 201 590 201 202 591 202 200 592 201 203 + 594 203 204 595 204 202 596 203 205 598 + 205 206 599 206 204 600 205 207 602 207 + 208 603 208 206 604 207 209 606 209 210 + 607 210 208 608 209 211 610 211 212 611 + 212 210 612 + 0 2 0 0 0 + 42 43 + 3 0 0 3 301 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 + 5 + 12 213 13 13 214 14 14 215 11 11 + 216 12 13 218 15 15 219 16 16 220 + 14 15 222 17 17 223 18 18 224 16 + 17 226 19 19 227 20 20 228 18 19 + 230 21 21 231 22 22 232 20 21 234 + 23 23 235 24 24 236 22 23 238 25 + 25 239 26 26 240 24 25 242 27 27 + 243 28 28 244 26 27 246 29 29 247 + 30 30 248 28 29 250 31 31 251 32 + 32 252 30 31 254 33 33 255 34 34 + 256 32 33 258 35 35 259 36 36 260 + 34 35 262 37 37 263 38 38 264 36 + 37 266 39 39 267 40 40 268 38 39 + 270 41 41 271 42 42 272 40 41 274 + 43 43 275 44 44 276 42 43 278 45 + 45 279 46 46 280 44 45 282 47 47 + 283 48 48 284 46 47 286 49 49 287 + 50 50 288 48 49 290 51 51 291 52 + 52 292 50 51 294 53 53 295 54 54 + 296 52 53 298 55 55 299 56 56 300 + 54 55 302 57 57 303 58 58 304 56 + 57 306 59 59 307 60 60 308 58 59 + 310 61 61 311 62 62 312 60 61 314 + 63 63 315 64 64 316 62 63 318 65 + 65 319 66 66 320 64 65 322 67 67 + 323 68 68 324 66 67 326 69 69 327 + 70 70 328 68 69 330 71 71 331 72 + 72 332 70 71 334 73 73 335 74 74 + 336 72 73 338 75 75 339 76 76 340 + 74 75 342 77 77 343 78 78 344 76 + 77 346 79 79 347 80 80 348 78 79 + 350 81 81 351 82 82 352 80 81 354 + 83 83 355 84 84 356 82 83 358 85 + 85 359 86 86 360 84 85 362 87 87 + 363 88 88 364 86 87 366 89 89 367 + 90 90 368 88 89 370 91 91 371 92 + 92 372 90 91 374 93 93 375 94 94 + 376 92 93 378 95 95 379 96 96 380 + 94 95 382 97 97 383 98 98 384 96 + 97 386 99 99 387 100 100 388 98 99 + 390 101 101 391 102 102 392 100 101 394 + 103 103 395 104 104 396 102 103 398 105 + 105 399 106 106 400 104 105 402 107 107 + 403 108 108 404 106 107 406 109 109 407 + 110 110 408 108 109 410 111 111 411 112 + 112 412 110 111 414 113 113 415 114 114 + 416 112 113 418 115 115 419 116 116 420 + 114 115 422 117 117 423 118 118 424 116 + 117 426 119 119 427 120 120 428 118 119 + 430 121 121 431 122 122 432 120 121 434 + 123 123 435 124 124 436 122 123 438 125 + 125 439 126 126 440 124 125 442 127 127 + 443 128 128 444 126 127 446 129 129 447 + 130 130 448 128 129 450 131 131 451 132 + 132 452 130 131 454 133 133 455 134 134 + 456 132 133 458 135 135 459 136 136 460 + 134 135 462 137 137 463 138 138 464 136 + 137 466 139 139 467 140 140 468 138 139 + 470 141 141 471 142 142 472 140 141 474 + 143 143 475 144 144 476 142 143 478 145 + 145 479 146 146 480 144 145 482 147 147 + 483 148 148 484 146 147 486 149 149 487 + 150 150 488 148 149 490 151 151 491 152 + 152 492 150 151 494 153 153 495 154 154 + 496 152 153 498 155 155 499 156 156 500 + 154 155 502 157 157 503 158 158 504 156 + 157 506 159 159 507 160 160 508 158 159 + 510 161 161 511 162 162 512 160 161 514 + 163 163 515 164 164 516 162 163 518 165 + 165 519 166 166 520 164 165 522 167 167 + 523 168 168 524 166 167 526 169 169 527 + 170 170 528 168 169 530 171 171 531 172 + 172 532 170 171 534 173 173 535 174 174 + 536 172 173 538 175 175 539 176 176 540 + 174 175 542 177 177 543 178 178 544 176 + 177 546 179 179 547 180 180 548 178 179 + 550 181 181 551 182 182 552 180 181 554 + 183 183 555 184 184 556 182 183 558 185 + 185 559 186 186 560 184 185 562 187 187 + 563 188 188 564 186 187 566 189 189 567 + 190 190 568 188 189 570 191 191 571 192 + 192 572 190 191 574 193 193 575 194 194 + 576 192 193 578 195 195 579 196 196 580 + 194 195 582 197 197 583 198 198 584 196 + 197 586 199 199 587 200 200 588 198 199 + 590 201 201 591 202 202 592 200 201 594 + 203 203 595 204 204 596 202 203 598 205 + 205 599 206 206 600 204 205 602 207 207 + 603 208 208 604 206 207 606 209 209 607 + 210 210 608 208 209 610 211 211 611 212 + 212 612 210 + 1 0 0 1 202 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 + 0 0 + 12 14 16 18 20 22 24 26 28 30 + 32 34 36 38 40 42 44 46 48 50 + 52 54 56 58 60 62 64 66 68 70 + 72 74 76 78 79 81 83 85 87 89 + 91 93 95 97 99 101 103 105 107 109 + 111 113 115 117 119 121 123 125 127 129 + 131 133 135 137 139 141 143 145 147 149 + 151 153 155 157 159 161 163 165 167 169 + 171 173 175 177 179 181 183 185 187 189 + 191 193 195 197 199 201 203 205 207 209 + 13 15 17 19 21 23 25 27 29 31 + 33 35 37 39 41 43 45 47 49 51 + 53 55 57 59 61 63 65 67 69 71 + 73 75 77 211 82 84 86 88 90 92 + 94 96 98 100 102 104 106 108 110 112 + 114 116 118 120 122 124 126 128 130 132 + 134 136 138 140 142 144 146 148 150 152 + 154 156 158 160 162 164 166 168 170 172 + 174 176 178 180 182 184 186 188 190 192 + 194 196 198 200 202 204 206 208 210 212 + 11 80 + 3 0 0 3 99 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 + 217 214 221 221 219 225 225 223 229 229 + 227 233 233 231 237 237 235 241 241 239 + 245 245 243 249 249 247 253 253 251 257 + 257 255 261 261 259 265 265 263 269 269 + 267 273 273 271 277 277 275 281 281 279 + 285 285 283 289 289 287 293 293 291 297 + 297 295 301 301 299 305 305 303 309 309 + 307 313 313 311 317 317 315 321 321 319 + 325 325 323 329 329 327 333 333 331 337 + 337 335 341 341 339 345 345 343 349 349 + 347 353 353 351 357 357 355 361 361 359 + 365 365 363 369 369 367 373 373 371 377 + 377 375 381 381 379 385 385 383 389 389 + 387 393 393 391 397 397 395 401 401 399 + 405 405 403 409 409 407 413 413 411 417 + 417 415 421 421 419 425 425 423 429 429 + 427 433 433 431 437 437 435 441 441 439 + 445 445 443 449 449 447 453 453 451 457 + 457 455 461 461 459 465 465 463 469 469 + 467 473 473 471 477 477 475 481 481 479 + 485 485 483 489 489 487 493 493 491 497 + 497 495 501 501 499 505 505 503 509 509 + 507 513 513 511 517 517 515 521 521 519 + 525 525 523 529 529 527 533 533 531 537 + 537 535 541 541 539 545 545 543 549 549 + 547 553 553 551 557 557 555 561 561 559 + 565 565 563 569 569 567 573 573 571 577 + 577 575 581 581 579 585 585 583 589 589 + 587 593 593 591 597 597 595 601 601 599 + 605 605 603 609 609 607 613 + 2 0 0 2 202 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 + 217 213 217 215 217 216 221 218 221 220 + 225 222 225 224 229 226 229 228 233 230 + 233 232 237 234 237 236 241 238 241 240 + 245 242 245 244 249 246 249 248 253 250 + 253 252 257 254 257 256 261 258 261 260 + 265 262 265 264 269 266 269 268 273 270 + 273 272 277 274 277 276 281 278 281 280 + 285 282 285 284 289 286 289 288 293 290 + 293 292 297 294 297 296 301 298 301 300 + 305 302 305 304 309 306 309 308 313 310 + 313 312 317 314 317 316 321 318 321 320 + 325 322 325 324 329 326 329 328 333 330 + 333 332 337 334 337 336 341 338 341 340 + 345 342 345 344 349 346 349 348 353 350 + 353 352 357 354 357 356 361 358 361 360 + 365 362 365 364 369 366 369 368 373 370 + 373 372 377 374 377 376 381 378 381 380 + 385 382 385 384 389 386 389 388 393 390 + 393 392 397 394 397 396 401 398 401 400 + 405 402 405 404 409 406 409 408 413 410 + 413 412 417 414 417 416 421 418 421 420 + 425 422 425 424 429 426 429 428 433 430 + 433 432 437 434 437 436 441 438 441 440 + 445 442 445 444 449 446 449 448 453 450 + 453 452 457 454 457 456 461 458 461 460 + 465 462 465 464 469 466 469 468 473 470 + 473 472 477 474 477 476 481 478 481 480 + 485 482 485 484 489 486 489 488 493 490 + 493 492 497 494 497 496 501 498 501 500 + 505 502 505 504 509 506 509 508 513 510 + 513 512 517 514 517 516 521 518 521 520 + 525 522 525 524 529 526 529 528 533 530 + 533 532 537 534 537 536 541 538 541 540 + 545 542 545 544 549 546 549 548 553 550 + 553 552 557 554 557 556 561 558 561 560 + 565 562 565 564 569 566 569 568 573 570 + 573 572 577 574 577 576 581 578 581 580 + 585 582 585 584 589 586 589 588 593 590 + 593 592 597 594 597 596 601 598 601 600 + 605 602 605 604 609 606 609 608 613 610 + 613 611 613 612 + 3 0 0 3 99 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 + 217 214 221 221 219 225 225 223 229 229 + 227 233 233 231 237 237 235 241 241 239 + 245 245 243 249 249 247 253 253 251 257 + 257 255 261 261 259 265 265 263 269 269 + 267 273 273 271 277 277 275 281 281 279 + 285 285 283 289 289 287 293 293 291 297 + 297 295 301 301 299 305 305 303 309 309 + 307 313 313 311 317 317 315 321 321 319 + 325 325 323 329 329 327 333 333 331 337 + 337 335 341 341 339 345 345 343 349 349 + 347 353 353 351 357 357 355 361 361 359 + 365 365 363 369 369 367 373 373 371 377 + 377 375 381 381 379 385 385 383 389 389 + 387 393 393 391 397 397 395 401 401 399 + 405 405 403 409 409 407 413 413 411 417 + 417 415 421 421 419 425 425 423 429 429 + 427 433 433 431 437 437 435 441 441 439 + 445 445 443 449 449 447 453 453 451 457 + 457 455 461 461 459 465 465 463 469 469 + 467 473 473 471 477 477 475 481 481 479 + 485 485 483 489 489 487 493 493 491 497 + 497 495 501 501 499 505 505 503 509 509 + 507 513 513 511 517 517 515 521 521 519 + 525 525 523 529 529 527 533 533 531 537 + 537 535 541 541 539 545 545 543 549 549 + 547 553 553 551 557 557 555 561 561 559 + 565 565 563 569 569 567 573 573 571 577 + 577 575 581 581 579 585 585 583 589 589 + 587 593 593 591 597 597 595 601 601 599 + 605 605 603 609 609 607 613 + 2 0 0 2 202 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 + 3 3 + 217 213 217 215 217 216 221 218 221 220 + 225 222 225 224 229 226 229 228 233 230 + 233 232 237 234 237 236 241 238 241 240 + 245 242 245 244 249 246 249 248 253 250 + 253 252 257 254 257 256 261 258 261 260 + 265 262 265 264 269 266 269 268 273 270 + 273 272 277 274 277 276 281 278 281 280 + 285 282 285 284 289 286 289 288 293 290 + 293 292 297 294 297 296 301 298 301 300 + 305 302 305 304 309 306 309 308 313 310 + 313 312 317 314 317 316 321 318 321 320 + 325 322 325 324 329 326 329 328 333 330 + 333 332 337 334 337 336 341 338 341 340 + 345 342 345 344 349 346 349 348 353 350 + 353 352 357 354 357 356 361 358 361 360 + 365 362 365 364 369 366 369 368 373 370 + 373 372 377 374 377 376 381 378 381 380 + 385 382 385 384 389 386 389 388 393 390 + 393 392 397 394 397 396 401 398 401 400 + 405 402 405 404 409 406 409 408 413 410 + 413 412 417 414 417 416 421 418 421 420 + 425 422 425 424 429 426 429 428 433 430 + 433 432 437 434 437 436 441 438 441 440 + 445 442 445 444 449 446 449 448 453 450 + 453 452 457 454 457 456 461 458 461 460 + 465 462 465 464 469 466 469 468 473 470 + 473 472 477 474 477 476 481 478 481 480 + 485 482 485 484 489 486 489 488 493 490 + 493 492 497 494 497 496 501 498 501 500 + 505 502 505 504 509 506 509 508 513 510 + 513 512 517 514 517 516 521 518 521 520 + 525 522 525 524 529 526 529 528 533 530 + 533 532 537 534 537 536 541 538 541 540 + 545 542 545 544 549 546 549 548 553 550 + 553 552 557 554 557 556 561 558 561 560 + 565 562 565 564 569 566 569 568 573 570 + 573 572 577 574 577 576 581 578 581 580 + 585 582 585 584 589 586 589 588 593 590 + 593 592 597 594 597 596 601 598 601 600 + 605 602 605 604 609 606 609 608 613 610 + 613 611 613 612 + ENREGISTREMENT DE TYPE 2 + PILE NUMERO 2NBRE OBJETS NOMMES 0NBRE OBJETS 8 + 1 1 -1 1 + -23 100 1 + SCAL + 0 + + + 1 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 + 1 1 -1 2 + -24 100 1 + SCAL + 0 + CENT RE GIBI FEC IT + + 2 0 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 + 1 1 -1 2 + -24 100 1 + SCAL + 0 + CENT RE GIBI FEC IT + + 2 0 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 5.49990000000000E-02 5.49990000000000E-02 + 5.49990000000000E-02 + 1 1 -1 1 + -25 100 1 + SCAL + 0 + + + 1 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 4.00000000000000E+00 4.00000000000000E+00 + 4.00000000000000E+00 + 1 1 -1 1 + -27 301 1 + SCAL + 0 + FACE + + 2 + 3.00000000000000E-02 1.00000000000000E+00 2.99999999999980E-02 + 1.00000000000000E+00 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000001E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 2.99999999999999E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 2.99999999999999E-02 1.00000000000000E+00 + 3.00000000000009E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 2.99999999999999E-02 1.00000000000000E+00 + 2.99999999999999E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 2.99999999999999E-02 1.00000000000000E+00 + 2.99999999999999E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 2.99999999999999E-02 1.00000000000000E+00 + 2.99999999999999E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000010E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 + 1 2 -1 1 + -27 301 2 + UX UY + 0 0 + FACE + + 2 + -1.00000000000000E+00 1.99840144432528E-15 1.00000000000000E+00 + 0.00000000000000E+00 -1.00000000000000E+00 1.89431803576667E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.90125692967058E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 1.00000000000000E+00 + 0.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 + 1 1 -1 1 + -34 301 1 + SCAL + 0 + FACE + + 2 + 3.00000000000000E-02 1.00000000000000E+00 2.99999999999980E-02 + 1.00000000000000E+00 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000001E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 2.99999999999999E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 2.99999999999999E-02 1.00000000000000E+00 + 3.00000000000009E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 2.99999999999999E-02 1.00000000000000E+00 + 2.99999999999999E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 2.99999999999999E-02 1.00000000000000E+00 + 2.99999999999999E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 2.99999999999999E-02 1.00000000000000E+00 + 2.99999999999999E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000010E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 3.00000000000000E-02 1.00000000000000E+00 + 3.00000000000000E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 3.00000000000002E-02 1.00000000000000E+00 + 3.00000000000002E-02 2.99999999999998E-02 1.00000000000000E+00 + 2.99999999999998E-02 + 1 2 -1 1 + -34 301 2 + UX UY + 0 0 + FACE + + 2 + -1.00000000000000E+00 1.99840144432528E-15 1.00000000000000E+00 + 0.00000000000000E+00 -1.00000000000000E+00 1.89431803576667E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.90125692967058E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 1.99840144432528E-15 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 9.99200722162641E-16 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 1.00000000000000E+00 + 0.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 + ENREGISTREMENT DE TYPE 2 + PILE NUMERO 10NBRE OBJETS NOMMES 36NBRE OBJETS 40 + C_2 C_3 C_4 C_E C_F C_10 C_11 C_12 + C_13 C_14 C_18 C_1C C_20 C_24 C_28 C_2C + C_30 C_34 C_38 C_3C C_3E C_43 C_45 C_5C + C_5D C_5E C_6B C_6C C_6D C_6E C_8B C_8C + C_8D C_8E C_8F C_90 + 1 2 3 4 5 6 7 8 9 10 + 11 12 13 14 15 16 17 18 19 20 + 21 22 23 24 25 26 27 28 29 30 + 31 32 33 34 35 36 + 64 + 27 80 27 81 27 82 27 57 27 83 + 25 8 27 84 25 9 27 85 27 58 + 27 86 25 10 27 87 27 59 27 88 + 27 60 27 89 25 11 27 90 27 61 + 27 91 27 62 27 92 26 11 27 93 + 26 12 27 94 25 12 27 95 18 1 + 27 96 18 2 + 4 + 27 97 10 9 + 0 + 40 + 26 1 10 10 26 2 10 11 26 3 + 10 12 26 4 10 13 26 5 10 14 + 26 6 10 15 26 7 10 16 26 8 + 10 17 26 9 10 18 26 10 10 19 + 0 + 0 + 0 + 0 + 40 + 26 1 32 1 26 2 32 2 26 3 + 32 3 26 4 32 4 26 5 32 5 + 26 6 32 6 26 7 32 7 26 8 + 32 8 26 9 32 9 26 10 32 10 + 12 + 27 97 26 1 27 98 27 44 27 99 + 18 3 + 12 + 27 97 26 2 27 98 27 45 27 99 + 18 4 + 12 + 27 97 26 3 27 98 27 46 27 99 + 18 5 + 12 + 27 97 26 4 27 98 27 47 27 99 + 18 6 + 12 + 27 97 26 5 27 98 27 48 27 99 + 18 7 + 12 + 27 97 26 6 27 98 27 49 27 99 + 18 8 + 12 + 27 97 26 7 27 98 27 50 27 99 + 18 9 + 12 + 27 97 26 8 27 98 27 51 27 99 + 18 10 + 12 + 27 97 26 9 27 98 27 52 27 99 + 18 11 + 12 + 27 97 26 10 27 98 27 53 27 99 + 18 12 + 12 + 27 80 27 100 26 1 10 21 27 101 + 10 37 + 36 + 27 102 1 2 27 80 27 54 27 103 + 25 2 27 104 25 3 27 105 25 4 + 27 106 38 1 27 107 27 108 27 109 + 39 10 27 110 2 1 + 12 + 27 80 27 100 26 1 10 23 27 101 + 10 38 + 48 + 27 102 1 2 27 80 27 56 27 111 + 25 5 27 112 25 6 27 113 25 7 + 27 106 38 2 27 107 27 108 27 114 + 2 2 27 115 2 3 27 116 25 13 + 27 109 39 11 27 110 2 4 + 8 + 27 117 10 25 27 118 10 26 + 8 + 26 1 39 2 26 2 39 3 + 8 + 26 1 22 1 26 2 22 2 + 0 + 8 + 27 117 10 29 27 118 10 30 + 8 + 26 1 39 4 26 2 39 5 + 8 + 26 1 22 3 26 2 22 4 + 0 + 0 + 84 + 26 13 39 12 26 1 39 13 26 2 + 39 14 26 3 39 15 26 4 39 16 + 26 5 39 17 26 6 39 18 26 7 + 39 19 26 8 39 20 26 9 39 21 + 26 10 39 22 26 14 39 23 26 15 + 39 24 26 16 39 25 26 17 39 26 + 26 18 39 27 26 19 39 28 26 20 + 39 29 26 21 39 30 26 22 39 31 + 26 23 39 32 + 84 + 26 13 39 33 26 1 39 34 26 2 + 39 35 26 3 39 36 26 4 39 37 + 26 5 39 38 26 6 39 39 26 7 + 39 40 26 8 39 41 26 9 39 42 + 26 10 39 43 26 14 39 44 26 15 + 39 45 26 16 39 46 26 17 39 47 + 26 18 39 48 26 19 39 49 26 20 + 39 50 26 21 39 51 26 22 39 52 + 26 23 39 53 + 84 + 26 13 39 54 26 1 39 55 26 2 + 39 56 26 3 39 57 26 4 39 58 + 26 5 39 59 26 6 39 60 26 7 + 39 61 26 8 39 62 26 9 39 63 + 26 10 39 64 26 14 39 65 26 15 + 39 66 26 16 39 67 26 17 39 68 + 26 18 39 69 26 19 39 70 26 20 + 39 71 26 21 39 72 26 22 39 73 + 26 23 39 74 + 84 + 26 13 39 75 26 1 39 76 26 2 + 39 77 26 3 39 78 26 4 39 79 + 26 5 39 80 26 6 39 81 26 7 + 39 82 26 8 39 83 26 9 39 84 + 26 10 39 85 26 14 39 86 26 15 + 39 87 26 16 39 88 26 17 39 89 + 26 18 39 90 26 19 39 91 26 20 + 39 92 26 21 39 93 26 22 39 94 + 26 23 39 95 + 4 + 26 1 26 1 + 4 + 26 1 26 1 + 88 + 27 80 27 119 27 120 26 1 27 121 + 1 17 27 122 27 123 27 102 1 26 + 27 124 26 1 27 125 1 27 27 126 + 1 28 27 127 1 29 27 128 1 23 + 27 129 1 19 27 130 1 30 27 131 + 1 31 27 132 25 8 27 133 1 32 + 27 134 26 24 27 135 26 25 27 136 + 26 26 27 137 29 1 27 138 39 96 + 27 139 2 5 27 140 2 6 + 88 + 27 80 27 119 27 120 26 1 27 121 + 1 18 27 122 27 123 27 102 1 33 + 27 124 26 1 27 125 1 34 27 126 + 1 35 27 127 1 36 27 128 1 25 + 27 129 1 20 27 130 1 37 27 131 + 1 38 27 132 25 8 27 133 1 39 + 27 134 26 24 27 135 26 25 27 136 + 26 26 27 137 29 2 27 138 39 97 + 27 139 2 7 27 140 2 8 + ENREGISTREMENT DE TYPE 2 + PILE NUMERO 18NBRE OBJETS NOMMES 2NBRE OBJETS 20 + C_57 C_58 + 1 2 + 21 + 0.00000000000000E+00 1.80000000000000E+02 3.60000000000000E+02 + 5.40000000000000E+02 7.20000000000000E+02 9.00000000000000E+02 + 1.08000000000000E+03 1.26000000000000E+03 1.44000000000000E+03 + 1.62000000000000E+03 1.80000000000000E+03 1.98000000000000E+03 + 2.16000000000000E+03 2.34000000000000E+03 2.52000000000000E+03 + 2.70000000000000E+03 2.88000000000000E+03 3.06000000000000E+03 + 3.24000000000000E+03 3.42000000000000E+03 3.60000000000000E+03 + 21 + 0.00000000000000E+00 1.80000000000000E+02 3.60000000000000E+02 + 5.40000000000000E+02 7.20000000000000E+02 9.00000000000000E+02 + 1.08000000000000E+03 1.26000000000000E+03 1.44000000000000E+03 + 1.62000000000000E+03 1.80000000000000E+03 1.98000000000000E+03 + 2.16000000000000E+03 2.34000000000000E+03 2.52000000000000E+03 + 2.70000000000000E+03 2.88000000000000E+03 3.06000000000000E+03 + 3.24000000000000E+03 3.42000000000000E+03 3.60000000000000E+03 + 21 + -1.15000000000000E+00 -2.16540006497621E-01 -8.41397770009844E-02 + -4.85976677678687E-02 -3.37455570371690E-02 -2.52459832108218E-02 + -1.97690425436327E-02 -1.59409962757219E-02 -1.31888625377558E-02 + -1.09119860531204E-02 -9.19290101181534E-03 -7.84294096039159E-03 + -6.74365940030929E-03 -5.82979435469586E-03 -5.06740412419820E-03 + -4.41975400584346E-03 -3.86658567110400E-03 -3.39449654285649E-03 + -2.98504207216772E-03 -2.53776152358996E-03 -2.31476016363927E-03 + 21 + -1.15000000000000E+00 -9.30397404678052E-01 -3.99006393092861E-01 + -2.07168724171530E-01 -1.29350727394083E-01 -9.03551366564161E-02 + -6.76129559558960E-02 -5.28388160049688E-02 -4.26312674227759E-02 + -3.45377273330808E-02 -2.86788164188325E-02 -2.41927361441432E-02 + -2.06123089316590E-02 -1.76887851915472E-02 -1.52792695565113E-02 + -1.32536610116376E-02 -1.15427250669061E-02 -1.00903141297685E-02 + -8.84056690841387E-03 -7.48544137316366E-03 -6.80674510584511E-03 + 21 + -1.15000000000000E+00 -1.15060872024149E+00 -1.13499905693040E+00 + -7.95394822100051E-01 -4.30905323840183E-01 -2.64917049285670E-01 + -1.81256800501063E-01 -1.32961427219939E-01 -1.02231526111713E-01 + -8.01552310619662E-02 -6.48410172548005E-02 -5.35915529885089E-02 + -4.49298823577743E-02 -3.80662136598705E-02 -3.25312588159042E-02 + -2.79676615199501E-02 -2.41759217163720E-02 -2.09930359371299E-02 + -1.82881621622230E-02 -1.55047223983316E-02 -1.39381228920544E-02 + 21 + -1.15000000000000E+00 -1.15003050279579E+00 -1.14945324999156E+00 + -1.15216622941086E+00 -1.14194776513999E+00 -9.31257334949404E-01 + -5.67940566609100E-01 -3.60643458507160E-01 -2.50817800828769E-01 + -1.84496520865302E-01 -1.41808693317095E-01 -1.12656876351951E-01 + -9.16244319997735E-02 -7.58227570362588E-02 -6.35890561852581E-02 + -5.38457707225434E-02 -4.59685747877699E-02 -3.94954594598532E-02 + -3.41018315130958E-02 -2.89695162340258E-02 -2.56219655982434E-02 + 21 + -1.15000000000000E+00 -1.15000151469562E+00 -1.14997228758946E+00 + -1.15012078743789E+00 -1.14964997086609E+00 -1.15034594794479E+00 + -1.15242834219045E+00 -1.10346040120499E+00 -8.26415561949390E-01 + -5.30787359698162E-01 -3.58863584011360E-01 -2.60114236348006E-01 + -1.97855922317559E-01 -1.55882626060270E-01 -1.25947669247034E-01 + -1.03629896223960E-01 -8.64832401557986E-02 -7.29512134106926E-02 + -6.20519737259673E-02 -5.25659618901367E-02 -4.56082435019248E-02 + 21 + -1.15000000000000E+00 -1.15000007516150E+00 -1.14999858497049E+00 + -1.15000648601938E+00 -1.14998091221237E+00 -1.15002201148601E+00 + -1.15012292571263E+00 -1.14916546120541E+00 -1.15151945793081E+00 + -1.15140124164690E+00 -1.09441898963168E+00 -8.38270772945895E-01 + -5.54048026462153E-01 -3.82909893086666E-01 -2.82442837703037E-01 + -2.17561993419072E-01 -1.72968908719407E-01 -1.40614485535019E-01 + -1.16224003093473E-01 -9.70000399779595E-02 -8.21272011753830E-02 + 21 + -1.15000000000000E+00 -1.15000000372952E+00 -1.14999992775752E+00 + -1.15000034647027E+00 -1.14999895267042E+00 -1.15000134148075E+00 + -1.15000601799045E+00 -1.14995662642460E+00 -1.15009096148427E+00 + -1.15006229202357E+00 -1.14914889879884E+00 -1.15134713449563E+00 + -1.15235921190085E+00 -1.11260787601159E+00 -8.99467334965939E-01 + -6.13129474211469E-01 -4.25293436586229E-01 -3.14332083383740E-01 + -2.42570221057817E-01 -1.93671486405551E-01 -1.57261914282897E-01 + 21 + -1.15000000000000E+00 -1.15000000018511E+00 -1.14999999631362E+00 + -1.15000001845649E+00 -1.14999994261664E+00 -1.15000008029727E+00 + -1.15000029118890E+00 -1.14999771852574E+00 -1.15000518273646E+00 + -1.15000241369967E+00 -1.14995590195655E+00 -1.15008167585997E+00 + -1.15011240661199E+00 -1.14920280894521E+00 -1.15048413637776E+00 + -1.15355271999449E+00 -1.13489684822653E+00 -9.88079014600367E-01 + -7.06575620556291E-01 -4.89547416771393E-01 -3.57755578976403E-01 + 21 + -1.15000000000000E+00 -1.15000000000919E+00 -1.14999999981198E+00 + -1.15000000098080E+00 -1.14999999686222E+00 -1.15000000474282E+00 + -1.15000001391583E+00 -1.14999988021859E+00 -1.15000029238419E+00 + -1.15000007693173E+00 -1.14999769428415E+00 -1.15000469239171E+00 + -1.15000502071806E+00 -1.14995808942615E+00 -1.15003535574102E+00 + -1.15018676578197E+00 -1.14948762713892E+00 -1.14955847860536E+00 + -1.15335609441927E+00 -1.14777221562769E+00 -1.07288169976893E+00 + 21 + -1.15000000000000E+00 -1.15000000000046E+00 -1.14999999999041E+00 + -1.15000000005201E+00 -1.14999999982878E+00 -1.15000000027714E+00 + -1.15000000065495E+00 -1.14999999372727E+00 -1.15000001638543E+00 + -1.15000000121241E+00 -1.14999987981461E+00 -1.15000026657349E+00 + -1.15000021282329E+00 -1.14999777671329E+00 -1.15000230040975E+00 + -1.15000939152630E+00 -1.14997173675939E+00 -1.14998304877008E+00 + -1.15018720080803E+00 -1.14987984887642E+00 -1.14909664847054E+00 + 2 + 0.00000000000000E+00 3.60000000000000E+03 + 2 + 1.00000000000000E+00 1.00000000000000E+00 + 2 + 0.00000000000000E+00 3.60000000000000E+03 + 2 + 1.00000000000000E+00 1.00000000000000E+00 + 2 + 0.00000000000000E+00 3.60000000000000E+03 + 2 + 1.00000000000000E+00 1.00000000000000E+00 + 2 + 0.00000000000000E+00 3.60000000000000E+03 + 2 + 1.00000000000000E+00 1.00000000000000E+00 + ENREGISTREMENT DE TYPE 2 + PILE NUMERO 22NBRE OBJETS NOMMES 4NBRE OBJETS 4 + C_62 C_68 C_72 C_78 + 1 2 3 4 + 1 + REEL GIBI FEC IT + + -13 -14 0 + PROG _X PROG _Y REEL LIST REEL LIST REEL + GIBI FEC IT + + 1 + REEL GIBI FEC IT + + -15 -16 0 + PROG _X PROG _Y REEL LIST REEL LIST REEL + GIBI FEC IT + + 1 + REEL GIBI FEC IT + + -17 -18 0 + PROG _X PROG _Y REEL LIST REEL LIST REEL + GIBI FEC IT + + 1 + REEL GIBI FEC IT + + -19 -20 0 + PROG _X PROG _Y REEL LIST REEL LIST REEL + GIBI FEC IT + + ENREGISTREMENT DE TYPE 2 + PILE NUMERO 25NBRE OBJETS NOMMES 12NBRE OBJETS 13 + PI C_40 C_41 C_42 C_47 C_48 C_49 C_4B + C_4C C_4E C_51 C_56 + 1 2 3 4 5 6 7 8 9 10 + 11 12 + 13 + 3.14159265358979E+00 -1.00000000000000E+00 7.30000000000000E+00 + 1.00000000000000E+00 2.92270000000000E+00 2.03040000000000E+00 + 5.07500000000000E-01 0.00000000000000E+00 3.00000000000000E+00 + 8.00000000000000E-01 1.00000000000000E-14 5.00000000000000E-04 + 3.42149382420365E-05 + ENREGISTREMENT DE TYPE 2 + PILE NUMERO 26NBRE OBJETS NOMMES 13NBRE OBJETS 26 + C_16 C_1A C_1E C_22 C_26 C_2A C_2E C_32 + C_36 C_3A C_54 C_55 C_8A + 1 2 3 4 5 6 7 8 9 10 + 11 12 1 + 26 + 1 2 3 4 5 6 7 + 8 9 10 1000 40 0 11 + 12 13 14 15 16 17 18 + 19 20 202 100 301 + ENREGISTREMENT DE TYPE 2 + PILE NUMERO 27NBRE OBJETS NOMMES 79NBRE OBJETS 140 + #2 #3 #4 D C GRAV * DENS + MESH0 TROPIC PARAMET PERMEA POROSITY SRESIDU MCOMPRES SATLAW + PERMLAW SOURCE BC_DIRI BC_NEUMA HINI MODD FIELD MOTC + / DEUXINDI LOI PW SAT SATUR H_TFIELD OUTPUTS + OUT_SUP TABLE OUBL OPTI MODE PLAN DEFO TASS + C_A MOT DIME C_17 C_1B C_1F C_23 C_27 + C_2B C_2F C_33 C_37 C_3B C_3F CHAIN C_46 + C_4A C_4D C_4F C_50 C_52 C_53 PROG PROG_Y + ALL X N INDIC CHP1 NIV MODARCY TRANS1 + TRANS2 QELEM OPTRESOL TYPDI MASSEFMH MATTR MATTM + 1 2 3 4 5 6 7 8 9 10 + 11 12 13 14 15 16 17 18 19 20 + 21 22 23 24 25 26 27 28 29 30 + 31 32 33 34 35 36 37 38 39 40 + 41 42 43 44 45 46 47 48 49 50 + 51 52 53 54 55 56 57 58 59 60 + 61 62 63 64 65 66 67 68 69 70 + 71 72 73 74 75 76 77 78 79 + 807 140 + #2#3#4DROICERCGRAV*DENSMESH0TROPICPARAMETPERMEAPOROSITYSRESIDUMCOMPRESS + ATLAWPERMLAWSOURCEBC_DIRIBC_NEUMAHINIMODDFIELDMOTC/DEUXINDILOIPWSATSATU + RH_TFIELDOUTPUTSOUT_SUPTABLEOUBLOPTIMODEPLANDEFOTASSISOTROPEMOTDIMEOUT2 + .955OUT2.895OUT2.835OUT2.775OUT2.715OUT2.655OUT2.595OUT2.535OUT2.475OUT + 2.415EXPONENTIELLECHAINVAN_GENUCHTENLUYESDECENTRENOEFMHILU0PROGPROG_YAL + LXNINDICCHP1NIVMODARCYTRANS1TRANS2QELEMOPTRESOLTYPDIMASSEFMHMATTRMATTMS + OUSTYPEDARCYSATURSOLVERPREFZREFMASSLUMPSOUS_RELAXATIONHOMOGENEISATIONLT + RACEEPSILONSSCHEMEPRECONDMAXITERITMAXRESIDU_MAXTEMPS_CALCULESTEMPS_SAUV + ESCPOINTNAMEVALUEMULTIZONEINDEXMAILLAGECOEF_NALPHACOEF_CMODELENOMZONE1A + BMCNFBHETANEXPMEXPPOROTERESIDUPRECCHAMPEVOLDOMAINEPRECONDIQUAFNOMDOMINE + FMDFACEFACELFACEPCENTREELTFAFACEL2MAILFACETOLERSOMMETNPTDNELDNBFDOBJINC + LUXXNORMAEXXSURFACXXNORMAF + 2 4 6 10 14 18 19 23 28 34 + 41 47 55 62 70 76 83 89 96 104 + 108 112 117 121 122 130 133 135 138 143 + 151 158 165 170 174 178 182 186 190 194 + 202 205 209 217 225 233 241 249 257 265 + 273 281 289 302 307 320 322 325 333 335 + 339 343 347 353 356 357 358 363 367 370 + 377 383 389 394 402 407 415 420 425 433 + 443 449 453 457 465 480 495 501 508 515 + 522 529 534 544 558 570 576 580 585 594 + 599 607 613 618 624 630 637 638 642 644 + 649 653 657 661 669 673 678 682 689 697 + 701 707 707 713 717 722 727 733 738 744 + 752 757 763 767 771 775 783 791 799 807 + ENREGISTREMENT DE TYPE 2 + PILE NUMERO 29NBRE OBJETS NOMMES 0NBRE OBJETS 2 + 8 18 + C_9 C_5 TOP RIGHT LEFT GE_3 GE_1 FAM_TOP FAM_STO + TFAM_LEFTC_75 C_6F C_65 C_6 C_5F C_3D BOTTOM MESH0 + + 8 18 + C_9 C_5 TOP RIGHT LEFT GE_3 GE_1 FAM_TOP FAM_STO + TFAM_LEFTC_75 C_6F C_65 C_6 C_5F C_3D BOTTOM MESH0 + + ENREGISTREMENT DE TYPE 2 + PILE NUMERO 32NBRE OBJETS NOMMES 10NBRE OBJETS 613 + C_15 C_19 C_1D C_21 C_25 C_29 C_2D C_31 + C_35 C_39 + 1 2 3 4 5 6 7 8 9 10 + 613 + 604 605 606 607 608 609 610 611 612 613 + 201 1 101 2 102 3 103 4 104 5 + 105 6 106 7 107 8 108 9 109 10 + 110 11 111 12 112 13 113 14 114 15 + 115 16 116 17 117 18 118 19 119 20 + 120 21 121 22 122 23 123 24 124 25 + 125 26 126 27 127 28 128 29 129 30 + 130 31 131 32 132 33 133 34 35 202 + 36 135 37 136 38 137 39 138 40 139 + 41 140 42 141 43 142 44 143 45 144 + 46 145 47 146 48 147 49 148 50 149 + 51 150 52 151 53 152 54 153 55 154 + 56 155 57 156 58 157 59 158 60 159 + 61 160 62 161 63 162 64 163 65 164 + 66 165 67 166 68 167 69 168 70 169 + 71 170 72 171 73 172 74 173 75 174 + 76 175 77 176 78 177 79 178 80 179 + 81 180 82 181 83 182 84 183 85 184 + 86 185 87 186 88 187 89 188 90 189 + 91 190 92 191 93 192 94 193 95 194 + 96 195 97 196 98 197 99 198 100 199 + 134 200 203 204 205 206 207 208 209 210 + 211 212 213 214 215 216 217 218 219 220 + 221 222 223 224 225 226 227 228 229 230 + 231 232 233 234 235 236 237 238 239 240 + 241 242 243 244 245 246 247 248 249 250 + 251 252 253 254 255 256 257 258 259 260 + 261 262 263 264 265 266 267 268 269 270 + 271 272 273 274 275 276 277 278 279 280 + 281 282 283 284 285 286 287 288 289 290 + 291 292 293 294 295 296 297 298 299 300 + 301 302 303 304 305 306 307 308 309 310 + 311 312 313 314 315 316 317 318 319 320 + 321 322 323 324 325 326 327 328 329 330 + 331 332 333 334 335 336 337 338 339 340 + 341 342 343 344 345 346 347 348 349 350 + 351 352 353 354 355 356 357 358 359 360 + 361 362 363 364 365 366 367 368 369 370 + 371 372 373 374 375 376 377 378 379 380 + 381 382 383 384 385 386 387 388 389 390 + 391 392 393 394 395 396 397 398 399 400 + 401 402 403 404 405 406 407 408 409 410 + 411 412 413 414 415 416 417 418 419 420 + 421 422 423 424 425 426 427 428 429 430 + 431 432 433 434 435 436 437 438 439 440 + 441 442 443 444 445 446 447 448 449 450 + 451 452 453 454 455 456 457 458 459 460 + 461 462 463 464 465 466 467 468 469 470 + 471 472 473 474 475 476 477 478 479 480 + 481 482 483 484 485 486 487 488 489 490 + 491 492 493 494 495 496 497 498 499 500 + 501 502 503 504 505 506 507 508 509 510 + 511 512 513 514 515 516 517 518 519 520 + 521 522 523 524 525 526 527 528 529 530 + 531 532 533 534 535 536 537 538 539 540 + 541 542 543 544 545 546 547 548 549 550 + 551 552 553 554 555 556 557 558 559 560 + 561 562 563 564 565 566 567 568 569 570 + 571 572 573 574 575 576 577 578 579 580 + 581 582 583 584 585 586 587 588 589 590 + 591 592 593 594 595 596 597 598 599 600 + 601 602 603 + ENREGISTREMENT DE TYPE 2 + PILE NUMERO 33NBRE OBJETS NOMMES 0NBRE OBJETS 1 + 3042 + -5.00000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.99999999999980E-02 0.00000000000000E+00 + 5.00000000000000E-01 5.99999999999981E-02 0.00000000000000E+00 + 5.00000000000000E-01 8.99999999999981E-02 0.00000000000000E+00 + 5.00000000000000E-01 1.19999999999998E-01 0.00000000000000E+00 + 5.00000000000000E-01 1.49999999999998E-01 0.00000000000000E+00 + 5.00000000000000E-01 1.79999999999998E-01 0.00000000000000E+00 + 5.00000000000000E-01 2.09999999999998E-01 0.00000000000000E+00 + 5.00000000000000E-01 2.39999999999998E-01 0.00000000000000E+00 + 5.00000000000000E-01 2.69999999999998E-01 0.00000000000000E+00 + 5.00000000000000E-01 2.99999999999998E-01 0.00000000000000E+00 + 5.00000000000000E-01 3.29999999999998E-01 0.00000000000000E+00 + 5.00000000000000E-01 3.59999999999998E-01 0.00000000000000E+00 + 5.00000000000000E-01 3.89999999999998E-01 0.00000000000000E+00 + 5.00000000000000E-01 4.19999999999998E-01 0.00000000000000E+00 + 5.00000000000000E-01 4.49999999999998E-01 0.00000000000000E+00 + 5.00000000000000E-01 4.79999999999998E-01 0.00000000000000E+00 + 5.00000000000000E-01 5.09999999999998E-01 0.00000000000000E+00 + 5.00000000000000E-01 5.39999999999998E-01 0.00000000000000E+00 + 5.00000000000000E-01 5.69999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 5.99999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 6.29999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 6.59999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 6.89999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 7.19999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 7.49999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 7.79999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 8.09999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 8.39999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 8.69999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 8.99999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 9.29999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 9.59999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 9.89999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 1.02000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.05000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.08000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.11000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.14000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.17000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.20000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.23000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.26000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.29000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.32000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.35000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.38000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.41000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.44000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.47000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.50000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.53000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.56000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.59000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.62000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.65000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.68000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.71000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.74000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.77000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.80000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.83000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.86000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.89000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.92000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.95000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.98000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.01000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.04000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.07000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.10000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.13000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.16000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.19000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.22000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.25000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.28000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.31000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.34000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.37000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.40000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.43000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.46000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.49000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.52000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.55000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.58000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.61000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.64000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.67000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.70000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.73000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.76000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.79000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.82000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.85000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.88000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.91000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.94000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.97000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 3.00000000000000E-02 0.00000000000000E+00 + -5.00000000000000E-01 6.00000000000000E-02 0.00000000000000E+00 + -5.00000000000000E-01 9.00000000000000E-02 0.00000000000000E+00 + -5.00000000000000E-01 1.20000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 1.50000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 1.80000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 2.10000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 2.40000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 2.70000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 3.00000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 3.30000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 3.60000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 3.90000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 4.20000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 4.50000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 4.80000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 5.10000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 5.40000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 5.70000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 6.00000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 6.30000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 6.60000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 6.90000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 7.20000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 7.50000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 7.80000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 8.10000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 8.40000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 8.70000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 9.00000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 9.30000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 9.60000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 9.90000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 3.00000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.05000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.08000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.11000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.14000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.17000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.20000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.23000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.26000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.29000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.32000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.35000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.38000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.41000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.44000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.47000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.50000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.53000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.56000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.59000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.62000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.65000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.68000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.71000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.74000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.77000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.80000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.83000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.86000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.89000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.92000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.95000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.98000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.01000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.04000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.07000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.10000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.13000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.16000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.19000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.22000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.25000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.28000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.31000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.34000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.37000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.40000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.43000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.46000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.49000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.52000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.55000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.58000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.61000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.64000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.67000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.70000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.73000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.76000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.79000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.82000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.85000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.88000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.91000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.94000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.97000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 3.00000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.02000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.50000000000000E-02 0.00000000000000E+00 + 0.00000000000000E+00 2.99999999999990E-02 0.00000000000000E+00 + 5.00000000000000E-01 1.49999999999990E-02 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.49999999999995E-02 0.00000000000000E+00 + -5.00000000000000E-01 4.50000000000000E-02 0.00000000000000E+00 + 0.00000000000000E+00 5.99999999999991E-02 0.00000000000000E+00 + 5.00000000000000E-01 4.49999999999981E-02 0.00000000000000E+00 + 0.00000000000000E+00 4.49999999999990E-02 0.00000000000000E+00 + -5.00000000000000E-01 7.50000000000000E-02 0.00000000000000E+00 + 0.00000000000000E+00 8.99999999999991E-02 0.00000000000000E+00 + 5.00000000000000E-01 7.49999999999981E-02 0.00000000000000E+00 + 0.00000000000000E+00 7.49999999999991E-02 0.00000000000000E+00 + -5.00000000000000E-01 1.05000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 1.19999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 1.04999999999998E-01 0.00000000000000E+00 + 0.00000000000000E+00 1.04999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 1.35000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 1.49999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 1.34999999999998E-01 0.00000000000000E+00 + 0.00000000000000E+00 1.34999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 1.65000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 1.79999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 1.64999999999998E-01 0.00000000000000E+00 + 0.00000000000000E+00 1.64999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 1.95000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 2.09999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 1.94999999999998E-01 0.00000000000000E+00 + 0.00000000000000E+00 1.94999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 2.25000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 2.39999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 2.24999999999998E-01 0.00000000000000E+00 + 0.00000000000000E+00 2.24999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 2.55000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 2.69999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 2.54999999999998E-01 0.00000000000000E+00 + 0.00000000000000E+00 2.54999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 2.85000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 2.99999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 2.84999999999998E-01 0.00000000000000E+00 + 0.00000000000000E+00 2.84999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 3.15000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 3.29999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 3.14999999999998E-01 0.00000000000000E+00 + 0.00000000000000E+00 3.14999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 3.45000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 3.59999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 3.44999999999998E-01 0.00000000000000E+00 + 0.00000000000000E+00 3.44999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 3.75000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 3.89999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 3.74999999999998E-01 0.00000000000000E+00 + 0.00000000000000E+00 3.74999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 4.05000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 4.19999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 4.04999999999998E-01 0.00000000000000E+00 + 0.00000000000000E+00 4.04999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 4.35000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 4.49999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 4.34999999999998E-01 0.00000000000000E+00 + 0.00000000000000E+00 4.34999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 4.65000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 4.79999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 4.64999999999998E-01 0.00000000000000E+00 + 0.00000000000000E+00 4.64999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 4.95000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 5.09999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 4.94999999999998E-01 0.00000000000000E+00 + 0.00000000000000E+00 4.94999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 5.25000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 5.39999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 5.24999999999998E-01 0.00000000000000E+00 + 0.00000000000000E+00 5.24999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 5.55000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 5.69999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 5.54999999999998E-01 0.00000000000000E+00 + 0.00000000000000E+00 5.54999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 5.85000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 5.99999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 5.84999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 5.84999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 6.15000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 6.29999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 6.14999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 6.14999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 6.45000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 6.59999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 6.44999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 6.44999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 6.75000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 6.90000000000000E-01 0.00000000000000E+00 + 5.00000000000000E-01 6.74999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 6.74999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 7.05000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 7.20000000000000E-01 0.00000000000000E+00 + 5.00000000000000E-01 7.04999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 7.05000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 7.35000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 7.50000000000000E-01 0.00000000000000E+00 + 5.00000000000000E-01 7.34999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 7.35000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 7.65000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 7.80000000000000E-01 0.00000000000000E+00 + 5.00000000000000E-01 7.64999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 7.65000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 7.95000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 8.10000000000000E-01 0.00000000000000E+00 + 5.00000000000000E-01 7.94999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 7.95000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 8.25000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 8.39999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 8.24999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 8.25000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 8.55000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 8.69999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 8.54999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 8.54999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 8.85000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 8.99999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 8.84999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 8.84999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 9.15000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 9.29999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 9.14999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 9.14999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 9.45000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 9.60000000000000E-01 0.00000000000000E+00 + 5.00000000000000E-01 9.44999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 9.45000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 9.75000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 9.90000000000000E-01 0.00000000000000E+00 + 5.00000000000000E-01 9.74999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 9.75000000000000E-01 0.00000000000000E+00 + -5.00000000000000E-01 1.00500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.02000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.00500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.00500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.03500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.05000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.03500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.03500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.06500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.08000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.06500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.06500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.09500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.11000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.09500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.09500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.12500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.14000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.12500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.12500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.15500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.17000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.15500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.15500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.18500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.20000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.18500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.18500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.21500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.23000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.21500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.21500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.24500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.26000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.24500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.24500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.27500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.29000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.27500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.27500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.30500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.32000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.30500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.30500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.33500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.35000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.33500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.33500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.36500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.38000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.36500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.36500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.39500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.41000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.39500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.39500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.42500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.44000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.42500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.42500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.45500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.47000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.45500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.45500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.48500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.50000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.48500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.48500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.51500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.53000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.51500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.51500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.54500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.56000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.54500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.54500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.57500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.59000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.57500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.57500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.60500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.62000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.60500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.60500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.63500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.65000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.63500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.63500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.66500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.68000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.66500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.66500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.69500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.71000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.69500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.69500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.72500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.74000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.72500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.72500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.75500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.77000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.75500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.75500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.78500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.80000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.78500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.78500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.81500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.83000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.81500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.81500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.84500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.86000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.84500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.84500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.87500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.89000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.87500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.87500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.90500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.92000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.90500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.90500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.93500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.95000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.93500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.93500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.96500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.98000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.96500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.96500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.99500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.01000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.99500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.99500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.02500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.04000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.02500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.02500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.05500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.07000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.05500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.05500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.08500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.10000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.08500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.08500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.11500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.13000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.11500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.11500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.14500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.16000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.14500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.14500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.17500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.19000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.17500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.17500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.20500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.22000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.20500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.20500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.23500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.25000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.23500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.23500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.26500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.28000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.26500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.26500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.29500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.31000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.29500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.29500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.32500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.34000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.32500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.32500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.35500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.37000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.35500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.35500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.38500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.40000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.38500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.38500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.41500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.43000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.41500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.41500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.44500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.46000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.44500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.44500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.47500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.49000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.47500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.47500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.50500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.52000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.50500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.53500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.55000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.53500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.53500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.56500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.58000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.56500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.56500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.59500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.61000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.59500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.59500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.62500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.64000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.62500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.62500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.65500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.67000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.65500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.65500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.68500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.70000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.68500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.68500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.71500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.73000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.71500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.71500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.74500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.76000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.74500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.74500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.77500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.79000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.77500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.77500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.80500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.82000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.80500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.80500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.83500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.85000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.83500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.83500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.86500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.88000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.86500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.86500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.89500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.91000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.89500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.89500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.92500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.94000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.92500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.92500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.95500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.97000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.95500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.95500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.98500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 3.00000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.98500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.98500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.95500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.89500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.83500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.77500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.71500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.65500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.59500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.53500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.47500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.41500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.50000000000000E-02 0.00000000000000E+00 + 0.00000000000000E+00 2.99999999999990E-02 0.00000000000000E+00 + 5.00000000000000E-01 1.49999999999990E-02 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 4.50000000000000E-02 0.00000000000000E+00 + 0.00000000000000E+00 5.99999999999991E-02 0.00000000000000E+00 + 5.00000000000000E-01 4.49999999999981E-02 0.00000000000000E+00 + -5.00000000000000E-01 7.50000000000000E-02 0.00000000000000E+00 + 0.00000000000000E+00 8.99999999999991E-02 0.00000000000000E+00 + 5.00000000000000E-01 7.49999999999981E-02 0.00000000000000E+00 + -5.00000000000000E-01 1.05000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 1.19999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 1.04999999999998E-01 0.00000000000000E+00 + -5.00000000000000E-01 1.35000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 1.49999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 1.34999999999998E-01 0.00000000000000E+00 + -5.00000000000000E-01 1.65000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 1.79999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 1.64999999999998E-01 0.00000000000000E+00 + -5.00000000000000E-01 1.95000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 2.09999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 1.94999999999998E-01 0.00000000000000E+00 + -5.00000000000000E-01 2.25000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 2.39999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 2.24999999999998E-01 0.00000000000000E+00 + -5.00000000000000E-01 2.55000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 2.69999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 2.54999999999998E-01 0.00000000000000E+00 + -5.00000000000000E-01 2.85000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 2.99999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 2.84999999999998E-01 0.00000000000000E+00 + -5.00000000000000E-01 3.15000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 3.29999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 3.14999999999998E-01 0.00000000000000E+00 + -5.00000000000000E-01 3.45000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 3.59999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 3.44999999999998E-01 0.00000000000000E+00 + -5.00000000000000E-01 3.75000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 3.89999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 3.74999999999998E-01 0.00000000000000E+00 + -5.00000000000000E-01 4.05000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 4.19999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 4.04999999999998E-01 0.00000000000000E+00 + -5.00000000000000E-01 4.35000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 4.49999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 4.34999999999998E-01 0.00000000000000E+00 + -5.00000000000000E-01 4.65000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 4.79999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 4.64999999999998E-01 0.00000000000000E+00 + -5.00000000000000E-01 4.95000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 5.09999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 4.94999999999998E-01 0.00000000000000E+00 + -5.00000000000000E-01 5.25000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 5.39999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 5.24999999999998E-01 0.00000000000000E+00 + -5.00000000000000E-01 5.55000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 5.69999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 5.54999999999998E-01 0.00000000000000E+00 + -5.00000000000000E-01 5.85000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 5.99999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 5.84999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 6.15000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 6.29999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 6.14999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 6.45000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 6.59999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 6.44999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 6.75000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 6.90000000000000E-01 0.00000000000000E+00 + 5.00000000000000E-01 6.74999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 7.05000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 7.20000000000000E-01 0.00000000000000E+00 + 5.00000000000000E-01 7.04999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 7.35000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 7.50000000000000E-01 0.00000000000000E+00 + 5.00000000000000E-01 7.34999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 7.65000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 7.80000000000000E-01 0.00000000000000E+00 + 5.00000000000000E-01 7.64999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 7.95000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 8.10000000000000E-01 0.00000000000000E+00 + 5.00000000000000E-01 7.94999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 8.25000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 8.39999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 8.24999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 8.55000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 8.69999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 8.54999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 8.85000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 8.99999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 8.84999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 9.15000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 9.29999999999999E-01 0.00000000000000E+00 + 5.00000000000000E-01 9.14999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 9.45000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 9.60000000000000E-01 0.00000000000000E+00 + 5.00000000000000E-01 9.44999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 9.75000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 9.90000000000000E-01 0.00000000000000E+00 + 5.00000000000000E-01 9.74999999999999E-01 0.00000000000000E+00 + -5.00000000000000E-01 1.00500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.02000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.00500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.03500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.05000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.03500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.06500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.08000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.06500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.09500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.11000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.09500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.12500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.14000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.12500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.15500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.17000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.15500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.18500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.20000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.18500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.21500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.23000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.21500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.24500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.26000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.24500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.27500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.29000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.27500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.30500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.32000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.30500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.33500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.35000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.33500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.36500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.38000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.36500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.39500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.41000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.39500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.42500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.44000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.42500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.45500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.47000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.45500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.48500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.50000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.48500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.51500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.53000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.51500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.54500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.56000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.54500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.57500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.59000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.57500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.60500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.62000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.60500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.63500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.65000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.63500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.66500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.68000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.66500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.69500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.71000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.69500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.72500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.74000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.72500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.75500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.77000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.75500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.78500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.80000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.78500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.81500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.83000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.81500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.84500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.86000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.84500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.87500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.89000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.87500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.90500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.92000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.90500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.93500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.95000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.93500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.96500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.98000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.96500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 1.99500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.01000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 1.99500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.02500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.04000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.02500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.05500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.07000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.05500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.08500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.10000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.08500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.11500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.13000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.11500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.14500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.16000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.14500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.17500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.19000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.17500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.20500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.22000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.20500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.23500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.25000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.23500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.26500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.28000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.26500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.29500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.31000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.29500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.32500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.34000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.32500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.35500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.37000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.35500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.38500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.40000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.38500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.41500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.43000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.41500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.44500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.46000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.44500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.47500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.49000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.47500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.50500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.52000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.50500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.53500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.55000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.53500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.56500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.58000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.56500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.59500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.61000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.59500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.62500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.64000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.62500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.65500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.67000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.65500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.68500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.70000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.68500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.71500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.73000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.71500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.74500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.76000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.74500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.77500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.79000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.77500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.80500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.82000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.80500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.83500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.85000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.83500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.86500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.88000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.86500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.89500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.91000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.89500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.92500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.94000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.92500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.95500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.97000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.95500000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 2.98500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 3.00000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 2.98500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.49999999999995E-02 0.00000000000000E+00 + 0.00000000000000E+00 4.49999999999990E-02 0.00000000000000E+00 + 0.00000000000000E+00 7.49999999999991E-02 0.00000000000000E+00 + 0.00000000000000E+00 1.04999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 1.34999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 1.64999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 1.94999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 2.24999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 2.54999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 2.84999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 3.14999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 3.44999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 3.74999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 4.04999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 4.34999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 4.64999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 4.94999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 5.24999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 5.54999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 5.84999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 6.14999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 6.44999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 6.74999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 7.05000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 7.35000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 7.65000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 7.95000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 8.25000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 8.54999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 8.84999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 9.14999999999999E-01 0.00000000000000E+00 + 0.00000000000000E+00 9.45000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 9.75000000000000E-01 0.00000000000000E+00 + 0.00000000000000E+00 1.00500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.03500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.06500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.09500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.12500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.15500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.18500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.21500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.24500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.27500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.30500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.33500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.36500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.39500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.42500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.45500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.48500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.51500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.54500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.57500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.60500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.63500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.66500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.69500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.72500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.75500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.78500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.81500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.84500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.87500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.90500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.93500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.96500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.99500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.02500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.05500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.08500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.11500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.14500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.17500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.20500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.23500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.26500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.29500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.32500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.35500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.38500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.41500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.44500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.47500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.53500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.56500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.59500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.62500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.65500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.68500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.71500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.74500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.77500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.80500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.83500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.86500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.89500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.92500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.95500000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.98500000000000E+00 0.00000000000000E+00 + ENREGISTREMENT DE TYPE 2 + PILE NUMERO 38NBRE OBJETS NOMMES 0NBRE OBJETS 2 + 1 2 2 2 3 11 1 0 0 0 + -17 100 1 1 2 0 0 1 0 0 + 0 + 318745 + DARCY + ISOTROPE + 0 -39 + K + 1 2 2 2 3 11 1 0 0 0 + -18 100 1 1 2 0 0 1 0 0 + 0 + 318877 + DARCY + ISOTROPE + 0 -40 + K + ENREGISTREMENT DE TYPE 2 + PILE NUMERO 39NBRE OBJETS NOMMES 9NBRE OBJETS 97 + C_5B C_61 C_67 C_71 C_77 C_7D C_80 C_83 + C_D + 1 2 3 4 5 6 7 8 9 + 1 -1 6 72 + Field + + -4 317635 1 0 0 0 0 0 2 + + + 317623 + H + REAL*8 + 1 100 0 0 + -4.13500000000000E+00 -4.10500000000000E+00 -4.07500000000000E+00 + -4.04500000000000E+00 -4.01500000000000E+00 -3.98500000000000E+00 + -3.95500000000000E+00 -3.92500000000000E+00 -3.89500000000000E+00 + -3.86500000000000E+00 -3.83500000000000E+00 -3.80500000000000E+00 + -3.77500000000000E+00 -3.74500000000000E+00 -3.71500000000000E+00 + -3.68500000000000E+00 -3.65500000000000E+00 -3.62500000000000E+00 + -3.59500000000000E+00 -3.56500000000000E+00 -3.53500000000000E+00 + -3.50500000000000E+00 -3.47500000000000E+00 -3.44500000000000E+00 + -3.41500000000000E+00 -3.38500000000000E+00 -3.35500000000000E+00 + -3.32500000000000E+00 -3.29500000000000E+00 -3.26500000000000E+00 + -3.23500000000000E+00 -3.20500000000000E+00 -3.17500000000000E+00 + -3.14500000000000E+00 -3.11500000000000E+00 -3.08500000000000E+00 + -3.05500000000000E+00 -3.02500000000000E+00 -2.99500000000000E+00 + -2.96500000000000E+00 -2.93500000000000E+00 -2.90500000000000E+00 + -2.87500000000000E+00 -2.84500000000000E+00 -2.81500000000000E+00 + -2.78500000000000E+00 -2.75500000000000E+00 -2.72500000000000E+00 + -2.69500000000000E+00 -2.66500000000000E+00 -2.63500000000000E+00 + -2.60500000000000E+00 -2.57500000000000E+00 -2.54500000000000E+00 + -2.51500000000000E+00 -2.48500000000000E+00 -2.45500000000000E+00 + -2.42500000000000E+00 -2.39500000000000E+00 -2.36500000000000E+00 + -2.33500000000000E+00 -2.30500000000000E+00 -2.27500000000000E+00 + -2.24500000000000E+00 -2.21500000000000E+00 -2.18500000000000E+00 + -2.15500000000000E+00 -2.12500000000000E+00 -2.09500000000000E+00 + -2.06500000000000E+00 -2.03500000000000E+00 -2.00500000000000E+00 + -1.97500000000000E+00 -1.94500000000000E+00 -1.91500000000000E+00 + -1.88500000000000E+00 -1.85500000000000E+00 -1.82500000000000E+00 + -1.79500000000000E+00 -1.76500000000000E+00 -1.73500000000000E+00 + -1.70500000000000E+00 -1.67500000000000E+00 -1.64500000000000E+00 + -1.61500000000000E+00 -1.58500000000000E+00 -1.55500000000000E+00 + -1.52500000000000E+00 -1.49500000000000E+00 -1.46500000000000E+00 + -1.43500000000000E+00 -1.40500000000000E+00 -1.37500000000000E+00 + -1.34500000000000E+00 -1.31500000000000E+00 -1.28500000000000E+00 + -1.25500000000000E+00 -1.22500000000000E+00 -1.19500000000000E+00 + -1.16500000000000E+00 + 1 -1 6 72 + Field + + -3 317653 1 0 0 0 0 0 2 + + + 317641 + TH + REAL*8 + 1 1 0 0 + -4.15000000000000E+00 + 1 -1 6 72 + Field + + -5 317671 1 0 0 0 0 0 2 + + + 317659 + TH + REAL*8 + 1 1 0 0 + 0.00000000000000E+00 + 1 -1 6 72 + Field + + -6 317689 1 0 0 0 0 0 2 + + + 317677 + FLUX + REAL*8 + 1 100 0 0 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 + 1 -1 6 72 + Field + + -7 317707 1 0 0 0 0 0 2 + + + 317695 + FLUX + REAL*8 + 1 100 0 0 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 + 1 -1 6 72 + Field + + -4 317725 1 0 0 0 0 0 2 + + + 317713 + SCAL + REAL*8 + 1 100 0 0 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 1.62500000000000E-05 1.62500000000000E-05 + 1.62500000000000E-05 + 1 -1 6 72 + Field + + -4 317761 1 0 0 0 0 0 2 + + + 317749 + SCAL + REAL*8 + 1 100 0 0 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 + 1 -1 6 72 + Field + + -4 317779 1 0 0 0 0 0 2 + + + 317767 + SCAL + REAL*8 + 1 100 0 0 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 3.00000000000000E-01 3.00000000000000E-01 + 3.00000000000000E-01 + 1 -1 6 72 + Field + + -4 317797 1 0 0 0 0 0 2 + + + 317785 + SCAL + REAL*8 + 1 100 0 0 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 1.83330000000000E-01 1.83330000000000E-01 + 1.83330000000000E-01 + 1 -1 6 0 + -19 323917 1 0 0 0 0 0 0 + + + 323911 + SCAL + REAL*8 + 4 100 0 0 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 + 1 -1 6 0 + -20 322831 1 0 0 0 0 0 0 + + + 322825 + SCAL + REAL*8 + 4 100 0 0 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 + 1 -1 6 8 + SCALAIRE + -21 324895 1 0 0 0 -1 0 2 + + + 324913 + H + REAL*8 + 1 100 0 0 + -4.13500000000000E+00 -4.10500000000000E+00 -4.07500000000000E+00 + -4.04500000000000E+00 -4.01500000000000E+00 -3.98500000000000E+00 + -3.95500000000000E+00 -3.92500000000000E+00 -3.89500000000000E+00 + -3.86500000000000E+00 -3.83500000000000E+00 -3.80500000000000E+00 + -3.77500000000000E+00 -3.74500000000000E+00 -3.71500000000000E+00 + -3.68500000000000E+00 -3.65500000000000E+00 -3.62500000000000E+00 + -3.59500000000000E+00 -3.56500000000000E+00 -3.53500000000000E+00 + -3.50500000000000E+00 -3.47500000000000E+00 -3.44500000000000E+00 + -3.41500000000000E+00 -3.38500000000000E+00 -3.35500000000000E+00 + -3.32500000000000E+00 -3.29500000000000E+00 -3.26500000000000E+00 + -3.23500000000000E+00 -3.20500000000000E+00 -3.17500000000000E+00 + -3.14500000000000E+00 -3.11500000000000E+00 -3.08500000000000E+00 + -3.05500000000000E+00 -3.02500000000000E+00 -2.99500000000000E+00 + -2.96500000000000E+00 -2.93500000000000E+00 -2.90500000000000E+00 + -2.87500000000000E+00 -2.84500000000000E+00 -2.81500000000000E+00 + -2.78500000000000E+00 -2.75500000000000E+00 -2.72500000000000E+00 + -2.69500000000000E+00 -2.66500000000000E+00 -2.63500000000000E+00 + -2.60500000000000E+00 -2.57500000000000E+00 -2.54500000000000E+00 + -2.51500000000000E+00 -2.48500000000000E+00 -2.45500000000000E+00 + -2.42500000000000E+00 -2.39500000000000E+00 -2.36500000000000E+00 + -2.33500000000000E+00 -2.30500000000000E+00 -2.27500000000000E+00 + -2.24500000000000E+00 -2.21500000000000E+00 -2.18500000000000E+00 + -2.15500000000000E+00 -2.12500000000000E+00 -2.09500000000000E+00 + -2.06500000000000E+00 -2.03500000000000E+00 -2.00500000000000E+00 + -1.97500000000000E+00 -1.94500000000000E+00 -1.91500000000000E+00 + -1.88500000000000E+00 -1.85500000000000E+00 -1.82500000000000E+00 + -1.79500000000000E+00 -1.76500000000000E+00 -1.73500000000000E+00 + -1.70500000000000E+00 -1.67500000000000E+00 -1.64500000000000E+00 + -1.61500000000000E+00 -1.58500000000000E+00 -1.55500000000000E+00 + -1.52500000000000E+00 -1.49500000000000E+00 -1.46500000000000E+00 + -1.43500000000000E+00 -1.40500000000000E+00 -1.37500000000000E+00 + -1.34500000000000E+00 -1.31500000000000E+00 -1.28500000000000E+00 + -1.25500000000000E+00 -1.22500000000000E+00 -1.19500000000000E+00 + -1.16500000000000E+00 + 1 -1 6 8 + SCALAIRE + -21 325177 1 0 0 0 -2 0 2 + + + 325189 + H + REAL*8 + 1 100 0 0 + -4.13500000000000E+00 -4.10500000000000E+00 -4.07500000000000E+00 + -4.04500000000000E+00 -4.01500000000000E+00 -3.98500000000000E+00 + -3.95500000000000E+00 -3.92500000000000E+00 -3.89500000000000E+00 + -3.86500000000000E+00 -3.83500000000000E+00 -3.80500000000000E+00 + -3.77500000000000E+00 -3.74500000000000E+00 -3.71500000000000E+00 + -3.68500000000000E+00 -3.65500000000000E+00 -3.62500000000000E+00 + -3.59500000000000E+00 -3.56500000000000E+00 -3.53500000000000E+00 + -3.50500000000000E+00 -3.47500000000000E+00 -3.44500000000000E+00 + -3.41500000000000E+00 -3.38500000000000E+00 -3.35500000000000E+00 + -3.32500000000000E+00 -3.29500000000000E+00 -3.26500000000000E+00 + -3.23500000000000E+00 -3.20500000000000E+00 -3.17500000000000E+00 + -3.14500000000000E+00 -3.11500000000000E+00 -3.08500000000000E+00 + -3.05500000000000E+00 -3.02500000000000E+00 -2.99500000000000E+00 + -2.96500000000000E+00 -2.93500000000000E+00 -2.90500000000000E+00 + -2.87500000000000E+00 -2.84500000000000E+00 -2.81500000000000E+00 + -2.78500000000000E+00 -2.75500000000000E+00 -2.72500000000000E+00 + -2.69500000000000E+00 -2.66500000000000E+00 -2.63500000000000E+00 + -2.60500000000000E+00 -2.57500000000000E+00 -2.54500000000000E+00 + -2.51500000000000E+00 -2.48500000000000E+00 -2.45500000000000E+00 + -2.42500000000000E+00 -2.39500000000000E+00 -2.36500000000000E+00 + -2.33500000000000E+00 -2.30500000000000E+00 -2.27500000000000E+00 + -2.24500000000000E+00 -2.21500000000000E+00 -2.18500000000000E+00 + -2.15500000000000E+00 -2.12500000000000E+00 -2.09500000000000E+00 + -2.06500000000000E+00 -2.03500000000000E+00 -2.00500000000000E+00 + -1.97500000000000E+00 -1.94500000000000E+00 -1.91500000000000E+00 + -1.88500000000000E+00 -1.85500000000000E+00 -1.82499999999999E+00 + -1.79500000000002E+00 -1.76499999999990E+00 -1.73500000000046E+00 + -1.70499999999795E+00 -1.67500000000919E+00 -1.64499999995875E+00 + -1.61500000018511E+00 -1.58499999916916E+00 -1.55500000372952E+00 + -1.52499998325759E+00 -1.49500007516150E+00 -1.46499966257587E+00 + -1.43500151469562E+00 -1.40499319973773E+00 -1.37503050279579E+00 + -1.34486272161241E+00 -1.31560872024149E+00 -1.28208143964912E+00 + -1.03539740467805E+00 -5.49145954159549E-01 -2.61540006497621E-01 + -7.90437383301150E-02 + 1 -1 6 8 + SCALAIRE + -21 326443 1 0 0 0 -3 0 2 + + + 326491 + H + REAL*8 + 1 100 0 0 + -4.13500000000000E+00 -4.10500000000000E+00 -4.07500000000000E+00 + -4.04500000000000E+00 -4.01500000000000E+00 -3.98500000000000E+00 + -3.95500000000000E+00 -3.92500000000000E+00 -3.89500000000000E+00 + -3.86500000000000E+00 -3.83500000000000E+00 -3.80500000000000E+00 + -3.77500000000000E+00 -3.74500000000000E+00 -3.71500000000000E+00 + -3.68500000000000E+00 -3.65500000000000E+00 -3.62500000000000E+00 + -3.59500000000000E+00 -3.56500000000000E+00 -3.53500000000000E+00 + -3.50500000000000E+00 -3.47500000000000E+00 -3.44500000000000E+00 + -3.41500000000000E+00 -3.38500000000000E+00 -3.35500000000000E+00 + -3.32500000000000E+00 -3.29500000000000E+00 -3.26500000000000E+00 + -3.23500000000000E+00 -3.20500000000000E+00 -3.17500000000000E+00 + -3.14500000000000E+00 -3.11500000000000E+00 -3.08500000000000E+00 + -3.05500000000000E+00 -3.02500000000000E+00 -2.99500000000000E+00 + -2.96500000000000E+00 -2.93500000000000E+00 -2.90500000000000E+00 + -2.87500000000000E+00 -2.84500000000000E+00 -2.81500000000000E+00 + -2.78500000000000E+00 -2.75500000000000E+00 -2.72500000000000E+00 + -2.69500000000000E+00 -2.66500000000000E+00 -2.63500000000000E+00 + -2.60500000000000E+00 -2.57500000000000E+00 -2.54500000000000E+00 + -2.51500000000000E+00 -2.48500000000000E+00 -2.45500000000000E+00 + -2.42500000000000E+00 -2.39500000000000E+00 -2.36500000000000E+00 + -2.33500000000000E+00 -2.30500000000000E+00 -2.27500000000000E+00 + -2.24500000000000E+00 -2.21500000000000E+00 -2.18500000000000E+00 + -2.15500000000000E+00 -2.12500000000000E+00 -2.09500000000000E+00 + -2.06500000000000E+00 -2.03500000000000E+00 -2.00500000000000E+00 + -1.97500000000000E+00 -1.94500000000000E+00 -1.91500000000000E+00 + -1.88500000000001E+00 -1.85499999999998E+00 -1.82500000000011E+00 + -1.79499999999951E+00 -1.76500000000216E+00 -1.73499999999041E+00 + -1.70500000004245E+00 -1.67499999981198E+00 -1.64500000083258E+00 + -1.61499999631362E+00 -1.58500001632013E+00 -1.55499992775752E+00 + -1.52500031974302E+00 -1.49499858497048E+00 -1.46500626037860E+00 + -1.43497228758946E+00 -1.40512229123405E+00 -1.37445324999156E+00 + -1.34732398415236E+00 -1.29999905693040E+00 -9.39039023392856E-01 + -5.04006393092861E-01 -2.68247218769097E-01 -1.29139777000984E-01 + -3.75078673593804E-02 + 1 -1 6 8 + SCALAIRE + -21 324649 1 0 0 0 -4 0 2 + + + 324637 + H + REAL*8 + 1 100 0 0 + -4.13500000000000E+00 -4.10500000000000E+00 -4.07500000000000E+00 + -4.04500000000000E+00 -4.01500000000000E+00 -3.98500000000000E+00 + -3.95500000000000E+00 -3.92500000000000E+00 -3.89500000000000E+00 + -3.86500000000000E+00 -3.83500000000000E+00 -3.80500000000000E+00 + -3.77500000000000E+00 -3.74500000000000E+00 -3.71500000000000E+00 + -3.68500000000000E+00 -3.65500000000000E+00 -3.62500000000000E+00 + -3.59500000000000E+00 -3.56500000000000E+00 -3.53500000000000E+00 + -3.50500000000000E+00 -3.47500000000000E+00 -3.44500000000000E+00 + -3.41500000000000E+00 -3.38500000000000E+00 -3.35500000000000E+00 + -3.32500000000000E+00 -3.29500000000000E+00 -3.26500000000000E+00 + -3.23500000000000E+00 -3.20500000000000E+00 -3.17500000000000E+00 + -3.14500000000000E+00 -3.11500000000000E+00 -3.08500000000000E+00 + -3.05500000000000E+00 -3.02500000000000E+00 -2.99500000000000E+00 + -2.96500000000000E+00 -2.93500000000000E+00 -2.90500000000000E+00 + -2.87500000000000E+00 -2.84500000000000E+00 -2.81500000000000E+00 + -2.78500000000000E+00 -2.75500000000000E+00 -2.72500000000000E+00 + -2.69500000000000E+00 -2.66500000000000E+00 -2.63500000000000E+00 + -2.60500000000000E+00 -2.57500000000000E+00 -2.54500000000000E+00 + -2.51500000000000E+00 -2.48500000000000E+00 -2.45500000000000E+00 + -2.42500000000000E+00 -2.39500000000000E+00 -2.36500000000000E+00 + -2.33500000000000E+00 -2.30500000000000E+00 -2.27500000000000E+00 + -2.24500000000000E+00 -2.21500000000000E+00 -2.18500000000000E+00 + -2.15500000000000E+00 -2.12500000000000E+00 -2.09500000000000E+00 + -2.06500000000000E+00 -2.03500000000000E+00 -2.00500000000000E+00 + -1.97500000000000E+00 -1.94500000000000E+00 -1.91500000000001E+00 + -1.88499999999997E+00 -1.85500000000015E+00 -1.82499999999937E+00 + -1.79500000000275E+00 -1.76499999998803E+00 -1.73500000005201E+00 + -1.70499999977409E+00 -1.67500000098080E+00 -1.64499999574411E+00 + -1.61500001845649E+00 -1.58499992000793E+00 -1.55500034647027E+00 + -1.52499850024683E+00 -1.49500648601938E+00 -1.46497194543986E+00 + -1.43512078743789E+00 -1.40447123268857E+00 -1.37716622941086E+00 + -1.32999410273643E+00 -9.60394822100051E-01 -5.35159666296827E-01 + -3.12168724171530E-01 -1.81111056228492E-01 -9.35976677678686E-02 + -2.85937362206644E-02 + 1 -1 6 8 + SCALAIRE + -21 324409 1 0 0 0 -5 0 2 + + + 324397 + H + REAL*8 + 1 100 0 0 + -4.13500000000000E+00 -4.10500000000000E+00 -4.07500000000000E+00 + -4.04500000000000E+00 -4.01500000000000E+00 -3.98500000000000E+00 + -3.95500000000000E+00 -3.92500000000000E+00 -3.89500000000000E+00 + -3.86500000000000E+00 -3.83500000000000E+00 -3.80500000000000E+00 + -3.77500000000000E+00 -3.74500000000000E+00 -3.71500000000000E+00 + -3.68500000000000E+00 -3.65500000000000E+00 -3.62500000000000E+00 + -3.59500000000000E+00 -3.56500000000000E+00 -3.53500000000000E+00 + -3.50500000000000E+00 -3.47500000000000E+00 -3.44500000000000E+00 + -3.41500000000000E+00 -3.38500000000000E+00 -3.35500000000000E+00 + -3.32500000000000E+00 -3.29500000000000E+00 -3.26500000000000E+00 + -3.23500000000000E+00 -3.20500000000000E+00 -3.17500000000000E+00 + -3.14500000000000E+00 -3.11500000000000E+00 -3.08500000000000E+00 + -3.05500000000000E+00 -3.02500000000000E+00 -2.99500000000000E+00 + -2.96500000000000E+00 -2.93500000000000E+00 -2.90500000000000E+00 + -2.87500000000000E+00 -2.84500000000000E+00 -2.81500000000000E+00 + -2.78500000000000E+00 -2.75500000000000E+00 -2.72500000000000E+00 + -2.69500000000000E+00 -2.66500000000000E+00 -2.63500000000000E+00 + -2.60500000000000E+00 -2.57500000000000E+00 -2.54500000000000E+00 + -2.51500000000000E+00 -2.48500000000000E+00 -2.45500000000000E+00 + -2.42500000000000E+00 -2.39500000000000E+00 -2.36500000000000E+00 + -2.33500000000000E+00 -2.30500000000000E+00 -2.27500000000000E+00 + -2.24500000000000E+00 -2.21500000000000E+00 -2.18500000000000E+00 + -2.15500000000000E+00 -2.12500000000000E+00 -2.09500000000000E+00 + -2.06500000000000E+00 -2.03500000000000E+00 -2.00500000000000E+00 + -1.97500000000000E+00 -1.94500000000001E+00 -1.91499999999997E+00 + -1.88500000000012E+00 -1.85499999999949E+00 -1.82500000000217E+00 + -1.79499999999068E+00 -1.76500000003996E+00 -1.73499999982878E+00 + -1.70500000073316E+00 -1.67499999686222E+00 -1.64500001342196E+00 + -1.61499994261664E+00 -1.58500024520669E+00 -1.55499895267043E+00 + -1.52500447046912E+00 -1.49498091221237E+00 -1.46508121144364E+00 + -1.43464997086609E+00 -1.40643115235774E+00 -1.36694776513999E+00 + -1.04002512536374E+00 -5.95905323840183E-01 -3.67098547585758E-01 + -2.34350727394083E-01 -1.45267147117089E-01 -7.87455570371689E-02 + -2.47231504493155E-02 + 1 -1 6 8 + SCALAIRE + -21 324169 1 0 0 0 -6 0 2 + + + 324133 + H + REAL*8 + 1 100 0 0 + -4.13500000000000E+00 -4.10500000000000E+00 -4.07500000000000E+00 + -4.04500000000000E+00 -4.01500000000000E+00 -3.98500000000000E+00 + -3.95500000000000E+00 -3.92500000000000E+00 -3.89500000000000E+00 + -3.86500000000000E+00 -3.83500000000000E+00 -3.80500000000000E+00 + -3.77500000000000E+00 -3.74500000000000E+00 -3.71500000000000E+00 + -3.68500000000000E+00 -3.65500000000000E+00 -3.62500000000000E+00 + -3.59500000000000E+00 -3.56500000000000E+00 -3.53500000000000E+00 + -3.50500000000000E+00 -3.47500000000000E+00 -3.44500000000000E+00 + -3.41500000000000E+00 -3.38500000000000E+00 -3.35500000000000E+00 + -3.32500000000000E+00 -3.29500000000000E+00 -3.26500000000000E+00 + -3.23500000000000E+00 -3.20500000000000E+00 -3.17500000000000E+00 + -3.14500000000000E+00 -3.11500000000000E+00 -3.08500000000000E+00 + -3.05500000000000E+00 -3.02500000000000E+00 -2.99500000000000E+00 + -2.96500000000000E+00 -2.93500000000000E+00 -2.90500000000000E+00 + -2.87500000000000E+00 -2.84500000000000E+00 -2.81500000000000E+00 + -2.78500000000000E+00 -2.75500000000000E+00 -2.72500000000000E+00 + -2.69500000000000E+00 -2.66500000000000E+00 -2.63500000000000E+00 + -2.60500000000000E+00 -2.57500000000000E+00 -2.54500000000000E+00 + -2.51500000000000E+00 -2.48500000000000E+00 -2.45500000000000E+00 + -2.42500000000000E+00 -2.39500000000000E+00 -2.36500000000000E+00 + -2.33500000000000E+00 -2.30500000000000E+00 -2.27500000000000E+00 + -2.24500000000000E+00 -2.21500000000000E+00 -2.18500000000000E+00 + -2.15500000000000E+00 -2.12500000000000E+00 -2.09500000000000E+00 + -2.06500000000000E+00 -2.03500000000000E+00 -2.00500000000000E+00 + -1.97500000000000E+00 -1.94499999999999E+00 -1.91500000000005E+00 + -1.88499999999978E+00 -1.85500000000092E+00 -1.82499999999615E+00 + -1.79500000001605E+00 -1.76499999993324E+00 -1.73500000027714E+00 + -1.70499999885212E+00 -1.67500000474282E+00 -1.64499998045600E+00 + -1.61500008029727E+00 -1.58499967117228E+00 -1.55500134148075E+00 + -1.52499454751231E+00 -1.49502201148601E+00 -1.46491087912687E+00 + -1.43534594794479E+00 -1.40343758225318E+00 -1.15625733494940E+00 + -6.81591577109316E-01 -4.29917049285670E-01 -2.88797648041618E-01 + -1.95355136656416E-01 -1.26089220082132E-01 -7.02459832108218E-02 + -2.23956508279002E-02 + 1 -1 6 8 + SCALAIRE + -21 323839 1 0 0 0 -7 0 2 + + + 323827 + H + REAL*8 + 1 100 0 0 + -4.13500000000000E+00 -4.10500000000000E+00 -4.07500000000000E+00 + -4.04500000000000E+00 -4.01500000000000E+00 -3.98500000000000E+00 + -3.95500000000000E+00 -3.92500000000000E+00 -3.89500000000000E+00 + -3.86500000000000E+00 -3.83500000000000E+00 -3.80500000000000E+00 + -3.77500000000000E+00 -3.74500000000000E+00 -3.71500000000000E+00 + -3.68500000000000E+00 -3.65500000000000E+00 -3.62500000000000E+00 + -3.59500000000000E+00 -3.56500000000000E+00 -3.53500000000000E+00 + -3.50500000000000E+00 -3.47500000000000E+00 -3.44500000000000E+00 + -3.41500000000000E+00 -3.38500000000000E+00 -3.35500000000000E+00 + -3.32500000000000E+00 -3.29500000000000E+00 -3.26500000000000E+00 + -3.23500000000000E+00 -3.20500000000000E+00 -3.17500000000000E+00 + -3.14500000000000E+00 -3.11500000000000E+00 -3.08500000000000E+00 + -3.05500000000000E+00 -3.02500000000000E+00 -2.99500000000000E+00 + -2.96500000000000E+00 -2.93500000000000E+00 -2.90500000000000E+00 + -2.87500000000000E+00 -2.84500000000000E+00 -2.81500000000000E+00 + -2.78500000000000E+00 -2.75500000000000E+00 -2.72500000000000E+00 + -2.69500000000000E+00 -2.66500000000000E+00 -2.63500000000000E+00 + -2.60500000000000E+00 -2.57500000000000E+00 -2.54500000000000E+00 + -2.51500000000000E+00 -2.48500000000000E+00 -2.45500000000000E+00 + -2.42500000000000E+00 -2.39500000000000E+00 -2.36500000000000E+00 + -2.33500000000000E+00 -2.30500000000000E+00 -2.27500000000000E+00 + -2.24500000000000E+00 -2.21500000000000E+00 -2.18500000000000E+00 + -2.15500000000000E+00 -2.12500000000000E+00 -2.09500000000000E+00 + -2.06500000000000E+00 -2.03500000000000E+00 -2.00500000000000E+00 + -1.97500000000000E+00 -1.94499999999999E+00 -1.91500000000006E+00 + -1.88499999999972E+00 -1.85500000000136E+00 -1.82499999999356E+00 + -1.79500000003023E+00 -1.76499999985890E+00 -1.73500000065495E+00 + -1.70499999697457E+00 -1.67500001391583E+00 -1.64499993623505E+00 + -1.61500029118890E+00 -1.58499867429844E+00 -1.55500601799045E+00 + -1.52497273589662E+00 -1.49512292571263E+00 -1.46444078115727E+00 + -1.43742834219045E+00 -1.28263638756659E+00 -7.92940566609100E-01 + -5.01859648381398E-01 -3.46256800501063E-01 -2.45860445229598E-01 + -1.72612955955896E-01 -1.14269489149970E-01 -6.47690425436326E-02 + -2.08541229081103E-02 + 1 -1 6 8 + SCALAIRE + -21 323587 1 0 0 0 -8 0 2 + + + 323575 + H + REAL*8 + 1 100 0 0 + -4.13500000000000E+00 -4.10500000000000E+00 -4.07500000000000E+00 + -4.04500000000000E+00 -4.01500000000000E+00 -3.98500000000000E+00 + -3.95500000000000E+00 -3.92500000000000E+00 -3.89500000000000E+00 + -3.86500000000000E+00 -3.83500000000000E+00 -3.80500000000000E+00 + -3.77500000000000E+00 -3.74500000000000E+00 -3.71500000000000E+00 + -3.68500000000000E+00 -3.65500000000000E+00 -3.62500000000000E+00 + -3.59500000000000E+00 -3.56500000000000E+00 -3.53500000000000E+00 + -3.50500000000000E+00 -3.47500000000000E+00 -3.44500000000000E+00 + -3.41500000000000E+00 -3.38500000000000E+00 -3.35500000000000E+00 + -3.32500000000000E+00 -3.29500000000000E+00 -3.26500000000000E+00 + -3.23500000000000E+00 -3.20500000000000E+00 -3.17500000000000E+00 + -3.14500000000000E+00 -3.11500000000000E+00 -3.08500000000000E+00 + -3.05500000000000E+00 -3.02500000000000E+00 -2.99500000000000E+00 + -2.96500000000000E+00 -2.93500000000000E+00 -2.90500000000000E+00 + -2.87500000000000E+00 -2.84500000000000E+00 -2.81500000000000E+00 + -2.78500000000000E+00 -2.75500000000000E+00 -2.72500000000000E+00 + -2.69500000000000E+00 -2.66500000000000E+00 -2.63500000000000E+00 + -2.60500000000000E+00 -2.57500000000000E+00 -2.54500000000000E+00 + -2.51500000000000E+00 -2.48500000000000E+00 -2.45500000000000E+00 + -2.42500000000000E+00 -2.39500000000000E+00 -2.36500000000000E+00 + -2.33500000000000E+00 -2.30500000000000E+00 -2.27500000000000E+00 + -2.24500000000000E+00 -2.21500000000000E+00 -2.18500000000000E+00 + -2.15500000000000E+00 -2.12500000000000E+00 -2.09500000000000E+00 + -2.06500000000000E+00 -2.03500000000000E+00 -2.00500000000001E+00 + -1.97499999999995E+00 -1.94500000000020E+00 -1.91499999999911E+00 + -1.88500000000389E+00 -1.85499999998293E+00 -1.82500000007480E+00 + -1.79499999967238E+00 -1.76500000143404E+00 -1.73499999372727E+00 + -1.70500002741978E+00 -1.67499988021859E+00 -1.64500052291084E+00 + -1.61499771852574E+00 -1.58500994501613E+00 -1.55495662642460E+00 + -1.52518809456395E+00 -1.49416546120541E+00 -1.46840898382644E+00 + -1.38846040120499E+00 -9.35682918089455E-01 -5.85643458507160E-01 + -4.08184793116873E-01 -2.97961427219939E-01 -2.19395918470747E-01 + -1.57838816004969E-01 -1.06260677206624E-01 -6.09409962757218E-02 + -1.97564413836509E-02 + 1 -1 6 8 + SCALAIRE + -21 323413 1 0 0 0 -9 0 2 + + + 323395 + H + REAL*8 + 1 100 0 0 + -4.13500000000000E+00 -4.10500000000000E+00 -4.07500000000000E+00 + -4.04500000000000E+00 -4.01500000000000E+00 -3.98500000000000E+00 + -3.95500000000000E+00 -3.92500000000000E+00 -3.89500000000000E+00 + -3.86500000000000E+00 -3.83500000000000E+00 -3.80500000000000E+00 + -3.77500000000000E+00 -3.74500000000000E+00 -3.71500000000000E+00 + -3.68500000000000E+00 -3.65500000000000E+00 -3.62500000000000E+00 + -3.59500000000000E+00 -3.56500000000000E+00 -3.53500000000000E+00 + -3.50500000000000E+00 -3.47500000000000E+00 -3.44500000000000E+00 + -3.41500000000000E+00 -3.38500000000000E+00 -3.35500000000000E+00 + -3.32500000000000E+00 -3.29500000000000E+00 -3.26500000000000E+00 + -3.23500000000000E+00 -3.20500000000000E+00 -3.17500000000000E+00 + -3.14500000000000E+00 -3.11500000000000E+00 -3.08500000000000E+00 + -3.05500000000000E+00 -3.02500000000000E+00 -2.99500000000000E+00 + -2.96500000000000E+00 -2.93500000000000E+00 -2.90500000000000E+00 + -2.87500000000000E+00 -2.84500000000000E+00 -2.81500000000000E+00 + -2.78500000000000E+00 -2.75500000000000E+00 -2.72500000000000E+00 + -2.69500000000000E+00 -2.66500000000000E+00 -2.63500000000000E+00 + -2.60500000000000E+00 -2.57500000000000E+00 -2.54500000000000E+00 + -2.51500000000000E+00 -2.48500000000000E+00 -2.45500000000000E+00 + -2.42500000000000E+00 -2.39500000000000E+00 -2.36500000000000E+00 + -2.33500000000000E+00 -2.30500000000000E+00 -2.27500000000000E+00 + -2.24500000000000E+00 -2.21500000000000E+00 -2.18500000000000E+00 + -2.15500000000000E+00 -2.12500000000000E+00 -2.09500000000000E+00 + -2.06500000000000E+00 -2.03500000000001E+00 -2.00499999999996E+00 + -1.97500000000015E+00 -1.94499999999935E+00 -1.91500000000279E+00 + -1.88499999998811E+00 -1.85500000005060E+00 -1.82499999978494E+00 + -1.79500000091293E+00 -1.76499999612968E+00 -1.73500001638543E+00 + -1.70499993073060E+00 -1.67500029238419E+00 -1.64499876778899E+00 + -1.61500518273646E+00 -1.58497821846118E+00 -1.55509096148427E+00 + -1.52461371682233E+00 -1.49651945793081E+00 -1.45550522404072E+00 + -1.11141556194939E+00 -6.85617467062108E-01 -4.75817800828769E-01 + -3.52493664636066E-01 -2.67231526111714E-01 -2.01735043236646E-01 + -1.47631267422776E-01 -1.00592612668865E-01 -5.81888625377557E-02 + -1.89603860496890E-02 + 1 -1 6 8 + SCALAIRE + -21 323221 1 0 0 0 -10 0 2 + + + 323209 + H + REAL*8 + 1 100 0 0 + -4.13500000000000E+00 -4.10500000000000E+00 -4.07500000000000E+00 + -4.04500000000000E+00 -4.01500000000000E+00 -3.98500000000000E+00 + -3.95500000000000E+00 -3.92500000000000E+00 -3.89500000000000E+00 + -3.86500000000000E+00 -3.83500000000000E+00 -3.80500000000000E+00 + -3.77500000000000E+00 -3.74500000000000E+00 -3.71500000000000E+00 + -3.68500000000000E+00 -3.65500000000000E+00 -3.62500000000000E+00 + -3.59500000000000E+00 -3.56500000000000E+00 -3.53500000000000E+00 + -3.50500000000000E+00 -3.47500000000000E+00 -3.44500000000000E+00 + -3.41500000000000E+00 -3.38500000000000E+00 -3.35500000000000E+00 + -3.32500000000000E+00 -3.29500000000000E+00 -3.26500000000000E+00 + -3.23500000000000E+00 -3.20500000000000E+00 -3.17500000000000E+00 + -3.14500000000000E+00 -3.11500000000000E+00 -3.08500000000000E+00 + -3.05500000000000E+00 -3.02500000000000E+00 -2.99500000000000E+00 + -2.96500000000000E+00 -2.93500000000000E+00 -2.90500000000000E+00 + -2.87500000000000E+00 -2.84500000000000E+00 -2.81500000000000E+00 + -2.78500000000000E+00 -2.75500000000000E+00 -2.72500000000000E+00 + -2.69500000000000E+00 -2.66500000000000E+00 -2.63500000000000E+00 + -2.60500000000000E+00 -2.57500000000000E+00 -2.54500000000000E+00 + -2.51500000000000E+00 -2.48500000000000E+00 -2.45500000000000E+00 + -2.42500000000000E+00 -2.39500000000000E+00 -2.36500000000000E+00 + -2.33500000000000E+00 -2.30500000000000E+00 -2.27500000000000E+00 + -2.24500000000000E+00 -2.21500000000000E+00 -2.18500000000000E+00 + -2.15500000000000E+00 -2.12500000000000E+00 -2.09500000000000E+00 + -2.06500000000000E+00 -2.03499999999999E+00 -2.00500000000002E+00 + -1.97499999999991E+00 -1.94500000000034E+00 -1.91499999999878E+00 + -1.88500000000425E+00 -1.85499999998610E+00 -1.82500000004098E+00 + -1.79499999990457E+00 -1.76500000006362E+00 -1.73500000121241E+00 + -1.70499998842712E+00 -1.67500007693173E+00 -1.64499955319541E+00 + -1.61500241369967E+00 -1.58498749940464E+00 -1.55506229202357E+00 + -1.52468781009987E+00 -1.49640124164690E+00 -1.29828539904695E+00 + -8.15787359698163E-01 -5.52564260334102E-01 -4.09496520865303E-01 + -3.15342837430113E-01 -2.45155231061966E-01 -1.88306354219557E-01 + -1.39537727333081E-01 -9.59717936652752E-02 -5.59119860531203E-02 + -1.82986686913840E-02 + 1 -1 6 8 + SCALAIRE + -21 323059 1 0 0 0 -11 0 2 + + + 323047 + H + REAL*8 + 1 100 0 0 + -4.13500000000000E+00 -4.10500000000000E+00 -4.07500000000000E+00 + -4.04500000000000E+00 -4.01500000000000E+00 -3.98500000000000E+00 + -3.95500000000000E+00 -3.92500000000000E+00 -3.89500000000000E+00 + -3.86500000000000E+00 -3.83500000000000E+00 -3.80500000000000E+00 + -3.77500000000000E+00 -3.74500000000000E+00 -3.71500000000000E+00 + -3.68500000000000E+00 -3.65500000000000E+00 -3.62500000000000E+00 + -3.59500000000000E+00 -3.56500000000000E+00 -3.53500000000000E+00 + -3.50500000000000E+00 -3.47500000000000E+00 -3.44500000000000E+00 + -3.41500000000000E+00 -3.38500000000000E+00 -3.35500000000000E+00 + -3.32500000000000E+00 -3.29500000000000E+00 -3.26500000000000E+00 + -3.23500000000000E+00 -3.20500000000000E+00 -3.17500000000000E+00 + -3.14500000000000E+00 -3.11500000000000E+00 -3.08500000000000E+00 + -3.05500000000000E+00 -3.02500000000000E+00 -2.99500000000000E+00 + -2.96500000000000E+00 -2.93500000000000E+00 -2.90500000000000E+00 + -2.87500000000000E+00 -2.84500000000000E+00 -2.81500000000000E+00 + -2.78500000000000E+00 -2.75500000000000E+00 -2.72500000000000E+00 + -2.69500000000000E+00 -2.66500000000000E+00 -2.63500000000000E+00 + -2.60500000000000E+00 -2.57500000000000E+00 -2.54500000000000E+00 + -2.51500000000000E+00 -2.48500000000000E+00 -2.45500000000000E+00 + -2.42500000000000E+00 -2.39500000000000E+00 -2.36500000000000E+00 + -2.33500000000000E+00 -2.30500000000000E+00 -2.27500000000000E+00 + -2.24500000000000E+00 -2.21500000000000E+00 -2.18500000000000E+00 + -2.15500000000000E+00 -2.12500000000000E+00 -2.09500000000000E+00 + -2.06500000000001E+00 -2.03499999999996E+00 -2.00500000000019E+00 + -1.97499999999915E+00 -1.94500000000375E+00 -1.91499999998343E+00 + -1.88500000007314E+00 -1.85499999967763E+00 -1.82500000141909E+00 + -1.79499999376094E+00 -1.76500002739826E+00 -1.73499987981461E+00 + -1.70500052665675E+00 -1.67499769428415E+00 -1.64501008296745E+00 + -1.61495590195655E+00 -1.58519189020477E+00 -1.55414889879884E+00 + -1.52851191983636E+00 -1.43941898963168E+00 -9.81842080685448E-01 + -6.43863584011360E-01 -4.73139086315934E-01 -3.66808693317095E-01 + -2.90338102902997E-01 -2.29841017254800E-01 -1.78775092857409E-01 + -1.33678816418832E-01 -9.25593652683946E-02 -5.41929010118153E-02 + -1.77895189025899E-02 + 1 -1 6 8 + SCALAIRE + -21 322561 1 0 0 0 -12 0 2 + + + 322471 + H + REAL*8 + 1 100 0 0 + -4.13500000000000E+00 -4.10500000000000E+00 -4.07500000000000E+00 + -4.04500000000000E+00 -4.01500000000000E+00 -3.98500000000000E+00 + -3.95500000000000E+00 -3.92500000000000E+00 -3.89500000000000E+00 + -3.86500000000000E+00 -3.83500000000000E+00 -3.80500000000000E+00 + -3.77500000000000E+00 -3.74500000000000E+00 -3.71500000000000E+00 + -3.68500000000000E+00 -3.65500000000000E+00 -3.62500000000000E+00 + -3.59500000000000E+00 -3.56500000000000E+00 -3.53500000000000E+00 + -3.50500000000000E+00 -3.47500000000000E+00 -3.44500000000000E+00 + -3.41500000000000E+00 -3.38500000000000E+00 -3.35500000000000E+00 + -3.32500000000000E+00 -3.29500000000000E+00 -3.26500000000000E+00 + -3.23500000000000E+00 -3.20500000000000E+00 -3.17500000000000E+00 + -3.14500000000000E+00 -3.11500000000000E+00 -3.08500000000000E+00 + -3.05500000000000E+00 -3.02500000000000E+00 -2.99500000000000E+00 + -2.96500000000000E+00 -2.93500000000000E+00 -2.90500000000000E+00 + -2.87500000000000E+00 -2.84500000000000E+00 -2.81500000000000E+00 + -2.78500000000000E+00 -2.75500000000000E+00 -2.72500000000000E+00 + -2.69500000000000E+00 -2.66500000000000E+00 -2.63500000000000E+00 + -2.60500000000000E+00 -2.57500000000000E+00 -2.54500000000000E+00 + -2.51500000000000E+00 -2.48500000000000E+00 -2.45500000000000E+00 + -2.42500000000000E+00 -2.39500000000000E+00 -2.36500000000000E+00 + -2.33500000000000E+00 -2.30500000000000E+00 -2.27500000000000E+00 + -2.24500000000000E+00 -2.21500000000000E+00 -2.18500000000000E+00 + -2.15500000000000E+00 -2.12500000000000E+00 -2.09500000000001E+00 + -2.06499999999997E+00 -2.03500000000014E+00 -2.00499999999939E+00 + -1.97500000000260E+00 -1.94499999998894E+00 -1.91500000004693E+00 + -1.88499999980106E+00 -1.85500000084225E+00 -1.82499999643920E+00 + -1.79500001503169E+00 -1.76499993664479E+00 -1.73500026657349E+00 + -1.70499888033726E+00 -1.67500469239171E+00 -1.64498035522495E+00 + -1.61508167585997E+00 -1.58465446764326E+00 -1.55634713449563E+00 + -1.51635524464944E+00 -1.18327077294589E+00 -7.55733803743065E-01 + -5.45114236348007E-01 -4.22306189906336E-01 -3.37656876351951E-01 + -2.72525392337286E-01 -2.18591552988509E-01 -1.71608240957917E-01 + -1.29192736144143E-01 -8.99091049467646E-02 -5.28429409603915E-02 + -1.73868596837357E-02 + 1 -1 6 8 + SCALAIRE + -21 322099 1 0 0 0 -13 0 2 + + + 322087 + H + REAL*8 + 1 100 0 0 + -4.13500000000000E+00 -4.10500000000000E+00 -4.07500000000000E+00 + -4.04500000000000E+00 -4.01500000000000E+00 -3.98500000000000E+00 + -3.95500000000000E+00 -3.92500000000000E+00 -3.89500000000000E+00 + -3.86500000000000E+00 -3.83500000000000E+00 -3.80500000000000E+00 + -3.77500000000000E+00 -3.74500000000000E+00 -3.71500000000000E+00 + -3.68500000000000E+00 -3.65500000000000E+00 -3.62500000000000E+00 + -3.59500000000000E+00 -3.56500000000000E+00 -3.53500000000000E+00 + -3.50500000000000E+00 -3.47500000000000E+00 -3.44500000000000E+00 + -3.41500000000000E+00 -3.38500000000000E+00 -3.35500000000000E+00 + -3.32500000000000E+00 -3.29500000000000E+00 -3.26500000000000E+00 + -3.23500000000000E+00 -3.20500000000000E+00 -3.17500000000000E+00 + -3.14500000000000E+00 -3.11500000000000E+00 -3.08500000000000E+00 + -3.05500000000000E+00 -3.02500000000000E+00 -2.99500000000000E+00 + -2.96500000000000E+00 -2.93500000000000E+00 -2.90500000000000E+00 + -2.87500000000000E+00 -2.84500000000000E+00 -2.81500000000000E+00 + -2.78500000000000E+00 -2.75500000000000E+00 -2.72500000000000E+00 + -2.69500000000000E+00 -2.66500000000000E+00 -2.63500000000000E+00 + -2.60500000000000E+00 -2.57500000000000E+00 -2.54500000000000E+00 + -2.51500000000000E+00 -2.48500000000000E+00 -2.45500000000000E+00 + -2.42500000000000E+00 -2.39500000000000E+00 -2.36500000000000E+00 + -2.33500000000000E+00 -2.30500000000000E+00 -2.27500000000000E+00 + -2.24500000000000E+00 -2.21500000000000E+00 -2.18500000000000E+00 + -2.15500000000000E+00 -2.12500000000000E+00 -2.09500000000000E+00 + -2.06500000000001E+00 -2.03499999999996E+00 -2.00500000000010E+00 + -1.97499999999980E+00 -1.94499999999978E+00 -1.91500000000559E+00 + -1.88499999995589E+00 -1.85500000027617E+00 -1.82499999843995E+00 + -1.79500000831078E+00 -1.76499995737749E+00 -1.73500021282329E+00 + -1.70499895816906E+00 -1.67500502071806E+00 -1.64497607675388E+00 + -1.61511240661199E+00 -1.58446815158855E+00 -1.55735921190085E+00 + -1.38188676739605E+00 -8.99048026462153E-01 -6.28308879412534E-01 + -4.82855922317560E-01 -3.87568689490143E-01 -3.16624431999774E-01 + -2.59181507666836E-01 -2.09929882357774E-01 -1.65975829802754E-01 + -1.25612308931659E-01 -8.77692139374181E-02 -5.17436594003092E-02 + -1.70572940941870E-02 + 1 -1 6 8 + SCALAIRE + -21 321907 1 0 0 0 -14 0 2 + + + 321895 + H + REAL*8 + 1 100 0 0 + -4.13500000000000E+00 -4.10500000000000E+00 -4.07500000000000E+00 + -4.04500000000000E+00 -4.01500000000000E+00 -3.98500000000000E+00 + -3.95500000000000E+00 -3.92500000000000E+00 -3.89500000000000E+00 + -3.86500000000000E+00 -3.83500000000000E+00 -3.80500000000000E+00 + -3.77500000000000E+00 -3.74500000000000E+00 -3.71500000000000E+00 + -3.68500000000000E+00 -3.65500000000000E+00 -3.62500000000000E+00 + -3.59500000000000E+00 -3.56500000000000E+00 -3.53500000000000E+00 + -3.50500000000000E+00 -3.47500000000000E+00 -3.44500000000000E+00 + -3.41500000000000E+00 -3.38500000000000E+00 -3.35500000000000E+00 + -3.32500000000000E+00 -3.29500000000000E+00 -3.26500000000000E+00 + -3.23500000000000E+00 -3.20500000000000E+00 -3.17500000000000E+00 + -3.14500000000000E+00 -3.11500000000000E+00 -3.08500000000000E+00 + -3.05500000000000E+00 -3.02500000000000E+00 -2.99500000000000E+00 + -2.96500000000000E+00 -2.93500000000000E+00 -2.90500000000000E+00 + -2.87500000000000E+00 -2.84500000000000E+00 -2.81500000000000E+00 + -2.78500000000000E+00 -2.75500000000000E+00 -2.72500000000000E+00 + -2.69500000000000E+00 -2.66500000000000E+00 -2.63500000000000E+00 + -2.60500000000000E+00 -2.57500000000000E+00 -2.54500000000000E+00 + -2.51500000000000E+00 -2.48500000000000E+00 -2.45500000000000E+00 + -2.42500000000000E+00 -2.39500000000000E+00 -2.36500000000000E+00 + -2.33500000000000E+00 -2.30500000000000E+00 -2.27500000000000E+00 + -2.24500000000000E+00 -2.21500000000000E+00 -2.18500000000000E+00 + -2.15500000000000E+00 -2.12500000000001E+00 -2.09499999999996E+00 + -2.06500000000020E+00 -2.03499999999913E+00 -2.00500000000383E+00 + -1.97499999998318E+00 -1.94500000007378E+00 -1.91499999967679E+00 + -1.88500000141394E+00 -1.85499999382253E+00 -1.82500002695510E+00 + -1.79499988252698E+00 -1.76500051133874E+00 -1.73499777671329E+00 + -1.70500965323825E+00 -1.67495808942615E+00 -1.64518091197089E+00 + -1.61420280894521E+00 -1.58824697663436E+00 -1.51760787601159E+00 + -1.08543736306801E+00 -7.27909893086666E-01 -5.50321650130748E-01 + -4.40882626060270E-01 -3.62575415113305E-01 -3.00822757036259E-01 + -2.48843364845485E-01 -2.03066213659871E-01 -1.61436270837271E-01 + -1.22688785191547E-01 -8.60041424118693E-02 -5.08297943546958E-02 + -1.67819474408829E-02 + 1 -1 6 8 + SCALAIRE + -21 321691 1 0 0 0 -15 0 2 + + + 321679 + H + REAL*8 + 1 100 0 0 + -4.13500000000000E+00 -4.10500000000000E+00 -4.07500000000000E+00 + -4.04500000000000E+00 -4.01500000000000E+00 -3.98500000000000E+00 + -3.95500000000000E+00 -3.92500000000000E+00 -3.89500000000000E+00 + -3.86500000000000E+00 -3.83500000000000E+00 -3.80500000000000E+00 + -3.77500000000000E+00 -3.74500000000000E+00 -3.71500000000000E+00 + -3.68500000000000E+00 -3.65500000000000E+00 -3.62500000000000E+00 + -3.59500000000000E+00 -3.56500000000000E+00 -3.53500000000000E+00 + -3.50500000000000E+00 -3.47500000000000E+00 -3.44500000000000E+00 + -3.41500000000000E+00 -3.38500000000000E+00 -3.35500000000000E+00 + -3.32500000000000E+00 -3.29500000000000E+00 -3.26500000000000E+00 + -3.23500000000000E+00 -3.20500000000000E+00 -3.17500000000000E+00 + -3.14500000000000E+00 -3.11500000000000E+00 -3.08500000000000E+00 + -3.05500000000000E+00 -3.02500000000000E+00 -2.99500000000000E+00 + -2.96500000000000E+00 -2.93500000000000E+00 -2.90500000000000E+00 + -2.87500000000000E+00 -2.84500000000000E+00 -2.81500000000000E+00 + -2.78500000000000E+00 -2.75500000000000E+00 -2.72500000000000E+00 + -2.69500000000000E+00 -2.66500000000000E+00 -2.63500000000000E+00 + -2.60500000000000E+00 -2.57500000000000E+00 -2.54500000000000E+00 + -2.51500000000000E+00 -2.48500000000000E+00 -2.45500000000000E+00 + -2.42500000000000E+00 -2.39500000000000E+00 -2.36500000000000E+00 + -2.33500000000000E+00 -2.30500000000000E+00 -2.27500000000000E+00 + -2.24500000000000E+00 -2.21500000000000E+00 -2.18500000000000E+00 + -2.15500000000001E+00 -2.12499999999998E+00 -2.09500000000010E+00 + -2.06499999999957E+00 -2.03500000000177E+00 -2.00499999999262E+00 + -1.97500000003061E+00 -1.94499999987343E+00 -1.91500000052155E+00 + -1.88499999785939E+00 -1.85500000874691E+00 -1.82499996443679E+00 + -1.79500014376692E+00 -1.76499942260985E+00 -1.73500230040975E+00 + -1.70499090918539E+00 -1.67503535574102E+00 -1.64486149739304E+00 + -1.61548413637776E+00 -1.58236356215296E+00 -1.30446733496594E+00 + -8.53144609758120E-01 -6.27442837703036E-01 -4.98709850686808E-01 + -4.10947669247034E-01 -3.43861516019437E-01 -2.88589056185258E-01 + -2.40647818875179E-01 -1.97531258815904E-01 -1.57729398777222E-01 + -1.20279269556511E-01 -8.45392657922977E-02 -5.00674041241981E-02 + -1.65514929378359E-02 + 1 -1 6 8 + SCALAIRE + -21 321469 1 0 0 0 -16 0 2 + + + 321445 + H + REAL*8 + 1 100 0 0 + -4.13500000000000E+00 -4.10500000000000E+00 -4.07500000000000E+00 + -4.04500000000000E+00 -4.01500000000000E+00 -3.98500000000000E+00 + -3.95500000000000E+00 -3.92500000000000E+00 -3.89500000000000E+00 + -3.86500000000000E+00 -3.83500000000000E+00 -3.80500000000000E+00 + -3.77500000000000E+00 -3.74500000000000E+00 -3.71500000000000E+00 + -3.68500000000000E+00 -3.65500000000000E+00 -3.62500000000000E+00 + -3.59500000000000E+00 -3.56500000000000E+00 -3.53500000000000E+00 + -3.50500000000000E+00 -3.47500000000000E+00 -3.44500000000000E+00 + -3.41500000000000E+00 -3.38500000000000E+00 -3.35500000000000E+00 + -3.32500000000000E+00 -3.29500000000000E+00 -3.26500000000000E+00 + -3.23500000000000E+00 -3.20500000000000E+00 -3.17500000000000E+00 + -3.14500000000000E+00 -3.11500000000000E+00 -3.08500000000000E+00 + -3.05500000000000E+00 -3.02500000000000E+00 -2.99500000000000E+00 + -2.96500000000000E+00 -2.93500000000000E+00 -2.90500000000000E+00 + -2.87500000000000E+00 -2.84500000000000E+00 -2.81500000000000E+00 + -2.78500000000000E+00 -2.75500000000000E+00 -2.72500000000000E+00 + -2.69500000000000E+00 -2.66500000000000E+00 -2.63500000000000E+00 + -2.60500000000000E+00 -2.57500000000000E+00 -2.54500000000000E+00 + -2.51500000000000E+00 -2.48500000000000E+00 -2.45500000000000E+00 + -2.42500000000000E+00 -2.39500000000000E+00 -2.36500000000000E+00 + -2.33500000000000E+00 -2.30500000000000E+00 -2.27500000000000E+00 + -2.24500000000000E+00 -2.21500000000000E+00 -2.18500000000000E+00 + -2.15500000000000E+00 -2.12499999999998E+00 -2.09500000000010E+00 + -2.06499999999951E+00 -2.03500000000233E+00 -2.00499999998904E+00 + -1.97500000005111E+00 -1.94499999976330E+00 -1.91500000108945E+00 + -1.88499999501316E+00 -1.85500002271558E+00 -1.82499989698235E+00 + -1.79500046532613E+00 -1.76499790577032E+00 -1.73500939152630E+00 + -1.70495798442831E+00 -1.67518676578197E+00 -1.64415923729329E+00 + -1.61855271999449E+00 -1.49449212288334E+00 -1.01812947421147E+00 + -7.18323423488807E-01 -5.62561993419072E-01 -4.62394581843326E-01 + -3.88629896223960E-01 -3.29358866942754E-01 -2.78845770722544E-01 + -2.33989572297653E-01 -1.92967661519950E-01 -1.54638985801121E-01 + -1.18253661011638E-01 -8.33001983139831E-02 -4.94197540058434E-02 + -1.63552445631558E-02 + 1 -1 6 8 + SCALAIRE + -21 320965 1 0 0 0 -17 0 2 + + + 320425 + H + REAL*8 + 1 100 0 0 + -4.13500000000000E+00 -4.10500000000000E+00 -4.07500000000000E+00 + -4.04500000000000E+00 -4.01500000000000E+00 -3.98500000000000E+00 + -3.95500000000000E+00 -3.92500000000000E+00 -3.89500000000000E+00 + -3.86500000000000E+00 -3.83500000000000E+00 -3.80500000000000E+00 + -3.77500000000000E+00 -3.74500000000000E+00 -3.71500000000000E+00 + -3.68500000000000E+00 -3.65500000000000E+00 -3.62500000000000E+00 + -3.59500000000000E+00 -3.56500000000000E+00 -3.53500000000000E+00 + -3.50500000000000E+00 -3.47500000000000E+00 -3.44500000000000E+00 + -3.41500000000000E+00 -3.38500000000000E+00 -3.35500000000000E+00 + -3.32500000000000E+00 -3.29500000000000E+00 -3.26500000000000E+00 + -3.23500000000000E+00 -3.20500000000000E+00 -3.17500000000000E+00 + -3.14500000000000E+00 -3.11500000000000E+00 -3.08500000000000E+00 + -3.05500000000000E+00 -3.02500000000000E+00 -2.99500000000000E+00 + -2.96500000000000E+00 -2.93500000000000E+00 -2.90500000000000E+00 + -2.87500000000000E+00 -2.84500000000000E+00 -2.81500000000000E+00 + -2.78500000000000E+00 -2.75500000000000E+00 -2.72500000000000E+00 + -2.69500000000000E+00 -2.66500000000000E+00 -2.63500000000000E+00 + -2.60500000000000E+00 -2.57500000000000E+00 -2.54500000000000E+00 + -2.51500000000000E+00 -2.48500000000000E+00 -2.45500000000000E+00 + -2.42500000000000E+00 -2.39500000000000E+00 -2.36500000000000E+00 + -2.33500000000000E+00 -2.30500000000000E+00 -2.27500000000000E+00 + -2.24500000000000E+00 -2.21500000000000E+00 -2.18500000000001E+00 + -2.15499999999996E+00 -2.12500000000017E+00 -2.09499999999925E+00 + -2.06500000000325E+00 -2.03499999998600E+00 -2.00500000006021E+00 + -1.97499999974149E+00 -1.94500000110828E+00 -1.91499999525586E+00 + -1.88500002027688E+00 -1.85499991346874E+00 -1.82500036868679E+00 + -1.79499843153118E+00 -1.76500666007237E+00 -1.73497173675939E+00 + -1.70511918852121E+00 -1.67448762713892E+00 -1.64703246136924E+00 + -1.59989684822653E+00 -1.23068537872209E+00 -8.30293436586229E-01 + -6.34936848362107E-01 -5.17968908719407E-01 -4.35677384763109E-01 + -3.71483240155799E-01 -3.17879990570377E-01 -2.70968574787770E-01 + -2.28522077526631E-01 -1.89175921716372E-01 -1.52047710788681E-01 + -1.16542725066906E-01 -8.22472559032441E-02 -4.88665856711039E-02 + -1.61870424730015E-02 + 1 -1 6 8 + SCALAIRE + -21 320281 1 0 0 0 -18 0 2 + + + 320269 + H + REAL*8 + 1 100 0 0 + -4.13500000000000E+00 -4.10500000000000E+00 -4.07500000000000E+00 + -4.04500000000000E+00 -4.01500000000000E+00 -3.98500000000000E+00 + -3.95500000000000E+00 -3.92500000000000E+00 -3.89500000000000E+00 + -3.86500000000000E+00 -3.83500000000000E+00 -3.80500000000000E+00 + -3.77500000000000E+00 -3.74500000000000E+00 -3.71500000000000E+00 + -3.68500000000000E+00 -3.65500000000000E+00 -3.62500000000000E+00 + -3.59500000000000E+00 -3.56500000000000E+00 -3.53500000000000E+00 + -3.50500000000000E+00 -3.47500000000000E+00 -3.44500000000000E+00 + -3.41500000000000E+00 -3.38500000000000E+00 -3.35500000000000E+00 + -3.32500000000000E+00 -3.29500000000000E+00 -3.26500000000000E+00 + -3.23500000000000E+00 -3.20500000000000E+00 -3.17500000000000E+00 + -3.14500000000000E+00 -3.11500000000000E+00 -3.08500000000000E+00 + -3.05500000000000E+00 -3.02500000000000E+00 -2.99500000000000E+00 + -2.96500000000000E+00 -2.93500000000000E+00 -2.90500000000000E+00 + -2.87500000000000E+00 -2.84500000000000E+00 -2.81500000000000E+00 + -2.78500000000000E+00 -2.75500000000000E+00 -2.72500000000000E+00 + -2.69500000000000E+00 -2.66500000000000E+00 -2.63500000000000E+00 + -2.60500000000000E+00 -2.57500000000000E+00 -2.54500000000000E+00 + -2.51500000000000E+00 -2.48500000000000E+00 -2.45500000000000E+00 + -2.42500000000000E+00 -2.39500000000000E+00 -2.36500000000000E+00 + -2.33500000000000E+00 -2.30500000000000E+00 -2.27500000000000E+00 + -2.24500000000000E+00 -2.21500000000000E+00 -2.18499999999999E+00 + -2.15500000000003E+00 -2.12499999999987E+00 -2.09500000000049E+00 + -2.06499999999818E+00 -2.03500000000650E+00 -2.00499999997787E+00 + -1.97500000006975E+00 -1.94499999981103E+00 -1.91500000032912E+00 + -1.88500000068871E+00 -1.85499998789205E+00 -1.82500009177635E+00 + -1.79499943295436E+00 -1.76500318344073E+00 -1.73498304877008E+00 + -1.70508638477966E+00 -1.67455847860536E+00 -1.64702131434164E+00 + -1.45307901460037E+00 -9.76343132097054E-01 -7.19332083383740E-01 + -5.78992719586475E-01 -4.85614485535019E-01 -4.15290953068750E-01 + -3.57951213410693E-01 -3.08605124448837E-01 -2.64495459459853E-01 + -2.23973592811258E-01 -1.85993035937130E-01 -1.49858247317575E-01 + -1.15090314129768E-01 -8.13505236277189E-02 -4.83944965428564E-02 + -1.60433356194304E-02 + 1 -1 6 8 + SCALAIRE + -21 320101 1 0 0 0 -19 0 2 + + + 320089 + H + REAL*8 + 1 100 0 0 + -4.13500000000000E+00 -4.10500000000000E+00 -4.07500000000000E+00 + -4.04500000000000E+00 -4.01500000000000E+00 -3.98500000000000E+00 + -3.95500000000000E+00 -3.92500000000000E+00 -3.89500000000000E+00 + -3.86500000000000E+00 -3.83500000000000E+00 -3.80500000000000E+00 + -3.77500000000000E+00 -3.74500000000000E+00 -3.71500000000000E+00 + -3.68500000000000E+00 -3.65500000000000E+00 -3.62500000000000E+00 + -3.59500000000000E+00 -3.56500000000000E+00 -3.53500000000000E+00 + -3.50500000000000E+00 -3.47500000000000E+00 -3.44500000000000E+00 + -3.41500000000000E+00 -3.38500000000000E+00 -3.35500000000000E+00 + -3.32500000000000E+00 -3.29500000000000E+00 -3.26500000000000E+00 + -3.23500000000000E+00 -3.20500000000000E+00 -3.17500000000000E+00 + -3.14500000000000E+00 -3.11500000000000E+00 -3.08500000000000E+00 + -3.05500000000000E+00 -3.02500000000000E+00 -2.99500000000000E+00 + -2.96500000000000E+00 -2.93500000000000E+00 -2.90500000000000E+00 + -2.87500000000000E+00 -2.84500000000000E+00 -2.81500000000000E+00 + -2.78500000000000E+00 -2.75500000000000E+00 -2.72500000000000E+00 + -2.69500000000000E+00 -2.66500000000000E+00 -2.63500000000000E+00 + -2.60500000000000E+00 -2.57500000000000E+00 -2.54500000000000E+00 + -2.51500000000000E+00 -2.48500000000000E+00 -2.45500000000000E+00 + -2.42500000000000E+00 -2.39500000000000E+00 -2.36500000000000E+00 + -2.33500000000000E+00 -2.30500000000000E+00 -2.27500000000000E+00 + -2.24500000000000E+00 -2.21500000000001E+00 -2.18499999999996E+00 + -2.15500000000019E+00 -2.12499999999915E+00 -2.09500000000376E+00 + -2.06499999998335E+00 -2.03500000007360E+00 -2.00499999967542E+00 + -1.97500000142846E+00 -1.94499999372593E+00 -1.91500002750383E+00 + -1.88499987965708E+00 -1.85500052558087E+00 -1.82499770865601E+00 + -1.79500996887489E+00 -1.76495666210619E+00 -1.73518720080803E+00 + -1.70417535842507E+00 -1.67835609441927E+00 -1.60565784801097E+00 + -1.17157562055629E+00 -8.21560351878633E-01 -6.47570221057817E-01 + -5.39323223872264E-01 -4.61224003093473E-01 -3.99308541774042E-01 + -3.47051973725967E-01 -3.00987993886565E-01 -2.59101831513096E-01 + -2.20141499462282E-01 -1.83288162162223E-01 -1.47984729132786E-01 + -1.13840566908414E-01 -8.05754656628490E-02 -4.79850420721677E-02 + -1.59184235380158E-02 + 1 -1 6 8 + SCALAIRE + -21 319939 1 0 0 0 -20 0 2 + + + 319927 + H + REAL*8 + 1 100 0 0 + -4.13500000000000E+00 -4.10500000000000E+00 -4.07500000000000E+00 + -4.04500000000000E+00 -4.01500000000000E+00 -3.98500000000000E+00 + -3.95500000000000E+00 -3.92500000000000E+00 -3.89500000000000E+00 + -3.86500000000000E+00 -3.83500000000000E+00 -3.80500000000000E+00 + -3.77500000000000E+00 -3.74500000000000E+00 -3.71500000000000E+00 + -3.68500000000000E+00 -3.65500000000000E+00 -3.62500000000000E+00 + -3.59500000000000E+00 -3.56500000000000E+00 -3.53500000000000E+00 + -3.50500000000000E+00 -3.47500000000000E+00 -3.44500000000000E+00 + -3.41500000000000E+00 -3.38500000000000E+00 -3.35500000000000E+00 + -3.32500000000000E+00 -3.29500000000000E+00 -3.26500000000000E+00 + -3.23500000000000E+00 -3.20500000000000E+00 -3.17500000000000E+00 + -3.14500000000000E+00 -3.11500000000000E+00 -3.08500000000000E+00 + -3.05500000000000E+00 -3.02500000000000E+00 -2.99500000000000E+00 + -2.96500000000000E+00 -2.93500000000000E+00 -2.90500000000000E+00 + -2.87500000000000E+00 -2.84500000000000E+00 -2.81500000000000E+00 + -2.78500000000000E+00 -2.75500000000000E+00 -2.72500000000000E+00 + -2.69500000000000E+00 -2.66500000000000E+00 -2.63500000000000E+00 + -2.60500000000000E+00 -2.57500000000000E+00 -2.54500000000000E+00 + -2.51500000000000E+00 -2.48500000000000E+00 -2.45500000000000E+00 + -2.42500000000000E+00 -2.39500000000000E+00 -2.36500000000000E+00 + -2.33500000000000E+00 -2.30500000000000E+00 -2.27500000000000E+00 + -2.24500000000001E+00 -2.21499999999998E+00 -2.18500000000010E+00 + -2.15499999999959E+00 -2.12500000000171E+00 -2.09499999999288E+00 + -2.06500000002950E+00 -2.03499999987831E+00 -2.00500000049984E+00 + -1.97499999795685E+00 -1.94500000830635E+00 -1.91499996643941E+00 + -1.88500013462757E+00 -1.85499946442300E+00 -1.82500210889192E+00 + -1.79499178635361E+00 -1.76503134459040E+00 -1.73487984887641E+00 + -1.70540159991715E+00 -1.67277221562769E+00 -1.40162620326480E+00 + -9.54547416771393E-01 -7.28488147764493E-01 -5.98671486405551E-01 + -5.09923046753073E-01 -4.42000039977959E-01 -3.86043009820908E-01 + -3.37565961890137E-01 -2.94050371875220E-01 -2.53969516234026E-01 + -2.16341488218916E-01 -1.80504722398332E-01 -1.45996856626893E-01 + -1.12485441373164E-01 -7.97263482747270E-02 -4.75377615235899E-02 + -1.57833121775161E-02 + 1 -1 6 8 + SCALAIRE + -21 319063 1 0 0 0 -21 0 2 + + + 319051 + H + REAL*8 + 1 100 0 0 + -4.13500000000000E+00 -4.10500000000000E+00 -4.07500000000000E+00 + -4.04500000000000E+00 -4.01500000000000E+00 -3.98500000000000E+00 + -3.95500000000000E+00 -3.92500000000000E+00 -3.89500000000000E+00 + -3.86500000000000E+00 -3.83500000000000E+00 -3.80500000000000E+00 + -3.77500000000000E+00 -3.74500000000000E+00 -3.71500000000000E+00 + -3.68500000000000E+00 -3.65500000000000E+00 -3.62500000000000E+00 + -3.59500000000000E+00 -3.56500000000000E+00 -3.53500000000000E+00 + -3.50500000000000E+00 -3.47500000000000E+00 -3.44500000000000E+00 + -3.41500000000000E+00 -3.38500000000000E+00 -3.35500000000000E+00 + -3.32500000000000E+00 -3.29500000000000E+00 -3.26500000000000E+00 + -3.23500000000000E+00 -3.20500000000000E+00 -3.17500000000000E+00 + -3.14500000000000E+00 -3.11500000000000E+00 -3.08500000000000E+00 + -3.05500000000000E+00 -3.02500000000000E+00 -2.99500000000000E+00 + -2.96500000000000E+00 -2.93500000000000E+00 -2.90500000000000E+00 + -2.87500000000000E+00 -2.84500000000000E+00 -2.81500000000000E+00 + -2.78500000000000E+00 -2.75500000000000E+00 -2.72500000000000E+00 + -2.69500000000000E+00 -2.66500000000000E+00 -2.63500000000000E+00 + -2.60500000000000E+00 -2.57500000000000E+00 -2.54500000000000E+00 + -2.51500000000000E+00 -2.48500000000000E+00 -2.45500000000000E+00 + -2.42500000000000E+00 -2.39500000000000E+00 -2.36500000000000E+00 + -2.33500000000000E+00 -2.30500000000000E+00 -2.27500000000000E+00 + -2.24500000000000E+00 -2.21499999999998E+00 -2.18500000000012E+00 + -2.15499999999944E+00 -2.12500000000263E+00 -2.09499999998770E+00 + -2.06500000005700E+00 -2.03499999973747E+00 -2.00500000120243E+00 + -1.97499999451969E+00 -1.94500002486672E+00 -1.91499988762354E+00 + -1.88500050595717E+00 -1.85499772973232E+00 -1.82501015222710E+00 + -1.79495469916735E+00 -1.76520080678885E+00 -1.73409664847054E+00 + -1.70879144835943E+00 -1.59788169976893E+00 -1.12953755674489E+00 + -8.22755578976403E-01 -6.64153880913141E-01 -5.62261914282898E-01 + -4.87285649346261E-01 -4.27127201175383E-01 -3.75955278447332E-01 + -3.30608243501925E-01 -2.89221144244088E-01 -2.50621965598243E-01 + -2.14037478711910E-01 -1.78938122892054E-01 -1.44950743646838E-01 + -1.11806745105845E-01 -7.93097828201385E-02 -4.73147601636392E-02 + -1.57136364979199E-02 + 1 -1 6 8 + SCALAIRE + -21 324955 1 0 0 0 -22 0 2 + + + 324967 + SCAL + REAL*8 + 1 100 0 0 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 + 1 -1 6 8 + SCALAIRE + -21 325309 1 0 0 0 -23 0 2 + + + 325381 + SCAL + REAL*8 + 1 100 0 0 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000002E+00 -1.14999999999990E+00 -1.15000000000046E+00 + -1.14999999999795E+00 -1.15000000000919E+00 -1.14999999995875E+00 + -1.15000000018511E+00 -1.14999999916916E+00 -1.15000000372952E+00 + -1.14999998325759E+00 -1.15000007516150E+00 -1.14999966257587E+00 + -1.15000151469562E+00 -1.14999319973773E+00 -1.15003050279579E+00 + -1.14986272161241E+00 -1.15060872024149E+00 -1.14708143964912E+00 + -9.30397404678052E-01 -4.74145954159549E-01 -2.16540006497621E-01 + -6.40437383301153E-02 + 1 -1 6 8 + SCALAIRE + -21 326617 1 0 0 0 -24 0 2 + + + 324799 + SCAL + REAL*8 + 1 100 0 0 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000001E+00 -1.14999999999998E+00 -1.15000000000011E+00 + -1.14999999999951E+00 -1.15000000000216E+00 -1.14999999999041E+00 + -1.15000000004245E+00 -1.14999999981198E+00 -1.15000000083258E+00 + -1.14999999631362E+00 -1.15000001632013E+00 -1.14999992775752E+00 + -1.15000031974302E+00 -1.14999858497049E+00 -1.15000626037860E+00 + -1.14997228758946E+00 -1.15012229123405E+00 -1.14945324999156E+00 + -1.15232398415236E+00 -1.13499905693040E+00 -8.04039023392856E-01 + -3.99006393092861E-01 -1.93247218769097E-01 -8.41397770009844E-02 + -2.25078673593807E-02 + 1 -1 6 8 + SCALAIRE + -21 324595 1 0 0 0 -25 0 2 + + + 324511 + SCAL + REAL*8 + 1 100 0 0 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000001E+00 + -1.14999999999997E+00 -1.15000000000015E+00 -1.14999999999937E+00 + -1.15000000000275E+00 -1.14999999998803E+00 -1.15000000005201E+00 + -1.14999999977409E+00 -1.15000000098080E+00 -1.14999999574411E+00 + -1.15000001845649E+00 -1.14999992000793E+00 -1.15000034647027E+00 + -1.14999850024683E+00 -1.15000648601938E+00 -1.14997194543986E+00 + -1.15012078743789E+00 -1.14947123268857E+00 -1.15216622941086E+00 + -1.13499410273643E+00 -7.95394822100051E-01 -4.00159666296827E-01 + -2.07168724171530E-01 -1.06111056228492E-01 -4.85976677678687E-02 + -1.35937362206647E-02 + 1 -1 6 8 + SCALAIRE + -21 324373 1 0 0 0 -26 0 2 + + + 324319 + SCAL + REAL*8 + 1 100 0 0 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000001E+00 -1.14999999999997E+00 + -1.15000000000012E+00 -1.14999999999949E+00 -1.15000000000217E+00 + -1.14999999999068E+00 -1.15000000003996E+00 -1.14999999982878E+00 + -1.15000000073316E+00 -1.14999999686222E+00 -1.15000001342196E+00 + -1.14999994261664E+00 -1.15000024520669E+00 -1.14999895267042E+00 + -1.15000447046912E+00 -1.14998091221237E+00 -1.15008121144364E+00 + -1.14964997086609E+00 -1.15143115235774E+00 -1.14194776513999E+00 + -8.45025125363738E-01 -4.30905323840183E-01 -2.32098547585758E-01 + -1.29350727394083E-01 -7.02671471170892E-02 -3.37455570371690E-02 + -9.72315044931582E-03 + 1 -1 6 8 + SCALAIRE + -21 324109 1 0 0 0 -27 0 2 + + + 324031 + SCAL + REAL*8 + 1 100 0 0 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.14999999999999E+00 -1.15000000000005E+00 + -1.14999999999978E+00 -1.15000000000092E+00 -1.14999999999615E+00 + -1.15000000001605E+00 -1.14999999993324E+00 -1.15000000027714E+00 + -1.14999999885212E+00 -1.15000000474282E+00 -1.14999998045600E+00 + -1.15000008029727E+00 -1.14999967117228E+00 -1.15000134148075E+00 + -1.14999454751231E+00 -1.15002201148601E+00 -1.14991087912687E+00 + -1.15034594794479E+00 -1.14843758225318E+00 -9.31257334949404E-01 + -4.86591577109316E-01 -2.64917049285670E-01 -1.53797648041618E-01 + -9.03551366564161E-02 -5.10892200821322E-02 -2.52459832108218E-02 + -7.39565082790055E-03 + 1 -1 6 8 + SCALAIRE + -21 323797 1 0 0 0 -28 0 2 + + + 323773 + SCAL + REAL*8 + 1 100 0 0 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.14999999999999E+00 -1.15000000000006E+00 + -1.14999999999971E+00 -1.15000000000136E+00 -1.14999999999357E+00 + -1.15000000003023E+00 -1.14999999985890E+00 -1.15000000065495E+00 + -1.14999999697457E+00 -1.15000001391583E+00 -1.14999993623505E+00 + -1.15000029118890E+00 -1.14999867429844E+00 -1.15000601799045E+00 + -1.14997273589662E+00 -1.15012292571263E+00 -1.14944078115727E+00 + -1.15242834219045E+00 -1.02763638756659E+00 -5.67940566609100E-01 + -3.06859648381398E-01 -1.81256800501063E-01 -1.10860445229599E-01 + -6.76129559558960E-02 -3.92694891499696E-02 -1.97690425436327E-02 + -5.85412290811059E-03 + 1 -1 6 8 + SCALAIRE + -21 323551 1 0 0 0 -29 0 2 + + + 323539 + SCAL + REAL*8 + 1 100 0 0 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000001E+00 + -1.14999999999995E+00 -1.15000000000020E+00 -1.14999999999911E+00 + -1.15000000000389E+00 -1.14999999998293E+00 -1.15000000007480E+00 + -1.14999999967238E+00 -1.15000000143404E+00 -1.14999999372727E+00 + -1.15000002741979E+00 -1.14999988021859E+00 -1.15000052291084E+00 + -1.14999771852574E+00 -1.15000994501613E+00 -1.14995662642460E+00 + -1.15018809456395E+00 -1.14916546120541E+00 -1.15340898382644E+00 + -1.10346040120499E+00 -6.80682918089455E-01 -3.60643458507160E-01 + -2.13184793116873E-01 -1.32961427219939E-01 -8.43959184707471E-02 + -5.28388160049688E-02 -3.12606772066239E-02 -1.59409962757219E-02 + -4.75644138365122E-03 + 1 -1 6 8 + SCALAIRE + -21 323371 1 0 0 0 -30 0 2 + + + 323359 + SCAL + REAL*8 + 1 100 0 0 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000001E+00 -1.14999999999996E+00 + -1.15000000000015E+00 -1.14999999999935E+00 -1.15000000000279E+00 + -1.14999999998811E+00 -1.15000000005060E+00 -1.14999999978494E+00 + -1.15000000091293E+00 -1.14999999612968E+00 -1.15000001638543E+00 + -1.14999993073060E+00 -1.15000029238419E+00 -1.14999876778899E+00 + -1.15000518273646E+00 -1.14997821846118E+00 -1.15009096148427E+00 + -1.14961371682233E+00 -1.15151945793081E+00 -1.14050522404072E+00 + -8.26415561949390E-01 -4.30617467062108E-01 -2.50817800828769E-01 + -1.57493664636066E-01 -1.02231526111713E-01 -6.67350432366463E-02 + -4.26312674227759E-02 -2.55926126688644E-02 -1.31888625377558E-02 + -3.96038604968927E-03 + 1 -1 6 8 + SCALAIRE + -21 323185 1 0 0 0 -31 0 2 + + + 323173 + SCAL + REAL*8 + 1 100 0 0 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.14999999999999E+00 -1.15000000000002E+00 + -1.14999999999991E+00 -1.15000000000034E+00 -1.14999999999878E+00 + -1.15000000000425E+00 -1.14999999998610E+00 -1.15000000004098E+00 + -1.14999999990457E+00 -1.15000000006362E+00 -1.15000000121241E+00 + -1.14999998842712E+00 -1.15000007693173E+00 -1.14999955319541E+00 + -1.15000241369967E+00 -1.14998749940464E+00 -1.15006229202357E+00 + -1.14968781009987E+00 -1.15140124164690E+00 -9.83285399046954E-01 + -5.30787359698162E-01 -2.97564260334102E-01 -1.84496520865302E-01 + -1.20342837430113E-01 -8.01552310619662E-02 -5.33063542195572E-02 + -3.45377273330808E-02 -2.09717936652750E-02 -1.09119860531204E-02 + -3.29866869138428E-03 + 1 -1 6 8 + SCALAIRE + -21 323023 1 0 0 0 -32 0 2 + + + 323011 + SCAL + REAL*8 + 1 100 0 0 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000001E+00 -1.14999999999996E+00 -1.15000000000019E+00 + -1.14999999999915E+00 -1.15000000000375E+00 -1.14999999998343E+00 + -1.15000000007314E+00 -1.14999999967763E+00 -1.15000000141909E+00 + -1.14999999376094E+00 -1.15000002739826E+00 -1.14999987981461E+00 + -1.15000052665675E+00 -1.14999769428415E+00 -1.15001008296745E+00 + -1.14995590195655E+00 -1.15019189020477E+00 -1.14914889879884E+00 + -1.15351191983636E+00 -1.09441898963168E+00 -6.66842080685448E-01 + -3.58863584011360E-01 -2.18139086315934E-01 -1.41808693317095E-01 + -9.53381029029966E-02 -6.48410172548005E-02 -4.37750928574093E-02 + -2.86788164188325E-02 -1.75593652683945E-02 -9.19290101181534E-03 + -2.78951890259027E-03 + 1 -1 6 8 + SCALAIRE + -21 322333 1 0 0 0 -33 0 2 + + + 322315 + SCAL + REAL*8 + 1 100 0 0 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000001E+00 + -1.14999999999997E+00 -1.15000000000014E+00 -1.14999999999939E+00 + -1.15000000000260E+00 -1.14999999998894E+00 -1.15000000004693E+00 + -1.14999999980106E+00 -1.15000000084225E+00 -1.14999999643920E+00 + -1.15000001503169E+00 -1.14999993664479E+00 -1.15000026657349E+00 + -1.14999888033726E+00 -1.15000469239171E+00 -1.14998035522495E+00 + -1.15008167585997E+00 -1.14965446764326E+00 -1.15134713449563E+00 + -1.14135524464944E+00 -8.38270772945895E-01 -4.40733803743065E-01 + -2.60114236348006E-01 -1.67306189906336E-01 -1.12656876351951E-01 + -7.75253923372858E-02 -5.35915529885089E-02 -3.66082409579170E-02 + -2.41927361441432E-02 -1.49091049467644E-02 -7.84294096039159E-03 + -2.38685968373603E-03 + 1 -1 6 8 + SCALAIRE + -21 322063 1 0 0 0 -34 0 2 + + + 322051 + SCAL + REAL*8 + 1 100 0 0 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000001E+00 -1.14999999999996E+00 -1.15000000000010E+00 + -1.14999999999980E+00 -1.14999999999978E+00 -1.15000000000559E+00 + -1.14999999995589E+00 -1.15000000027617E+00 -1.14999999843995E+00 + -1.15000000831078E+00 -1.14999995737749E+00 -1.15000021282329E+00 + -1.14999895816906E+00 -1.15000502071806E+00 -1.14997607675388E+00 + -1.15011240661199E+00 -1.14946815158854E+00 -1.15235921190085E+00 + -1.00688676739605E+00 -5.54048026462153E-01 -3.13308879412534E-01 + -1.97855922317559E-01 -1.32568689490143E-01 -9.16244319997735E-02 + -6.41815076668359E-02 -4.49298823577743E-02 -3.09758298027547E-02 + -2.06123089316590E-02 -1.27692139374180E-02 -6.74365940030929E-03 + -2.05729409418735E-03 + 1 -1 6 8 + SCALAIRE + -21 321805 1 0 0 0 -35 0 2 + + + 321793 + SCAL + REAL*8 + 1 100 0 0 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000001E+00 -1.14999999999996E+00 + -1.15000000000020E+00 -1.14999999999913E+00 -1.15000000000383E+00 + -1.14999999998318E+00 -1.15000000007378E+00 -1.14999999967679E+00 + -1.15000000141394E+00 -1.14999999382253E+00 -1.15000002695510E+00 + -1.14999988252698E+00 -1.15000051133873E+00 -1.14999777671329E+00 + -1.15000965323825E+00 -1.14995808942615E+00 -1.15018091197089E+00 + -1.14920280894521E+00 -1.15324697663436E+00 -1.11260787601159E+00 + -7.10437363068010E-01 -3.82909893086666E-01 -2.35321650130748E-01 + -1.55882626060270E-01 -1.07575415113305E-01 -7.58227570362588E-02 + -5.38433648454849E-02 -3.80662136598705E-02 -2.64362708372711E-02 + -1.76887851915472E-02 -1.10041424118691E-02 -5.82979435469586E-03 + -1.78194744088324E-03 + 1 -1 6 8 + SCALAIRE + -21 321655 1 0 0 0 -36 0 2 + + + 321643 + SCAL + REAL*8 + 1 100 0 0 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000001E+00 -1.14999999999998E+00 -1.15000000000010E+00 + -1.14999999999957E+00 -1.15000000000177E+00 -1.14999999999262E+00 + -1.15000000003061E+00 -1.14999999987343E+00 -1.15000000052155E+00 + -1.14999999785939E+00 -1.15000000874691E+00 -1.14999996443679E+00 + -1.15000014376692E+00 -1.14999942260984E+00 -1.15000230040975E+00 + -1.14999090918539E+00 -1.15003535574102E+00 -1.14986149739304E+00 + -1.15048413637776E+00 -1.14736356215296E+00 -8.99467334965939E-01 + -4.78144609758120E-01 -2.82442837703037E-01 -1.83709850686808E-01 + -1.25947669247034E-01 -8.88615160194366E-02 -6.35890561852581E-02 + -4.56478188751788E-02 -3.25312588159042E-02 -2.27293987772218E-02 + -1.52792695565113E-02 -9.53926579229748E-03 -5.06740412419820E-03 + -1.55149293783622E-03 + 1 -1 6 8 + SCALAIRE + -21 321325 1 0 0 0 -37 0 2 + + + 321307 + SCAL + REAL*8 + 1 100 0 0 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.14999999999998E+00 -1.15000000000010E+00 + -1.14999999999951E+00 -1.15000000000233E+00 -1.14999999998904E+00 + -1.15000000005111E+00 -1.14999999976330E+00 -1.15000000108945E+00 + -1.14999999501315E+00 -1.15000002271558E+00 -1.14999989698235E+00 + -1.15000046532613E+00 -1.14999790577032E+00 -1.15000939152630E+00 + -1.14995798442831E+00 -1.15018676578197E+00 -1.14915923729329E+00 + -1.15355271999449E+00 -1.05949212288334E+00 -6.13129474211469E-01 + -3.43323423488807E-01 -2.17561993419072E-01 -1.47394581843326E-01 + -1.03629896223960E-01 -7.43588669427536E-02 -5.38457707225434E-02 + -3.89895722976527E-02 -2.79676615199501E-02 -1.96389858011214E-02 + -1.32536610116376E-02 -8.30019831398295E-03 -4.41975400584346E-03 + -1.35524456315610E-03 + 1 -1 6 8 + SCALAIRE + -21 320395 1 0 0 0 -38 0 2 + + + 320383 + SCAL + REAL*8 + 1 100 0 0 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000001E+00 + -1.14999999999996E+00 -1.15000000000017E+00 -1.14999999999925E+00 + -1.15000000000325E+00 -1.14999999998600E+00 -1.15000000006021E+00 + -1.14999999974149E+00 -1.15000000110828E+00 -1.14999999525586E+00 + -1.15000002027688E+00 -1.14999991346874E+00 -1.15000036868679E+00 + -1.14999843153118E+00 -1.15000666007237E+00 -1.14997173675939E+00 + -1.15011918852121E+00 -1.14948762713892E+00 -1.15203246136924E+00 + -1.13489684822653E+00 -7.95685378722091E-01 -4.25293436586229E-01 + -2.59936848362107E-01 -1.72968908719407E-01 -1.20677384763109E-01 + -8.64832401557986E-02 -6.28799905703766E-02 -4.59685747877699E-02 + -3.35220775266305E-02 -2.41759217163720E-02 -1.70477107886816E-02 + -1.15427250669061E-02 -7.24725590324395E-03 -3.86658567110400E-03 + -1.18704247300186E-03 + 1 -1 6 8 + SCALAIRE + -21 320245 1 0 0 0 -39 0 2 + + + 320233 + SCAL + REAL*8 + 1 100 0 0 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.14999999999999E+00 + -1.15000000000003E+00 -1.14999999999987E+00 -1.15000000000049E+00 + -1.14999999999818E+00 -1.15000000000650E+00 -1.14999999997787E+00 + -1.15000000006975E+00 -1.14999999981103E+00 -1.15000000032912E+00 + -1.15000000068871E+00 -1.14999998789205E+00 -1.15000009177635E+00 + -1.14999943295436E+00 -1.15000318344073E+00 -1.14998304877008E+00 + -1.15008638477966E+00 -1.14955847860536E+00 -1.15202131434164E+00 + -9.88079014600367E-01 -5.41343132097054E-01 -3.14332083383740E-01 + -2.03992719586475E-01 -1.40614485535019E-01 -1.00290953068750E-01 + -7.29512134106926E-02 -5.36051244488369E-02 -3.94954594598532E-02 + -2.89735928112576E-02 -2.09930359371299E-02 -1.48582473175757E-02 + -1.00903141297685E-02 -6.35052362771876E-03 -3.39449654285649E-03 + -1.04333561943075E-03 + 1 -1 6 8 + SCALAIRE + -21 320065 1 0 0 0 -40 0 2 + + + 320053 + SCAL + REAL*8 + 1 100 0 0 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000001E+00 -1.14999999999996E+00 + -1.15000000000019E+00 -1.14999999999915E+00 -1.15000000000376E+00 + -1.14999999998335E+00 -1.15000000007360E+00 -1.14999999967542E+00 + -1.15000000142846E+00 -1.14999999372593E+00 -1.15000002750383E+00 + -1.14999987965708E+00 -1.15000052558087E+00 -1.14999770865601E+00 + -1.15000996887489E+00 -1.14995666210619E+00 -1.15018720080803E+00 + -1.14917535842507E+00 -1.15335609441927E+00 -1.11065784801097E+00 + -7.06575620556291E-01 -3.86560351878633E-01 -2.42570221057817E-01 + -1.64323223872264E-01 -1.16224003093473E-01 -8.43085417740423E-02 + -6.20519737259673E-02 -4.59879938865652E-02 -3.41018315130958E-02 + -2.51414994622821E-02 -1.82881621622230E-02 -1.29847291327866E-02 + -8.84056690841387E-03 -5.57546566284878E-03 -2.98504207216772E-03 + -9.18423538016081E-04 + 1 -1 6 8 + SCALAIRE + -21 319867 1 0 0 0 -41 0 2 + + + 319177 + SCAL + REAL*8 + 1 100 0 0 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000001E+00 -1.14999999999998E+00 -1.15000000000010E+00 + -1.14999999999959E+00 -1.15000000000171E+00 -1.14999999999288E+00 + -1.15000000002950E+00 -1.14999999987831E+00 -1.15000000049984E+00 + -1.14999999795685E+00 -1.15000000830635E+00 -1.14999996643941E+00 + -1.15000013462757E+00 -1.14999946442300E+00 -1.15000210889192E+00 + -1.14999178635361E+00 -1.15003134459040E+00 -1.14987984887642E+00 + -1.15040159991715E+00 -1.14777221562769E+00 -9.06626203264796E-01 + -4.89547416771393E-01 -2.93488147764493E-01 -1.93671486405551E-01 + -1.34923046753073E-01 -9.70000399779595E-02 -7.10430098209084E-02 + -5.25659618901367E-02 -3.90503718752204E-02 -2.89695162340258E-02 + -2.13414882189154E-02 -1.55047223983316E-02 -1.09968566268930E-02 + -7.48544137316366E-03 -4.72634827472679E-03 -2.53776152358996E-03 + -7.83312177516423E-04 + 1 -1 6 8 + SCALAIRE + -21 318895 1 0 0 0 -42 0 2 + + + 318805 + SCAL + REAL*8 + 1 100 0 0 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.15000000000000E+00 -1.15000000000000E+00 + -1.15000000000000E+00 -1.14999999999998E+00 -1.15000000000012E+00 + -1.14999999999944E+00 -1.15000000000263E+00 -1.14999999998770E+00 + -1.15000000005700E+00 -1.14999999973747E+00 -1.15000000120243E+00 + -1.14999999451969E+00 -1.15000002486672E+00 -1.14999988762354E+00 + -1.15000050595717E+00 -1.14999772973232E+00 -1.15001015222710E+00 + -1.14995469916735E+00 -1.15020080678885E+00 -1.14909664847054E+00 + -1.15379144835943E+00 -1.07288169976893E+00 -6.34537556744892E-01 + -3.57755578976403E-01 -2.29153880913141E-01 -1.57261914282897E-01 + -1.12285649346261E-01 -8.21272011753830E-02 -6.09552784473316E-02 + -4.56082435019248E-02 -3.42211442440880E-02 -2.56219655982434E-02 + -1.90374787119092E-02 -1.39381228920544E-02 -9.95074364683848E-03 + -6.80674510584511E-03 -4.30978282013827E-03 -2.31476016363927E-03 + -7.13636497920257E-04 + 1 -1 6 8 + SCALAIRE + -21 324991 1 0 0 0 -43 0 2 + + + 325003 + SCAL + REAL*8 + 1 100 0 0 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 + 1 -1 6 8 + SCALAIRE + -21 325603 1 0 0 0 -44 0 2 + + + 325723 + SCAL + REAL*8 + 1 100 0 0 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243884E-01 + 2.75076403243878E-01 2.75076403243906E-01 2.75076403243779E-01 + 2.75076403244348E-01 2.75076403241795E-01 2.75076403253250E-01 + 2.75076403201845E-01 2.75076403432567E-01 2.75076402396908E-01 + 2.75076407046083E-01 2.75076386174716E-01 2.75076479872885E-01 + 2.75076059257084E-01 2.75077947590852E-01 2.75069476226816E-01 + 2.75107582481038E-01 2.74938228399967E-01 2.75740716552630E-01 + 3.35088285191157E-01 5.78559124771428E-01 8.44554067695688E-01 + 9.83514651550140E-01 + 1 -1 6 8 + SCALAIRE + -21 324757 1 0 0 0 -45 0 2 + + + 324745 + SCAL + REAL*8 + 1 100 0 0 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243882E-01 2.75076403243888E-01 2.75076403243858E-01 + 2.75076403243994E-01 2.75076403243391E-01 2.75076403246060E-01 + 2.75076403234241E-01 2.75076403286582E-01 2.75076403054805E-01 + 2.75076404081059E-01 2.75076399537584E-01 2.75076419650144E-01 + 2.75076330630297E-01 2.75076724597280E-01 2.75074981519534E-01 + 2.75082696864921E-01 2.75048633561102E-01 2.75200622959918E-01 + 2.74549579549443E-01 2.78523327342428E-01 3.81798147501242E-01 + 6.45886388339689E-01 8.70752849056533E-01 9.71815912108816E-01 + 9.97984223966455E-01 + 1 -1 6 8 + SCALAIRE + -21 324481 1 0 0 0 -46 0 2 + + + 324469 + SCAL + REAL*8 + 1 100 0 0 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243881E-01 + 2.75076403243891E-01 2.75076403243850E-01 2.75076403244027E-01 + 2.75076403243258E-01 2.75076403246600E-01 2.75076403232072E-01 + 2.75076403295187E-01 2.75076403021142E-01 2.75076404210396E-01 + 2.75076399052417E-01 2.75076421410073E-01 2.75076324560545E-01 + 2.75076743838056E-01 2.75074930277047E-01 2.75082774570429E-01 + 2.75048975008449E-01 2.75196535671437E-01 2.74585280759558E-01 + 2.78524479152279E-01 3.85423995339201E-01 6.44776844558968E-01 + 8.55175906606314E-01 9.55953899835618E-01 9.90487419249991E-01 + 9.99274516744765E-01 + 1 -1 6 8 + SCALAIRE + -21 324295 1 0 0 0 -47 0 2 + + + 324277 + SCAL + REAL*8 + 1 100 0 0 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243881E-01 2.75076403243889E-01 + 2.75076403243856E-01 2.75076403243998E-01 2.75076403243389E-01 + 2.75076403246000E-01 2.75076403234807E-01 2.75076403282766E-01 + 2.75076403077382E-01 2.75076403956472E-01 2.75076400195756E-01 + 2.75076416275639E-01 2.75076347557482E-01 2.75076641092505E-01 + 2.75075388004380E-01 2.75080738142696E-01 2.75057961299655E-01 + 2.75155916478797E-01 2.74751750291351E-01 2.76916591719028E-01 + 3.65410829911533E-01 6.16074043280492E-01 8.26765266988173E-01 + 9.36182856971901E-01 9.80198909919764E-01 9.95430171969058E-01 + 9.99632404189964E-01 + 1 -1 6 8 + SCALAIRE + -21 323995 1 0 0 0 -48 0 2 + + + 323959 + SCAL + REAL*8 + 1 100 0 0 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243882E-01 2.75076403243886E-01 2.75076403243871E-01 + 2.75076403243933E-01 2.75076403243673E-01 2.75076403244757E-01 + 2.75076403240238E-01 2.75076403259044E-01 2.75076403180945E-01 + 2.75076403504566E-01 2.75076402166788E-01 2.75076407682324E-01 + 2.75076385008383E-01 2.75076477920641E-01 2.75076098594074E-01 + 2.75077641508478E-01 2.75071404523509E-01 2.75096643987876E-01 + 2.74997859649614E-01 2.75431660046904E-01 3.34806381021184E-01 + 5.68367466392874E-01 7.89076430871077E-01 9.12704213645399E-01 + 9.67636599287993E-01 9.89486842677331E-01 9.97457078703781E-01 + 9.99789041049580E-01 + 1 -1 6 8 + SCALAIRE + -21 323743 1 0 0 0 -49 0 2 + + + 323677 + SCAL + REAL*8 + 1 100 0 0 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243882E-01 2.75076403243886E-01 2.75076403243869E-01 + 2.75076403243948E-01 2.75076403243574E-01 2.75076403245344E-01 + 2.75076403237018E-01 2.75076403275927E-01 2.75076403095143E-01 + 2.75076403930959E-01 2.75076400083600E-01 2.75076417724897E-01 + 2.75076337114932E-01 2.75076704310868E-01 2.75075036565330E-01 + 2.75082595050061E-01 2.75048489498580E-01 2.75203457069334E-01 + 2.74525967266966E-01 3.05771180228018E-01 5.08006685133833E-01 + 7.41722364815973E-01 8.83905415084670E-01 9.52145467738794E-01 + 9.81647655265086E-01 9.93798177210084E-01 9.98449995669623E-01 + 9.99868739454027E-01 + 1 -1 6 8 + SCALAIRE + -21 323497 1 0 0 0 -50 0 2 + + + 323485 + SCAL + REAL*8 + 1 100 0 0 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243880E-01 + 2.75076403243893E-01 2.75076403243837E-01 2.75076403244084E-01 + 2.75076403242999E-01 2.75076403247758E-01 2.75076403226896E-01 + 2.75076403318286E-01 2.75076402918213E-01 2.75076404668418E-01 + 2.75076397016853E-01 2.75076430446229E-01 2.75076284490938E-01 + 2.75076921367351E-01 2.75074144749317E-01 2.75086253710453E-01 + 2.75033693241166E-01 2.75266050066841E-01 2.74304272012834E-01 + 2.86041854807574E-01 4.39999467546227E-01 6.84122227688821E-01 + 8.48367183610111E-01 9.32871929985208E-01 9.71648712251219E-01 + 9.88755311025829E-01 9.96083688701043E-01 9.98997913961015E-01 + 9.99913888234155E-01 + 1 -1 6 8 + SCALAIRE + -21 323323 1 0 0 0 -51 0 2 + + + 323299 + SCAL + REAL*8 + 1 100 0 0 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243881E-01 2.75076403243891E-01 + 2.75076403243848E-01 2.75076403244031E-01 2.75076403243249E-01 + 2.75076403246583E-01 2.75076403232392E-01 2.75076403292723E-01 + 2.75076403036556E-01 2.75076404122832E-01 2.75076399522752E-01 + 2.75076418974956E-01 2.75076336843481E-01 2.75076683079132E-01 + 2.75075226249762E-01 2.75081349912743E-01 2.75055747363164E-01 + 2.75164154487523E-01 2.74731742077390E-01 2.77248709718158E-01 + 3.72691065982872E-01 6.16334916531130E-01 8.05254012427773E-01 + 9.08958218909807E-01 9.58969219685787E-01 9.82115560135372E-01 + 9.92684804027684E-01 9.97385963671390E-01 9.99317672207359E-01 + 9.99940629277427E-01 + 1 -1 6 8 + SCALAIRE + -21 323149 1 0 0 0 -52 0 2 + + + 323137 + SCAL + REAL*8 + 1 100 0 0 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243884E-01 2.75076403243877E-01 + 2.75076403243904E-01 2.75076403243806E-01 2.75076403244161E-01 + 2.75076403242918E-01 2.75076403247040E-01 2.75076403234576E-01 + 2.75076403265555E-01 2.75076403229435E-01 2.75076402968544E-01 + 2.75076405872082E-01 2.75076385772696E-01 2.75076504713190E-01 + 2.75075855093989E-01 2.75079242155298E-01 2.75062257418054E-01 + 2.75147318763092E-01 2.74758528061837E-01 3.18528679762045E-01 + 5.34271958706114E-01 7.52074179273654E-01 8.80380047313657E-01 + 9.44175445405613E-01 9.74359982893834E-01 9.88555807346621E-01 + 9.95211289778203E-01 9.98253030755661E-01 9.99535458491857E-01 + 9.99959038784235E-01 + 1 -1 6 8 + SCALAIRE + -21 322951 1 0 0 0 -53 0 2 + + + 322939 + SCAL + REAL*8 + 1 100 0 0 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243881E-01 2.75076403243892E-01 2.75076403243839E-01 + 2.75076403244075E-01 2.75076403243032E-01 2.75076403247646E-01 + 2.75076403227273E-01 2.75076403317094E-01 2.75076402921608E-01 + 2.75076404660773E-01 2.75076397021741E-01 2.75076430537973E-01 + 2.75076283640243E-01 2.75076926872633E-01 2.75074113421077E-01 + 2.75086418248265E-01 2.75032831506396E-01 2.75269816325956E-01 + 2.74281020677927E-01 2.88268002535811E-01 4.47498099617187E-01 + 6.85957263065727E-01 8.42733266340498E-01 9.24518929653974E-01 + 9.64106210414430E-01 9.83105754143116E-01 9.92285401972344E-01 + 9.96709437690328E-01 9.98780931315179E-01 9.99671944858330E-01 + 9.99970856059199E-01 + 1 -1 6 8 + SCALAIRE + -21 322261 1 0 0 0 -54 0 2 + + + 322201 + SCAL + REAL*8 + 1 100 0 0 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243881E-01 + 2.75076403243891E-01 2.75076403243850E-01 2.75076403244022E-01 + 2.75076403243292E-01 2.75076403246393E-01 2.75076403233226E-01 + 2.75076403289062E-01 2.75076403052608E-01 2.75076404052540E-01 + 2.75076399830189E-01 2.75076417631844E-01 2.75076342705086E-01 + 2.75076657519386E-01 2.75075337606145E-01 2.75080864638288E-01 + 2.75057855844128E-01 2.75154894708238E-01 2.74770789549403E-01 + 2.77052917690813E-01 3.68023253039494E-01 6.07255829957364E-01 + 7.94579662623554E-01 8.98802294939202E-01 9.50672320596031E-01 + 9.75979733567630E-01 9.88433279849384E-01 9.94615186713931E-01 + 9.97667124480411E-01 9.99125064985235E-01 9.99762337260503E-01 + 9.99978763136121E-01 + 1 -1 6 8 + SCALAIRE + -21 322027 1 0 0 0 -55 0 2 + + + 322015 + SCAL + REAL*8 + 1 100 0 0 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243884E-01 + 2.75076403243880E-01 2.75076403243891E-01 2.75076403243859E-01 + 2.75076403243928E-01 2.75076403243933E-01 2.75076403242613E-01 + 2.75076403253900E-01 2.75076403181165E-01 2.75076403598169E-01 + 2.75076401356505E-01 2.75076412923451E-01 2.75076354911745E-01 + 2.75076639843763E-01 2.75075263043832E-01 2.75081836311531E-01 + 2.75050877947728E-01 2.75197235966756E-01 2.74541608412357E-01 + 3.11619295542107E-01 5.17582681532861E-01 7.34600300746943E-01 + 8.65627865400592E-01 9.33234910320546E-01 9.66752249413485E-01 + 9.83444330892054E-01 9.91871618014800E-01 9.96155393041772E-01 + 9.98313144143876E-01 9.99360989853670E-01 9.99825079299029E-01 + 9.99984293797073E-01 + 1 -1 6 8 + SCALAIRE + -21 321769 1 0 0 0 -56 0 2 + + + 321757 + SCAL + REAL*8 + 1 100 0 0 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243881E-01 2.75076403243893E-01 + 2.75076403243838E-01 2.75076403244080E-01 2.75076403243013E-01 + 2.75076403247703E-01 2.75076403227127E-01 2.75076403317284E-01 + 2.75076402922777E-01 2.75076404646786E-01 2.75076397122384E-01 + 2.75076429921994E-01 2.75076287118960E-01 2.75076908152918E-01 + 2.75074211011031E-01 2.75085921440915E-01 2.75035323938940E-01 + 2.75257557619757E-01 2.74340873960896E-01 2.83822219078321E-01 + 4.24593815142912E-01 6.61618294691164E-01 8.23065282704934E-01 + 9.10596678590429E-01 9.54793200102124E-01 9.77002838064811E-01 + 9.88324573827211E-01 9.94174651925386E-01 9.97208765652739E-01 + 9.98762652430626E-01 9.99527463675546E-01 9.99869844436761E-01 + 9.99988267953268E-01 + 1 -1 6 8 + SCALAIRE + -21 321619 1 0 0 0 -57 0 2 + + + 321589 + SCAL + REAL*8 + 1 100 0 0 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243881E-01 2.75076403243888E-01 2.75076403243860E-01 + 2.75076403243979E-01 2.75076403243480E-01 2.75076403245558E-01 + 2.75076403236932E-01 2.75076403272627E-01 2.75076403125439E-01 + 2.75076403730014E-01 2.75076401257460E-01 2.75076411320285E-01 + 2.75076370594436E-01 2.75076534369181E-01 2.75075880822022E-01 + 2.75078467781463E-01 2.75068374179981E-01 2.75107860560792E-01 + 2.74966497334450E-01 2.75676368750234E-01 3.45525648600928E-01 + 5.75255619914131E-01 7.69105886950918E-01 8.81238135868439E-01 + 9.39248300942959E-01 9.68663976127688E-01 9.83745732173656E-01 + 9.91609035405005E-01 9.95755801640328E-01 9.97943859954538E-01 + 9.99080455341518E-01 9.99646374660908E-01 9.99902074057537E-01 + 9.99991143603448E-01 + 1 -1 6 8 + SCALAIRE + -21 321277 1 0 0 0 -58 0 2 + + + 321031 + SCAL + REAL*8 + 1 100 0 0 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243882E-01 2.75076403243888E-01 2.75076403243860E-01 + 2.75076403243994E-01 2.75076403243354E-01 2.75076403246371E-01 + 2.75076403232276E-01 2.75076403297638E-01 2.75076402996470E-01 + 2.75076404376395E-01 2.75076398085178E-01 2.75076426639182E-01 + 2.75076297568409E-01 2.75076878843983E-01 2.75074270444905E-01 + 2.75085945287469E-01 2.75033994919394E-01 2.75267465360987E-01 + 2.74271805707605E-01 2.97181172385417E-01 4.78768164364373E-01 + 7.02197815355443E-01 8.43390621444724E-01 9.19081051771557E-01 + 9.57892452985096E-01 9.77866244245520E-01 9.88323532860446E-01 + 9.93886795585721E-01 9.96872236776175E-01 9.98470583008462E-01 + 9.99310855330837E-01 9.99733369648950E-01 9.99925812145758E-01 + 9.99993270098462E-01 + 1 -1 6 8 + SCALAIRE + -21 320359 1 0 0 0 -59 0 2 + + + 320347 + SCAL + REAL*8 + 1 100 0 0 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243881E-01 + 2.75076403243892E-01 2.75076403243843E-01 2.75076403244054E-01 + 2.75076403243145E-01 2.75076403247063E-01 2.75076403230209E-01 + 2.75076403302591E-01 2.75076402992193E-01 2.75076404321277E-01 + 2.75076398639007E-01 2.75076422895124E-01 2.75076319515179E-01 + 2.75076759443410E-01 2.75074890750035E-01 2.75082821963817E-01 + 2.75049338054446E-01 2.75192809475366E-01 2.74615560438652E-01 + 2.78547091851997E-01 3.85301119135236E-01 6.21186648249266E-01 + 7.94783100461535E-01 8.92814917870383E-01 9.43885719287350E-01 + 9.70269922021216E-01 9.84103028781021E-01 9.91490401464924E-01 + 9.95491000100106E-01 9.97670404002984E-01 9.98851851465030E-01 + 9.99479357861243E-01 9.99797544195274E-01 9.99943449308032E-01 + 9.99994857700813E-01 + 1 -1 6 8 + SCALAIRE + -21 320191 1 0 0 0 -60 0 2 + + + 320179 + SCAL + REAL*8 + 1 100 0 0 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243882E-01 2.75076403243885E-01 + 2.75076403243875E-01 2.75076403243913E-01 2.75076403243771E-01 + 2.75076403244297E-01 2.75076403242406E-01 2.75076403248910E-01 + 2.75076403228043E-01 2.75076403286797E-01 2.75076403169140E-01 + 2.75076403087476E-01 2.75076405993597E-01 2.75076382401485E-01 + 2.75076532019941E-01 2.75075680286642E-01 2.75080252917071E-01 + 2.75056786588840E-01 2.75176707165086E-01 2.74618083959426E-01 + 3.17102445319390E-01 5.26594655048742E-01 7.33475146296911E-01 + 8.58753498126137E-01 9.25665515370157E-01 9.60444341881162E-01 + 9.78682208281852E-01 9.88427433595326E-01 9.93726178404508E-01 + 9.96640745510548E-01 9.98249445428024E-01 9.99131106382427E-01 + 9.99603688428033E-01 9.99845157931926E-01 9.99956586712335E-01 + 9.99996042964252E-01 + 1 -1 6 8 + SCALAIRE + -21 320023 1 0 0 0 -61 0 2 + + + 320011 + SCAL + REAL*8 + 1 100 0 0 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243881E-01 2.75076403243893E-01 + 2.75076403243840E-01 2.75076403244075E-01 2.75076403243029E-01 + 2.75076403247665E-01 2.75076403227168E-01 2.75076403317595E-01 + 2.75076402919480E-01 2.75076404668724E-01 2.75076396997765E-01 + 2.75076430573749E-01 2.75076283884574E-01 2.75076923608774E-01 + 2.75074139331080E-01 2.75086245606620E-01 2.75033896153769E-01 + 2.75263799504664E-01 2.74316220194198E-01 2.84292674912493E-01 + 4.26540022790520E-01 6.58010510863171E-01 8.14735482565288E-01 + 9.01920389609861E-01 9.47695560123662E-01 9.71705797830911E-01 + 9.84515519404856E-01 9.91483193046957E-01 9.95332360678094E-01 + 9.97478321699428E-01 9.98676207458368E-01 9.99338923161316E-01 + 9.99696958512170E-01 9.99881112303148E-01 9.99966558773075E-01 + 9.99996945607005E-01 + 1 -1 6 8 + SCALAIRE + -21 319147 1 0 0 0 -62 0 2 + + + 319135 + SCAL + REAL*8 + 1 100 0 0 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243882E-01 2.75076403243888E-01 2.75076403243861E-01 + 2.75076403243976E-01 2.75076403243494E-01 2.75076403245501E-01 + 2.75076403237183E-01 2.75076403271519E-01 2.75076403130370E-01 + 2.75076403707882E-01 2.75076401357512E-01 2.75076410865489E-01 + 2.75076372669981E-01 2.75076524873409E-01 2.75075924315552E-01 + 2.75078268573976E-01 2.75069285064556E-01 2.75103692102007E-01 + 2.74985228442121E-01 2.75583211354218E-01 3.43057286145631E-01 + 5.65985865759580E-01 7.56643364380001E-01 8.70282521264471E-01 + 9.31048736801026E-01 9.62894182038538E-01 9.79765795602946E-01 + 9.88870958864737E-01 9.93867600695666E-01 9.96641700320888E-01 + 9.98190104312052E-01 9.99052735814466E-01 9.99528098252560E-01 + 9.99783809832887E-01 9.99914990677645E-01 9.99975948300227E-01 + 9.99997788900343E-01 + 1 -1 6 8 + SCALAIRE + -21 318721 1 0 0 0 -63 0 2 + + + 318673 + SCAL + REAL*8 + 1 100 0 0 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243883E-01 2.75076403243883E-01 2.75076403243883E-01 + 2.75076403243882E-01 2.75076403243888E-01 2.75076403243856E-01 + 2.75076403244010E-01 2.75076403243284E-01 2.75076403246676E-01 + 2.75076403230938E-01 2.75076403303503E-01 2.75076402970810E-01 + 2.75076404488461E-01 2.75076397596653E-01 2.75076428764566E-01 + 2.75076288341111E-01 2.75076918822328E-01 2.75074097692465E-01 + 2.75086691420561E-01 2.75030807169828E-01 2.75281698585845E-01 + 2.74217899115999E-01 2.93703945394787E-01 4.65875386319161E-01 + 6.87102250960072E-01 8.30142339263955E-01 9.09194441577445E-01 + 9.50978184442015E-01 9.73114334153185E-01 9.85053957900761E-01 + 9.91623616241485E-01 9.95299374491461E-01 9.97379896381979E-01 + 9.98563993772111E-01 9.99236754546396E-01 9.99614733108286E-01 + 9.99821741720774E-01 9.99929511687589E-01 9.99980045333358E-01 + 9.99998169949833E-01 + 1 -1 6 8 + SCALAIRE + -22 325111 1 0 0 0 -64 0 2 + + + 325147 + FLUX + REAL*8 + 1 301 0 0 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 + 1 -1 6 8 + SCALAIRE + -22 326071 1 0 0 0 -65 0 2 + + + 326209 + FLUX + REAL*8 + 1 301 0 0 + 1.07234596012123E-25 -3.67241024039310E-09 1.06830699228650E-25 + 3.67241024039376E-09 -3.08981039356966E-25 -3.67241024039319E-09 + -4.90330695136414E-25 1.95687991592745E-25 -3.67241024039276E-09 + 2.25576353569759E-25 7.83559759937927E-26 -3.67241024039276E-09 + 1.31064506237040E-25 -5.14968398928277E-26 -3.67241024039320E-09 + -3.27964188180204E-25 -7.29033694169050E-26 -3.67241024039320E-09 + -1.47422325967703E-26 1.08850183146016E-25 -3.67241024039287E-09 + 6.66429692730711E-27 -7.89618211690024E-26 -3.67241024039332E-09 + -3.05547916697444E-25 2.50214057361621E-25 -3.67241024039331E-09 + -3.42504472385238E-25 2.14671140415984E-25 -3.67241024039266E-09 + 3.72594782753988E-25 3.64920743867998E-25 -3.67241024039329E-09 + 6.11095833394888E-25 1.42575564566025E-25 -3.67241024039342E-09 + -1.42575564566025E-25 -4.48325429655205E-26 -3.67241024039285E-09 + -5.35163238101934E-26 -2.73640070803065E-25 -3.67241024039277E-09 + 1.79936017037292E-25 -2.01140598169633E-25 -3.67241024039332E-09 + -1.93668507675379E-25 1.50047655060278E-25 -3.67241024039335E-09 + -6.28059498300761E-26 3.95818847803695E-26 -3.67241024039290E-09 + -2.28403631054071E-25 6.70468660565442E-26 -3.67241024039288E-09 + -3.60679827641530E-25 -3.23723271953736E-25 -3.67241024039336E-09 + -4.49335171613888E-25 1.58327539121478E-25 -3.67241024039338E-09 + 6.03825691292371E-26 -2.30827011754910E-25 -3.67241024039330E-09 + -7.60537643279957E-25 2.62532909257553E-27 -3.67241024039267E-09 + -2.62532909257553E-27 -6.32098466135492E-26 -3.67241024039364E-09 + -2.30625063363173E-25 2.96864135852771E-26 -3.67241024039305E-09 + -2.96864135852771E-26 1.13494996155957E-25 -3.67241024039328E-09 + -1.13494996155957E-25 -2.98277774594927E-25 -3.67241024039359E-09 + 1.79734068645555E-25 1.83167191305077E-25 -3.67241024039301E-09 + 5.23854128164686E-25 -1.88417849490228E-25 -3.67241024039304E-09 + 2.38904947424373E-25 1.34497628896562E-25 -3.67241024039350E-09 + 1.58933384296688E-25 7.95676663442121E-26 -3.67241024039301E-09 + 2.13661398457301E-25 -7.47209049425342E-26 -3.67241024039329E-09 + 7.47209049425342E-26 1.39344390298240E-26 -3.67241024039291E-09 + -3.45533698261287E-25 -2.63138754432762E-25 -3.67241024039352E-09 + -1.59943126255371E-25 -5.13554760186120E-25 -3.67241024039318E-09 + -4.98004734022404E-25 5.04870979341448E-26 -3.67241024039333E-09 + 1.10465770279909E-25 6.60371240978613E-26 -3.67241024039257E-09 + 2.01948391736579E-25 9.89547119509237E-26 -3.67241024039312E-09 + -7.67403888599000E-26 -2.06189307963047E-25 -3.67241024039342E-09 + -2.43751708826051E-25 -2.71216690102226E-25 -3.67241024039295E-09 + -1.77108739552980E-25 6.82585564069637E-26 -3.67241024039308E-09 + -6.82585564069637E-26 6.84605047987003E-26 -3.67241024039339E-09 + 7.35092145921148E-26 -5.55358077275592E-26 -3.67241024039344E-09 + -9.47137957244556E-26 1.11273563846855E-25 -3.67241024039318E-09 + 1.82359397738131E-25 -1.22582673784103E-25 -3.67241024039329E-09 + -1.70848339409146E-25 -1.31266454628776E-27 -3.67241024039349E-09 + 3.83701944299500E-27 6.01806207375005E-26 -3.67241024039345E-09 + -6.01806207375005E-26 8.69387826425973E-26 -3.67241024039303E-09 + 5.54348335316909E-26 -1.60548971430580E-26 -3.67241024039354E-09 + 1.56913900379322E-25 1.30458661061830E-25 -3.67241024039286E-09 + -1.45200893658600E-25 -2.70610844927016E-26 -3.67241024039375E-09 + 2.69601102968333E-26 3.17260923418166E-25 -3.67241024039307E-09 + 4.27221822718733E-25 2.02352288520052E-25 -3.67241024039317E-09 + 4.08945493266573E-25 9.61274344666116E-26 -3.67241024039324E-09 + -9.61274344666116E-26 2.44357554001261E-26 -3.67241024039336E-09 + 1.07133621816255E-25 1.43484332328839E-25 -3.67241024039331E-09 + 1.99928907819213E-26 -7.38121371797196E-26 -3.67241024039303E-09 + -5.46270399647446E-26 1.37223932185005E-25 -3.67241024039319E-09 + 1.56510003595849E-25 -4.01877299555792E-26 -3.67241024039309E-09 + 1.65698655419863E-25 2.65562135133601E-26 -3.67241024039328E-09 + -2.64552393174919E-26 2.32240650497066E-26 -3.67241024039348E-09 + -2.32240650497066E-26 3.23117426778526E-26 -3.67241024039283E-09 + 8.83524213847533E-26 -6.40176401804956E-26 -3.67241024039304E-09 + 6.41186143763638E-26 -2.63542651216236E-26 -3.67241024039296E-09 + 1.43686280720576E-25 -9.22904150236166E-26 -3.67241024039328E-09 + 3.85721428216866E-25 5.46270399647446E-26 -3.67241024039307E-09 + 5.98776981498957E-26 8.96650859310411E-26 -3.67241024039318E-09 + 3.16857026634692E-25 -1.10263821888172E-25 -3.67241024039353E-09 + -3.65425614847340E-25 -6.45225111598370E-26 -3.67241024039358E-09 + -4.53374139448620E-26 2.78688780596479E-26 -3.67241024039309E-09 + 2.65663109329470E-25 7.81540276020561E-26 -3.67241024039303E-09 + 2.85756974307259E-26 1.04003421744338E-26 -3.67241024039319E-09 + -9.34011311781678E-26 2.15377959787062E-25 -3.67241024039314E-09 + 7.81540276020561E-26 4.73568978622278E-26 -3.67241024039311E-09 + -4.73568978622278E-26 -1.20462215670869E-25 -3.67241024039352E-09 + -2.63542651216236E-26 1.48432067926386E-25 -3.67241024039259E-09 + 9.74400990128994E-26 -7.16916790664856E-27 -3.67241024039531E-09 + -2.37087411898744E-25 1.14403763918772E-25 -3.67241024038472E-09 + 2.75053709545221E-25 -8.27988406119974E-27 -3.67241024043177E-09 + -4.41257235944425E-26 -2.86766716265942E-26 -3.67241024022065E-09 + -2.53445231629407E-26 -5.11939173052228E-26 -3.67241024116607E-09 + -9.55215892914019E-26 -9.59254860748750E-27 -3.67241023692872E-09 + -8.01735115194219E-26 -1.67617165141361E-26 -3.67241025593145E-09 + 7.54277243136123E-26 1.11071615455118E-27 -3.67241017068603E-09 + 2.32139676301198E-25 -2.47386779877309E-26 -3.67241055317633E-09 + 8.64339116632558E-26 -1.57519745554532E-26 -3.67240883665447E-09 + 9.91566603426603E-26 -7.77501308185829E-27 -3.67241654107518E-09 + -7.41150597673245E-26 -2.07300024117598E-25 -3.67238195705987E-09 + -2.33149418259880E-25 -1.17533963990689E-25 -3.67253721004644E-09 + -1.86903236552204E-25 -2.06997101529993E-26 -3.67184023473504E-09 + -4.87705366043838E-26 9.00689827145142E-26 -3.67496918095292E-09 + 1.27732357773386E-25 7.77501308185829E-26 -3.66092335343000E-09 + 1.41666796803210E-25 -6.46234853557053E-27 -3.72398243270705E-09 + 6.46234853557053E-27 6.00796465416323E-27 -3.44112923141631E-09 + 6.95207338553173E-26 -7.83559759937927E-26 -4.71430921074279E-09 + -6.07359788147761E-26 -1.25712873856020E-26 9.27421964195406E-10 + -6.32098466135492E-26 -8.11832534781048E-26 -2.62092929521969E-08 + -2.16185753354008E-25 -5.94536065272489E-25 -2.48955785161512E-06 + -4.51556603922991E-25 5.64809262008864E-24 -1.48867407977123E-05 + -5.64809262008864E-24 -8.24207932226665E-23 -3.81233169248468E-05 + -8.74614250804115E-23 -1.17924936077091E-22 -6.70527946976353E-05 + -1.06060064165784E-22 + 1 -1 6 8 + SCALAIRE + -22 324721 1 0 0 0 -66 0 2 + + + 324673 + FLUX + REAL*8 + 1 301 0 0 + 8.90592407558313E-26 -3.67241024039288E-09 -8.88572923640948E-26 + 3.67241024039353E-09 -7.06819371078027E-27 -3.67241024039253E-09 + 2.19517901817661E-25 -2.01948391736579E-28 -3.67241024039320E-09 + -3.76633750588720E-25 -3.97838331721061E-26 -3.67241024039298E-09 + -1.69232752275253E-25 4.03896783473158E-26 -3.67241024039233E-09 + 1.67011319966151E-25 2.10228275797779E-25 -3.67241024039354E-09 + 1.70848339409146E-25 -8.68378084467290E-26 -3.67241024039333E-09 + -5.89285407087338E-25 -3.75825957021774E-25 -3.67241024039342E-09 + -4.13994203059987E-25 2.47386779877309E-25 -3.67241024039320E-09 + -4.60442333159400E-26 -1.74685358852141E-25 -3.67241024039333E-09 + -2.12449708106881E-25 6.86624531904369E-26 -3.67241024039320E-09 + 2.17296469508559E-25 1.42777512957761E-25 -3.67241024039375E-09 + 5.41221689854032E-26 -4.44286461820474E-26 -3.67241024039307E-09 + -1.50855448627225E-25 -7.99715631276853E-26 -3.67241024039344E-09 + 7.99715631276853E-26 -2.97268032636244E-25 -3.67241024039290E-09 + 3.63507105125842E-27 1.57923642338005E-25 -3.67241024039320E-09 + 1.35507370855245E-25 3.93799363886329E-26 -3.67241024039333E-09 + 6.52293305309150E-26 1.60750919822317E-25 -3.67241024039306E-09 + -1.60750919822317E-25 -1.47624274359439E-25 -3.67241024039303E-09 + 3.97838331721061E-26 1.40959977432132E-25 -3.67241024039348E-09 + -1.40959977432132E-25 -1.13696944547694E-25 -3.67241024039361E-09 + -6.90663499739100E-26 9.89547119509237E-27 -3.67241024039296E-09 + -1.91245126974540E-25 -6.30078982218127E-26 -3.67241024039386E-09 + -2.30221166579700E-25 -1.57115848771058E-25 -3.67241024039359E-09 + -2.08006843488676E-26 -1.51259345410698E-25 -3.67241024039328E-09 + -3.18674562160322E-25 8.27988406119974E-26 -3.67241024039290E-09 + -2.01342546561369E-25 -2.94844651935405E-25 -3.67241024039308E-09 + -1.72261978151302E-25 -3.10192729707385E-25 -3.67241024039331E-09 + -2.26788043920178E-25 -3.03932329563551E-25 -3.67241024039308E-09 + -4.53374139448620E-25 -3.15039491109063E-26 -3.67241024039391E-09 + 2.00332804602686E-25 1.06628750836914E-25 -3.67241024039308E-09 + -6.58351757061248E-26 -6.86624531904369E-26 -3.67241024039323E-09 + 3.24329117128946E-25 -6.72488144482808E-26 -3.67241024039318E-09 + -6.22001046548663E-26 5.69494464697153E-26 -3.67241024039301E-09 + 2.68187464226177E-25 -1.45200893658600E-25 -3.67241024039377E-09 + -2.80910212905581E-25 9.14826214566703E-26 -3.67241024039300E-09 + 3.61487621208476E-25 -7.77501308185829E-26 -3.67241024039317E-09 + 7.77501308185829E-26 -2.06189307963047E-25 -3.67241024039310E-09 + -2.43751708826051E-25 -3.89760396051598E-26 -3.67241024039290E-09 + 5.51319109440861E-26 -1.27429435185781E-25 -3.67241024039354E-09 + -1.27227486794045E-26 2.46377037918626E-26 -3.67241024039328E-09 + -1.66203526399205E-25 1.70040545842200E-25 -3.67241024039333E-09 + 1.23794364134523E-25 -1.08042389579070E-25 -3.67241024039339E-09 + -3.69565556877940E-26 4.84676140167790E-26 -3.67241024039361E-09 + -3.42100575601765E-25 -7.65384404681634E-26 -3.67241024039317E-09 + -6.88644015821734E-26 -2.13055553282091E-25 -3.67241024039331E-09 + -8.04764341070267E-26 2.11439966148198E-25 -3.67241024039343E-09 + 2.33250392455749E-25 6.62390724895979E-26 -3.67241024039318E-09 + 2.27393889095388E-25 -1.34901525680035E-25 -3.67241024039311E-09 + 1.34901525680035E-25 8.18900728491828E-26 -3.67241024039357E-09 + 1.93668507675379E-25 3.23117426778526E-26 -3.67241024039314E-09 + -5.34153496143252E-26 -5.43241173771398E-26 -3.67241024039307E-09 + 5.44250915730080E-26 1.62669429543814E-25 -3.67241024039284E-09 + 1.30761583649435E-25 -4.12984461101304E-26 -3.67241024039350E-09 + -9.02709311062508E-26 2.08612688663886E-25 -3.67241024039307E-09 + -4.51354655531254E-26 2.39308844207846E-26 -3.67241024039306E-09 + 1.40959977432132E-25 -9.28962601988264E-26 -3.67241024039349E-09 + 9.28962601988264E-26 -5.14968398928277E-27 -3.67241024039352E-09 + 1.30458661061830E-25 -9.73391248170311E-26 -3.67241024039339E-09 + 2.67177722267494E-25 2.32240650497066E-26 -3.67241024039338E-09 + 9.90556861467920E-26 -1.02892705589787E-25 -3.67241024039340E-09 + 1.02993679785655E-25 -1.61962610172736E-25 -3.67241024039337E-09 + -3.06052787676786E-25 1.10768692867514E-25 -3.67241024039322E-09 + 6.52293305309150E-26 -9.20884666318800E-26 -3.67241024039350E-09 + -8.54241697045729E-26 -1.41060951628000E-25 -3.67241024039317E-09 + -3.80672718423451E-26 -2.34260134414432E-26 -3.67241024039306E-09 + 2.03866901458077E-25 4.33179300274962E-26 -3.67241024039341E-09 + -4.32169558316279E-26 -6.45225111598370E-26 -3.67241024039337E-09 + -4.53374139448620E-26 8.19910470450511E-26 -3.67241024039320E-09 + -8.20920212409194E-26 7.81540276020561E-26 -3.67241024039314E-09 + 2.85756974307259E-26 -4.22072138729450E-26 -3.67241024039330E-09 + -4.39641648810533E-25 2.15377959787062E-25 -3.67241024039292E-09 + 7.81540276020561E-26 -5.04870979341448E-26 -3.67241024039388E-09 + -5.15978140886959E-26 1.75897049202560E-25 -3.67241024039071E-09 + 3.18876510552058E-25 -4.73568978622278E-26 -3.67241024040324E-09 + -2.93935884172591E-25 9.04728794979874E-26 -3.67241024034861E-09 + 3.00499206904030E-25 -8.03754599111585E-26 -3.67241024059032E-09 + -1.62265532760341E-25 -3.02922587604869E-27 -3.67241023952035E-09 + 5.54348335316909E-26 -1.21471957629552E-25 -3.67241024426136E-09 + 1.21370983433684E-25 1.47826222751176E-25 -3.67241022324977E-09 + 5.45260657688763E-26 -5.45260657688763E-27 -3.67241031637190E-09 + -8.42124793541535E-26 3.69565556877940E-26 -3.67240990368664E-09 + -6.65419950772028E-26 -3.08981039356966E-26 -3.67241173242214E-09 + 9.10787246731971E-26 6.68449176648077E-26 -3.67240362942430E-09 + -6.67439434689394E-26 1.80036991233160E-25 -3.67243952988475E-09 + 1.13494996155957E-25 9.79449699922408E-26 -3.67228048833603E-09 + 4.87705366043838E-26 -1.09355054125358E-25 -3.67298497952106E-09 + 4.30150074398913E-26 -4.81646914291741E-26 -3.66986473778849E-09 + 4.82656656250424E-26 -8.99680085186460E-26 -3.68368333162175E-09 + -2.03563978870472E-25 -1.43383358132971E-25 -3.62250163492353E-09 + -2.25879276157364E-25 1.02791731393919E-25 -3.89352501416930E-09 + 1.92456817324960E-25 -4.20557525791426E-26 -2.69653362574500E-09 + -1.04205370136075E-25 1.51158371214829E-25 -8.05177318462775E-09 + 6.93692725615149E-26 1.16978605913413E-25 1.47323925086573E-08 + 8.82009600909509E-26 -4.58422849242034E-26 -1.31703887083274E-07 + 1.71858081367829E-25 3.72877510502420E-24 -4.47711692554017E-06 + 4.30230853755608E-24 7.67727006025779E-24 -1.71768467880227E-05 + 1.62851183096377E-23 -1.30280946477102E-23 -2.91071220692787E-05 + -1.52511425439464E-24 -9.88739325942291E-24 -3.43072691406396E-05 + 9.90031795649405E-24 8.91157863055176E-24 -3.48986932858369E-05 + 8.42690249038397E-24 + 1 -1 6 8 + SCALAIRE + -22 324445 1 0 0 0 -67 0 2 + + + 324433 + FLUX + REAL*8 + 1 301 0 0 + 4.03896783473158E-28 -3.67241024039266E-09 -2.01948391736579E-28 + 3.67241024039396E-09 -7.06819371078027E-27 -3.67241024039318E-09 + 2.19517901817661E-25 3.91375983185490E-25 -3.67241024039363E-09 + 2.98883619770137E-26 2.74043967586538E-25 -3.67241024039320E-09 + 3.13423903975171E-25 1.32276196587459E-25 -3.67241024039321E-09 + -3.39879143292662E-25 2.20527643776344E-25 -3.67241024039299E-09 + 7.31053178086416E-26 9.99644539096066E-26 -3.67241024039332E-09 + -1.89225643057175E-25 -7.51248017260074E-26 -3.67241024039353E-09 + -1.55500261637166E-26 3.50986304838174E-25 -3.67241024039341E-09 + -1.49643758276805E-25 -3.76633750588720E-25 -3.67241024039375E-09 + -6.10086091436205E-25 1.69232752275253E-25 -3.67241024039374E-09 + 1.24602157701469E-25 -5.25065818515105E-26 -3.67241024039331E-09 + -1.41161925823869E-25 5.31124270267203E-26 -3.67241024039318E-09 + -5.31124270267203E-26 -1.77916533119926E-25 -3.67241024039374E-09 + -3.09182987748702E-25 1.84580830047233E-25 -3.67241024039299E-09 + 1.99525011035740E-25 -1.40758029040396E-25 -3.67241024039320E-09 + -1.52672984152854E-25 2.35067927981378E-25 -3.67241024039331E-09 + 1.62972352131419E-25 1.60750919822317E-25 -3.67241024039360E-09 + -1.60750919822317E-25 -4.48325429655205E-26 -3.67241024039337E-09 + -2.48800418619465E-25 -3.73604524712671E-26 -3.67241024039337E-09 + -3.73604524712671E-26 -2.86766716265942E-26 -3.67241024039351E-09 + -2.64754341566655E-25 1.22380725392367E-25 -3.67241024039318E-09 + -1.22380725392367E-25 1.40556080648659E-25 -3.67241024039309E-09 + 3.89760396051598E-26 2.08006843488676E-26 -3.67241024039337E-09 + 2.72630328844382E-25 1.55500261637166E-26 -3.67241024039361E-09 + -1.57519745554532E-26 2.01342546561369E-25 -3.67241024039340E-09 + 9.20884666318800E-26 -3.47351233786916E-26 -3.67241024039318E-09 + 8.80494987971485E-26 9.30982085905629E-26 -3.67241024039379E-09 + -4.28130590481548E-26 6.19981562631298E-26 -3.67241024039318E-09 + 2.31432856930120E-25 5.27085302432471E-26 -3.67241024039297E-09 + -1.77714584728190E-25 -6.07864659127103E-26 -3.67241024039335E-09 + -2.33250392455749E-25 1.11879409022065E-25 -3.67241024039297E-09 + 1.43787254916444E-25 -8.30007890037340E-26 -3.67241024039325E-09 + -4.69328062395810E-25 -1.05820957269967E-25 -3.67241024039351E-09 + 2.68389412617914E-25 2.46175089526890E-25 -3.67241024039333E-09 + -1.13696944547694E-25 2.25576353569759E-25 -3.67241024039290E-09 + 6.80566080152271E-26 8.01735115194219E-26 -3.67241024039355E-09 + -5.79591884283982E-26 -1.27833331969255E-25 -3.67241024039304E-09 + 1.27833331969255E-25 -1.36719061205664E-25 -3.67241024039327E-09 + -1.40758029040396E-25 -5.06890463258813E-26 -3.67241024039312E-09 + 3.57448653373745E-25 1.66203526399205E-25 -3.67241024039318E-09 + 2.69197206184860E-25 -1.23592415742786E-25 -3.67241024039355E-09 + -1.97909423901847E-26 -1.08042389579070E-25 -3.67241024039300E-09 + 1.08042389579070E-25 2.36279618331797E-26 -3.67241024039322E-09 + -2.44357554001261E-26 -2.64552393174919E-26 -3.67241024039334E-09 + 3.22410607407448E-25 6.00796465416323E-26 -3.67241024039345E-09 + -2.04169824045681E-25 -1.09052131537753E-26 -3.67241024039340E-09 + 1.10061873496436E-26 -1.29448919103147E-25 -3.67241024039350E-09 + -1.14100841331167E-26 -2.04573720829155E-25 -3.67241024039329E-09 + -8.89582665599631E-26 5.28095044391154E-26 -3.67241024039303E-09 + 2.22749076085447E-25 -1.72060029759565E-25 -3.67241024039339E-09 + -1.21471957629552E-25 -1.15413505877455E-25 -3.67241024039314E-09 + -1.78118481511663E-25 2.32240650497066E-27 -3.67241024039357E-09 + -2.96864135852771E-26 8.85543697764899E-26 -3.67241024039315E-09 + 7.35092145921148E-26 1.10768692867514E-25 -3.67241024039331E-09 + 1.82763294521604E-25 -1.71656132976092E-25 -3.67241024039292E-09 + -2.50416005753358E-25 6.83595306028320E-26 -3.67241024039372E-09 + 5.86660077994762E-26 2.24162714827603E-26 -3.67241024039316E-09 + -2.24162714827603E-26 -7.14897306747490E-26 -3.67241024039341E-09 + -9.82478925798457E-26 2.31331882734251E-25 -3.67241024039326E-09 + 2.33654289239222E-25 -1.02892705589787E-25 -3.67241024039318E-09 + 1.02993679785655E-25 1.25208002876679E-26 -3.67241024039314E-09 + -1.31771325608118E-25 9.13816472608020E-26 -3.67241024039318E-09 + 2.62532909257553E-26 -1.68424958708307E-25 -3.67241024039326E-09 + -6.37147175928907E-26 3.79662976464769E-26 -3.67241024039306E-09 + 1.41161925823869E-25 -1.21169035041947E-25 -3.67241024039328E-09 + 1.21169035041947E-25 -1.65900603811600E-25 -3.67241024039341E-09 + -2.39005921620241E-25 3.33214846365355E-26 -3.67241024039337E-09 + -1.43080435545366E-25 -1.24198260917996E-25 -3.67241024039298E-09 + 1.58529487513215E-26 1.59539229471897E-26 -3.67241024039336E-09 + -1.22683647979972E-25 1.08244337970806E-25 -3.67241024039254E-09 + -1.91346101170409E-25 -1.75998023398429E-25 -3.67241024039370E-09 + -1.17533963990689E-25 -1.61558713389263E-27 -3.67241024038972E-09 + 1.93062662500170E-25 -1.69333726471122E-25 -3.67241024040869E-09 + -7.79520792103195E-26 1.00974195868290E-27 -3.67241024032582E-09 + -1.00974195868290E-27 9.00689827145142E-26 -3.67241024068759E-09 + 7.27014210251684E-27 6.54312789226516E-26 -3.67241023910895E-09 + -1.16322273640270E-25 -1.06224854053441E-25 -3.67241024599752E-09 + 5.36172980060617E-26 -2.86766716265942E-26 -3.67241021594828E-09 + 1.21471957629552E-25 -2.32240650497066E-27 -3.67241034697880E-09 + -1.44494074287522E-25 -1.56308055204112E-25 -3.67240977583599E-09 + 9.59254860748750E-27 -6.57342015102565E-26 -3.67241226438450E-09 + 6.58351757061248E-26 1.59135332688424E-25 -3.67240142586568E-09 + 4.77607946457009E-26 -2.26788043920178E-25 -3.67244861142530E-09 + 7.99715631276853E-26 -1.57519745554532E-26 -3.67224327981185E-09 + 9.91566603426603E-26 2.01948391736579E-28 -3.67313638625655E-09 + 6.48254337474419E-26 -1.75897049202560E-25 -3.66925364726284E-09 + -1.17634938186557E-25 4.02887041514475E-26 -3.68612589317128E-09 + -1.87004210748072E-25 -1.78017507315794E-25 -3.61285901818769E-09 + -1.15514480073323E-25 1.39344390298240E-26 -3.93107607298909E-09 + -1.39344390298240E-26 2.99893361728820E-26 -2.55409793676906E-09 + 1.16221299444401E-25 1.72665874934775E-26 -8.59351902682153E-09 + 5.54348335316909E-26 -2.57989070443480E-26 1.65320211216982E-08 + 2.04977617612628E-26 2.05078591808496E-25 -1.45795184154468E-07 + 6.69458918606759E-26 -4.74982617364434E-25 -4.52527430267040E-06 + -2.39914689383056E-24 9.19592196611686E-24 -1.52793802463874E-05 + 4.96308367531817E-24 -2.01625274309800E-24 -2.38252364893103E-05 + 7.35415263347926E-24 -1.25886549472914E-23 -2.73069401262468E-05 + -6.35895095900140E-24 1.18777966083786E-23 -2.80706164505380E-05 + 1.67374827071277E-23 -1.19488824422699E-23 -2.81234131669965E-05 + -9.61597462092895E-24 + 1 -1 6 8 + SCALAIRE + -22 324223 1 0 0 0 -68 0 2 + + + 324211 + FLUX + REAL*8 + 1 301 0 0 + 2.01948391736579E-28 -3.67241024039310E-09 2.13459450065564E-25 + 3.67241024039375E-09 -1.29852815886620E-25 -3.67241024039340E-09 + -4.57211158891615E-25 0.00000000000000E+00 -3.67241024039319E-09 + 0.00000000000000E+00 -1.44191151699917E-25 -3.67241024039299E-09 + -6.46234853557053E-26 1.32276196587459E-25 -3.67241024039342E-09 + 2.47184831485573E-25 2.04977617612628E-25 -3.67241024039354E-09 + 2.63542651216236E-25 1.04407318527811E-25 -3.67241024039330E-09 + 9.99644539096066E-26 -1.76704842769507E-25 -3.67241024039288E-09 + -2.62532909257553E-26 -1.38334648339557E-25 -3.67241024039373E-09 + -4.60442333159400E-26 1.20765138258474E-25 -3.67241024039331E-09 + -2.14267243632510E-25 7.39131113755879E-26 -3.67241024039286E-09 + -1.69030803883517E-25 1.42777512957761E-25 -3.67241024039321E-09 + 1.51057397018961E-25 2.48396521835992E-25 -3.67241024039243E-09 + 4.50344913572571E-26 2.14671140415984E-25 -3.67241024039339E-09 + -2.14469192024247E-25 -1.07032647620387E-25 -3.67241024039277E-09 + -2.88180355008098E-25 3.53611633930750E-25 -3.67241024039329E-09 + 2.33452340847485E-25 2.31634805321856E-25 -3.67241024039308E-09 + -3.36446020633141E-25 -2.14065295240774E-25 -3.67241024039309E-09 + -1.60750919822317E-25 -4.96793043671984E-26 -3.67241024039306E-09 + -3.51592150013384E-25 -1.46816480792493E-25 -3.67241024039350E-09 + -3.30993414056253E-25 -1.26621641618835E-25 -3.67241024039329E-09 + -2.77477090246060E-25 -2.61725115690606E-25 -3.67241024039340E-09 + -1.00368350693080E-25 4.26111106564182E-26 -3.67241024039331E-09 + 1.36921009597401E-25 2.08006843488676E-26 -3.67241024039294E-09 + 2.72630328844382E-25 1.51865190585907E-25 -3.67241024039278E-09 + 8.21929954367877E-26 1.03397576569128E-25 -3.67241024039362E-09 + 1.89831488232384E-25 -2.36279618331797E-26 -3.67241024039302E-09 + 1.97101630334901E-25 -2.98277774594927E-25 -3.67241024039341E-09 + 5.49299625523495E-26 -1.08244337970806E-25 -3.67241024039318E-09 + -3.55631117848116E-25 -1.29448919103147E-25 -3.67241024039325E-09 + -3.33012897973619E-25 5.14968398928277E-26 -3.67241024039315E-09 + 7.47209049425342E-26 -9.87527635591871E-26 -3.67241024039352E-09 + -6.68449176648077E-26 -1.64991836048785E-25 -3.67241024039297E-09 + -2.57888096247611E-25 7.33072662003782E-26 -3.67241024039350E-09 + -7.35092145921148E-26 -2.08410740272150E-25 -3.67241024039349E-09 + -2.46377037918626E-25 9.14826214566703E-26 -3.67241024039333E-09 + 3.61487621208476E-25 1.77916533119926E-25 -3.67241024039312E-09 + -2.01948391736579E-26 2.82929696822947E-25 -3.67241024039357E-09 + 1.47624274359439E-25 1.77310687944716E-25 -3.67241024039305E-09 + 1.16322273640270E-25 1.23794364134523E-25 -3.67241024039307E-09 + -1.10667718671645E-25 -1.49441809885068E-25 -3.67241024039355E-09 + -1.44191151699917E-25 -4.84676140167790E-26 -3.67241024039329E-09 + -9.47137957244556E-26 -1.08042389579070E-25 -3.67241024039318E-09 + -1.81753552562921E-25 -6.05845175209737E-28 -3.67241024039329E-09 + 6.05845175209737E-28 2.11036069364725E-26 -3.67241024039364E-09 + -2.13055553282091E-26 -2.13055553282091E-25 -3.67241024039352E-09 + -8.04764341070267E-26 4.24091622646816E-26 -3.67241024039343E-09 + 2.51223799320304E-25 -1.56812926183454E-25 -3.67241024039339E-09 + -1.36719061205664E-25 -1.34901525680035E-25 -3.67241024039315E-09 + -3.12818058799961E-25 7.08838854995392E-26 -3.67241024039374E-09 + 2.22850050281315E-25 -7.41150597673245E-26 -3.67241024039331E-09 + -6.19981562631298E-26 -1.21673906021289E-25 -3.67241024039314E-09 + -1.31266454628776E-26 -1.97404552922506E-25 -3.67241024039317E-09 + 6.41186143763638E-26 1.88114926902623E-25 -3.67241024039347E-09 + 3.99150996267348E-25 1.75796075006692E-25 -3.67241024039363E-09 + -4.58422849242034E-26 1.89124668861306E-25 -3.67241024039306E-09 + -2.40318586166529E-26 1.66203526399205E-25 -3.67241024039351E-09 + -3.92789621927646E-26 1.20260267279133E-25 -3.67241024039339E-09 + 5.14968398928277E-27 3.65526589043208E-26 -3.67241024039286E-09 + 4.26817925935260E-25 -3.78653234506086E-26 -3.67241024039349E-09 + 3.78653234506086E-26 6.98741435408563E-26 -3.67241024039294E-09 + 1.02993679785655E-25 -8.54241697045729E-26 -3.67241024039304E-09 + -3.38263556158770E-26 1.30458661061830E-25 -3.67241024039321E-09 + -1.28237228752728E-26 2.41227353929344E-25 -3.67241024039295E-09 + 5.24056076556423E-26 -4.32169558316279E-26 -3.67241024039306E-09 + 1.57721693946268E-25 -1.21169035041947E-25 -3.67241024039339E-09 + 1.21169035041947E-25 -5.45260657688763E-26 -3.67241024039331E-09 + 5.46270399647446E-26 3.32205104406672E-26 -3.67241024039326E-09 + -2.16993546920954E-25 2.78688780596479E-26 -3.67241024039330E-09 + 2.65663109329470E-25 7.81540276020561E-26 -3.67241024039303E-09 + 2.85756974307259E-26 -4.95783301713301E-26 -3.67241024039386E-09 + -1.38738545123030E-25 7.14897306747490E-26 -3.67241024038983E-09 + -7.14897306747490E-26 9.84498409715823E-26 -3.67241024040755E-09 + 4.84676140167790E-26 2.62532909257553E-26 -3.67241024033189E-09 + -7.24994726334319E-26 -9.62284086624799E-26 -3.67241024065768E-09 + 1.95284094809272E-25 4.13994203059987E-26 -3.67241023925444E-09 + 1.05417060486494E-25 2.14166269436642E-25 -3.67241024529885E-09 + 2.77073193462586E-25 -4.84676140167790E-27 -3.67241021927662E-09 + 5.72523690573202E-26 -8.01735115194219E-26 -3.67241033124529E-09 + 1.72968797522380E-25 4.00867557597109E-26 -3.67240984970189E-09 + 1.42474590370157E-25 -5.44250915730080E-26 -3.67241191965898E-09 + -9.24923634153532E-26 2.72630328844382E-26 -3.67240302615240E-09 + 1.19452473712186E-25 1.64789887657048E-25 -3.67244121793013E-09 + -1.04609266919548E-25 -2.13964321044905E-25 -3.67227729050905E-09 + -1.78724326686872E-26 -2.28201682662334E-26 -3.67298055619205E-09 + 1.06426802445177E-25 -7.77501308185829E-27 -3.66996497593654E-09 + 1.54692468070220E-25 -7.78511050144512E-26 -3.68288972557482E-09 + -5.49299625523495E-26 -1.06830699228650E-25 -3.62752750801944E-09 + -2.54555947783958E-25 2.94844651935405E-26 -3.86467195985321E-09 + 2.64249470587314E-25 -3.33214846365355E-26 -2.85145474916674E-09 + -1.88619797881965E-25 -3.68555814919257E-26 -7.21816146023862E-09 + -3.77643492547403E-26 -1.37476367674676E-25 1.09455213600853E-08 + -1.42474590370157E-25 -2.09824379014306E-25 -8.41961845613521E-08 + -2.02251314324184E-25 -4.02765872479433E-24 -3.61381822391411E-06 + -4.64804418420910E-24 -2.27927032849573E-23 -1.30446904442429E-05 + -2.28508644217774E-23 -4.00665609205373E-25 -2.04805546634357E-05 + 3.87740912134232E-25 -5.82128356084193E-23 -2.37828557507934E-05 + -3.93169284904111E-23 -1.23043116117263E-23 -2.47708212411996E-05 + 1.23043116117263E-23 4.96308367531817E-24 -2.49723748419041E-05 + -4.95015897824702E-24 -6.91471293306047E-25 -2.49869805498920E-05 + -3.53490464895708E-24 + 1 -1 6 8 + SCALAIRE + -22 323905 1 0 0 0 -69 0 2 + + + 323893 + FLUX + REAL*8 + 1 301 0 0 + 7.08838854995392E-26 -3.67241024039375E-09 -2.84747232348576E-25 + 3.67241024039331E-09 8.23949438285242E-26 -3.67241024039275E-09 + 1.29852815886620E-25 9.02709311062508E-26 -3.67241024039362E-09 + 4.96793043671984E-25 -3.97838331721061E-26 -3.67241024039363E-09 + -1.69232752275253E-25 -1.43383358132971E-25 -3.67241024039299E-09 + -2.36077669940061E-25 2.20527643776344E-25 -3.67241024039397E-09 + -2.20527643776344E-25 1.55500261637166E-26 -3.67241024039321E-09 + 9.99644539096066E-26 -7.87598727772658E-26 -3.67241024039322E-09 + 1.69232752275253E-25 -4.32169558316279E-26 -3.67241024039331E-09 + 4.32169558316279E-26 -7.89618211690024E-26 -3.67241024039373E-09 + -2.14267243632510E-25 3.66132434218418E-25 -3.67241024039362E-09 + 2.28201682662334E-26 -1.51865190585907E-25 -3.67241024039332E-09 + -4.35198784192328E-25 1.50855448627225E-25 -3.67241024039288E-09 + -2.49204315402939E-25 -1.78926275078609E-25 -3.67241024039330E-09 + -5.08102153609233E-25 9.04728794979874E-26 -3.67241024039334E-09 + -9.04728794979874E-26 -3.33820691540565E-25 -3.67241024039332E-09 + -8.40105309624169E-25 1.33891783721352E-25 -3.67241024039319E-09 + 1.59741177863634E-25 -2.30625063363173E-25 -3.67241024039297E-09 + -6.30078982218127E-26 -4.26515003347655E-25 -3.67241024039357E-09 + 1.32680093370932E-25 -2.38904947424373E-25 -3.67241024039348E-09 + -2.38904947424373E-25 -1.39546338689976E-25 -3.67241024039327E-09 + -3.75624008630037E-25 2.42338070083895E-26 -3.67241024039276E-09 + 2.00130856210950E-25 -7.12877822830124E-26 -3.67241024039360E-09 + -4.28130590481548E-26 -1.66001578007468E-25 -3.67241024039344E-09 + -1.27429435185781E-25 4.44286461820474E-26 -3.67241024039325E-09 + -2.20931540559817E-25 1.91043178582804E-25 -3.67241024039308E-09 + 1.02589783002182E-25 -1.85792520397653E-25 -3.67241024039344E-09 + -2.81314109689055E-25 -7.89618211690024E-26 -3.67241024039330E-09 + -2.14873088807720E-25 8.76456020136753E-26 -3.67241024039292E-09 + 1.58933384296688E-25 -1.42979461349498E-25 -3.67241024039301E-09 + -5.69090567913680E-25 1.06628750836914E-25 -3.67241024039286E-09 + -6.58351757061248E-26 1.79734068645555E-25 -3.67241024039320E-09 + 2.41732224908685E-25 1.47422325967703E-26 -3.67241024039286E-09 + 1.49239861493332E-25 5.69494464697153E-26 -3.67241024039355E-09 + 2.68187464226177E-25 -1.10667718671645E-25 -3.67241024039343E-09 + -3.44120059519131E-25 1.45806738833810E-25 -3.67241024039322E-09 + 1.47624274359439E-25 8.01735115194219E-26 -3.67241024039388E-09 + -5.79591884283982E-26 -3.62901259950633E-25 -3.67241024039331E-09 + 6.94702467573832E-26 -1.16322273640270E-25 -3.67241024039306E-09 + -2.24162714827603E-26 4.70539752746229E-26 -3.67241024039339E-09 + -4.70539752746229E-26 -1.05417060486494E-25 -3.67241024039343E-09 + -1.88215901098492E-25 -4.84676140167790E-26 -3.67241024039339E-09 + -9.47137957244556E-26 -1.35103474071771E-25 -3.67241024039343E-09 + 1.35305422463508E-25 2.36279618331797E-26 -3.67241024039350E-09 + -1.70646391017409E-25 -1.49441809885068E-25 -3.67241024039354E-09 + 3.93799363886329E-27 -6.35127692011541E-26 -3.67241024039335E-09 + -8.03754599111585E-26 2.11439966148198E-25 -3.67241024039310E-09 + 2.33250392455749E-25 -2.27393889095388E-25 -3.67241024039292E-09 + 8.64339116632558E-26 1.30458661061830E-25 -3.67241024039311E-09 + 8.78475504054119E-27 -2.70610844927016E-26 -3.67241024039364E-09 + 2.69601102968333E-26 2.37289360290480E-26 -3.67241024039318E-09 + 1.33790809525484E-25 -1.15413505877455E-25 -3.67241024039350E-09 + 1.15312531681587E-25 -6.42195885722321E-26 -3.67241024039357E-09 + -9.62284086624799E-26 8.85543697764899E-26 -3.67241024039304E-09 + 7.35092145921148E-26 7.79520792103195E-26 -3.67241024039331E-09 + -2.41530276516949E-25 -6.66429692730711E-27 -3.67241024039336E-09 + 1.71656132976092E-25 -9.28962601988264E-26 -3.67241024039339E-09 + 9.28962601988264E-26 -4.01877299555792E-26 -3.67241024039320E-09 + 1.65698655419863E-25 -7.13887564788807E-26 -3.67241024039328E-09 + 7.14897306747490E-26 2.32240650497066E-26 -3.67241024039348E-09 + -2.32240650497066E-26 -1.25914822247757E-25 -3.67241024039305E-09 + -1.67718139337229E-25 1.25208002876679E-26 -3.67241024039314E-09 + -1.31771325608118E-25 9.13816472608020E-26 -3.67241024039297E-09 + -9.14826214566703E-26 -7.05809629119344E-26 -3.67241024039318E-09 + -4.54383881407303E-26 -2.39005921620241E-25 -3.67241024039338E-09 + -2.33755263435090E-25 -3.83701944299500E-26 -3.67241024039339E-09 + 3.83701944299500E-26 -5.45260657688763E-26 -3.67241024039319E-09 + -1.27530409381650E-25 -1.50350577647883E-25 -3.67241024039325E-09 + -3.32205104406672E-26 -2.22042256714369E-25 -3.67241024039298E-09 + 5.45260657688763E-27 -2.84747232348576E-26 -3.67241024039369E-09 + -1.58226564925610E-25 1.00873221672421E-25 -3.67241024039133E-09 + 1.92759739912565E-25 -1.75897049202560E-25 -3.67241024040141E-09 + -4.11166925575675E-25 5.14968398928277E-26 -3.67241024035965E-09 + 2.42035147496290E-25 2.36279618331797E-26 -3.67241024053529E-09 + 1.23188518959313E-25 -4.73568978622278E-26 -3.67241023979269E-09 + 4.73568978622278E-26 -7.37111629838513E-27 -3.67241024293143E-09 + -1.88720772077833E-25 6.35127692011541E-26 -3.67241022968243E-09 + -2.61119270515397E-25 -2.00534752994423E-25 -3.67241028554567E-09 + 1.21169035041947E-27 -7.26004468293002E-26 -3.67241005027592E-09 + -7.43170081590611E-26 9.56225634872702E-26 -3.67241103992250E-09 + 1.42474590370157E-25 -1.76704842769507E-26 -3.67240688233238E-09 + 1.76704842769507E-26 -6.08874401085786E-26 -3.67242432529182E-09 + -1.15413505877455E-25 -1.51259345410698E-25 -3.67235124816126E-09 + -2.02453262715920E-25 -1.28944048123806E-25 -3.67265694278546E-09 + -1.78724326686872E-26 -8.48183245293632E-27 -3.67138022513029E-09 + -5.48289883564812E-26 -7.87598727772658E-27 -3.67670326507487E-09 + 7.87598727772658E-27 -6.93692725615149E-26 -3.65455170399297E-09 + -1.43787254916444E-25 -3.84711686258183E-26 -3.74656700307015E-09 + 3.83701944299500E-26 -4.27120848522865E-26 -3.36544160750021E-09 + 4.27120848522865E-26 -7.01770661284612E-26 -4.94496986160892E-09 + 7.00760919325929E-26 4.94773559754619E-26 1.50941977348801E-09 + -4.55393623365986E-26 2.10026327406042E-26 -2.62460699675534E-08 + -2.10026327406042E-26 -1.40394521935270E-24 -2.38137905264311E-06 + -1.99848128462519E-24 1.58973773975035E-24 -1.06758299602607E-05 + 7.42523846737054E-24 -6.96641172134503E-24 -1.77464553400661E-05 + 6.96641172134503E-24 -1.98523347012727E-23 -2.12523037521504E-05 + -4.16175245690742E-24 -9.64699389389969E-23 -2.25349190595267E-05 + -7.33605805757966E-23 3.02696405406124E-23 -2.29138857114356E-05 + 2.58752435364244E-23 3.45089411799466E-23 -2.29966672954561E-05 + 3.31001491991922E-23 -3.98080669791145E-24 -2.30030697359713E-05 + 3.98080669791145E-24 + 1 -1 6 8 + SCALAIRE + -22 323653 1 0 0 0 -70 0 2 + + + 323635 + FLUX + REAL*8 + 1 301 0 0 + -3.91174034793754E-25 -3.67241024039354E-09 1.77714584728190E-26 + 3.67241024039354E-09 2.78082935421269E-25 -3.67241024039319E-09 + 9.69352280335579E-26 3.01105052079239E-25 -3.67241024039363E-09 + -9.02709311062508E-26 -1.30862557845303E-25 -3.67241024039343E-09 + -7.81540276020561E-26 -1.43383358132971E-25 -3.67241024039299E-09 + -2.36077669940061E-25 2.20527643776344E-25 -3.67241024039353E-09 + 7.31053178086416E-26 1.11071615455118E-26 -3.67241024039385E-09 + 1.04407318527811E-25 -7.51248017260074E-26 -3.67241024039353E-09 + -1.55500261637166E-26 -4.32169558316279E-26 -3.67241024039278E-09 + 1.52269087369381E-25 -7.89618211690024E-26 -3.67241024039384E-09 + -2.14267243632510E-25 -2.64552393174919E-26 -3.67241024039374E-09 + -2.66975773875757E-25 1.42979461349498E-25 -3.67241024039352E-09 + 3.47149285395179E-25 5.29104786349837E-26 -3.67241024039286E-09 + -5.29104786349837E-26 -7.89618211690024E-26 -3.67241024039384E-09 + 1.78926275078609E-25 -3.95213002628485E-25 -3.67241024039334E-09 + -4.85483933734736E-25 3.50986304838174E-25 -3.67241024039320E-09 + 3.39071349725716E-25 -6.17962078713932E-26 -3.67241024039341E-09 + -4.28130590481548E-26 -1.24400209309733E-25 -3.67241024039331E-09 + 1.24400209309733E-25 -2.30625063363173E-25 -3.67241024039322E-09 + 1.52672984152854E-25 4.88715108002521E-26 -3.67241024039322E-09 + 6.03825691292371E-26 -3.53409685539013E-26 -3.67241024039351E-09 + -3.69161660094466E-25 1.15110583289850E-25 -3.67241024039307E-09 + -2.62532909257553E-27 -2.51021850928568E-25 -3.67241024039330E-09 + -3.36244072241404E-25 2.96864135852771E-26 -3.67241024039305E-09 + -2.96864135852771E-26 1.13494996155957E-25 -3.67241024039296E-09 + -1.13494996155957E-25 -4.64481300994132E-27 -3.67241024039314E-09 + -2.88988148575045E-25 -1.96899681943165E-25 -3.67241024039370E-09 + -9.65313312500848E-26 -7.87598727772658E-26 -3.67241024039331E-09 + -3.36446020633141E-25 -1.33689835329615E-25 -3.67241024039293E-09 + 1.02993679785655E-26 5.27085302432471E-26 -3.67241024039302E-09 + 1.15918376856796E-25 4.14398099843460E-25 -3.67241024039286E-09 + 3.39879143292662E-25 -9.89547119509237E-26 -3.67241024039314E-09 + -2.32644547280539E-25 1.47422325967703E-26 -3.67241024039297E-09 + 1.49239861493332E-25 -1.05820957269967E-25 -3.67241024039346E-09 + 1.05619008878231E-25 -1.10667718671645E-25 -3.67241024039354E-09 + -3.44120059519131E-25 6.60371240978613E-26 -3.67241024039300E-09 + 2.01948391736579E-25 1.36921009597401E-25 -3.67241024039366E-09 + 2.12045811323408E-26 -1.27833331969255E-25 -3.67241024039365E-09 + -1.65597681223995E-25 -1.36719061205664E-25 -3.67241024039328E-09 + -1.40556080648659E-25 -5.08909947176179E-26 -3.67241024039339E-09 + -2.29817269796227E-25 2.42338070083895E-27 -3.67241024039329E-09 + 1.49239861493332E-25 -2.21537385735027E-25 -3.67241024039339E-09 + -7.20955758499587E-26 1.85590572005916E-25 -3.67241024039334E-09 + 2.56676405897192E-25 9.73391248170311E-26 -3.67241024039339E-09 + 4.92754075837253E-26 1.69232752275253E-25 -3.67241024039342E-09 + 2.72327406256777E-25 -6.36137433970224E-26 -3.67241024039349E-09 + -8.03754599111585E-26 1.57519745554532E-26 -3.67241024039310E-09 + -1.58226564925610E-25 -1.59539229471897E-26 -3.67241024039340E-09 + -1.36618087009796E-25 -1.48331093730517E-25 -3.67241024039297E-09 + -2.84646258152708E-25 2.77477090246060E-25 -3.67241024039361E-09 + 1.53783700307405E-25 2.19214979230057E-25 -3.67241024039328E-09 + 2.31533831125988E-25 1.41262900019737E-25 -3.67241024039314E-09 + 1.52269087369381E-25 9.62284086624799E-26 -3.67241024039352E-09 + -9.62284086624799E-26 -1.05518034682363E-25 -3.67241024039336E-09 + 1.05619008878231E-25 1.10061873496436E-25 -3.67241024039344E-09 + -1.43585306524708E-25 9.12806730649337E-26 -3.67241024039304E-09 + 7.39131113755879E-26 3.92789621927646E-26 -3.67241024039341E-09 + 2.54253025196353E-25 -5.14968398928277E-27 -3.67241024039341E-09 + 1.30458661061830E-25 -9.73391248170311E-26 -3.67241024039339E-09 + 2.67177722267494E-25 2.33250392455749E-26 -3.67241024039373E-09 + -2.32240650497066E-26 5.51319109440861E-26 -3.67241024039308E-09 + 6.55322531185199E-26 3.37253814200087E-26 -3.67241024039282E-09 + 2.59806605969109E-25 1.30458661061830E-25 -3.67241024039342E-09 + -1.28237228752728E-26 -1.90033436624121E-25 -3.67241024039306E-09 + -1.03599524960865E-25 -8.38085825706803E-26 -3.67241024039328E-09 + 8.37076083748120E-26 -1.06022905661704E-25 -3.67241024039340E-09 + 2.19013030838320E-25 7.19946016540904E-26 -3.67241024039353E-09 + -1.21169035041947E-27 -6.45225111598370E-26 -3.67241024039358E-09 + -4.53374139448620E-26 1.25712873856020E-25 -3.67241024039309E-09 + 1.67920087728965E-25 -7.30043436127733E-26 -3.67241024039282E-09 + 2.86564767874206E-25 9.35021053740361E-26 -3.67241024039386E-09 + -9.35021053740361E-26 -1.30054764278357E-25 -3.67241024039184E-09 + 2.62532909257553E-26 1.00570299084816E-25 -3.67241024039684E-09 + 4.63471559035449E-26 2.36279618331797E-26 -3.67241024039191E-09 + 1.23087544763445E-25 1.00974195868290E-27 -3.67241024033383E-09 + -1.00974195868290E-27 -7.57306469012171E-27 -3.67241024092811E-09 + -1.39243416102371E-25 -3.33214846365355E-26 -3.67241023687463E-09 + -3.11000523274332E-25 9.13816472608020E-26 -3.67241026083658E-09 + -9.13816472608020E-26 -1.78017507315794E-25 -3.67241012933954E-09 + 3.12010265233015E-26 -1.03498550764997E-25 -3.67241081869888E-09 + 4.79627430374375E-26 3.53409685539013E-26 -3.67240731517883E-09 + 1.11475512238592E-25 -6.57342015102565E-26 -3.67242472581844E-09 + -8.10822792822365E-26 5.56367819234275E-26 -3.67233966420491E-09 + 3.08981039356966E-26 3.06961555439600E-26 -3.67274972667956E-09 + -5.40211947895349E-26 -1.06325828249309E-25 -3.67079412118892E-09 + -4.03896783473158E-26 9.79449699922408E-26 -3.68003817324006E-09 + 4.89724849961204E-26 1.93870456067116E-26 -3.63667281930962E-09 + 6.09884143044469E-26 2.09016585447359E-26 -3.83893444180349E-09 + -2.09016585447359E-26 -5.69494464697153E-26 -2.90324120563540E-09 + 5.69494464697153E-26 -1.14605712310509E-25 -7.26494328943760E-09 + -1.08143363774938E-25 -2.05987359571311E-26 1.20013250860920E-08 + -4.28130590481548E-26 -8.32835167521652E-25 -1.22383101138835E-06 + 8.32835167521652E-25 7.27014210251684E-24 -8.29640894066741E-06 + 6.48819792971281E-24 2.14032983498096E-23 -1.53829689953952E-05 + 1.76292868050364E-23 4.32977351883225E-23 -1.92533983599839E-05 + 9.97528119950667E-23 -1.76034374108941E-23 -2.08622916601194E-05 + 1.75775880167518E-23 -2.58493941422821E-24 -2.14340684376363E-05 + 6.56316117272543E-23 4.00665609205373E-24 -2.16101573362036E-05 + 2.32644547280539E-24 3.13294657004459E-23 -2.16507499071785E-05 + 2.52677827740808E-23 1.00941884125612E-23 -2.16540105355530E-05 + 8.46567658159739E-24 + 1 -1 6 8 + SCALAIRE + -22 323455 1 0 0 0 -71 0 2 + + + 323443 + FLUX + REAL*8 + 1 301 0 0 + 1.07234596012123E-25 -3.67241024039310E-09 1.06830699228650E-25 + 3.67241024039376E-09 6.58351757061248E-26 -3.67241024039340E-09 + -6.58351757061248E-26 -1.49441809885068E-26 -3.67241024039320E-09 + 1.49441809885068E-26 -2.21941282518500E-25 -3.67241024039321E-09 + -1.55904158420639E-25 4.05916267390524E-26 -3.67241024039343E-09 + -4.05916267390524E-26 1.12485254197275E-25 -3.67241024039364E-09 + -4.06118215782260E-25 -1.89023694665438E-25 -3.67241024039342E-09 + -1.04407318527811E-25 1.17130067207216E-26 -3.67241024039333E-09 + -1.24198260917996E-25 -2.41934173300422E-25 -3.67241024039309E-09 + -3.45331749869550E-25 -1.74685358852141E-25 -3.67241024039344E-09 + -2.12449708106881E-25 -1.21774880217157E-25 -3.67241024039351E-09 + -1.71656132976092E-25 2.40924431341739E-25 -3.67241024039311E-09 + -4.42266977903108E-26 -4.46305945737840E-26 -3.67241024039350E-09 + -5.37182722019300E-26 1.15716428465060E-25 -3.67241024039363E-09 + -1.15716428465060E-25 -1.11071615455118E-26 -3.67241024039321E-09 + -1.91850972149750E-25 5.73533432531884E-26 -3.67241024039352E-09 + -5.75552916449250E-26 3.93799363886329E-26 -3.67241024039277E-09 + -3.93799363886329E-26 -3.06961555439600E-26 -3.67241024039289E-09 + -1.56711951987585E-25 1.55702210028902E-25 -3.67241024039335E-09 + -1.55904158420639E-25 2.61725115690606E-25 -3.67241024039307E-09 + 2.50416005753358E-25 2.77679038637796E-25 -3.67241024039326E-09 + -1.66809371574414E-25 -3.66940227785364E-25 -3.67241024039340E-09 + -2.20123746992871E-25 4.26111106564182E-26 -3.67241024039374E-09 + 2.51021850928568E-25 2.07602946705203E-25 -3.67241024039317E-09 + 8.58280664880461E-26 -1.51259345410698E-25 -3.67241024039295E-09 + -3.18674562160322E-25 7.24994726334319E-26 -3.67241024039345E-09 + 1.02387834610446E-25 9.65313312500848E-26 -3.67241024039340E-09 + 2.36279618331797E-26 9.30982085905629E-26 -3.67241024039330E-09 + 2.50819902536831E-25 -1.33689835329615E-25 -3.67241024039326E-09 + 1.02993679785655E-26 -3.38869401333980E-25 -3.67241024039326E-09 + -5.42231431812715E-25 -7.49228533342708E-26 -3.67241024039296E-09 + -1.77714584728190E-25 1.11879409022065E-25 -3.67241024039331E-09 + -2.77679038637796E-25 -1.65193784440522E-25 -3.67241024039352E-09 + -2.57888096247611E-25 -7.87598727772658E-27 -3.67241024039383E-09 + 1.70444442625673E-25 6.78546596234906E-26 -3.67241024039311E-09 + -6.78546596234906E-26 4.78617688415692E-26 -3.67241024039295E-09 + -4.80637172333058E-26 -2.54656921979826E-25 -3.67241024039327E-09 + -1.74685358852141E-25 2.82929696822947E-25 -3.67241024039324E-09 + 1.47624274359439E-25 -2.71216690102226E-25 -3.67241024039328E-09 + -1.77108739552980E-25 1.66001578007468E-25 -3.67241024039350E-09 + 1.27631383577518E-25 1.44191151699917E-25 -3.67241024039306E-09 + 1.49239861493332E-25 9.49157441161921E-26 -3.67241024039312E-09 + 1.98717217468794E-25 -1.08042389579070E-25 -3.67241024039306E-09 + -3.69565556877940E-26 -6.05845175209737E-28 -3.67241024039362E-09 + 6.05845175209737E-28 7.13887564788807E-26 -3.67241024039357E-09 + 7.66394146640317E-26 -2.39005921620241E-25 -3.67241024039337E-09 + -2.04169824045681E-25 -5.55358077275592E-26 -3.67241024039350E-09 + 6.42195885722321E-26 -1.29448919103147E-25 -3.67241024039350E-09 + -1.14100841331167E-26 -2.04573720829155E-25 -3.67241024039329E-09 + -8.89582665599631E-26 8.18900728491828E-26 -3.67241024039368E-09 + 1.93668507675379E-25 -2.31533831125988E-25 -3.67241024039328E-09 + 7.42160339631928E-26 8.02744857152902E-26 -3.67241024039314E-09 + -8.03754599111585E-26 -1.97404552922506E-25 -3.67241024039338E-09 + 6.41186143763638E-26 9.01699569103825E-26 -3.67241024039314E-09 + 2.03463004674603E-25 -5.28095044391154E-26 -3.67241024039349E-09 + 1.92860714108433E-26 -1.71656132976092E-25 -3.67241024039282E-09 + -2.50416005753358E-25 2.00635727190291E-25 -3.67241024039375E-09 + 9.29972343946946E-26 -1.65698655419863E-25 -3.67241024039359E-09 + 1.65698655419863E-25 4.03896783473158E-28 -3.67241024039306E-09 + 1.69232752275253E-25 -3.78653234506086E-26 -3.67241024039347E-09 + -1.33386912742010E-25 3.24127168737209E-26 -3.67241024039315E-09 + 2.61119270515397E-25 -1.61962610172736E-25 -3.67241024039340E-09 + -1.31670351412250E-25 9.13816472608020E-26 -3.67241024039297E-09 + 2.62532909257553E-26 1.43383358132971E-25 -3.67241024039338E-09 + 1.50249603452015E-25 9.52186667037970E-26 -3.67241024039340E-09 + 1.98212346489452E-25 -3.83701944299500E-26 -3.67241024039306E-09 + 3.83701944299500E-26 -1.10263821888172E-25 -3.67241024039353E-09 + -3.65425614847340E-25 2.42338070083895E-27 -3.67241024039304E-09 + 1.07537518599728E-25 -3.19886252510741E-25 -3.67241024039429E-09 + -2.67278696463362E-25 2.20527643776344E-25 -3.67241024038884E-09 + 1.79734068645555E-25 -3.35840175457931E-25 -3.67241024041174E-09 + -1.46109661421415E-25 -1.29953790082489E-25 -3.67241024031090E-09 + -1.63578197306629E-25 -1.61558713389263E-27 -3.67241024075875E-09 + 2.37693257073954E-25 2.76669296679113E-26 -3.67241023877604E-09 + 1.19048576928713E-25 4.87705366043838E-26 -3.67241024754211E-09 + 1.45806738833810E-25 -5.65455496862421E-26 -3.67241020882449E-09 + 5.65455496862421E-26 -1.30357686865962E-25 -3.67241037967676E-09 + -1.63174300523156E-25 4.24091622646816E-26 -3.67240962639660E-09 + 1.04306344331943E-25 -2.61523167298870E-26 -3.67241294477900E-09 + -2.13459450065564E-25 1.11071615455118E-27 -3.67239833845266E-09 + -9.22904150236166E-26 1.78017507315794E-25 -3.67246257907850E-09 + 2.05280540200233E-25 -1.58731435904951E-25 -3.67218025945504E-09 + -1.75695100810824E-26 -1.02286860414577E-25 -3.67342003876045E-09 + -1.80743810604238E-26 -1.71454184584356E-25 -3.66797977224315E-09 + -4.15609790193880E-25 2.62532909257553E-26 -3.69183616047043E-09 + 5.72523690573202E-26 4.17023428936036E-26 -3.58732216990726E-09 + 2.30221166579700E-26 -4.74578720580961E-26 -4.04535763371071E-09 + -1.79936017037292E-25 -1.14403763918772E-25 -2.04852851387296E-09 + -9.84498409715823E-26 1.54086622895010E-25 -1.09323357115035E-08 + 1.48230119534649E-25 4.18538041874060E-26 2.57837085903936E-08 + -4.18033170894719E-26 1.14908634898113E-25 -4.43951352575007E-07 + -1.14706686506377E-25 8.17487089749672E-25 -5.91945509373330E-06 + -2.45569244351680E-24 1.59749255799303E-23 -1.31189825371438E-05 + 1.15417544845290E-23 -3.12260681238768E-23 -1.74735215059716E-05 + -7.66434536318665E-23 -6.20902447297616E-23 -1.94715448771937E-05 + -3.20790981305721E-23 -3.85155972720004E-24 -2.02675213940120E-05 + -4.02992054678178E-23 -7.52217369540410E-23 -2.05577972547547E-05 + -9.07572228335525E-23 3.49742302745077E-23 -2.06512160672106E-05 + 3.94720248552648E-23 1.16322273640270E-23 -2.06736310268074E-05 + 2.45052256468834E-23 -5.79349546213898E-24 -2.06754791963205E-05 + -9.63213049226787E-24 + 1 -1 6 8 + SCALAIRE + -22 323275 1 0 0 0 -72 0 2 + + + 323245 + FLUX + REAL*8 + 1 301 0 0 + -3.91174034793754E-25 -3.67241024039265E-09 -5.69292516305416E-25 + 3.67241024039396E-09 1.72060029759565E-25 -3.67241024039275E-09 + -1.71858081367829E-25 3.91375983185490E-25 -3.67241024039320E-09 + 4.06320164173997E-25 -2.21941282518500E-25 -3.67241024039277E-09 + -1.55904158420639E-25 -6.34117950052858E-26 -3.67241024039276E-09 + -5.23854128164686E-25 1.12485254197275E-25 -3.67241024039311E-09 + 2.68591361009650E-25 -8.68378084467290E-26 -3.67241024039398E-09 + -9.12806730649337E-26 1.06224854053441E-25 -3.67241024039364E-09 + 2.77880987029533E-25 -1.40959977432132E-25 -3.67241024039319E-09 + -1.52471035761117E-25 -7.91637695607390E-26 -3.67241024039331E-09 + -3.08173245790020E-25 2.64552393174919E-25 -3.67241024039265E-09 + 2.19921798601135E-25 -2.48800418619465E-25 -3.67241024039398E-09 + -3.38263556158770E-25 -1.41969719390815E-25 -3.67241024039318E-09 + -3.46745388611706E-25 4.11368873967411E-25 -3.67241024039322E-09 + 3.75624008630037E-25 -1.99525011035740E-25 -3.67241024039312E-09 + -9.41079505492458E-26 6.01806207375005E-26 -3.67241024039288E-09 + -2.50416005753358E-25 3.22915478386790E-25 -3.67241024039350E-09 + 5.49299625523495E-26 -1.20361241475001E-25 -3.67241024039268E-09 + -6.70468660565442E-26 5.29104786349837E-26 -3.67241024039306E-09 + 5.33951547751515E-25 1.41161925823869E-25 -3.67241024039322E-09 + -4.34592939017118E-25 -1.26621641618835E-25 -3.67241024039384E-09 + -1.66809371574414E-25 -2.83737490389894E-25 -3.67241024039308E-09 + -1.91043178582804E-25 2.46377037918626E-25 -3.67241024039302E-09 + 1.60952868214053E-25 -7.71442856433732E-26 -3.67241024039304E-09 + -3.83701944299500E-26 -2.58897838206294E-25 -3.67241024039316E-09 + -3.49370717704282E-26 -1.90033436624121E-25 -3.67241024039352E-09 + -2.78486832204742E-25 -1.96899681943165E-25 -3.67241024039283E-09 + -9.65313312500848E-26 -2.74447864370011E-25 -3.67241024039320E-09 + -1.40758029040396E-25 1.47220377575966E-25 -3.67241024039302E-09 + -1.47220377575966E-25 -3.38869401333980E-25 -3.67241024039347E-09 + -5.42231431812715E-25 -8.90592407558313E-26 -3.67241024039303E-09 + -4.57211158891615E-25 -1.81551604171185E-25 -3.67241024039341E-09 + -1.49845706668542E-25 -1.49441809885068E-25 -3.67241024039335E-09 + -1.44191151699917E-25 -3.34426536715775E-25 -3.67241024039367E-09 + -3.83499995907764E-25 6.78546596234906E-26 -3.67241024039366E-09 + -6.78546596234906E-26 9.14826214566703E-26 -3.67241024039365E-09 + 3.61487621208476E-25 1.99928907819213E-26 -3.67241024039339E-09 + -1.55702210028902E-25 3.02720639213132E-25 -3.67241024039358E-09 + 2.65158238350128E-25 -1.16322273640270E-25 -3.67241024039306E-09 + -2.24162714827603E-26 8.94631375393045E-26 -3.67241024039328E-09 + 5.08909947176179E-26 -5.14968398928277E-26 -3.67241024039328E-09 + -1.00368350693080E-25 -4.84676140167790E-26 -3.67241024039367E-09 + -9.47137957244556E-26 -1.35103474071771E-25 -3.67241024039365E-09 + -1.58327539121478E-25 9.73391248170311E-26 -3.67241024039351E-09 + -9.71371764252945E-26 -1.49441809885068E-25 -3.67241024039361E-09 + 3.83701944299500E-27 -8.94631375393045E-26 -3.67241024039331E-09 + -5.45260657688763E-26 1.13595970351826E-25 -3.67241024039354E-09 + 3.75624008630037E-26 -1.29448919103147E-25 -3.67241024039329E-09 + -1.14100841331167E-26 1.92860714108433E-26 -3.67241024039319E-09 + -1.93870456067116E-26 8.18900728491828E-26 -3.67241024039346E-09 + 1.93668507675379E-25 -6.05845175209737E-27 -3.67241024039326E-09 + 1.42373616174288E-25 -1.15413505877455E-25 -3.67241024039339E-09 + 1.15312531681587E-25 -1.97404552922506E-25 -3.67241024039338E-09 + 6.41186143763638E-26 9.01699569103825E-26 -3.67241024039336E-09 + 2.03463004674603E-25 2.08612688663886E-25 -3.67241024039361E-09 + -4.51354655531254E-26 1.21875854413025E-25 -3.67241024039308E-09 + 1.71656132976092E-25 1.37223932185005E-25 -3.67241024039319E-09 + 1.56510003595849E-25 -4.02887041514475E-26 -3.67241024039329E-09 + 4.03896783473158E-26 3.65526589043208E-26 -3.67241024039351E-09 + 4.26817925935260E-25 1.21068060846079E-25 -3.67241024039338E-09 + 1.21169035041947E-27 1.53076880936327E-25 -3.67241024039297E-09 + -3.23117426778526E-26 -4.44286461820474E-27 -3.67241024039295E-09 + 1.23592415742786E-25 1.30458661061830E-25 -3.67241024039308E-09 + -1.29246970711411E-26 -2.48093599248387E-25 -3.67241024039327E-09 + -1.61558713389263E-25 -2.96258290677561E-25 -3.67241024039328E-09 + -2.90906658296542E-25 -2.19013030838320E-25 -3.67241024039339E-09 + -7.45189565507977E-26 -1.94476301242326E-25 -3.67241024039308E-09 + 1.24198260917996E-26 4.53374139448620E-26 -3.67241024039425E-09 + -1.19048576928713E-25 3.82692202340817E-26 -3.67241024038944E-09 + 2.55262767155036E-25 1.75998023398429E-25 -3.67241024041189E-09 + 3.74614266671354E-26 -4.95783301713301E-26 -3.67241024031195E-09 + -1.38738545123030E-25 1.38334648339557E-26 -3.67241024074168E-09 + -2.21234463147422E-25 -4.62461817076766E-26 -3.67241023889439E-09 + 1.93163636696038E-25 2.36279618331797E-26 -3.67241024683450E-09 + -7.79520792103195E-26 1.00974195868290E-27 -3.67241021273262E-09 + 1.93567533479511E-25 -5.67474980779787E-26 -3.67241035907448E-09 + -2.36885463507007E-25 6.44215369639687E-26 -3.67240973161857E-09 + -1.66203526399205E-25 -4.74578720580961E-27 -3.67241241950008E-09 + -4.76598204498326E-26 7.16916790664856E-26 -3.67240091578795E-09 + 2.21840308322632E-25 1.00974195868290E-27 -3.67245010328658E-09 + -1.47725248555308E-25 -7.06819371078027E-26 -3.67223999333808E-09 + -4.35198784192328E-26 -5.60406787069007E-26 -3.67313659561857E-09 + -1.20260267279133E-25 9.89547119509237E-26 -3.66931456831474E-09 + 1.34396654700693E-25 -3.74614266671354E-26 -3.68558986379105E-09 + -1.71050287800882E-25 -6.50273821391784E-26 -3.61637372058597E-09 + -1.44897971070995E-25 -5.83630852118713E-26 -3.91057079186339E-09 + -2.36279618331797E-26 -2.19114005034188E-26 -2.66488595451117E-09 + -1.24299235113864E-25 -5.60406787069007E-26 -7.99200438801827E-09 + -1.71858081367829E-25 3.58458395332428E-26 1.38268645244581E-08 + -3.59468137291111E-26 1.70242494233936E-25 -1.06378433713651E-07 + -1.70242494233936E-25 -5.39444544006750E-24 -3.63018616491496E-06 + -3.69646336234634E-24 8.59492355230880E-25 -1.08242147884387E-05 + -4.32977351883225E-25 -1.61946454301397E-23 -1.57718481429636E-05 + -1.15934532728135E-23 1.90510034828619E-23 -1.82435119926449E-05 + 1.82496722644512E-23 6.69757802226530E-23 -1.93068569886447E-05 + 8.88702170611659E-23 -4.99927282711736E-23 -1.97331217072005E-05 + -5.78767934845697E-23 -3.71714287766017E-23 -1.98931622614145E-05 + -2.24889729037854E-23 5.14402943431414E-23 -1.99462274840331E-05 + 6.21419435180462E-23 -2.74003577908190E-24 -1.99592671714597E-05 + 2.75296047615305E-24 -5.96151652406381E-24 -1.99603584460771E-05 + 1.13091099372484E-25 + 1 -1 6 8 + SCALAIRE + -22 323095 1 0 0 0 -73 0 2 + + + 323083 + FLUX + REAL*8 + 1 301 0 0 + -1.06628750836914E-25 -3.67241024039288E-09 1.06628750836914E-25 + 3.67241024039353E-09 2.78082935421269E-25 -3.67241024039296E-09 + 5.21228799072110E-25 -1.05417060486494E-25 -3.67241024039340E-09 + 1.05215112094758E-25 7.83559759937927E-26 -3.67241024039277E-09 + -7.81540276020561E-26 -6.34117950052858E-26 -3.67241024039298E-09 + -1.44191151699917E-25 -7.79520792103195E-26 -3.67241024039311E-09 + -2.15276985591193E-25 1.09052131537753E-26 -3.67241024039298E-09 + -1.89023694665438E-25 -1.73069771718248E-25 -3.67241024039352E-09 + -2.11238017756462E-25 2.53041334845934E-25 -3.67241024039297E-09 + -5.16987882845642E-26 -2.72630328844382E-25 -3.67241024039340E-09 + -1.14504738114640E-25 -2.19517901817661E-25 -3.67241024039405E-09 + -7.37111629838513E-26 -1.49845706668542E-25 -3.67241024039342E-09 + -3.37253814200087E-25 2.48396521835992E-25 -3.67241024039254E-09 + 4.50344913572571E-26 2.15680882374666E-25 -3.67241024039333E-09 + -1.57519745554532E-26 -7.27014210251684E-27 -3.67241024039288E-09 + -9.41079505492458E-26 -3.77643492547403E-26 -3.67241024039332E-09 + 3.77643492547403E-26 3.93799363886329E-26 -3.67241024039320E-09 + -3.93799363886329E-26 -1.28439177144464E-25 -3.67241024039330E-09 + -6.45830956773580E-25 1.55702210028902E-25 -3.67241024039314E-09 + -1.55904158420639E-25 1.58327539121478E-25 -3.67241024039337E-09 + 6.03825691292371E-26 2.77679038637796E-25 -3.67241024039315E-09 + -1.66809371574414E-25 -1.92860714108433E-25 -3.67241024039309E-09 + 8.05774083028950E-26 -3.91779879968963E-26 -3.67241024039317E-09 + 3.32810949581882E-25 2.08006843488676E-26 -3.67241024039348E-09 + 2.72630328844382E-25 -5.52328851399544E-25 -3.67241024039310E-09 + -7.98503940926433E-25 -1.02589783002182E-25 -3.67241024039362E-09 + -1.59539229471897E-26 -1.96899681943165E-25 -3.67241024039359E-09 + -9.65313312500848E-26 1.89831488232384E-26 -3.67241024039326E-09 + -3.12616110408224E-25 -3.03730381171815E-25 -3.67241024039258E-09 + -2.83333593606420E-25 -1.42979461349498E-25 -3.67241024039301E-09 + -5.69090567913680E-25 1.06628750836914E-25 -3.67241024039308E-09 + -6.58351757061248E-26 -3.11000523274332E-26 -3.67241024039330E-09 + -9.69352280335579E-26 -1.49441809885068E-25 -3.67241024039309E-09 + -1.44191151699917E-25 -2.20123746992871E-25 -3.67241024039329E-09 + -2.04371772437418E-25 -1.45200893658600E-25 -3.67241024039355E-09 + -2.80910212905581E-25 -1.66001578007468E-25 -3.67241024039295E-09 + 3.17058975026429E-26 2.34664031197905E-25 -3.67241024039333E-09 + 5.10323585918335E-25 -1.08446286362543E-25 -3.67241024039309E-09 + -4.82656656250424E-26 -1.36921009597401E-25 -3.67241024039321E-09 + 1.36719061205664E-25 -5.08909947176179E-26 -3.67241024039339E-09 + -2.29817269796227E-25 6.84605047987003E-26 -3.67241024039329E-09 + 2.25172456786286E-25 -1.23592415742786E-25 -3.67241024039367E-09 + -1.95889939984482E-26 -8.44144277458900E-26 -3.67241024039350E-09 + 2.33048444064012E-25 9.73391248170311E-26 -3.67241024039335E-09 + -9.71371764252945E-26 2.42035147496290E-25 -3.67241024039338E-09 + 3.45129801477814E-25 -8.94631375393045E-26 -3.67241024039342E-09 + -5.45260657688763E-26 1.13595970351826E-25 -3.67241024039307E-09 + 3.75624008630037E-26 3.88750654092915E-26 -3.67241024039328E-09 + 2.54858870371563E-25 -1.34901525680035E-25 -3.67241024039315E-09 + -3.12818058799961E-25 8.18900728491828E-26 -3.67241024039368E-09 + 1.93668507675379E-25 -6.05845175209737E-27 -3.67241024039342E-09 + 6.05845175209737E-27 -1.15413505877455E-25 -3.67241024039328E-09 + 1.15312531681587E-25 -1.97404552922506E-25 -3.67241024039338E-09 + -9.62284086624799E-26 -1.05518034682363E-25 -3.67241024039358E-09 + 1.05619008878231E-25 2.08612688663886E-25 -3.67241024039372E-09 + -4.51354655531254E-26 -1.71656132976092E-25 -3.67241024039303E-09 + -2.50416005753358E-25 1.66203526399205E-25 -3.67241024039351E-09 + -3.92789621927646E-26 -5.14968398928277E-27 -3.67241024039352E-09 + 1.30458661061830E-25 2.64552393174919E-26 -3.67241024039318E-09 + -1.96192862572087E-25 -9.89547119509237E-26 -3.67241024039371E-09 + -2.32240650497066E-26 6.98741435408563E-26 -3.67241024039294E-09 + 1.02993679785655E-25 1.25208002876679E-26 -3.67241024039304E-09 + -1.31771325608118E-25 1.30458661061830E-25 -3.67241024039309E-09 + -1.28237228752728E-26 -9.22904150236166E-26 -3.67241024039328E-09 + 3.85721428216866E-25 5.46270399647446E-26 -3.67241024039307E-09 + 5.98776981498957E-26 -2.33250392455749E-26 -3.67241024039285E-09 + 2.33250392455749E-26 1.41161925823869E-25 -3.67241024039374E-09 + 1.52471035761117E-25 1.86095442985258E-25 -3.67241024039183E-09 + 2.17397443704427E-25 -5.35163238101934E-27 -3.67241024040013E-09 + 1.13696944547694E-25 2.20527643776344E-25 -3.67241024036626E-09 + 7.30043436127733E-26 2.43953657217787E-25 -3.67241024050241E-09 + 4.96793043671984E-26 1.11677460630328E-25 -3.67241023994561E-09 + 2.67985515834440E-25 1.47321351771834E-25 -3.67241024221549E-09 + -5.04870979341448E-28 -2.18205237271374E-25 -3.67241023300174E-09 + -2.22042256714369E-25 1.61558713389263E-27 -3.67241027023173E-09 + -1.48331093730517E-25 1.39647312885844E-25 -3.67241012057040E-09 + 2.03261056282867E-25 -1.29347944907279E-25 -3.67241071869039E-09 + -1.64285016677707E-25 1.89124668861306E-25 -3.67240834440596E-09 + 2.51122825124436E-25 -2.19315953425925E-25 -3.67241769497842E-09 + -1.67011319966151E-25 5.33143754184569E-26 -3.67238121542601E-09 + 2.32240650497066E-27 -6.66429692730711E-26 -3.67252191540260E-09 + -1.37324906380874E-25 -2.07703920901072E-25 -3.67198689341817E-09 + -1.15413505877455E-25 -1.34396654700693E-25 -3.67398479101008E-09 + -9.89547119509237E-26 -6.09884143044469E-26 -3.66670167477851E-09 + 3.76633750588720E-26 1.38637570927161E-25 -3.69237884649335E-09 + 9.17855440442752E-26 7.06819371078027E-28 -3.60631339505549E-09 + -7.06819371078027E-28 4.12984461101304E-26 -3.87214898067419E-09 + 2.54454973588090E-26 -1.81551604171185E-25 -3.18477037194116E-09 + -1.89528565644779E-25 3.16049233067746E-26 -4.27913275502452E-09 + 4.00867557597109E-26 -1.09698366391310E-24 -1.70308071332777E-06 + 1.09617587034615E-24 2.71418638493962E-24 -8.28937201405086E-06 + -2.71418638493962E-24 1.16968508493827E-23 -1.38170743729813E-05 + 2.93390623514902E-24 6.85008944770476E-24 -1.68883280063703E-05 + -4.89070537171978E-23 -1.25886549472914E-23 -1.83295843332460E-05 + 4.59343733908353E-23 -1.73449434694713E-23 -1.89586559438941E-05 + -2.79690444619492E-23 -2.66507253606929E-23 -1.92212312789595E-05 + 1.13220346343196E-23 -5.70754622661589E-23 -1.93239142361664E-05 + -6.95607196368812E-23 5.96604016803871E-23 -1.93590336395289E-05 + 6.54765153624006E-23 -1.88829824209371E-23 -1.93678253171371E-05 + -2.56296742920727E-23 -3.78047389330876E-24 -1.93685666714608E-05 + 1.61235595962485E-24 + 1 -1 6 8 + SCALAIRE + -22 322915 1 0 0 0 -74 0 2 + + + 322897 + FLUX + REAL*8 + 1 301 0 0 + -2.13459450065564E-25 -3.67241024039266E-09 -2.01948391736579E-28 + 3.67241024039396E-09 -2.92421271234566E-25 -3.67241024039341E-09 + -2.94642703543669E-25 1.95687991592745E-25 -3.67241024039320E-09 + 1.47422325967703E-26 7.81540276020561E-26 -3.67241024039341E-09 + 1.30862557845303E-25 -1.55298313245429E-25 -3.67241024039320E-09 + -2.24364663219339E-25 2.20527643776344E-25 -3.67241024039397E-09 + -2.20527643776344E-25 -1.80339913820765E-25 -3.67241024039343E-09 + -2.91411529275884E-25 -1.73069771718248E-25 -3.67241024039330E-09 + -2.11238017756462E-25 1.52471035761117E-25 -3.67241024039232E-09 + -1.52269087369381E-25 1.16928118815479E-25 -3.67241024039351E-09 + -1.16524222032006E-25 -2.19517901817661E-25 -3.67241024039351E-09 + -7.37111629838513E-26 -1.51057397018961E-25 -3.67241024039356E-09 + -1.42575564566025E-25 4.44690358603947E-25 -3.67241024039286E-09 + 2.40520534558266E-25 2.12449708106881E-25 -3.67241024039374E-09 + 8.11832534781048E-26 2.86160871090732E-25 -3.67241024039364E-09 + -1.95687991592745E-25 -1.40959977432132E-25 -3.67241024039321E-09 + 1.40556080648659E-25 1.30660609453567E-25 -3.67241024039320E-09 + 5.83630852118713E-26 6.70468660565442E-26 -3.67241024039298E-09 + -3.60679827641530E-25 -2.25576353569759E-25 -3.67241024039382E-09 + -2.53647180021143E-25 1.52471035761117E-25 -3.67241024039326E-09 + 4.34592939017118E-25 1.79734068645555E-25 -3.67241024039310E-09 + -6.90663499739100E-26 2.12853604890354E-25 -3.67241024039297E-09 + 8.05774083028950E-26 -3.91779879968963E-26 -3.67241024039299E-09 + 1.52874932544590E-25 3.14231697542117E-25 -3.67241024039315E-09 + 4.50950758747781E-25 -2.68389412617914E-25 -3.67241024039329E-09 + -3.18876510552058E-25 -1.49441809885068E-26 -3.67241024039308E-09 + 1.49441809885068E-26 -2.08006843488676E-25 -3.67241024039346E-09 + -8.56261180963095E-26 9.30982085905629E-26 -3.67241024039298E-09 + -2.14873088807720E-25 1.34497628896562E-25 -3.67241024039285E-09 + 1.58933384296688E-25 -1.15918376856796E-25 -3.67241024039356E-09 + 1.16120325248533E-25 1.06628750836914E-25 -3.67241024039304E-09 + -6.58351757061248E-26 -1.00974195868290E-27 -3.67241024039287E-09 + -2.92623219626303E-25 4.64481300994132E-26 -3.67241024039345E-09 + -4.62461817076766E-26 -2.20325695384608E-25 -3.67241024039339E-09 + -2.04371772437418E-25 2.46175089526890E-25 -3.67241024039312E-09 + -1.13696944547694E-25 -6.80566080152271E-26 -3.67241024039284E-09 + 2.02150340128316E-25 3.89760396051598E-26 -3.67241024039350E-09 + 3.90164292835071E-25 -1.08244337970806E-25 -3.67241024039341E-09 + 2.45367295959944E-25 -3.89760396051598E-26 -3.67241024039301E-09 + 5.51319109440861E-26 6.82585564069637E-26 -3.67241024039312E-09 + 3.78653234506086E-25 -5.14968398928277E-26 -3.67241024039313E-09 + -9.04728794979874E-26 1.17533963990689E-25 -3.67241024039322E-09 + 1.76098997594297E-25 1.11273563846855E-25 -3.67241024039307E-09 + 3.30993414056253E-25 -4.92754075837253E-26 -3.67241024039314E-09 + -3.90770138010280E-25 9.39060021575092E-26 -3.67241024039300E-09 + 1.99625985231608E-25 6.00796465416323E-26 -3.67241024039357E-09 + 2.38904947424373E-25 4.23081880688133E-26 -3.67241024039340E-09 + 1.08749208950148E-25 -1.56913900379322E-25 -3.67241024039339E-09 + -1.36618087009796E-25 4.74578720580961E-26 -3.67241024039271E-09 + 1.06729725032782E-25 3.35537252870326E-25 -3.67241024039339E-09 + 2.51728670299646E-25 3.23117426778526E-26 -3.67241024039325E-09 + -5.34153496143252E-26 1.04609266919548E-25 -3.67241024039339E-09 + -8.03754599111585E-26 -1.62164558564473E-25 -3.67241024039316E-09 + -1.31468403020513E-25 -7.57306469012171E-27 -3.67241024039347E-09 + 7.77501308185829E-27 -8.56261180963095E-26 -3.67241024039329E-09 + -7.78511050144512E-26 -1.04407318527811E-25 -3.67241024039331E-09 + -2.40318586166529E-26 -9.28962601988264E-26 -3.67241024039328E-09 + 9.28962601988264E-26 -1.73271720109985E-25 -3.67241024039328E-09 + 5.14968398928277E-27 -9.73391248170311E-26 -3.67241024039317E-09 + 2.67177722267494E-25 1.82157449346394E-25 -3.67241024039337E-09 + 2.33654289239222E-25 6.98741435408563E-26 -3.67241024039283E-09 + 1.02993679785655E-25 1.31569377216381E-25 -3.67241024039304E-09 + -1.31771325608118E-25 9.13816472608020E-26 -3.67241024039318E-09 + 2.62532909257553E-26 -2.66268954504679E-25 -3.67241024039327E-09 + -1.43383358132971E-25 -3.12818058799961E-25 -3.67241024039350E-09 + -2.74245915978274E-25 -1.62568455347946E-25 -3.67241024039328E-09 + -1.80743810604238E-26 -1.23794364134523E-25 -3.67241024039418E-09 + -2.81112161297318E-25 -9.59254860748750E-27 -3.67241024039017E-09 + -1.74079513676931E-25 -6.99751177367246E-26 -3.67241024040621E-09 + -2.23556869652393E-25 1.58529487513215E-26 -3.67241024033184E-09 + -1.59539229471897E-26 -2.00029882015082E-25 -3.67241024067214E-09 + -3.87034092763154E-25 6.56332273143882E-26 -3.67241023912656E-09 + 1.24198260917996E-25 4.72559236663595E-26 -3.67241024612763E-09 + -2.52435489670724E-27 2.49406263794675E-26 -3.67241021451625E-09 + -1.25510925464284E-25 1.48936938905727E-25 -3.67241035681707E-09 + -9.76420474046360E-26 -5.64445754903738E-26 -3.67240971801033E-09 + -1.39647312885844E-25 -8.13852018698413E-26 -3.67241257848886E-09 + -6.54312789226516E-26 -1.02690757198050E-25 -3.67239979925296E-09 + -1.90942204386935E-25 2.28201682662334E-26 -3.67245676938233E-09 + -2.28201682662334E-26 4.33179300274962E-26 -3.67220329428053E-09 + -4.33179300274962E-26 7.61345436846903E-26 -3.67332902047773E-09 + -1.33184964350274E-25 -7.16916790664856E-27 -3.66833799748444E-09 + -1.69131778079385E-25 9.34011311781678E-26 -3.69043237250492E-09 + 2.86665742070074E-25 -1.89831488232384E-26 -3.59278934569882E-09 + 8.05774083028950E-26 -1.24198260917996E-26 -4.02411894015268E-09 + 9.58245118790067E-26 -9.48147699203239E-26 -2.12899188816421E-09 + -1.15110583289850E-25 1.64587939265312E-26 -1.06040100329596E-08 + 6.39166659846273E-26 1.15766915562994E-25 2.47757728731998E-08 + 7.42160339631928E-26 -8.27988406119974E-25 -5.29319265901949E-07 + -4.76598204498326E-25 4.68520268828863E-24 -5.80759890841139E-06 + -4.68520268828863E-24 -1.77973078669612E-23 -1.19788991956802E-05 + -1.82625969615223E-23 4.03250548619601E-24 -1.56808927965243E-05 + -1.27179019180028E-23 -5.97121004686717E-24 -1.74868094137154E-05 + 5.99705944100945E-24 -7.33605805757966E-23 -1.83017529352925E-05 + -8.90253134260196E-23 3.48449833037963E-23 -1.86586083909881E-05 + 6.66138887046610E-23 -6.71825753757912E-23 -1.88103486194971E-05 + -1.33382873774176E-23 2.85635805272217E-23 -1.88711001879951E-05 + 3.75333202945936E-23 -5.87556728854072E-23 -1.88924337160956E-05 + -8.45275188452625E-23 -1.04431552334820E-23 -1.88979314879779E-05 + 1.04560799305531E-23 3.48320586067251E-24 -1.88984064073565E-05 + 6.46557970983831E-24 + 1 -1 6 8 + SCALAIRE + -22 322171 1 0 0 0 -75 0 2 + + + 322123 + FLUX + REAL*8 + 1 301 0 0 + -3.91174034793754E-25 -3.67241024039309E-09 -5.69292516305416E-25 + 3.67241024039374E-09 -9.69352280335579E-26 -3.67241024039296E-09 + -6.58351757061248E-26 9.04728794979874E-26 -3.67241024039342E-09 + -9.02709311062508E-26 -3.95818847803695E-26 -3.67241024039407E-09 + 3.97838331721061E-26 -6.34117950052858E-26 -3.67241024039342E-09 + -1.44191151699917E-25 -2.68591361009650E-25 -3.67241024039384E-09 + -1.12283305805538E-25 2.22143230910237E-27 -3.67241024039376E-09 + -2.22143230910237E-27 -1.76704842769507E-25 -3.67241024039343E-09 + -1.16928118815479E-25 -1.38334648339557E-25 -3.67241024039297E-09 + -4.60442333159400E-26 1.16928118815479E-25 -3.67241024039351E-09 + -1.16524222032006E-25 -2.19517901817661E-25 -3.67241024039383E-09 + -7.37111629838513E-26 4.35602680975801E-25 -3.67241024039353E-09 + 4.45094255387420E-25 1.51057397018961E-25 -3.67241024039329E-09 + 1.42373616174288E-25 1.16726170423743E-25 -3.67241024039375E-09 + -1.16726170423743E-25 -1.11071615455118E-26 -3.67241024039353E-09 + -1.91850972149750E-25 5.73533432531884E-26 -3.67241024039344E-09 + -3.50986304838174E-25 3.93799363886329E-26 -3.67241024039277E-09 + -3.93799363886329E-26 -3.06961555439600E-26 -3.67241024039289E-09 + -1.56711951987585E-25 -2.30625063363173E-25 -3.67241024039355E-09 + 1.52672984152854E-25 -3.75624008630037E-26 -3.67241024039332E-09 + -3.75624008630037E-26 1.66809371574414E-25 -3.67241024039348E-09 + 1.57519745554532E-26 -2.61927064082343E-25 -3.67241024039316E-09 + -2.12853604890354E-25 3.47351233786916E-26 -3.67241024039331E-09 + -3.28166136571941E-25 2.08006843488676E-26 -3.67241024039304E-09 + 2.72630328844382E-25 2.40116637774792E-25 -3.67241024039292E-09 + 1.70444442625673E-25 -2.87776458224625E-25 -3.67241024039308E-09 + -2.99287516553610E-25 -2.34260134414432E-26 -3.67241024039363E-09 + -3.90164292835071E-25 1.89831488232384E-26 -3.67241024039348E-09 + -3.12616110408224E-25 6.19981562631298E-26 -3.67241024039274E-09 + 1.08244337970806E-25 7.95676663442121E-26 -3.67241024039341E-09 + -7.97696147359487E-26 2.30221166579700E-26 -3.67241024039320E-09 + -1.49441809885068E-25 -1.00974195868290E-27 -3.67241024039287E-09 + -2.92623219626303E-25 -1.49441809885068E-25 -3.67241024039352E-09 + -1.44191151699917E-25 -8.92611891475679E-26 -3.67241024039339E-09 + -2.04371772437418E-25 1.65597681223995E-25 -3.67241024039377E-09 + 1.27833331969255E-25 -1.66001578007468E-25 -3.67241024039274E-09 + 3.17058975026429E-26 -1.75695100810824E-26 -3.67241024039323E-09 + 3.33416794757092E-25 -3.00903103687503E-26 -3.67241024039331E-09 + 3.00903103687503E-26 -1.57317797162795E-25 -3.67241024039322E-09 + 3.12010265233015E-25 2.63744599607972E-25 -3.67241024039328E-09 + 2.96864135852771E-26 2.42136121692158E-25 -3.67241024039317E-09 + 5.12948915010911E-26 9.49157441161921E-26 -3.67241024039375E-09 + 1.98919165860530E-25 -1.35103474071771E-25 -3.67241024039332E-09 + 1.35305422463508E-25 -6.05845175209737E-28 -3.67241024039318E-09 + 6.05845175209737E-28 1.69232752275253E-25 -3.67241024039342E-09 + 2.72327406256777E-25 -8.94631375393045E-26 -3.67241024039363E-09 + -5.45260657688763E-26 4.23081880688133E-26 -3.67241024039361E-09 + 1.08749208950148E-25 -5.90699045829494E-26 -3.67241024039349E-09 + -8.17890986533145E-26 1.17130067207216E-25 -3.67241024039264E-09 + 3.30690491468648E-25 1.29246970711411E-26 -3.67241024039329E-09 + 1.24804106093206E-25 -1.72060029759565E-25 -3.67241024039317E-09 + -1.21471957629552E-25 -1.74685358852141E-26 -3.67241024039314E-09 + 1.74685358852141E-26 -1.66102552203336E-25 -3.67241024039339E-09 + 3.29175878530624E-26 -4.12984461101304E-26 -3.67241024039371E-09 + -9.01699569103825E-26 -8.56261180963095E-26 -3.67241024039329E-09 + -7.78511050144512E-26 9.12806730649337E-26 -3.67241024039304E-09 + 7.39131113755879E-26 -1.90841230191067E-25 -3.67241024039362E-09 + 1.90841230191067E-25 -1.30357686865962E-25 -3.67241024039326E-09 + -1.20159293083265E-25 4.03896783473158E-28 -3.67241024039339E-09 + 1.69232752275253E-25 2.80203393534503E-25 -3.67241024039360E-09 + -3.54419427497696E-26 1.53076880936327E-25 -3.67241024039286E-09 + -3.23117426778526E-26 9.34011311781678E-26 -3.67241024039306E-09 + 2.57484199464138E-26 -6.52293305309150E-26 -3.67241024039321E-09 + 1.82864268717472E-25 1.43383358132971E-25 -3.67241024039316E-09 + 1.50249603452015E-25 -1.17130067207216E-25 -3.67241024039294E-09 + 2.62532909257553E-27 -2.34058186022695E-25 -3.67241024039429E-09 + -3.52904814559672E-25 1.41161925823869E-25 -3.67241024038932E-09 + -2.97873877811454E-26 -9.55215892914019E-26 -3.67241024041112E-09 + -3.81783434578003E-25 9.24923634153532E-26 -3.67241024031789E-09 + -9.23913892194849E-26 -2.85756974307259E-26 -3.67241024071875E-09 + -1.58226564925610E-25 -8.74436536219387E-26 -3.67241023898999E-09 + 4.34189042233645E-27 7.14897306747490E-26 -3.67241024642919E-09 + 1.18341757557635E-25 -4.62461817076766E-26 -3.67241021445703E-09 + 4.62461817076766E-26 2.22042256714369E-25 -3.67241035173176E-09 + 1.17735912382426E-25 -9.57235376831385E-26 -3.67240976292330E-09 + 2.01948391736579E-28 1.88720772077833E-25 -3.67241228591498E-09 + -9.00689827145142E-26 6.64410208813345E-26 -3.67240148630648E-09 + 8.03754599111585E-26 8.77465762095436E-26 -3.67244766498289E-09 + 6.46234853557053E-27 -2.61523167298870E-26 -3.67225042056438E-09 + -2.78688780596479E-26 -2.53546205825275E-25 -3.67309198072820E-09 + -1.51057397018961E-25 9.23913892194849E-26 -3.66950555093795E-09 + 5.44250915730080E-26 1.34901525680035E-25 -3.68477191885339E-09 + 1.58630461709083E-25 -4.25101364605499E-26 -3.61987798016023E-09 + 4.25101364605499E-26 -3.59468137291111E-26 -3.89554067850580E-09 + -1.10970641259250E-25 -5.98776981498957E-26 -2.72924382412303E-09 + 5.99786723457640E-26 -3.73604524712671E-26 -7.71363301018465E-09 + -2.60917322123660E-25 -5.96757497581591E-26 1.26613011808582E-08 + -1.59438255276029E-25 8.60300148797827E-26 -1.00650861534201E-07 + 7.06819371078027E-26 -3.95818847803695E-25 -3.37618415512387E-06 + -1.56227275847418E-24 -9.94555439624304E-24 -9.87864129022174E-06 + -6.17154285146985E-24 -3.19498511598607E-23 -1.43085331856003E-05 + -1.86115637824431E-23 1.69313531631948E-23 -1.66011565380491E-05 + -1.69055037690525E-23 -9.15844034461055E-23 -1.76706025932332E-05 + -1.58198292150767E-23 -5.54986492234797E-23 -1.81553546586637E-05 + 5.54727998293374E-23 4.34528315531762E-23 -1.83723150365528E-05 + 1.16580767581692E-23 -6.36153589841563E-23 -1.84669084631304E-05 + -2.48929665590177E-23 5.24742701088327E-24 -1.85056653765262E-05 + 8.34935430795712E-24 -8.40105309624169E-25 -1.85195466602756E-05 + -7.23783035983899E-25 -2.10801809230311E-23 -1.85231818848799E-05 + -1.29246970711411E-24 2.07247517535747E-23 -1.85234992186534E-05 + 1.91964063249123E-23 + 1 -1 6 8 + SCALAIRE + -22 321949 1 0 0 0 -76 0 2 + + + 321937 + FLUX + REAL*8 + 1 301 0 0 + -8.86553439723582E-26 -3.67241024039332E-09 8.86553439723582E-26 + 3.67241024039397E-09 3.67748021352310E-25 -3.67241024039297E-09 + 2.19517901817661E-25 2.86160871090732E-25 -3.67241024039319E-09 + 3.01105052079239E-25 7.81540276020561E-26 -3.67241024039320E-09 + 1.30862557845303E-25 -1.55298313245429E-25 -3.67241024039320E-09 + -2.24364663219339E-25 1.45402842050337E-26 -3.67241024039342E-09 + 3.66536331001891E-25 3.04538174738761E-25 -3.67241024039299E-09 + 1.04407318527811E-25 -7.87598727772658E-26 -3.67241024039354E-09 + 1.69232752275253E-25 4.88715108002521E-26 -3.67241024039309E-09 + -3.42504472385238E-25 -1.74685358852141E-25 -3.67241024039333E-09 + -2.12449708106881E-25 -1.21774880217157E-25 -3.67241024039329E-09 + -1.71656132976092E-25 4.56403365324669E-26 -3.67241024039321E-09 + 1.50855448627225E-25 5.35163238101934E-26 -3.67241024039329E-09 + -3.47149285395179E-25 -2.73640070803065E-25 -3.67241024039372E-09 + -3.13423903975171E-25 -9.08767762814606E-27 -3.67241024039320E-09 + -1.93668507675379E-25 3.53611633930750E-25 -3.67241024039329E-09 + 2.33452340847485E-25 3.33012897973619E-25 -3.67241024039254E-09 + 6.50273821391784E-26 -1.28439177144464E-25 -3.67241024039243E-09 + -6.45830956773580E-25 6.78546596234906E-26 -3.67241024039365E-09 + 3.99857815638426E-26 -2.44761450784734E-25 -3.67241024039266E-09 + -2.33250392455749E-25 -1.26621641618835E-25 -3.67241024039353E-09 + -4.60644281551137E-25 -2.61725115690606E-25 -3.67241024039361E-09 + -1.00368350693080E-25 -3.48764872529072E-25 -3.67241024039364E-09 + -5.89689303870811E-26 -7.69423372516366E-26 -3.67241024039319E-09 + -2.16488675941613E-25 4.44286461820474E-26 -3.67241024039303E-09 + -2.20931540559817E-25 7.24994726334319E-26 -3.67241024039334E-09 + 1.02387834610446E-25 1.07638492795597E-25 -3.67241024039341E-09 + -1.60952868214053E-25 9.30982085905629E-26 -3.67241024039314E-09 + -4.28130590481548E-26 -1.33487886937879E-25 -3.67241024039334E-09 + -1.59943126255371E-25 -1.42979461349498E-25 -3.67241024039352E-09 + 1.81753552562921E-26 3.71585040795305E-26 -3.67241024039290E-09 + 2.56070560721982E-25 -9.89547119509237E-26 -3.67241024039347E-09 + -2.32644547280539E-25 -8.30007890037340E-26 -3.67241024039304E-09 + -4.69328062395810E-25 -3.01307000470976E-25 -3.67241024039361E-09 + -2.85756974307259E-25 -1.45200893658600E-25 -3.67241024039333E-09 + 1.25208002876679E-26 2.96864135852771E-26 -3.67241024039274E-09 + 1.29650867494884E-25 2.15680882374666E-25 -3.67241024039355E-09 + 7.77501308185829E-26 -2.25778301961495E-25 -3.67241024039326E-09 + -5.17795676412589E-25 -3.89760396051598E-26 -3.67241024039323E-09 + 5.51319109440861E-26 2.21537385735027E-25 -3.67241024039329E-09 + 3.78451286114349E-25 2.46377037918626E-26 -3.67241024039339E-09 + -1.66203526399205E-25 1.95889939984482E-26 -3.67241024039349E-09 + 2.73842019194801E-25 8.78475504054119E-26 -3.67241024039350E-09 + 6.09884143044469E-26 -9.83488667757140E-26 -3.67241024039333E-09 + -1.95082146417535E-25 1.69232752275253E-25 -3.67241024039332E-09 + 2.72327406256777E-25 -1.15312531681587E-25 -3.67241024039320E-09 + -1.78219455707531E-25 2.82525800039474E-25 -3.67241024039280E-09 + 4.46911790913049E-25 6.61380982937296E-26 -3.67241024039350E-09 + 2.27292914899520E-25 1.58630461709083E-25 -3.67241024039290E-09 + -1.58630461709083E-25 -1.13797918743562E-25 -3.67241024039343E-09 + 9.59254860748750E-26 6.19981562631298E-26 -3.67241024039317E-09 + -6.19981562631298E-26 1.41262900019737E-25 -3.67241024039292E-09 + 1.52269087369381E-25 -1.93365585087774E-25 -3.67241024039327E-09 + -1.00065428105475E-25 -7.67403888599000E-27 -3.67241024039350E-09 + 7.67403888599000E-27 -8.56261180963095E-26 -3.67241024039318E-09 + -7.78511050144512E-26 1.86196417181126E-25 -3.67241024039283E-09 + 2.35976695744193E-25 3.92789621927646E-26 -3.67241024039339E-09 + 8.76456020136753E-26 -5.14968398928277E-27 -3.67241024039330E-09 + 1.30458661061830E-25 9.83488667757140E-26 -3.67241024039306E-09 + 7.14897306747490E-26 -1.35305422463508E-26 -3.67241024039349E-09 + -1.57822668142137E-25 -5.14968398928277E-27 -3.67241024039329E-09 + 5.25065818515105E-27 -4.71549494704912E-26 -3.67241024039315E-09 + 2.21537385735027E-25 -1.23996312526260E-25 -3.67241024039374E-09 + -5.19007366763008E-26 -2.08309766076281E-25 -3.67241024039317E-09 + -2.01241572365501E-25 1.11879409022065E-25 -3.67241024039319E-09 + 2.52435489670724E-27 1.16019351052665E-25 -3.67241024039184E-09 + 3.58357421136559E-25 -1.10263821888172E-25 -3.67241024039837E-09 + -1.83369139696814E-25 3.33214846365355E-26 -3.67241024037210E-09 + 2.60311476948450E-25 1.25712873856020E-25 -3.67241024047737E-09 + 1.67920087728965E-25 -1.35305422463508E-25 -3.67241024005577E-09 + -1.58226564925610E-25 4.82656656250424E-26 -3.67241024173497E-09 + 2.45367295959944E-25 6.57342015102565E-26 -3.67241023510011E-09 + 1.24097286722128E-25 -5.04870979341448E-26 -3.67241026106876E-09 + -2.42943915259105E-25 -2.39308844207846E-26 -3.67241016058758E-09 + 7.01770661284612E-26 -4.79627430374375E-26 -3.67241054388886E-09 + -5.10929431093545E-26 9.01699569103825E-26 -3.67240910812809E-09 + 1.54086622895010E-25 -8.04764341070267E-26 -3.67241435744275E-09 + -2.13257501673827E-25 -5.72523690573202E-26 -3.67239580438676E-09 + -8.95641117351728E-26 -7.76491566227146E-26 -3.67245812754514E-09 + -1.23188518959313E-25 -1.42474590370157E-25 -3.67226587249112E-09 + -4.24091622646816E-27 -1.15514480073323E-25 -3.67276429984079E-09 + -8.83524213847533E-26 -6.08874401085786E-26 -3.67204256148415E-09 + 3.14029749150380E-26 -9.66323054459531E-26 -3.66899800156275E-09 + -5.00832011506716E-26 -3.73604524712671E-26 -3.70867363661401E-09 + -2.44357554001261E-26 2.43347812042578E-26 -3.42374203898481E-09 + -1.50552526039620E-25 8.98670343227777E-26 -5.15252803383940E-09 + 1.23188518959313E-25 -2.26182198744969E-26 4.20938191100619E-09 + 2.26182198744969E-26 5.17795676412589E-25 -1.41564736595331E-06 + 1.46372194330672E-24 5.53823269498394E-24 -7.51502709705433E-06 + 4.07127957740943E-25 -1.34546096510578E-23 -1.27022004617453E-05 + -3.86448442427118E-23 3.28545799548406E-23 -1.56051647397627E-05 + 6.04875822929401E-24 -7.97195315347980E-23 -1.70132529917506E-05 + -8.52771512753887E-23 3.98597657673990E-23 -1.76701491577021E-05 + 5.99964438042368E-23 -9.59012522678666E-24 -1.79744532224153E-05 + -4.53139879314205E-23 -3.83088021188621E-23 -1.81142387519693E-05 + -3.47157363330849E-23 -1.85857143883008E-23 -1.81766611461520E-05 + 5.37667398159468E-23 1.98523347012727E-23 -1.82027577838721E-05 + 5.02253728184541E-23 -3.19627758569318E-23 -1.82122577438387E-05 + -6.07073021431495E-23 -2.28637891188485E-23 -1.82147769293799E-05 + -4.89846018996246E-24 4.95015897824702E-24 -1.82149985647079E-05 + 5.05355655481615E-24 + 1 -1 6 8 + SCALAIRE + -22 321727 1 0 0 0 -77 0 2 + + + 321715 + FLUX + REAL*8 + 1 301 0 0 + 8.90592407558313E-26 -3.67241024039331E-09 1.24602157701469E-25 + 3.67241024039331E-09 -1.13494996155957E-25 -3.67241024039296E-09 + 1.13494996155957E-25 -1.20361241475001E-25 -3.67241024039364E-09 + -9.02709311062508E-26 -1.30862557845303E-25 -3.67241024039299E-09 + -7.81540276020561E-26 -5.14968398928277E-26 -3.67241024039276E-09 + -3.27964188180204E-25 -2.63340702824499E-25 -3.67241024039354E-09 + 8.84533955806216E-26 -2.22143230910237E-27 -3.67241024039331E-09 + 9.12806730649337E-26 -7.87598727772658E-26 -3.67241024039311E-09 + 1.69232752275253E-25 -2.36077669940061E-25 -3.67241024039331E-09 + -2.41732224908685E-25 2.16488675941613E-25 -3.67241024039355E-09 + 2.76871245070850E-25 -2.76669296679113E-26 -3.67241024039353E-09 + -3.68555814919257E-25 -1.50855448627225E-25 -3.67241024039366E-09 + 5.41221689854032E-26 5.29104786349837E-26 -3.67241024039285E-09 + 1.42373616174288E-25 1.87812004315018E-26 -3.67241024039318E-09 + -2.12449708106881E-25 9.04728794979874E-26 -3.67241024039353E-09 + -1.92052920541487E-25 1.55500261637166E-25 -3.67241024039310E-09 + -1.55298313245429E-25 2.25172456786286E-25 -3.67241024039307E-09 + 2.57282251072402E-25 6.70468660565442E-26 -3.67241024039266E-09 + -3.60679827641530E-25 -2.35673773156588E-25 -3.67241024039346E-09 + -2.43953657217787E-25 -3.75624008630037E-26 -3.67241024039375E-09 + -3.75624008630037E-26 -1.59539229471897E-26 -3.67241024039342E-09 + -4.60442333159400E-25 9.89547119509237E-27 -3.67241024039329E-09 + -1.91245126974540E-25 -1.44998945266864E-25 -3.67241024039316E-09 + -3.28368084963677E-25 -1.66001578007468E-25 -3.67241024039372E-09 + 1.66203526399205E-25 -3.46947337003443E-25 -3.67241024039328E-09 + -7.10252493737548E-25 -1.90235385015857E-25 -3.67241024039311E-09 + 4.83464449817370E-25 9.65313312500848E-26 -3.67241024039308E-09 + 2.36279618331797E-26 -2.12247759715145E-25 -3.67241024039320E-09 + -3.24531065520682E-25 -1.46210635617283E-25 -3.67241024039334E-09 + -1.47220377575966E-25 -4.50344913572571E-26 -3.67241024039369E-09 + 3.38465504550506E-25 -8.90592407558313E-26 -3.67241024039325E-09 + -1.63780145698366E-25 -6.86624531904369E-26 -3.67241024039313E-09 + 3.24329117128946E-25 -1.64991836048785E-25 -3.67241024039352E-09 + -2.57888096247611E-25 -1.05820957269967E-25 -3.67241024039324E-09 + -1.87812004315018E-25 -2.77679038637796E-25 -3.67241024039289E-09 + -4.42065029511371E-25 -1.65799629615731E-25 -3.67241024039360E-09 + -2.87170613049415E-25 1.99928907819213E-26 -3.67241024039339E-09 + -1.55702210028902E-25 3.02720639213132E-25 -3.67241024039358E-09 + 2.65158238350128E-25 9.99644539096066E-26 -3.67241024039306E-09 + 3.48764872529072E-25 4.70539752746229E-26 -3.67241024039306E-09 + 2.59503683381504E-25 -1.49441809885068E-25 -3.67241024039355E-09 + -1.44191151699917E-25 -4.84676140167790E-26 -3.67241024039307E-09 + -9.47137957244556E-26 -2.05785411179574E-25 -3.67241024039322E-09 + -3.81278563598661E-25 2.36279618331797E-26 -3.67241024039350E-09 + -1.70646391017409E-25 -1.49441809885068E-25 -3.67241024039332E-09 + 3.93799363886329E-27 8.38085825706803E-27 -3.67241024039331E-09 + 1.41161925823869E-25 4.24091622646816E-26 -3.67241024039343E-09 + 2.51223799320304E-25 -1.29549893299015E-25 -3.67241024039310E-09 + -1.64184042481839E-25 -6.52293305309150E-26 -3.67241024039323E-09 + 5.03861237382765E-26 4.19042912853401E-26 -3.67241024039340E-09 + -4.19042912853401E-26 -6.05845175209737E-27 -3.67241024039315E-09 + 1.42373616174288E-25 -1.21673906021289E-25 -3.67241024039347E-09 + -1.31266454628776E-26 6.49264079433102E-26 -3.67241024039305E-09 + -6.49264079433102E-26 2.44357554001261E-26 -3.67241024039314E-09 + 1.07133621816255E-25 -5.21026850680374E-26 -3.67241024039352E-09 + -7.79520792103195E-26 1.21875854413025E-25 -3.67241024039297E-09 + 1.71656132976092E-25 -2.94844651935405E-26 -3.67241024039341E-09 + -1.00974195868290E-26 -5.14968398928277E-27 -3.67241024039352E-09 + 1.30458661061830E-25 -1.59135332688424E-25 -3.67241024039304E-09 + -1.34295680504825E-25 3.55429169456379E-26 -3.67241024039306E-09 + -3.56438911415062E-26 1.07234596012123E-25 -3.67241024039261E-09 + 6.55322531185199E-26 1.31670351412250E-25 -3.67241024039304E-09 + 1.61962610172736E-25 3.26146652654575E-26 -3.67241024039353E-09 + -2.08612688663886E-25 -1.26217744835362E-26 -3.67241024039306E-09 + -1.03599524960865E-25 -8.38085825706803E-26 -3.67241024039416E-09 + 1.92860714108433E-26 1.80743810604238E-26 -3.67241024038976E-09 + -1.79734068645555E-26 -1.52370061565249E-25 -3.67241024040874E-09 + -3.23319375170263E-25 -6.45225111598370E-26 -3.67241024032398E-09 + -4.52364397489937E-26 -1.57418771358663E-25 -3.67241024070688E-09 + -2.78688780596479E-26 1.22683647979972E-25 -3.67241023898450E-09 + 1.70949313605014E-25 1.46210635617283E-25 -3.67241024670657E-09 + 4.22072138729450E-26 1.96899681943165E-26 -3.67241021216743E-09 + -1.96899681943165E-26 1.00469324888948E-25 -3.67241036629365E-09 + 4.62461817076766E-26 2.50416005753358E-26 -3.67240968006121E-09 + 2.12045811323408E-26 -9.80459441881091E-26 -3.67241272907087E-09 + -1.47725248555308E-25 1.39344390298240E-25 -3.67239920851796E-09 + 5.66465238821104E-26 -3.24127168737209E-26 -3.67245905333379E-09 + -1.14302789722904E-25 -5.72523690573202E-26 -3.67219463136957E-09 + 4.74578720580961E-27 -2.11036069364725E-26 -3.67336102911222E-09 + -7.16916790664856E-26 -5.12948915010911E-26 -3.66822412598072E-09 + -1.51057397018961E-25 8.83524213847533E-26 -3.69081425509343E-09 + 1.15514480073323E-25 -6.67439434689394E-26 -3.59163832889835E-09 + -7.99715631276853E-26 6.36137433970224E-26 -4.02685766887640E-09 + -3.33214846365355E-27 3.70575298836623E-26 -2.12758930404420E-09 + 4.80637172333058E-26 -1.26722615814703E-25 -1.05669531351905E-08 + -1.07537518599728E-25 -3.72594782753988E-26 2.44028666277002E-08 + -9.71371764252945E-26 1.43787254916444E-25 -3.55567622349283E-07 + -1.43787254916444E-25 -1.88054342385102E-24 -4.98138494292076E-06 + -1.70929118765840E-24 -2.36263462460459E-23 -1.08450822193204E-05 + -2.18039639590150E-23 -2.34970992753344E-23 -1.44560557198934E-05 + -7.23783035983899E-24 7.02586532787228E-23 -1.62947009153702E-05 + 1.39379933215185E-22 2.38848401874687E-23 -1.71758381229689E-05 + 5.04063185774501E-23 5.33531495096703E-23 -1.75941360872711E-05 + 1.04069660816828E-22 4.10488378979440E-23 -1.77928203206775E-05 + 7.12926290444141E-23 2.66248759665506E-23 -1.78863175128531E-05 + 3.51293266393614E-23 4.49262470192863E-23 -1.79289491078582E-05 + 2.22821777506472E-23 -4.90363006879092E-23 -1.79470832766236E-05 + -2.25665210862123E-23 -1.54320883029424E-23 -1.79537785986010E-05 + -4.03638289531735E-23 1.23301610058686E-23 -1.79555741694020E-05 + 7.14735748034100E-24 5.87750599310140E-24 -1.79557332960063E-05 + 1.12541799746961E-23 + 1 -1 6 8 + SCALAIRE + -22 321541 1 0 0 0 -78 0 2 + + + 321511 + FLUX + REAL*8 + 1 301 0 0 + -3.91174034793754E-25 -3.67241024039354E-09 1.77714584728190E-26 + 3.67241024039354E-09 -2.38299102249163E-26 -3.67241024039318E-09 + 2.38299102249163E-26 1.95687991592745E-25 -3.67241024039298E-09 + 1.47422325967703E-26 -3.97838331721061E-26 -3.67241024039320E-09 + 3.97838331721061E-26 -5.14968398928277E-26 -3.67241024039343E-09 + 5.14968398928277E-26 1.47422325967703E-26 -3.67241024039354E-09 + -1.47422325967703E-26 9.99644539096066E-26 -3.67241024039310E-09 + -1.89225643057175E-25 -1.83974984872023E-25 -3.67241024039300E-09 + -4.03290938297948E-25 -2.36077669940061E-25 -3.67241024039321E-09 + -2.41732224908685E-25 2.18710108250715E-25 -3.67241024039332E-09 + 2.74851761153484E-25 7.00760919325929E-26 -3.67241024039319E-09 + -1.73069771718248E-25 4.48325429655205E-26 -3.67241024039334E-09 + -3.38263556158770E-25 1.51057397018961E-25 -3.67241024039253E-09 + -1.51057397018961E-25 1.16726170423743E-25 -3.67241024039351E-09 + -3.10192729707385E-25 9.04728794979874E-26 -3.67241024039288E-09 + -1.92052920541487E-25 1.55500261637166E-25 -3.67241024039310E-09 + -1.55298313245429E-25 -1.59539229471897E-25 -3.67241024039330E-09 + 1.59741177863634E-25 -1.20159293083265E-25 -3.67241024039320E-09 + 3.91779879968963E-26 -2.30625063363173E-25 -3.67241024039344E-09 + 1.52672984152854E-25 1.58125590729741E-25 -3.67241024039330E-09 + -4.90734591919887E-26 -1.13696944547694E-25 -3.67241024039296E-09 + -6.90663499739100E-26 4.15811738585616E-25 -3.67241024039306E-09 + -9.89547119509237E-27 -3.91779879968963E-26 -3.67241024039339E-09 + 3.32810949581882E-25 -7.71442856433732E-26 -3.67241024039337E-09 + -3.83701944299500E-26 -3.66132434218418E-25 -3.67241024039316E-09 + -3.97636383329324E-25 -1.51461293802434E-26 -3.67241024039320E-09 + -1.03801473352602E-25 -1.21169035041947E-27 -3.67241024039318E-09 + -1.72261978151302E-25 1.16928118815479E-25 -3.67241024039331E-09 + -2.38702999032636E-25 -4.01675351164056E-25 -3.67241024039334E-09 + -3.55833066239852E-25 -1.29448919103147E-25 -3.67241024039351E-09 + -1.64184042481839E-25 2.18710108250715E-25 -3.67241024039286E-09 + -5.14968398928277E-26 -6.86624531904369E-26 -3.67241024039323E-09 + 3.24329117128946E-25 1.44191151699917E-25 -3.67241024039302E-09 + -1.44191151699917E-25 -2.44357554001261E-26 -3.67241024039319E-09 + -2.68995257793123E-25 -2.77679038637796E-25 -3.67241024039332E-09 + -4.42065029511371E-25 1.63982094090102E-25 -3.67241024039312E-09 + 1.29650867494884E-25 -7.77501308185829E-26 -3.67241024039339E-09 + 7.77501308185829E-26 -8.86553439723582E-26 -3.67241024039341E-09 + -6.78546596234906E-26 -1.36719061205664E-25 -3.67241024039338E-09 + -1.40758029040396E-25 1.29246970711411E-26 -3.67241024039329E-09 + -1.66001578007468E-25 2.46377037918626E-26 -3.67241024039317E-09 + -1.66203526399205E-25 7.20955758499587E-26 -3.67241024039339E-09 + 3.71786989187042E-25 -1.00974195868290E-26 -3.67241024039350E-09 + -2.79698522555162E-25 -2.44963399176470E-25 -3.67241024039303E-09 + -1.95082146417535E-25 7.12877822830124E-26 -3.67241024039339E-09 + 2.24667585806944E-25 8.04764341070267E-26 -3.67241024039359E-09 + 2.13156527477959E-25 1.57519745554532E-26 -3.67241024039332E-09 + -1.58226564925610E-25 -1.29448919103147E-25 -3.67241024039307E-09 + -1.14100841331167E-26 -1.34901525680035E-25 -3.67241024039289E-09 + 1.34901525680035E-25 7.08838854995392E-26 -3.67241024039339E-09 + 8.49192987252315E-26 -2.31533831125988E-25 -3.67241024039317E-09 + 7.42160339631928E-26 8.02744857152902E-26 -3.67241024039314E-09 + -8.03754599111585E-26 -1.71656132976092E-27 -3.67241024039360E-09 + 1.61558713389263E-27 2.44357554001261E-26 -3.67241024039317E-09 + -2.44357554001261E-26 1.10061873496436E-25 -3.67241024039365E-09 + -1.43585306524708E-25 1.21875854413025E-25 -3.67241024039352E-09 + 1.71656132976092E-25 4.94773559754619E-27 -3.67241024039340E-09 + 2.88685225987440E-25 1.55500261637166E-25 -3.67241024039341E-09 + 1.38132699947820E-25 5.04870979341448E-28 -3.67241024039317E-09 + 1.69232752275253E-25 -3.78653234506086E-26 -3.67241024039305E-09 + 3.78653234506086E-26 1.07234596012123E-25 -3.67241024039282E-09 + 6.55322531185199E-26 1.25208002876679E-26 -3.67241024039314E-09 + -1.31771325608118E-25 -6.52293305309150E-26 -3.67241024039299E-09 + -1.10667718671645E-25 -3.06052787676786E-25 -3.67241024039406E-09 + -2.19618876013530E-25 -5.98776981498957E-26 -3.67241024038965E-09 + 5.98776981498957E-26 -3.83701944299500E-26 -3.67241024040750E-09 + -7.45189565507977E-26 1.69838597450463E-25 -3.67241024033254E-09 + 1.24198260917996E-26 -1.50350577647883E-25 -3.67241024065134E-09 + 7.66394146640317E-26 2.78688780596479E-26 -3.67241023929447E-09 + 1.57418771358663E-25 1.13797918743562E-25 -3.67241024506611E-09 + 1.79734068645555E-25 2.06088333767179E-25 -3.67241022055434E-09 + 1.92658765716696E-25 1.39344390298240E-26 -3.67241032447343E-09 + -2.21234463147422E-25 4.72559236663595E-26 -3.67240988467279E-09 + 9.95605571261335E-26 -7.14897306747490E-26 -3.67241174257651E-09 + -1.21471957629552E-25 -4.79627430374375E-26 -3.67240390907499E-09 + 4.79627430374375E-26 9.06748278897240E-26 -3.67243687051309E-09 + -2.37592282878085E-25 -3.04942071522234E-26 -3.67229847617418E-09 + 3.04942071522234E-26 -8.38085825706803E-27 -3.67287821070506E-09 + 1.96899681943165E-25 -2.86766716265942E-26 -3.67045572285493E-09 + 2.86766716265942E-26 5.00832011506716E-26 -3.68055153739757E-09 + 1.52168113173512E-25 -1.36315164422191E-26 -3.63860299048642E-09 + 7.07829113036709E-26 -5.35163238101934E-27 -3.81241466280927E-09 + 6.40176401804956E-26 -1.48634016318122E-25 -3.09590192026221E-09 + -5.76562658407933E-26 -1.48129145338781E-25 -6.05788840844362E-09 + -1.70141520038068E-25 1.00974195868290E-28 5.82604926563694E-09 + 0.00000000000000E+00 -5.20017108721691E-26 -4.87380196349415E-08 + 2.32745521476407E-25 7.51248017260074E-25 -2.58132668003456E-06 + 1.40717639362048E-24 9.31224423975713E-24 -8.71919391713703E-06 + 3.55429169456379E-24 6.43649914142825E-24 -1.31019766382739E-05 + -6.43649914142825E-24 1.03914564451974E-23 -1.54793032716819E-05 + -4.35820785238876E-23 9.46087825607525E-23 -1.66505032150849E-05 + 1.44136221737365E-22 -3.65510433171869E-23 -1.72168609640783E-05 + -3.62408505874795E-23 1.05155335370804E-22 -1.74916386198471E-05 + 9.97786613892090E-23 1.37311981683803E-22 -1.76251455312477E-05 + 3.05022850878929E-23 1.05982515983357E-24 -1.76892303828135E-05 + -4.28582954879037E-23 -6.57867080921080E-23 -1.77189319913074E-05 + -7.23007554159631E-23 -8.03916157824974E-24 -1.77317330604970E-05 + 2.25665210862123E-23 -3.28287305606983E-24 -1.77365089130635E-05 + 2.33290782134096E-23 -6.46234853557053E-24 -1.77378002342758E-05 + 6.47527323264167E-24 -4.29746177615440E-25 -1.77379152761724E-05 + 4.32977351883225E-25 + 1 -1 6 8 + SCALAIRE + -22 321007 1 0 0 0 -79 0 2 + + + 320989 + FLUX + REAL*8 + 1 301 0 0 + 7.10858338912758E-26 -3.67241024039287E-09 8.86553439723582E-26 + 3.67241024039352E-09 3.67546072960574E-25 -3.67241024039317E-09 + 5.94334116880752E-25 -1.95687991592745E-25 -3.67241024039319E-09 + -1.80743810604238E-25 -1.17533963990689E-25 -3.67241024039320E-09 + 1.17533963990689E-25 3.27964188180204E-25 -3.67241024039321E-09 + 5.14968398928277E-26 1.47422325967703E-26 -3.67241024039332E-09 + -1.47422325967703E-26 -4.73770927014014E-25 -3.67241024039364E-09 + -3.80470770031715E-25 -1.73069771718248E-25 -3.67241024039309E-09 + -2.11238017756462E-25 1.55298313245429E-25 -3.67241024039342E-09 + -4.62461817076766E-26 -3.70373350444886E-25 -3.67241024039375E-09 + -3.10192729707385E-25 6.86624531904369E-26 -3.67241024039320E-09 + 2.17296469508559E-25 4.52364397489937E-26 -3.67241024039330E-09 + 1.51461293802434E-25 2.48598470227729E-25 -3.67241024039275E-09 + -5.35163238101934E-26 1.15716428465060E-25 -3.67241024039342E-09 + -1.55500261637166E-26 -1.07032647620387E-25 -3.67241024039322E-09 + -3.89558447659861E-25 5.49299625523495E-26 -3.67241024039311E-09 + 1.35507370855245E-25 1.40556080648659E-25 -3.67241024039333E-09 + -2.24970508394549E-25 7.95676663442121E-26 -3.67241024039309E-09 + 2.66571877092284E-26 -4.21668241945977E-25 -3.67241024039293E-09 + 4.96793043671984E-26 -1.52471035761117E-25 -3.67241024039317E-09 + -3.19078458943795E-26 -3.53409685539013E-26 -3.67241024039372E-09 + -3.69161660094466E-25 2.05785411179574E-25 -3.67241024039285E-09 + 8.78475504054119E-26 -7.12877822830124E-26 -3.67241024039349E-09 + -4.28130590481548E-26 -4.50748810356044E-25 -3.67241024039362E-09 + -6.07864659127103E-25 -2.68187464226177E-25 -3.67241024039329E-09 + -4.35804629367538E-25 -2.98277774594927E-25 -3.67241024039338E-09 + 1.79734068645555E-25 3.79057131289559E-25 -3.67241024039323E-09 + 3.28368084963677E-25 1.16928118815479E-25 -3.67241024039320E-09 + -2.38702999032636E-25 1.72665874934775E-25 -3.67241024039336E-09 + 2.44155605609524E-25 -4.50142965180835E-25 -3.67241024039345E-09 + -2.62129012474080E-25 5.14968398928277E-26 -3.67241024039336E-09 + 7.47209049425342E-26 1.11879409022065E-25 -3.67241024039286E-09 + 1.43787254916444E-25 -1.80945758995975E-25 -3.67241024039330E-09 + -3.71383092403569E-25 -2.20123746992871E-25 -3.67241024039319E-09 + -3.66940227785364E-25 1.65597681223995E-25 -3.67241024039377E-09 + 1.27833331969255E-25 9.14826214566703E-26 -3.67241024039268E-09 + 3.61487621208476E-25 3.32609001190146E-25 -3.67241024039322E-09 + 4.12580564317831E-25 4.80637172333058E-26 -3.67241024039324E-09 + 2.45569244351680E-25 -2.71216690102226E-25 -3.67241024039306E-09 + -1.77108739552980E-25 -1.27429435185781E-25 -3.67241024039334E-09 + -1.29246970711411E-26 4.66500784911498E-26 -3.67241024039317E-09 + -1.88215901098492E-25 -1.23592415742786E-25 -3.67241024039296E-09 + -1.95889939984482E-26 1.35305422463508E-26 -3.67241024039307E-09 + -1.58327539121478E-25 -9.83488667757140E-26 -3.67241024039344E-09 + -1.95082146417535E-25 2.11036069364725E-26 -3.67241024039299E-09 + -2.13055553282091E-26 -6.36137433970224E-26 -3.67241024039327E-09 + -8.03754599111585E-26 4.23081880688133E-26 -3.67241024039318E-09 + 1.08749208950148E-25 -1.60548971430580E-26 -3.67241024039321E-09 + 1.56913900379322E-25 -1.48331093730517E-25 -3.67241024039318E-09 + -2.84646258152708E-25 -4.50344913572571E-26 -3.67241024039382E-09 + 2.71620586885699E-26 2.19416927621793E-25 -3.67241024039306E-09 + 7.41150597673245E-26 -1.15413505877455E-25 -3.67241024039361E-09 + 1.15312531681587E-25 -6.42195885722321E-26 -3.67241024039309E-09 + -2.29312398816885E-25 -7.67403888599000E-27 -3.67241024039283E-09 + 1.39344390298240E-25 1.28237228752728E-26 -3.67241024039364E-09 + -1.29246970711411E-26 -1.71656132976092E-25 -3.67241024039303E-09 + -2.50416005753358E-25 -9.28962601988264E-26 -3.67241024039386E-09 + 9.29972343946946E-26 2.24162714827603E-26 -3.67241024039316E-09 + -2.24162714827603E-26 2.64552393174919E-26 -3.67241024039306E-09 + -2.64552393174919E-26 -9.89547119509237E-26 -3.67241024039349E-09 + -2.32240650497066E-26 -1.63376248914892E-25 -3.67241024039317E-09 + -2.51021850928568E-25 1.31569377216381E-25 -3.67241024039295E-09 + -1.31670351412250E-25 -6.53303047267833E-26 -3.67241024039322E-09 + -1.10768692867514E-25 -1.50148629256147E-25 -3.67241024039327E-09 + 3.42302523993501E-26 3.07567400614810E-25 -3.67241024039438E-09 + 2.79496574163425E-25 1.87509081727414E-25 -3.67241024038987E-09 + -7.44179823549294E-26 1.27732357773386E-25 -3.67241024040381E-09 + -1.27732357773386E-25 7.62355178805586E-26 -3.67241024037322E-09 + -7.61345436846903E-26 -1.57418771358663E-25 -3.67241024036949E-09 + -3.21400865448766E-25 2.65057264154260E-25 -3.67241024097486E-09 + 1.35204448267640E-25 2.43953657217787E-25 -3.67241023581727E-09 + 2.37895205465690E-25 -3.21097942861161E-26 -3.67241026900556E-09 + 3.21097942861161E-26 -1.01479066847631E-25 -3.67241007889590E-09 + -1.47321351771834E-25 2.77679038637796E-26 -3.67241110014965E-09 + -2.75659554720430E-26 1.48331093730517E-25 -3.67240583402067E-09 + 1.45301867854469E-25 4.18033170894719E-26 -3.67243222729908E-09 + 7.57306469012171E-27 1.65597681223995E-26 -3.67230269536434E-09 + -6.73497886441491E-26 2.88685225987440E-25 -3.67292820288685E-09 + 1.51562267998303E-25 -7.76491566227146E-26 -3.66994637327746E-09 + -2.15983804962271E-25 4.67510526870180E-26 -3.68401209400644E-09 + -4.67510526870180E-26 7.59325952929537E-26 -3.61825614792585E-09 + 1.37324906380874E-26 8.91602149516996E-26 -3.92357309176902E-09 + 5.76562658407933E-26 -2.38198128053295E-25 -2.51973002858363E-09 + -1.40657054844527E-25 7.57306469012171E-27 -9.03659666759729E-09 + -7.57306469012171E-27 -6.47244595515736E-26 1.93364806333660E-08 + -1.54995390657824E-25 -1.13091099372484E-25 -8.62449047588266E-07 + 7.31457074869889E-25 6.24262868536113E-24 -6.30426733966067E-06 + 6.15861815439871E-24 3.15362608535842E-24 -1.14752219114733E-05 + -3.14070138828728E-24 3.67319890761829E-23 -1.45088873074069E-05 + 3.09934235765963E-23 8.07535073004893E-23 -1.60559227018534E-05 + 1.91052872105607E-22 -5.17504870728488E-23 -1.68176487092601E-05 + -6.58642562745348E-23 -1.05930817195072E-22 -1.71930230383733E-05 + -5.85230283381267E-23 -1.03397576569128E-23 -1.73793423962185E-05 + 2.32644547280539E-24 -3.67578384703252E-23 -1.74717988743411E-05 + -9.77107098578264E-23 -5.23708725322636E-23 -1.75169794511500E-05 + -1.06163461742353E-22 3.76884166594473E-23 -1.75382275855495E-05 + -3.76625672653050E-23 2.30059607866311E-23 -1.75474928523005E-05 + -1.10635406928967E-23 -3.94203260669802E-24 -1.75509812426694E-05 + 2.15842441088056E-23 -4.56241806611279E-24 -1.75519308993191E-05 + 4.54949336904165E-24 3.41858237531681E-24 -1.75520158509334E-05 + -3.41858237531681E-24 + 1 -1 6 8 + SCALAIRE + -22 320323 1 0 0 0 -80 0 2 + + + 320311 + FLUX + REAL*8 + 1 301 0 0 + -2.13459450065564E-25 -3.67241024039309E-09 -2.01948391736579E-28 + 3.67241024039374E-09 -2.92421271234566E-25 -3.67241024039319E-09 + -2.94642703543669E-25 2.86160871090732E-25 -3.67241024039364E-09 + 3.01105052079239E-25 6.48254337474419E-26 -3.67241024039385E-09 + -2.73842019194801E-25 -5.14968398928277E-26 -3.67241024039342E-09 + 5.12948915010911E-26 1.17533963990689E-25 -3.67241024039278E-09 + 1.76098997594297E-25 9.99644539096066E-26 -3.67241024039321E-09 + -1.89225643057175E-25 1.20563189866738E-25 -3.67241024039363E-09 + 1.72867823326512E-25 1.46816480792493E-25 -3.67241024039298E-09 + 1.46614532400756E-25 1.67617165141361E-26 -3.67241024039320E-09 + -2.16690624333349E-25 -2.20931540559817E-25 -3.67241024039350E-09 + -3.66132434218418E-25 -1.51865190585907E-25 -3.67241024039387E-09 + -4.35198784192328E-25 -4.46305945737840E-26 -3.67241024039273E-09 + 3.38263556158770E-25 2.11439966148198E-25 -3.67241024039333E-09 + -1.79734068645555E-26 -3.95213002628485E-25 -3.67241024039323E-09 + -4.85483933734736E-25 2.55868612330246E-25 -3.67241024039329E-09 + -2.55868612330246E-25 2.92825168018040E-26 -3.67241024039340E-09 + -1.34093732113088E-25 7.95676663442121E-26 -3.67241024039320E-09 + 2.66571877092284E-26 -2.45569244351680E-25 -3.67241024039263E-09 + -4.49537120005625E-25 -3.48360975745599E-25 -3.67241024039310E-09 + -2.38904947424373E-25 -1.33083990154406E-25 -3.67241024039350E-09 + -2.71216690102226E-25 -2.76467348287377E-25 -3.67241024039354E-09 + 3.88750654092915E-25 -4.72559236663595E-26 -3.67241024039368E-09 + 4.72559236663595E-26 4.72559236663595E-26 -3.67241024039257E-09 + -2.25374405178022E-25 4.44286461820474E-26 -3.67241024039325E-09 + -2.20931540559817E-25 8.27988406119974E-26 -3.67241024039327E-09 + -8.27988406119974E-26 3.79057131289559E-25 -3.67241024039268E-09 + 3.28368084963677E-25 1.16928118815479E-25 -3.67241024039320E-09 + -2.38702999032636E-25 1.85186675222443E-25 -3.67241024039330E-09 + 2.31432856930120E-25 -5.87669819953445E-26 -3.67241024039384E-09 + -2.35067927981378E-25 8.68378084467290E-27 -3.67241024039324E-09 + 1.58327539121478E-25 1.39344390298240E-26 -3.67241024039292E-09 + -5.21026850680374E-26 1.47422325967703E-26 -3.67241024039329E-09 + 1.49239861493332E-25 -8.92611891475679E-26 -3.67241024039350E-09 + -2.04371772437418E-25 -6.48254337474419E-26 -3.67241024039371E-09 + 2.25778301961495E-25 -1.66001578007468E-25 -3.67241024039274E-09 + 3.17058975026429E-26 2.15680882374666E-25 -3.67241024039345E-09 + 7.77501308185829E-26 -2.06189307963047E-25 -3.67241024039321E-09 + -2.43751708826051E-25 -1.57317797162795E-25 -3.67241024039311E-09 + 3.12010265233015E-25 -1.27429435185781E-25 -3.67241024039334E-09 + 1.27429435185781E-25 4.66500784911498E-26 -3.67241024039350E-09 + -1.88215901098492E-25 1.95889939984482E-26 -3.67241024039349E-09 + 2.73842019194801E-25 -8.44144277458900E-26 -3.67241024039307E-09 + 2.33048444064012E-25 2.36279618331797E-26 -3.67241024039333E-09 + -2.44357554001261E-26 -1.31266454628776E-27 -3.67241024039328E-09 + 3.83701944299500E-27 -2.85151129132050E-25 -3.67241024039370E-09 + -3.01912845646186E-25 -1.35507370855245E-25 -3.67241024039350E-09 + -1.58125590729741E-25 -1.13797918743562E-25 -3.67241024039310E-09 + 2.54757896175694E-25 1.92860714108433E-26 -3.67241024039329E-09 + 4.28433513069152E-25 -1.13797918743562E-25 -3.67241024039357E-09 + 9.59254860748750E-26 2.19416927621793E-25 -3.67241024039317E-09 + 7.41150597673245E-26 -1.74685358852141E-26 -3.67241024039328E-09 + 1.52168113173512E-25 -1.97404552922506E-25 -3.67241024039338E-09 + 6.41186143763638E-26 9.01699569103825E-26 -3.67241024039336E-09 + 2.03463004674603E-25 2.08612688663886E-25 -3.67241024039361E-09 + -4.51354655531254E-26 -1.71656132976092E-25 -3.67241024039325E-09 + -2.50416005753358E-25 4.94773559754619E-27 -3.67241024039340E-09 + 2.88685225987440E-25 -6.78546596234906E-26 -3.67241024039328E-09 + 6.78546596234906E-26 -2.31028960146646E-25 -3.67241024039304E-09 + 6.13923110879200E-26 2.33250392455749E-26 -3.67241024039340E-09 + -2.32240650497066E-26 -6.54312789226516E-26 -3.67241024039315E-09 + -1.07335570207992E-25 3.37253814200087E-26 -3.67241024039294E-09 + 8.54241697045729E-26 7.16916790664856E-26 -3.67241024039398E-09 + 4.59432591200717E-26 8.53231955087046E-26 -3.67241024038919E-09 + 9.21894408277483E-26 -2.39005921620241E-25 -3.67241024041104E-09 + -5.46270399647446E-26 1.87509081727414E-25 -3.67241024031642E-09 + 1.06022905661704E-25 -3.05951813480917E-25 -3.67241024072959E-09 + -1.69838597450463E-25 1.74180487872799E-25 -3.67241023891744E-09 + 1.19452473712186E-25 8.20920212409194E-26 -3.67241024685356E-09 + 2.63542651216236E-26 2.73942993390669E-25 -3.67241021215777E-09 + 2.33149418259880E-25 -3.43110317560448E-25 -3.67241036359670E-09 + -2.43953657217787E-25 2.61422193103002E-25 -3.67240970367814E-09 + 3.21097942861161E-26 -1.61558713389263E-27 -3.67241257480795E-09 + 4.63471559035449E-26 -2.12045811323408E-26 -3.67240010274169E-09 + -1.71757107171960E-25 4.92754075837253E-26 -3.67245419782431E-09 + 1.45200893658600E-25 -1.05417060486494E-25 -3.67221992641354E-09 + 5.60406787069007E-26 2.11238017756462E-25 -3.67323297628686E-09 + 1.27328460989913E-25 -5.72523690573202E-26 -3.66885884315946E-09 + 1.51562267998303E-25 1.20664164062606E-25 -3.68771828403649E-09 + 1.72867823326512E-25 -1.07436544403860E-25 -3.60653905820639E-09 + -3.53409685539013E-27 -1.72665874934775E-26 -3.95572769114796E-09 + -4.00867557597109E-26 1.69636649058726E-26 -2.46093046140696E-09 + 4.09955235225255E-26 2.40318586166529E-26 -8.94597395804359E-09 + -1.73978539481063E-25 -1.91850972149750E-26 1.76720761351751E-08 + 1.90841230191067E-26 1.00772247476553E-25 -1.57101478830654E-07 + -1.00772247476553E-25 4.36531643577789E-24 -3.76874819374065E-06 + 4.79344702625944E-24 7.90991460753833E-24 -9.56990432756230E-06 + 3.07607790293157E-24 -6.30208229188838E-23 -1.33474547521495E-05 + -3.80761575715816E-23 7.13443278326986E-24 -1.53673825057499E-05 + -7.13443278326986E-24 6.01773895632328E-23 -1.63810943817335E-05 + -3.87223924251386E-23 -5.73856549958663E-23 -1.68863543377959E-05 + -2.93132129573479E-23 -3.12260681238768E-23 -1.71404709690535E-05 + -4.44609579247252E-24 -8.91287110025887E-23 -1.72691960877876E-05 + -8.65954703766451E-23 -1.03397576569128E-25 -1.73342214396680E-05 + 1.03397576569128E-25 -3.70163324117480E-23 -1.73664762356253E-05 + -5.95828534979603E-23 -1.52511425439464E-24 -1.73818355972555E-05 + -3.82054045422930E-23 -7.90991460753833E-24 -1.73886031515654E-05 + 2.06278165255411E-23 2.27733162393505E-23 -1.73911737238040E-05 + -2.27603915422794E-23 1.57422810326498E-23 -1.73918787514344E-05 + 1.34158355598444E-23 3.91618321255574E-24 -1.73919421406017E-05 + 2.93713740941681E-24 + 1 -1 6 8 + SCALAIRE + -22 320137 1 0 0 0 -81 0 2 + + + 320125 + FLUX + REAL*8 + 1 301 0 0 + -3.91174034793754E-25 -3.67241024039310E-09 1.77714584728190E-26 + 3.67241024039375E-09 2.94642703543669E-25 -3.67241024039318E-09 + -8.23949438285242E-26 2.85958922698996E-25 -3.67241024039340E-09 + 3.01105052079239E-25 7.83559759937927E-26 -3.67241024039298E-09 + 1.31064506237040E-25 1.32276196587459E-25 -3.67241024039320E-09 + 2.47184831485573E-25 1.45402842050337E-26 -3.67241024039321E-09 + -2.20527643776344E-25 -8.68378084467290E-26 -3.67241024039311E-09 + -5.89285407087338E-25 1.53480777719800E-26 -3.67241024039308E-09 + -1.55500261637166E-26 2.47386779877309E-25 -3.67241024039320E-09 + -3.39677194900926E-25 1.67617165141361E-26 -3.67241024039287E-09 + 7.69423372516366E-26 7.12877822830124E-26 -3.67241024039361E-09 + 6.11095833394888E-25 1.42575564566025E-25 -3.67241024039364E-09 + -1.42575564566025E-25 2.48396521835992E-25 -3.67241024039264E-09 + 4.50344913572571E-26 2.13459450065564E-25 -3.67241024039309E-09 + 5.67273032388050E-25 9.04728794979874E-26 -3.67241024039290E-09 + -9.04728794979874E-26 -3.77643492547403E-26 -3.67241024039354E-09 + -2.55868612330246E-25 3.93799363886329E-26 -3.67241024039277E-09 + -3.93799363886329E-26 -3.06961555439600E-26 -3.67241024039311E-09 + -1.56711951987585E-25 -1.28035280360991E-25 -3.67241024039304E-09 + 4.96793043671984E-26 -4.32169558316279E-26 -3.67241024039326E-09 + -1.41161925823869E-25 -1.13696944547694E-25 -3.67241024039318E-09 + -6.90663499739100E-26 1.71656132976092E-26 -3.67241024039294E-09 + 3.88548705701178E-25 4.26111106564182E-26 -3.67241024039341E-09 + 1.36921009597401E-25 -4.50748810356044E-25 -3.67241024039318E-09 + -6.07864659127103E-25 -1.70444442625673E-25 -3.67241024039325E-09 + -5.33547650968042E-25 2.88786200183308E-25 -3.67241024039316E-09 + 4.16821480544299E-25 1.83167191305077E-25 -3.67241024039312E-09 + 5.23854128164686E-25 -9.06748278897240E-26 -3.67241024039319E-09 + -3.24531065520682E-25 1.34497628896562E-25 -3.67241024039296E-09 + 1.58933384296688E-25 -3.38869401333980E-25 -3.67241024039347E-09 + -5.42231431812715E-25 -8.90592407558313E-26 -3.67241024039281E-09 + -4.57211158891615E-25 -1.00974195868290E-27 -3.67241024039347E-09 + -3.30589517272780E-25 -2.47184831485573E-25 -3.67241024039357E-09 + -6.33512104877648E-25 -1.05820957269967E-25 -3.67241024039333E-09 + -1.87812004315018E-25 -2.08410740272150E-25 -3.67241024039360E-09 + -2.46377037918626E-25 1.45806738833810E-25 -3.67241024039301E-09 + 1.47826222751176E-25 9.89547119509237E-26 -3.67241024039355E-09 + 3.52399943580330E-25 -1.08446286362543E-25 -3.67241024039309E-09 + -4.82656656250424E-26 -1.36719061205664E-25 -3.67241024039317E-09 + -1.40758029040396E-25 1.10667718671645E-25 -3.67241024039307E-09 + -2.64148496391445E-25 -5.14968398928277E-26 -3.67241024039313E-09 + -9.04728794979874E-26 -3.02922587604869E-27 -3.67241024039365E-09 + 1.46412584009020E-25 8.78475504054119E-26 -3.67241024039306E-09 + 6.09884143044469E-26 9.73391248170311E-26 -3.67241024039324E-09 + -9.71371764252945E-26 1.69232752275253E-25 -3.67241024039310E-09 + 2.72327406256777E-25 -1.35608345051113E-25 -3.67241024039378E-09 + 1.41060951628000E-25 -2.77981961225401E-25 -3.67241024039335E-09 + -1.58024616533873E-25 -1.29448919103147E-25 -3.67241024039361E-09 + -1.14100841331167E-26 -8.88572923640948E-27 -3.67241024039326E-09 + 8.88572923640948E-27 1.50653500235488E-25 -3.67241024039369E-09 + 1.24804106093206E-25 -7.41150597673245E-26 -3.67241024039342E-09 + -6.19981562631298E-26 1.41464848411474E-25 -3.67241024039292E-09 + 1.52168113173512E-25 -1.93365585087774E-25 -3.67241024039305E-09 + -1.00065428105475E-25 -4.12984461101304E-26 -3.67241024039361E-09 + -9.02709311062508E-26 2.08612688663886E-25 -3.67241024039350E-09 + -4.51354655531254E-26 2.40318586166529E-26 -3.67241024039306E-09 + 1.41060951628000E-25 4.94773559754619E-27 -3.67241024039329E-09 + 2.88685225987440E-25 1.27934306165123E-25 -3.67241024039306E-09 + 1.65597681223995E-25 5.04870979341448E-28 -3.67241024039328E-09 + 1.69232752275253E-25 3.55429169456379E-26 -3.67241024039361E-09 + -3.55429169456379E-26 -2.98681671378400E-25 -3.67241024039295E-09 + -1.67718139337229E-25 -1.23693389938655E-25 -3.67241024039403E-09 + -1.69939571646331E-25 -2.22042256714369E-25 -3.67241024039131E-09 + 4.59432591200717E-26 5.65455496862421E-27 -3.67241024040122E-09 + -1.21774880217157E-25 2.50214057361621E-25 -3.67241024036101E-09 + 1.57620719750400E-25 -6.47244595515736E-26 -3.67241024052816E-09 + 6.46234853557053E-26 -1.23188518959313E-26 -3.67241023983736E-09 + 1.23794364134523E-25 7.63364920764269E-26 -3.67241024267130E-09 + 1.07436544403860E-25 -6.99751177367246E-26 -3.67241023109740E-09 + -3.83701944299500E-26 -8.19910470450511E-26 -3.67241027813751E-09 + 8.18900728491828E-26 1.91346101170409E-25 -3.67241008800946E-09 + 1.02185886218709E-25 1.11778434826196E-25 -3.67241085158396E-09 + -2.54454973588090E-26 9.83488667757140E-26 -3.67240780761044E-09 + 9.30982085905629E-26 2.76669296679113E-26 -3.67241983701927E-09 + -2.76669296679113E-26 -2.01948391736579E-28 -3.67237279248025E-09 + 1.94678249634062E-25 -5.62426270986373E-26 -3.67255443421343E-09 + -9.05738536938557E-26 -3.04942071522234E-26 -3.67186430405844E-09 + -6.54312789226516E-26 -2.00534752994423E-25 -3.67443210311541E-09 + -9.30982085905629E-26 2.28201682662334E-26 -3.66514584687697E-09 + 6.99751177367246E-26 9.91566603426603E-26 -3.69738444431288E-09 + 2.50012108969885E-25 -1.37324906380874E-26 -3.59248313420328E-09 + -4.32169558316279E-26 8.83524213847533E-26 -3.89663772383702E-09 + -2.95854393894088E-26 1.02993679785655E-25 -3.23917083348685E-09 + -1.63578197306629E-26 -1.26217744835362E-25 -3.34224756146355E-09 + -2.02958133695262E-26 -5.65455496862421E-25 -1.58487825807655E-06 + 5.65455496862421E-27 1.26209666899692E-23 -7.34757047487880E-06 + 1.38940493514766E-24 3.31130738962634E-23 -1.19246462832618E-05 + 1.97747865188458E-24 -7.36707733055040E-24 -1.45377675536451E-05 + -3.64993445289023E-23 -2.48671171648754E-23 -1.58804450984939E-05 + -3.37076099615359E-23 -1.03397576569128E-23 -1.65567383079266E-05 + 8.87151206963122E-23 -6.26072326126073E-23 -1.68997832054134E-05 + -1.48634016318122E-22 1.24697477342369E-22 -1.70757506132719E-05 + 2.06019671313988E-22 -5.19572822259871E-23 -1.71664911720159E-05 + -7.02586532787228E-23 5.94536065272489E-23 -1.72130164990172E-05 + 6.56574611213966E-24 -6.96899666075926E-23 -1.72363736891111E-05 + -3.08124778176003E-23 1.60783231564995E-23 -1.72476021977859E-05 + -1.61041725506418E-23 -3.25702366192755E-24 -1.72525863793049E-05 + -1.02105106862014E-23 1.06241009924779E-23 -1.72544902576826E-05 + 6.59159550628194E-24 -1.31056428301370E-23 -1.72550146062442E-05 + -2.65473277841237E-23 -5.90012421297589E-24 -1.72550618687095E-05 + -8.95035272176518E-25 + 1 -1 6 8 + SCALAIRE + -22 319987 1 0 0 0 -82 0 2 + + + 319969 + FLUX + REAL*8 + 1 301 0 0 + 7.08838854995392E-26 -3.67241024039375E-09 8.86553439723582E-26 + 3.67241024039375E-09 -3.08981039356966E-25 -3.67241024039363E-09 + -6.58351757061248E-26 3.01105052079239E-25 -3.67241024039341E-09 + -9.02709311062508E-26 -2.21941282518500E-25 -3.67241024039299E-09 + -1.55904158420639E-25 1.32276196587459E-25 -3.67241024039298E-09 + 2.47184831485573E-25 2.20527643776344E-25 -3.67241024039397E-09 + -2.20527643776344E-25 1.04407318527811E-25 -3.67241024039385E-09 + 9.99644539096066E-26 -1.83773036480287E-25 -3.67241024039331E-09 + -1.09859925104699E-25 2.47386779877309E-25 -3.67241024039321E-09 + 2.47386779877309E-25 -2.72630328844382E-25 -3.67241024039311E-09 + -1.14504738114640E-25 -3.18876510552058E-25 -3.67241024039242E-09 + 2.54454973588090E-26 2.40924431341739E-25 -3.67241024039355E-09 + -4.42266977903108E-26 -2.40520534558266E-25 -3.67241024039289E-09 + -4.44892306995684E-25 -7.79520792103195E-26 -3.67241024039373E-09 + -1.15514480073323E-25 -2.02958133695262E-25 -3.67241024039290E-09 + -9.04728794979874E-26 5.73533432531884E-26 -3.67241024039341E-09 + -5.75552916449250E-26 3.93799363886329E-26 -3.67241024039387E-09 + 6.52293305309150E-26 -1.28439177144464E-25 -3.67241024039330E-09 + -6.45830956773580E-25 -2.30625063363173E-25 -3.67241024039355E-09 + 1.52672984152854E-25 1.40959977432132E-25 -3.67241024039380E-09 + -1.40959977432132E-25 -1.26621641618835E-25 -3.67241024039329E-09 + -4.60442333159400E-25 -8.78475504054119E-26 -3.67241024039319E-09 + -4.99216424372823E-25 -3.91779879968963E-26 -3.67241024039317E-09 + 3.32810949581882E-25 2.08006843488676E-26 -3.67241024039283E-09 + 2.72630328844382E-25 2.52435489670724E-26 -3.67241024039314E-09 + -2.52435489670724E-26 5.65455496862421E-27 -3.67241024039338E-09 + 1.12687202589011E-25 -2.36279618331797E-26 -3.67241024039280E-09 + 1.97101630334901E-25 -2.98277774594927E-25 -3.67241024039324E-09 + -1.16928118815479E-25 1.34497628896562E-25 -3.67241024039274E-09 + 1.58933384296688E-25 -3.15039491109063E-26 -3.67241024039348E-09 + 2.00332804602686E-25 -8.90592407558313E-26 -3.67241024039336E-09 + -4.57211158891615E-25 -1.81551604171185E-25 -3.67241024039330E-09 + -1.49845706668542E-25 -1.64991836048785E-25 -3.67241024039308E-09 + -2.57888096247611E-25 -5.13554760186120E-25 -3.67241024039329E-09 + -4.98004734022404E-25 -2.08410740272150E-25 -3.67241024039371E-09 + -2.46377037918626E-25 5.00832011506716E-25 -3.67241024039300E-09 + 3.79662976464769E-25 1.17937860774162E-25 -3.67241024039371E-09 + -1.17937860774162E-25 -1.08446286362543E-25 -3.67241024039331E-09 + -4.82656656250424E-26 1.97707475510111E-25 -3.67241024039322E-09 + 3.89558447659861E-25 4.70539752746229E-26 -3.67241024039323E-09 + -3.39273298117453E-26 1.88215901098492E-25 -3.67241024039329E-09 + 1.05215112094758E-25 9.47137957244556E-26 -3.67241024039340E-09 + 5.55358077275592E-26 1.34699577288298E-25 -3.67241024039314E-09 + 3.07365452223073E-25 -4.92754075837253E-26 -3.67241024039358E-09 + -9.71371764252945E-26 4.62461817076766E-26 -3.67241024039350E-09 + -4.63471559035449E-26 -8.94631375393045E-26 -3.67241024039342E-09 + -5.45260657688763E-26 2.11439966148198E-25 -3.67241024039343E-09 + 2.33250392455749E-25 -1.29448919103147E-25 -3.67241024039339E-09 + -1.14100841331167E-26 -8.88572923640948E-27 -3.67241024039294E-09 + 8.88572923640948E-27 3.35537252870326E-25 -3.67241024039328E-09 + 2.51728670299646E-25 1.89629539840648E-25 -3.67241024039321E-09 + 1.03902447548470E-25 -3.11101497470200E-25 -3.67241024039335E-09 + -2.76063451503904E-25 -6.42195885722321E-26 -3.67241024039336E-09 + -9.62284086624799E-26 -7.34082403962465E-26 -3.67241024039372E-09 + 7.35092145921148E-26 2.08612688663886E-25 -3.67241024039350E-09 + -4.51354655531254E-26 2.19820824405266E-25 -3.67241024039319E-09 + 3.67344124568837E-25 3.92789621927646E-26 -3.67241024039330E-09 + 2.54253025196353E-25 -4.01877299555792E-26 -3.67241024039342E-09 + 1.65698655419863E-25 2.65562135133601E-26 -3.67241024039339E-09 + -2.64552393174919E-26 -1.35305422463508E-26 -3.67241024039338E-09 + -1.57822668142137E-25 1.90538307603462E-25 -3.67241024039319E-09 + 1.02993679785655E-25 -2.57484199464138E-26 -3.67241024039371E-09 + 2.57484199464138E-26 -6.52293305309150E-26 -3.67241024039053E-09 + -2.28403631054071E-25 1.03599524960865E-25 -3.67241024040508E-09 + 1.90134410819989E-25 2.33553315043354E-25 -3.67241024033732E-09 + 3.53409685539013E-25 -1.21270009237816E-25 -3.67241024065173E-09 + -1.72362952347170E-25 4.34189042233645E-26 -3.67241023920345E-09 + -2.25475379373890E-25 1.86095442985258E-25 -3.67241024584230E-09 + -7.62355178805586E-26 7.15907048706173E-26 -3.67241021555809E-09 + -7.14897306747490E-26 2.48396521835992E-26 -3.67241035310348E-09 + 1.88619797881965E-25 1.04003421744338E-26 -3.67240973087812E-09 + -9.35021053740361E-26 1.95889939984482E-26 -3.67241253548250E-09 + 1.70141520038068E-25 -4.62461817076766E-26 -3.67239993610636E-09 + -1.00469324888948E-25 2.76669296679113E-26 -3.67245636348669E-09 + -2.76669296679113E-26 2.01948391736579E-27 -3.67220437136776E-09 + 2.43751708826051E-25 -1.05013163703021E-25 -3.67332670213141E-09 + -4.17023428936036E-26 -3.35234330282721E-26 -3.66834069401166E-09 + 1.80339913820765E-25 1.40455106452791E-25 -3.69043945245977E-09 + 6.36137433970224E-27 -7.49228533342708E-26 -3.59273939212511E-09 + -7.17926532623538E-26 9.29972343946946E-26 -4.02415810440273E-09 + 8.95641117351728E-26 -2.05987359571311E-26 -2.13124439066565E-09 + 2.05987359571311E-26 3.63507105125842E-26 -1.05842241240242E-08 + 2.63542651216236E-26 5.43241173771398E-26 2.45538906686823E-08 + -1.41060951628000E-25 1.39748287081713E-25 -3.71339668052768E-07 + -1.39546338689976E-25 4.45578931527588E-24 -4.84934751541688E-06 + 7.16674452594772E-24 5.23450231381213E-24 -1.02029946298330E-05 + 1.68150308895545E-23 2.85377311330795E-23 -1.35198853655860E-05 + -2.85377311330795E-23 -8.47860127866853E-24 -1.52841049549540E-05 + 8.47860127866853E-24 7.85304594042531E-23 -1.61842703320657E-05 + -8.73709522009135E-24 -3.99114645556836E-23 -1.66438853440873E-05 + -4.81315718929293E-23 -4.60119215732622E-24 -1.68815258698557E-05 + 4.60119215732622E-24 -1.08205563879593E-22 -1.70057202381540E-05 + -1.88648878450375E-22 -4.63738130912541E-23 -1.70708183521222E-05 + -6.33827144368757E-23 -6.82940993239093E-23 -1.71046598950915E-05 + -1.14047526955749E-22 -1.06757997807625E-23 -1.71218466010197E-05 + -1.31961157096350E-22 -9.43502886193297E-24 -1.71301886836876E-05 + 7.20939602628248E-23 -1.19682694878766E-23 -1.71339215111459E-05 + -2.61854362661318E-23 -2.30059607866311E-24 -1.71353569402940E-05 + -1.47600040552431E-23 -2.68833699079734E-24 -1.71357544042738E-05 + -1.71898471046176E-23 -2.19073615355841E-24 -1.71357903542904E-05 + 2.19073615355841E-24 + 1 -1 6 8 + SCALAIRE + -22 319099 1 0 0 0 -83 0 2 + + + 319087 + FLUX + REAL*8 + 1 301 0 0 + 7.08838854995392E-26 -3.67241024039331E-09 -2.84747232348576E-25 + 3.67241024039352E-09 6.58351757061248E-26 -3.67241024039340E-09 + -6.58351757061248E-26 -1.49441809885068E-26 -3.67241024039320E-09 + 1.49441809885068E-26 -2.62532909257553E-26 -3.67241024039233E-09 + 2.64552393174919E-26 3.27964188180204E-25 -3.67241024039299E-09 + 5.14968398928277E-26 -2.68591361009650E-25 -3.67241024039384E-09 + -1.12283305805538E-25 1.93668507675379E-25 -3.67241024039364E-09 + 1.89023694665438E-25 -7.51248017260074E-26 -3.67241024039288E-09 + -1.55500261637166E-26 -3.31195362447990E-25 -3.67241024039339E-09 + -1.46816480792493E-25 -7.49228533342708E-26 -3.67241024039298E-09 + 2.74851761153484E-25 2.68389412617914E-25 -3.67241024039300E-09 + 1.20563189866738E-25 -1.49845706668542E-25 -3.67241024039331E-09 + -3.37253814200087E-25 5.29104786349837E-26 -3.67241024039340E-09 + 1.42373616174288E-25 1.15716428465060E-25 -3.67241024039342E-09 + 1.77916533119926E-25 1.86398365572862E-25 -3.67241024039352E-09 + -9.59254860748750E-26 1.57923642338005E-25 -3.67241024039331E-09 + 1.35507370855245E-25 2.28403631054071E-25 -3.67241024039296E-09 + -2.28403631054071E-25 -1.28439177144464E-25 -3.67241024039342E-09 + -1.64991836048785E-25 -4.48325429655205E-26 -3.67241024039261E-09 + -2.48800418619465E-25 1.46816480792493E-25 -3.67241024039363E-09 + -1.46816480792493E-25 -1.13696944547694E-25 -3.67241024039348E-09 + 2.24566611611076E-25 1.22380725392367E-25 -3.67241024039327E-09 + -9.89547119509237E-27 -4.72559236663595E-26 -3.67241024039346E-09 + 4.72559236663595E-26 -1.66001578007468E-25 -3.67241024039366E-09 + -1.27429435185781E-25 1.32680093370932E-25 -3.67241024039338E-09 + -1.32680093370932E-25 2.78486832204742E-25 -3.67241024039323E-09 + -1.03599524960865E-25 1.83167191305077E-25 -3.67241024039334E-09 + 5.23854128164686E-25 1.16928118815479E-25 -3.67241024039341E-09 + -2.38702999032636E-25 -3.54621375889433E-25 -3.67241024039329E-09 + -6.22001046548663E-26 -1.42979461349498E-25 -3.67241024039362E-09 + 1.81753552562921E-26 5.14968398928277E-26 -3.67241024039336E-09 + 7.47209049425342E-26 1.94880198025799E-25 -3.67241024039309E-09 + -6.68449176648077E-26 1.47422325967703E-26 -3.67241024039341E-09 + 1.49239861493332E-25 5.69494464697153E-26 -3.67241024039366E-09 + 2.68187464226177E-25 -1.10667718671645E-25 -3.67241024039354E-09 + -3.44120059519131E-25 1.63982094090102E-25 -3.67241024039333E-09 + 1.29650867494884E-25 3.89760396051598E-26 -3.67241024039291E-09 + -1.96899681943165E-25 -1.27833331969255E-25 -3.67241024039299E-09 + -1.65597681223995E-25 5.87669819953445E-26 -3.67241024039327E-09 + -4.28130590481548E-26 -2.03967875653945E-25 -3.67241024039356E-09 + 2.04169824045681E-25 -2.94844651935405E-26 -3.67241024039317E-09 + 1.71252236192619E-25 1.95889939984482E-26 -3.67241024039349E-09 + 2.73842019194801E-25 1.35305422463508E-26 -3.67241024039332E-09 + 1.35305422463508E-25 2.20123746992871E-25 -3.67241024039333E-09 + 2.20527643776344E-25 -2.64552393174919E-26 -3.67241024039334E-09 + 3.22410607407448E-25 8.04764341070267E-26 -3.67241024039359E-09 + 2.13156527477959E-25 -8.21929954367877E-26 -3.67241024039354E-09 + -6.02815949333688E-26 8.17890986533145E-26 -3.67241024039317E-09 + 5.90699045829494E-26 6.06854917168420E-26 -3.67241024039325E-09 + 7.85579243855292E-26 7.08838854995392E-26 -3.67241024039350E-09 + 8.49192987252315E-26 -2.31533831125988E-25 -3.67241024039328E-09 + 7.42160339631928E-26 4.35198784192328E-26 -3.67241024039346E-09 + -4.34189042233645E-26 6.49264079433102E-26 -3.67241024039327E-09 + -6.49264079433102E-26 2.44357554001261E-26 -3.67241024039325E-09 + 1.07133621816255E-25 7.79520792103195E-26 -3.67241024039344E-09 + 5.21026850680374E-26 1.21875854413025E-25 -3.67241024039330E-09 + 1.71656132976092E-25 6.83595306028320E-26 -3.67241024039383E-09 + 5.86660077994762E-26 -1.30357686865962E-25 -3.67241024039337E-09 + -1.20159293083265E-25 -1.59236306884293E-25 -3.67241024039317E-09 + -8.83524213847533E-26 -1.11273563846855E-25 -3.67241024039327E-09 + -5.99786723457640E-26 1.53177855132195E-25 -3.67241024039372E-09 + 1.40556080648659E-25 -4.44286461820474E-27 -3.67241024038987E-09 + -5.06890463258813E-26 1.69434700666990E-25 -3.67241024040675E-09 + -2.87170613049415E-25 1.43282383937103E-25 -3.67241024033535E-09 + 3.41292782034819E-26 -8.39095567665486E-26 -3.67241024064094E-09 + -9.53196408996653E-26 1.30963532041171E-25 -3.67241023933420E-09 + 2.75457606328694E-25 -9.66323054459531E-26 -3.67241024491125E-09 + -8.54241697045729E-26 8.83524213847533E-26 -3.67241022116221E-09 + 2.17094521116822E-26 -1.58529487513215E-26 -3.67241032208835E-09 + 1.58529487513215E-26 6.92682983656466E-26 -3.67240989409041E-09 + -6.92682983656466E-26 -2.37895205465690E-25 -3.67241170507284E-09 + -1.38738545123030E-25 1.96899681943165E-26 -3.67240406019146E-09 + -1.96899681943165E-26 -9.30982085905629E-26 -3.67243625254478E-09 + -9.83488667757140E-26 -7.00760919325929E-26 -3.67230104777980E-09 + -7.65384404681634E-26 -4.79627430374375E-26 -3.67286730035930E-09 + -9.88537377550554E-26 9.08767762814606E-26 -3.67050294932171E-09 + 7.67403888599000E-27 1.64587939265312E-26 -3.68034309677901E-09 + 7.93657179524756E-26 -6.86624531904369E-27 -3.63953940370348E-09 + 1.01176144260026E-25 6.90663499739100E-26 -3.80814396863972E-09 + 2.38299102249163E-26 -5.76562658407933E-26 -3.11559076103677E-09 + -3.36244072241404E-26 4.08945493266573E-26 -5.96568804190029E-09 + 1.07335570207992E-25 5.20017108721691E-26 5.40793843461567E-09 + -5.20017108721691E-26 4.11974719142621E-26 -4.63554694216671E-08 + -2.21032514755686E-25 5.23450231381213E-25 -2.46859301522864E-06 + -5.25065818515105E-25 -1.31314922242793E-23 -8.17994673947346E-06 + -1.11087771326457E-23 -3.99890127381104E-23 -1.22031078427885E-05 + -8.24595673138799E-23 1.99557322778418E-23 -1.44736911737957E-05 + 5.94794559213911E-23 -6.99484605490154E-23 -1.56675841684025E-05 + -5.06648125188729E-23 8.01331218410746E-24 -1.62916910416744E-05 + 3.87740912134232E-23 3.68095372586097E-23 -1.66229696591420E-05 + -1.18597020324790E-22 -1.47289847822723E-22 -1.68019811749265E-05 + -7.29469902695201E-23 2.74003577908190E-24 -1.68998767144953E-05 + 5.95570041038180E-23 7.02586532787228E-23 -1.69535115578035E-05 + 6.09528713875012E-23 2.65214783899814E-23 -1.69825628902453E-05 + -2.64697796016969E-23 9.83569447113834E-23 -1.69978525747682E-05 + 4.68132527916729E-23 5.97637992569562E-23 -1.70054836021629E-05 + 1.53028413322310E-23 5.86781247029804E-24 -1.70089587961893E-05 + 7.12150808619872E-23 1.10506159958256E-23 -1.70103018167796E-05 + 1.13608087255330E-23 8.01331218410746E-25 -1.70106703692447E-05 + -7.88406521339605E-25 -1.19585759650733E-23 -1.70107032160216E-05 + -8.23626320858464E-24 + 1 -1 6 8 + SCALAIRE + -22 318379 1 0 0 0 -84 0 2 + + + 318289 + FLUX + REAL*8 + 1 301 0 0 + 8.90592407558313E-26 -3.67241024039287E-09 1.24602157701469E-25 + 3.67241024039352E-09 -1.30054764278357E-25 -3.67241024039383E-09 + 1.29852815886620E-25 1.95687991592745E-25 -3.67241024039298E-09 + 2.25576353569759E-25 -3.97838331721061E-26 -3.67241024039320E-09 + -1.69232752275253E-25 2.24162714827603E-25 -3.67241024039320E-09 + -5.25065818515105E-26 2.05179566004364E-25 -3.67241024039267E-09 + 8.84533955806216E-26 2.22143230910237E-27 -3.67241024039330E-09 + -9.12806730649337E-26 1.91850972149750E-26 -3.67241024039277E-09 + -4.03290938297948E-25 5.45260657688763E-26 -3.67241024039310E-09 + -2.39106895816110E-25 -7.89618211690024E-26 -3.67241024039373E-09 + -2.14267243632510E-25 3.63709053517579E-25 -3.67241024039288E-09 + 1.20563189866738E-25 2.40924431341739E-25 -3.67241024039387E-09 + 2.49406263794675E-25 1.50653500235488E-25 -3.67241024039341E-09 + -5.37182722019300E-26 -7.77501308185829E-26 -3.67241024039329E-09 + 7.79520792103195E-26 -3.95213002628485E-25 -3.67241024039297E-09 + -9.04728794979874E-26 2.50617954145095E-25 -3.67241024039234E-09 + 2.33654289239222E-25 2.94844651935405E-26 -3.67241024039329E-09 + -2.92825168018040E-26 1.64991836048785E-25 -3.67241024039319E-09 + -1.64991836048785E-25 -2.25576353569759E-25 -3.67241024039360E-09 + -2.53647180021143E-25 1.40959977432132E-25 -3.67241024039358E-09 + -1.40959977432132E-25 -1.26621641618835E-25 -3.67241024039332E-09 + -4.60644281551137E-25 1.00570299084816E-25 -3.67241024039293E-09 + 8.07793566946316E-26 4.26111106564182E-26 -3.67241024039334E-09 + -2.22547127693710E-25 -8.58280664880461E-26 -3.67241024039349E-09 + -2.94844651935405E-26 -2.68389412617914E-25 -3.67241024039350E-09 + -3.18876510552058E-25 -1.90033436624121E-25 -3.67241024039338E-09 + -2.78688780596479E-25 -1.21169035041947E-27 -3.67241024039329E-09 + -1.72261978151302E-25 9.30982085905629E-26 -3.67241024039341E-09 + -2.14873088807720E-25 -3.03932329563551E-25 -3.67241024039308E-09 + -4.53374139448620E-25 -3.17058975026429E-26 -3.67241024039331E-09 + -2.61927064082343E-25 5.14968398928277E-26 -3.67241024039304E-09 + 7.47209049425342E-26 1.79734068645555E-25 -3.67241024039341E-09 + 2.41732224908685E-25 -1.64991836048785E-25 -3.67241024039319E-09 + -2.57888096247611E-25 -1.38738545123030E-25 -3.67241024039307E-09 + -1.23188518959313E-25 6.78546596234906E-26 -3.67241024039344E-09 + -6.78546596234906E-26 -4.98812527589350E-26 -3.67241024039295E-09 + 4.98812527589350E-26 -5.87669819953445E-26 -3.67241024039360E-09 + -9.91566603426603E-26 -3.00903103687503E-26 -3.67241024039315E-09 + 3.00903103687503E-26 -3.89760396051598E-26 -3.67241024039290E-09 + 5.51319109440861E-26 1.66001578007468E-25 -3.67241024039339E-09 + 1.27631383577518E-25 -1.93264610891906E-25 -3.67241024039355E-09 + 5.12948915010911E-26 -1.23592415742786E-25 -3.67241024039355E-09 + -1.97909423901847E-26 1.35305422463508E-26 -3.67241024039339E-09 + 1.35305422463508E-25 4.86695624085155E-26 -3.67241024039317E-09 + -4.86695624085155E-26 1.69232752275253E-25 -3.67241024039288E-09 + 2.72327406256777E-25 5.44250915730080E-26 -3.67241024039341E-09 + -2.04068849849813E-25 4.24091622646816E-26 -3.67241024039332E-09 + 2.51223799320304E-25 -1.29549893299015E-25 -3.67241024039321E-09 + -1.64184042481839E-25 1.30559635257698E-25 -3.67241024039296E-09 + 3.02417716625527E-25 2.77477090246060E-25 -3.67241024039350E-09 + 1.53783700307405E-25 3.17159949222297E-25 -3.67241024039317E-09 + 1.33790809525484E-25 8.02744857152902E-26 -3.67241024039314E-09 + -8.03754599111585E-26 -1.71656132976092E-27 -3.67241024039273E-09 + 1.62063584368605E-25 -7.67403888599000E-27 -3.67241024039326E-09 + 1.39344390298240E-25 1.29246970711411E-26 -3.67241024039364E-09 + -1.42979461349498E-25 -7.38121371797196E-26 -3.67241024039292E-09 + -5.46270399647446E-26 2.00635727190291E-25 -3.67241024039364E-09 + 9.29972343946946E-26 -5.14968398928277E-27 -3.67241024039352E-09 + 1.30458661061830E-25 -7.14897306747490E-26 -3.67241024039330E-09 + -9.82478925798457E-26 -9.89547119509237E-26 -3.67241024039371E-09 + -2.32240650497066E-26 5.51319109440861E-26 -3.67241024039262E-09 + 6.56332273143882E-26 -1.61861635976868E-25 -3.67241024039337E-09 + -1.31670351412250E-25 -6.36137433970224E-27 -3.67241024039123E-09 + 6.46234853557053E-27 5.65455496862421E-27 -3.67241024039619E-09 + -5.75552916449250E-27 -1.81652578367053E-25 -3.67241024040573E-09 + -2.90906658296542E-25 1.57317797162795E-25 -3.67241024022561E-09 + 2.33250392455749E-26 -6.80566080152271E-26 -3.67241024160476E-09 + 6.80566080152271E-26 7.63364920764269E-26 -3.67241023306524E-09 + -7.61345436846903E-26 -1.67920087728965E-25 -3.67241028106278E-09 + 5.95747755622908E-26 6.03825691292371E-26 -3.67241002603596E-09 + -6.03825691292371E-26 -4.22072138729450E-26 -3.67241133200713E-09 + 1.47523300163571E-25 1.38334648339557E-26 -3.67240481681615E-09 + -1.17533963990689E-25 -1.97404552922506E-25 -3.67243668973012E-09 + -1.53682726111537E-25 1.70444442625673E-25 -3.67228312479706E-09 + 2.25172456786286E-26 -2.43044889454973E-25 -3.67301398726464E-09 + -2.45064373372339E-25 -2.02655211107657E-25 -3.66957063503093E-09 + -4.16013686977353E-26 1.84782778438970E-26 -3.68565649821336E-09 + -1.14403763918772E-25 -1.53783700307405E-25 -3.61107060340678E-09 + -1.39647312885844E-25 1.97909423901847E-26 -3.95500079421264E-09 + 1.27126512598176E-25 1.35103474071771E-25 -2.38380011125780E-09 + 6.58351757061248E-26 9.99644539096066E-26 -9.65215721567542E-09 + 2.00736701386160E-25 -8.27988406119974E-27 2.16853787387587E-08 + -7.99715631276853E-26 -3.78855182897822E-25 -7.20589351035437E-07 + -2.81919954864264E-25 3.16655078242956E-24 -5.73897194747979E-06 + 7.77097411402356E-24 -1.29246970711411E-25 -1.06742920457331E-05 + 1.42171667782552E-25 -3.77918142360165E-23 -1.36752360237257E-05 + -5.97896486510985E-23 -2.52290086828673E-23 -1.52655577613042E-05 + -3.43279954209506E-23 8.30799527732947E-23 -1.60797779363244E-05 + 6.05392810812247E-23 8.11153988184813E-23 -1.64968021832648E-05 + 8.32350491381484E-24 6.04358835046556E-23 -1.67121660879859E-05 + 4.39956688301642E-23 -1.11410888753236E-22 -1.68239894520389E-05 + -1.22422730657848E-22 -1.78360819581747E-23 -1.68819784812890E-05 + -1.75000398343250E-22 1.56440533349091E-22 -1.69117743413299E-05 + 1.67297278888850E-22 -1.81979734761666E-23 -1.69268098587926E-05 + 1.82496722644512E-23 5.40510831515119E-23 -1.69341821237591E-05 + 1.95679913657076E-23 -3.01662429640432E-23 -1.69376405790826E-05 + 3.01920923581855E-23 -5.73856549958663E-24 -1.69391502063646E-05 + 2.94166105339170E-23 3.08771013029560E-23 -1.69397268550251E-05 + -3.08771013029560E-23 3.75462449916648E-23 -1.69398893856616E-05 + 2.23985000242875E-23 1.72221588472955E-24 -1.69399044986060E-05 + -8.37843487636719E-24 + 1 -1 6 0 + -19 323929 1 0 0 0 0 0 0 + + + 323923 + SCAL + REAL*8 + 4 100 0 0 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 + 1 -1 6 0 + -20 322843 1 0 0 0 0 0 0 + + + 322837 + SCAL + REAL*8 + 4 100 0 0 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 -1.00000000000000E+00 1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 -1.00000000000000E+00 + 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + -1.00000000000000E+00 + ENREGISTREMENT DE TYPE 2 + PILE NUMERO 40NBRE OBJETS NOMMES 0NBRE OBJETS 84 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 4 1 + 4.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + -2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 2.50000000000000E-01 -2.50000000000000E-01 + 2.50000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 2 1 + 2.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 5.00000000000000E-01 -5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 5.00000000000000E-01 5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 2 1 + 2.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 5.00000000000000E-01 -5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 5.00000000000000E-01 5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 2 1 + 2.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 5.00000000000000E-01 -5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 5.00000000000000E-01 5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 2 1 + 2.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 5.00000000000000E-01 -5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 5.00000000000000E-01 5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 2 1 + 2.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 5.00000000000000E-01 -5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 5.00000000000000E-01 5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 2 1 + 2.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 5.00000000000000E-01 -5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 5.00000000000000E-01 5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 2 1 + 2.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 5.00000000000000E-01 -5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 5.00000000000000E-01 5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 2 1 + 2.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 5.00000000000000E-01 -5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 5.00000000000000E-01 5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 2 1 + 2.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 5.00000000000000E-01 -5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 5.00000000000000E-01 5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 2 1 + 2.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 5.00000000000000E-01 -5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 5.00000000000000E-01 5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 2 1 + 2.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 5.00000000000000E-01 -5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 5.00000000000000E-01 5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 2 1 + 2.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 5.00000000000000E-01 -5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 5.00000000000000E-01 5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 2 1 + 2.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 5.00000000000000E-01 -5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 5.00000000000000E-01 5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 2 1 + 2.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 5.00000000000000E-01 -5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 5.00000000000000E-01 5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 2 1 + 2.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 5.00000000000000E-01 -5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 5.00000000000000E-01 5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 2 1 + 2.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 5.00000000000000E-01 -5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 5.00000000000000E-01 5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 2 1 + 2.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 5.00000000000000E-01 -5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 5.00000000000000E-01 5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 2 1 + 2.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 5.00000000000000E-01 -5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 5.00000000000000E-01 5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 2 1 + 2.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 5.00000000000000E-01 -5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 5.00000000000000E-01 5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 2 1 + 2.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 5.00000000000000E-01 -5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 5.00000000000000E-01 5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + 2 1 + 2.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 5.00000000000000E-01 -5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 5.00000000000000E-01 5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 + ENREGISTREMENT DE TYPE 5 +LABEL AUTOMATIQUE : 1 diff --git a/resources/portico_3subs.sauv b/resources/portico_3subs.sauv new file mode 100644 index 000000000..d672a118f --- /dev/null +++ b/resources/portico_3subs.sauv @@ -0,0 +1,182 @@ + ENREGISTREMENT DE TYPE 4 + NIVEAU 18 NIVEAU ERREUR 0 DIMENSION 3 + DENSITE 0.00000E+00 + ENREGISTREMENT DE TYPE 7 + NOMBRE INFO CASTEM2000 8 + IFOUR 2 NIFOUR 0 IFOMOD 2 IECHO 1 IIMPI 0 IOSPI 0 ISOTYP 1 + NSDPGE 0 + ENREGISTREMENT DE TYPE 2 + PILE NUMERO 1NBRE OBJETS NOMMES 6NBRE OBJETS 6 + PBAS POT1 POT2 POUTL STOT EL1 + 4 1 2 3 5 6 + 2 0 0 2 2 + 0 0 + 1 2 2 3 + 2 0 0 2 3 + 0 0 0 + 4 5 5 6 6 7 + 2 0 0 2 1 + 0 + 3 7 + 1 0 0 1 2 + 0 0 + 1 4 + 2 0 0 2 6 + 0 0 0 0 0 0 + 1 2 2 3 4 5 5 6 6 7 + 3 7 + 1 0 0 1 7 + 0 0 0 0 0 0 0 + 1 2 4 5 6 3 7 + ENREGISTREMENT DE TYPE 2 + PILE NUMERO 32NBRE OBJETS NOMMES 4NBRE OBJETS 7 + 0P0 0P1 1P0 1P1 + 1 4 3 7 + 7 + 1 2 6 3 4 5 7 + ENREGISTREMENT DE TYPE 2 + PILE NUMERO 33NBRE OBJETS NOMMES 0NBRE OBJETS 1 + 96 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 5.00000000000000E-01 5.00000000000000E-01 1.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 3.33333333333333E-01 + 3.33333333333333E-01 1.00000000000000E+00 0.00000000000000E+00 + 6.66666666666667E-01 3.33333333333333E-01 0.00000000000000E+00 + 0.00000000000000E+00 1.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 1.00000000000000E+00 + 0.00000000000000E+00 3.00000000000000E+03 -2.00000000000000E+04 + 6.00000000000000E+03 0.00000000000000E+00 1.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 1.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 1.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 -1.00000000000000E+03 + -1.00000000000000E+03 1.00000000000000E+03 0.00000000000000E+00 + ENREGISTREMENT DE TYPE 2 + PILE NUMERO 39NBRE OBJETS NOMMES 1NBRE OBJETS 1 + CHAM1D + 1 + 3 2 6 11 + CONTRAINTES + -1 27665 6 0 0 0 -1 0 5 -2 + 27882 6 0 0 0 -2 0 5 -3 27931 + 6 0 0 0 -3 0 5 + 19363 19664 19888 + + 27833 27840 27847 27854 27861 27868 + EFFX EFFY EFFZ MOMX MOMY MOMZ + REAL*8 REAL*8 REAL*8 REAL*8 + REAL*8 REAL*8 + 2 2 0 0 + -7.68749999999959E-03 -7.68749999999959E-03 -4.56249999999959E-03 + -4.56249999999959E-03 + 2 2 0 0 + -6.11141334691317E-07 -6.11141334691317E-07 -6.11141334690612E-07 + -6.11141334690612E-07 + 2 2 0 0 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 + 2 2 0 0 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 + 2 2 0 0 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 + 2 2 0 0 + 1.32422443924838E-04 1.32728014592183E-04 1.32728014592184E-04 + 1.33033585259529E-04 + 27826 27903 27889 27917 27910 27896 + EFFX EFFY EFFZ MOMX MOMY MOMZ + REAL*8 REAL*8 REAL*8 REAL*8 + REAL*8 REAL*8 + 2 3 0 0 + -8.20833333333293E-03 -8.20833333333293E-03 -6.12499999999960E-03 + -6.12499999999960E-03 -4.04166666666627E-03 -4.04166666666627E-03 + 2 3 0 0 + 6.11141334689149E-07 6.11141334689149E-07 6.11141334689393E-07 + 6.11141334689393E-07 6.11141334688905E-07 6.11141334688905E-07 + 2 3 0 0 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 2 3 0 0 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 2 3 0 0 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 2 3 0 0 + -1.32422443922787E-04 -1.32626157701017E-04 -1.32626157701017E-04 + -1.32829871479247E-04 -1.32829871479247E-04 -1.33033585257476E-04 + 27651 27952 27938 27966 27959 27945 + EFFX EFFY EFFZ MOMX MOMY MOMZ + REAL*8 REAL*8 REAL*8 REAL*8 + REAL*8 REAL*8 + 2 1 0 0 + -6.11141334691013E-07 -6.11141334691013E-07 + 2 1 0 0 + 0.00000000000000E+00 0.00000000000000E+00 + 2 1 0 0 + -5.81088996365331E-15 -5.81088996365331E-15 + 2 1 0 0 + 0.00000000000000E+00 0.00000000000000E+00 + 2 1 0 0 + -3.66966414738893E-04 -3.66966414744704E-04 + 2 1 0 0 + 0.00000000000000E+00 0.00000000000000E+00 + ENREGISTREMENT DE TYPE 2 + PILE NUMERO 40NBRE OBJETS NOMMES 0NBRE OBJETS 3 + 2 2 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.00000000000000E+00 -5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 1.00000000000000E+00 + 5.00000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.00000000000000E+00 + 2 2 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.00000000000000E+00 -5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 1.00000000000000E+00 + 5.00000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.00000000000000E+00 + 2 2 + 1.00000000000000E+00 -1.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.00000000000000E+00 -5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 1.00000000000000E+00 0.00000000000000E+00 5.00000000000000E-01 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 0.00000000000000E+00 + -5.00000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 0.00000000000000E+00 1.00000000000000E+00 + 5.00000000000000E-01 0.00000000000000E+00 0.00000000000000E+00 + 0.00000000000000E+00 1.00000000000000E+00 + ENREGISTREMENT DE TYPE 5 +LABEL_AUTOMATIQUE_2 diff --git a/src/INTERP_KERNELTest/CMakeLists.txt b/src/INTERP_KERNELTest/CMakeLists.txt index af3ddab5f..e783ed6d4 100644 --- a/src/INTERP_KERNELTest/CMakeLists.txt +++ b/src/INTERP_KERNELTest/CMakeLists.txt @@ -86,8 +86,6 @@ TARGET_LINK_LIBRARIES(InterpKernelTest ${InterpKernelTest_LIBS}) ADD_EXECUTABLE(TestINTERP_KERNEL ${TestINTERP_KERNEL_SOURCES}) TARGET_LINK_LIBRARIES(TestINTERP_KERNEL InterpKernelTest ${CPPUNIT_LIBRARIES} ${PLATFORM_LIBS}) ADD_TEST(TestINTERP_KERNEL TestINTERP_KERNEL) -#SALOME_GENERATE_TESTS_ENVIRONMENT(tests_env) -SET_TESTS_PROPERTIES(TestINTERP_KERNEL PROPERTIES ENVIRONMENT "${tests_env}") INSTALL(TARGETS TestINTERP_KERNEL DESTINATION ${MEDTOOL_INSTALL_BINS}) INSTALL(TARGETS InterpKernelTest DESTINATION ${MEDTOOL_INSTALL_LIBS}) diff --git a/src/INTERP_KERNELTest/Interpolation3DTest.cxx b/src/INTERP_KERNELTest/Interpolation3DTest.cxx index db32ed895..dbeb6ec67 100644 --- a/src/INTERP_KERNELTest/Interpolation3DTest.cxx +++ b/src/INTERP_KERNELTest/Interpolation3DTest.cxx @@ -31,7 +31,7 @@ #include "VectorUtils.hxx" -// levels : +// levels : // 1 - titles and volume results // 2 - symmetry / diagonal results and intersection matrix output // 3 - empty @@ -79,7 +79,7 @@ void Interpolation3DTest::getVolumes(ParaMEDMEM::MEDCouplingUMesh& mesh, double double Interpolation3DTest::sumVolume(const IntersectionMatrix& m) const { - + std::vector volumes; for(IntersectionMatrix::const_iterator iter = m.begin() ; iter != m.end() ; ++iter) { @@ -89,7 +89,7 @@ double Interpolation3DTest::sumVolume(const IntersectionMatrix& m) const // vol += std::abs(iter2->second); } } - + // sum in ascending order to avoid rounding errors sort(volumes.begin(), volumes.end()); @@ -163,7 +163,7 @@ bool Interpolation3DTest::areCompatitable(const IntersectionMatrix& m1, const In } return compatitable; } - + bool Interpolation3DTest::testSymmetric(const IntersectionMatrix& m1, const IntersectionMatrix& m2) const { @@ -242,9 +242,9 @@ void Interpolation3DTest::dumpIntersectionMatrix(const IntersectionMatrix& m) co { for(std::map::const_iterator iter2 = iter->begin() ; iter2 != iter->end() ; ++iter2) { - + std::cout << "V(" << i << ", " << iter2->first << ") = " << iter2->second << std::endl; - + } ++i; } @@ -259,18 +259,25 @@ void Interpolation3DTest::setUp() void Interpolation3DTest::tearDown() { delete interpolator; -} +} void Interpolation3DTest::calcIntersectionMatrix(const char* mesh1path, const char* mesh1, const char* mesh2path, const char* mesh2, IntersectionMatrix& m) const { - const string dataBaseDir = getenv("MED_ROOT_DIR"); - const string dataDir = dataBaseDir + "/share/salome/resources/med/"; + string dataDir = ""; + if ( getenv("MEDTOOL_ROOT_DIR") ) { + dataDir = getenv("MEDTOOL_ROOT_DIR"); + dataDir += "/share/resources/med/"; + } + else { + dataDir = get_current_dir_name(); + dataDir += "/../../resources/"; + } LOG(1, std::endl << "=== -> intersecting src = " << mesh1 << ", target = " << mesh2 ); LOG(5, "Loading " << mesh1 << " from " << mesh1path); MESH sMesh(MED_DRIVER, dataDir+mesh1path, mesh1); - + LOG(5, "Loading " << mesh2 << " from " << mesh2path); MESH tMesh(MED_DRIVER, dataDir+mesh2path, mesh2); @@ -284,7 +291,7 @@ void Interpolation3DTest::calcIntersectionMatrix(const char* mesh1path, const ch } LOG(1, "Intersection calculation done. " << std::endl ); - + } void Interpolation3DTest::intersectMeshes(const char* mesh1path, const char* mesh1, const char* mesh2path, const char* mesh2, const double correctVol, const double prec, bool doubleTest) const @@ -300,7 +307,7 @@ void Interpolation3DTest::intersectMeshes(const char* mesh1path, const char* mes IntersectionMatrix matrix1; calcIntersectionMatrix(mesh1path, mesh1, mesh2path, mesh2, matrix1); -#if LOG_LEVEL >= 2 +#if LOG_LEVEL >= 2 dumpIntersectionMatrix(matrix1); #endif @@ -320,14 +327,14 @@ void Interpolation3DTest::intersectMeshes(const char* mesh1path, const char* mes } else { - + IntersectionMatrix matrix2; - calcIntersectionMatrix(mesh2path, mesh2, mesh1path, mesh1, matrix2); + calcIntersectionMatrix(mesh2path, mesh2, mesh1path, mesh1, matrix2); #if LOG_LEVEL >= 2 dumpIntersectionMatrix(matrix2); #endif - + const double vol2 = sumVolume(matrix2); LOG(1, "vol1 = " << vol1 << ", vol2 = " << vol2 << ", correctVol = " << correctVol ); diff --git a/src/INTERP_KERNELTest/MeshTestToolkit.txx b/src/INTERP_KERNELTest/MeshTestToolkit.txx index 9096963ce..de2934321 100644 --- a/src/INTERP_KERNELTest/MeshTestToolkit.txx +++ b/src/INTERP_KERNELTest/MeshTestToolkit.txx @@ -38,7 +38,7 @@ #include -// levels : +// levels : // 1 - titles and volume results // 2 - symmetry / diagonal results and intersection matrix output // 3 - empty @@ -138,7 +138,7 @@ namespace INTERP_TEST } /** - * Verifies if for a given intersection matrix the sum of each row is equal to the volumes + * Verifies if for a given intersection matrix the sum of each row is equal to the volumes * of the corresponding source elements and the sum of each column is equal to the volumes * of the corresponding target elements. This will be true as long as the meshes correspond * to the same geometry. The equalities are in the "epsilon-sense", making sure the relative @@ -252,7 +252,7 @@ namespace INTERP_TEST //if(m2[j - 1].count(i+1) > 0) // { std::map theMap = m2.at(j); - const double v2 = fabs(theMap[i]); + const double v2 = fabs(theMap[i]); if(v1 != v2) { LOG(2, "V1( " << i << ", " << j << ") = " << v1 << " which is different from V2( " << j << ", " << i << ") = " << v2 << " | diff = " << v1 - v2 ); @@ -267,7 +267,7 @@ namespace INTERP_TEST } if(!isSymmetric) { - LOG(1, "*** matrices are not symmetric"); + LOG(1, "*** matrices are not symmetric"); } return isSymmetric; } @@ -335,9 +335,9 @@ namespace INTERP_TEST * Calculates the intersection matrix for two meshes. * If the source and target meshes are the same, a CppUnit assertion raised if testVolumes() returns false. * - * @param mesh1path the path to the file containing the source mesh, relative to {$MED_ROOT_DIR}/share/salome/resources/med/ + * @param mesh1path the path to the file containing the source mesh, relative to {$MEDTOOL_ROOT_DIR}/share/resources/med/ * @param mesh1 the name of the source mesh - * @param mesh2path the path to the file containing the target mesh, relative to {$MED_ROOT_DIR}/share/salome/resources/med/ + * @param mesh2path the path to the file containing the target mesh, relative to {$MEDTOOL_ROOT_DIR}/share/resources/med/ * @param mesh2 the name of the target mesh * @param m intersection matrix in which to store the result of the intersection */ @@ -397,9 +397,9 @@ namespace INTERP_TEST * it will be confirmed that the intersection matrix is diagonal, otherwise the intersection matrices will be * calculated once which each mesh as source mesh, and it will be verified that the they are each others' transpose. * - * @param mesh1path the path to the file containing the source mesh, relative to {$MED_ROOT_DIR}/share/salome/resources/med/ + * @param mesh1path the path to the file containing the source mesh, relative to {$MEDTOOL_ROOT_DIR}/share/resources/med/ * @param mesh1 the name of the source mesh - * @param mesh2path the path to the file containing the target mesh, relative to {$MED_ROOT_DIR}/share/salome/resources/med/ + * @param mesh2path the path to the file containing the target mesh, relative to {$MEDTOOL_ROOT_DIR}/share/resources/med/ * @param mesh2 the name of the target mesh * @param correctVol the total volume of the intersection of the two meshes * @param prec maximum relative error to be tolerated in volume comparisions @@ -420,7 +420,7 @@ namespace INTERP_TEST IntersectionMatrix matrix1; calcIntersectionMatrix(mesh1path, mesh1, mesh2path, mesh2, matrix1); -#if LOG_LEVEL >= 2 +#if LOG_LEVEL >= 2 dumpIntersectionMatrix(matrix1); #endif @@ -441,7 +441,7 @@ namespace INTERP_TEST else { IntersectionMatrix matrix2; - calcIntersectionMatrix(mesh2path, mesh2, mesh1path, mesh1, matrix2); + calcIntersectionMatrix(mesh2path, mesh2, mesh1path, mesh1, matrix2); #if LOG_LEVEL >= 2 dumpIntersectionMatrix(matrix2); @@ -460,7 +460,7 @@ namespace INTERP_TEST /** * Utility method used to facilitate the call to intersect meshes. - * It calls intersectMeshes, using "mesh1.med" as file name for the mesh with name "mesh1" and + * It calls intersectMeshes, using "mesh1.med" as file name for the mesh with name "mesh1" and * "mesh2.med" as file name for the mesh with name "mesh2". The rest of the arguments are passed * along as they are. * diff --git a/src/INTERP_KERNELTest/PerfTest.cxx b/src/INTERP_KERNELTest/PerfTest.cxx index 85d67be1a..8c5c8d641 100644 --- a/src/INTERP_KERNELTest/PerfTest.cxx +++ b/src/INTERP_KERNELTest/PerfTest.cxx @@ -31,11 +31,11 @@ /** * \file PerfTest.cxx - * Test program which takes two meshes and calculates their intersection matrix. - * - * USAGE : PerfTest mesh1 mesh2 + * Test program which takes two meshes and calculates their intersection matrix. + * + * USAGE : PerfTest mesh1 mesh2 * where mesh1 and mesh2 are the names of two meshes located in - * the files mesh1.med, mesh2.med in {$MED_ROOT_DIR}/share/salome/resources/med/ + * the files mesh1.med, mesh2.med in {$MEDTOOL_ROOT_DIR}/share/resources/med/ * */ @@ -47,48 +47,48 @@ namespace INTERP_TEST */ class PerfTestToolkit : public MeshTestToolkit<3,3> { - + public: /** * Calculates the intersection matrix for two meshes. - * Outputs the names of the meshes intersected, the number of elements in each mesh, + * Outputs the names of the meshes intersected, the number of elements in each mesh, * the number of matrix elements and the number of non-zero matrix elements, etc. * These values help to determine how well the filtering algorithm is working. * - * @param mesh1path the path to the file containing the source mesh, relative to {$MED_ROOT_DIR}/share/salome/resources/med/ + * @param mesh1path the path to the file containing the source mesh, relative to {$MEDTOOL_ROOT_DIR}/share/resources/med/ * @param mesh1 the name of the source mesh - * @param mesh2path the path to the file containing the target mesh, relative to {$MED_ROOT_DIR}/share/salome/resources/med/ + * @param mesh2path the path to the file containing the target mesh, relative to {$MEDTOOL_ROOT_DIR}/share/resources/med/ * @param mesh2 the name of the target mesh * @param m intersection matrix in which to store the result of the intersection */ - void calcIntersectionMatrix(const char* mesh1path, const char* mesh1, const char* mesh2path, const char* mesh2, IntersectionMatrix& m) + void calcIntersectionMatrix(const char* mesh1path, const char* mesh1, const char* mesh2path, const char* mesh2, IntersectionMatrix& m) { LOG(1, std::endl << "=== -> intersecting src = " << mesh1 << ", target = " << mesh2 ); - + LOG(5, "Loading " << mesh1 << " from " << mesh1path); MEDCouplingAutoRefCountObjectPtr sMeshML=MEDFileUMesh::New(INTERP_TEST::getResourceFile(mesh1path).c_str(),mesh1); MEDCouplingAutoRefCountObjectPtr sMesh=sMeshML->getMeshAtLevel(0); - - + + LOG(5, "Loading " << mesh2 << " from " << mesh2path); MEDCouplingAutoRefCountObjectPtr tMeshML=MEDFileUMesh::New(INTERP_TEST::getResourceFile(mesh2path).c_str(),mesh2); MEDCouplingAutoRefCountObjectPtr tMesh=tMeshML->getMeshAtLevel(0); - + MEDCouplingNormalizedUnstructuredMesh<3,3> sMesh_wrapper(sMesh); MEDCouplingNormalizedUnstructuredMesh<3,3> tMesh_wrapper(tMesh); - + Interpolation3D interpolator; interpolator.interpolateMeshes(sMesh_wrapper, tMesh_wrapper,m,"P0P0"); - + std::pair eff = countNumberOfMatrixEntries(m); - LOG(1, eff.first << " of " << numTargetElems * numSrcElems << " intersections calculated : ratio = " + LOG(1, eff.first << " of " << numTargetElems * numSrcElems << " intersections calculated : ratio = " << double(eff.first) / double(numTargetElems * numSrcElems)); - LOG(1, eff.second << " non-zero elements of " << eff.first << " total : filter efficiency = " + LOG(1, eff.second << " non-zero elements of " << eff.first << " total : filter efficiency = " << double(eff.second) / double(eff.first)); - + LOG(1, "Intersection calculation done. " << std::endl ); - + } /** @@ -100,7 +100,7 @@ namespace INTERP_TEST */ std::pair countNumberOfMatrixEntries(const IntersectionMatrix& m) { - + int numElems = 0; int numNonZero = 0; for(IntersectionMatrix::const_iterator iter = m.begin() ; iter != m.end() ; ++iter) @@ -116,12 +116,12 @@ namespace INTERP_TEST } return std::make_pair(numElems, numNonZero); } - + }; } /** - * Main method of the program. + * Main method of the program. * Intersects the meshes and outputs some information about the calculation as well as the * intersection matrix on std::cout. * @@ -133,7 +133,7 @@ int main(int argc, char** argv) using INTERP_TEST::PerfTestToolkit; assert(argc == 3); - + // load meshes const std::string mesh1 = argv[1]; const std::string mesh2 = argv[2]; @@ -148,7 +148,7 @@ int main(int argc, char** argv) testTools.calcIntersectionMatrix(mesh1path.c_str(), mesh1.c_str(), mesh2path.c_str(), mesh2.c_str(), m); testTools.dumpIntersectionMatrix(m); - + return 0; } diff --git a/src/INTERP_KERNELTest/TestInterpKernelUtils.cxx b/src/INTERP_KERNELTest/TestInterpKernelUtils.cxx index d82a4c273..6aa73854a 100644 --- a/src/INTERP_KERNELTest/TestInterpKernelUtils.cxx +++ b/src/INTERP_KERNELTest/TestInterpKernelUtils.cxx @@ -20,23 +20,24 @@ #include "TestInterpKernelUtils.hxx" #include +#include namespace INTERP_TEST { std::string getResourceFile( const std::string& filename ) { std::string resourceFile = ""; - - if ( getenv("top_srcdir") ) { - // we are in 'make test' step - resourceFile = getenv("top_srcdir"); - resourceFile += "/resources/"; + + if ( getenv("MEDTOOL_ROOT_DIR") ) { + // use MEDTOOL_ROOT_DIR env.var + resourceFile = getenv("MEDTOOL_ROOT_DIR"); + resourceFile += "/share/resources/med/"; } - else if ( getenv("MED_ROOT_DIR") ) { - // use MED_ROOT_DIR env.var - resourceFile = getenv("MED_ROOT_DIR"); - resourceFile += "/share/salome/resources/med/"; + else { + resourceFile = get_current_dir_name(); + resourceFile += "/../../resources/"; } + resourceFile += filename; return resourceFile; } diff --git a/src/MEDCoupling/Test/CMakeLists.txt b/src/MEDCoupling/Test/CMakeLists.txt index 2b8adefc7..5deb19f7f 100644 --- a/src/MEDCoupling/Test/CMakeLists.txt +++ b/src/MEDCoupling/Test/CMakeLists.txt @@ -54,22 +54,17 @@ SET(TestMEDCouplingExamples_SOURCES MEDCouplingBasicsTest0.cxx ) -#SALOME_GENERATE_TESTS_ENVIRONMENT(tests_env) - ADD_EXECUTABLE(TestMEDCoupling ${TestMEDCoupling_SOURCES}) TARGET_LINK_LIBRARIES(TestMEDCoupling medcoupling ${CPPUNIT_LIBRARIES} ${PLATFORM_LIBS}) ADD_TEST(TestMEDCoupling TestMEDCoupling) -SET_TESTS_PROPERTIES(TestMEDCoupling PROPERTIES ENVIRONMENT "${tests_env}") ADD_EXECUTABLE(TestMEDCouplingRemapper ${TestMEDCouplingRemapper_SOURCES}) TARGET_LINK_LIBRARIES(TestMEDCouplingRemapper medcouplingremapper ${CPPUNIT_LIBRARIES} ${PLATFORM_LIBS}) ADD_TEST(TestMEDCouplingRemapper TestMEDCouplingRemapper) -SET_TESTS_PROPERTIES(TestMEDCouplingRemapper PROPERTIES ENVIRONMENT "${tests_env}") ADD_EXECUTABLE(TestMEDCouplingExamples ${TestMEDCouplingExamples_SOURCES}) TARGET_LINK_LIBRARIES(TestMEDCouplingExamples medcoupling ${CPPUNIT_LIBRARIES} ${PLATFORM_LIBS}) ADD_TEST(TestMEDCouplingExamples TestMEDCouplingExamples) -SET_TESTS_PROPERTIES(TestMEDCouplingExamples PROPERTIES ENVIRONMENT "${tests_env}") INSTALL(TARGETS TestMEDCoupling TestMEDCouplingRemapper TestMEDCouplingExamples DESTINATION ${MEDTOOL_INSTALL_BINS}) diff --git a/src/MEDCoupling_Swig/CMakeLists.txt b/src/MEDCoupling_Swig/CMakeLists.txt index e0186342a..59cef51d2 100644 --- a/src/MEDCoupling_Swig/CMakeLists.txt +++ b/src/MEDCoupling_Swig/CMakeLists.txt @@ -89,20 +89,13 @@ INSTALL(FILES MEDCoupling.i MEDCouplingCommon.i MEDCouplingRefCountObject.i MEDC INSTALL(FILES MEDCouplingBasicsTest.py MEDCouplingRemapperTest.py MEDCouplingDataForTest.py MEDCouplingNumPyTest.py MEDCouplingPickleTest.py DESTINATION ${MEDTOOL_INSTALL_SCRIPT_PYTHON}) INSTALL(FILES MEDCouplingExamplesTest.py DESTINATION ${MEDTOOL_INSTALL_SCRIPT_PYTHON}) -#SALOME_GENERATE_TESTS_ENVIRONMENT(tests_env) - ADD_TEST(MEDCouplingBasicsTest ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/MEDCouplingBasicsTest.py) -SET_TESTS_PROPERTIES(MEDCouplingBasicsTest PROPERTIES ENVIRONMENT "${tests_env}") ADD_TEST(MEDCouplingExamplesTest ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/MEDCouplingExamplesTest.py) -SET_TESTS_PROPERTIES(MEDCouplingExamplesTest PROPERTIES ENVIRONMENT "${tests_env}") ADD_TEST(MEDCouplingRemapperTest ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/MEDCouplingRemapperTest.py) -SET_TESTS_PROPERTIES(MEDCouplingRemapperTest PROPERTIES ENVIRONMENT "${tests_env}") IF(NUMPY_FOUND) ADD_TEST(MEDCouplingNumPyTest ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/MEDCouplingNumPyTest.py) - SET_TESTS_PROPERTIES(MEDCouplingNumPyTest PROPERTIES ENVIRONMENT "${tests_env}") ADD_TEST(MEDCouplingPickleTest ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/MEDCouplingPickleTest.py) - SET_TESTS_PROPERTIES(MEDCouplingPickleTest PROPERTIES ENVIRONMENT "${tests_env}") ENDIF(NUMPY_FOUND) # Application tests diff --git a/src/MEDLoader/Swig/CMakeLists.txt b/src/MEDLoader/Swig/CMakeLists.txt index 54a9a602c..99a282168 100644 --- a/src/MEDLoader/Swig/CMakeLists.txt +++ b/src/MEDLoader/Swig/CMakeLists.txt @@ -81,31 +81,27 @@ INSTALL(FILES sauv2med PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EX INSTALL(FILES case2med PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ DESTINATION ${MEDTOOL_INSTALL_BINS} ) INSTALL(FILES med2case PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ DESTINATION ${MEDTOOL_INSTALL_BINS} ) -#SALOME_GENERATE_TESTS_ENVIRONMENT(tests_env) - ADD_TEST(MEDLoaderTest ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/MEDLoaderTest.py) -SET_TESTS_PROPERTIES(MEDLoaderTest PROPERTIES ENVIRONMENT "${tests_env}") ADD_TEST(MEDLoaderTest2 ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/MEDLoaderTest2.py) -SET_TESTS_PROPERTIES(MEDLoaderTest2 PROPERTIES ENVIRONMENT "${tests_env}") ADD_TEST(MEDLoaderTest3 ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/MEDLoaderTest3.py) -SET_TESTS_PROPERTIES(MEDLoaderTest3 PROPERTIES ENVIRONMENT "${tests_env}") ADD_TEST(MEDLoaderTest4 ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/MEDLoaderTest4.py) -SET_TESTS_PROPERTIES(MEDLoaderTest4 PROPERTIES ENVIRONMENT "${tests_env}") ADD_TEST(MEDLoaderExamplesTest ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/MEDLoaderExamplesTest.py) -SET_TESTS_PROPERTIES(MEDLoaderExamplesTest PROPERTIES ENVIRONMENT "${tests_env}") ADD_TEST(SauvLoaderTest ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/SauvLoaderTest.py) -SET_TESTS_PROPERTIES(SauvLoaderTest PROPERTIES ENVIRONMENT "${tests_env}") IF(NUMPY_FOUND) ADD_TEST(MEDLoaderCouplingTrainingSession ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/MEDLoaderCouplingTrainingSession.py) - SET_TESTS_PROPERTIES(MEDLoaderCouplingTrainingSession PROPERTIES ENVIRONMENT "${tests_env}") ENDIF(NUMPY_FOUND) # Application tests SET(TEST_INSTALL_DIRECTORY ${MEDTOOL_INSTALL_SCRIPT_SCRIPTS}/test/MEDCoupling/MEDLoader/Swig) -INSTALL(FILES MEDLoaderDataForTest.py MEDLoaderTest.py MEDLoaderTest2.py MEDLoaderTest3.py MEDLoaderTest4.py SauvLoaderTest.py MEDLoaderExamplesTest.py MEDLoaderCouplingTrainingSession.py CaseIO.py CaseReader.py CaseWriter.py VTKReader.py MEDLoaderSplitter.py medutilities.py DESTINATION ${TEST_INSTALL_DIRECTORY}) +SET(MEDLOADER_TEST_FILES MEDLoaderDataForTest.py MEDLoaderTest.py MEDLoaderTest2.py MEDLoaderTest3.py MEDLoaderTest4.py SauvLoaderTest.py MEDLoaderExamplesTest.py MEDLoaderCouplingTrainingSession.py CaseIO.py CaseReader.py CaseWriter.py VTKReader.py MEDLoaderSplitter.py medutilities.py) + +FOREACH(testfile ${MEDLOADER_TEST_FILES}) + CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/${testfile}" "${CMAKE_CURRENT_BINARY_DIR}/${testfile}" COPYONLY) +ENDFOREACH(testfile) +INSTALL(FILES ${MEDLOADER_TEST_FILES} DESTINATION ${TEST_INSTALL_DIRECTORY}) INSTALL(FILES CTestTestfileInstall.cmake DESTINATION ${TEST_INSTALL_DIRECTORY} diff --git a/src/MEDLoader/Swig/MEDLoaderCouplingTrainingSession.py b/src/MEDLoader/Swig/MEDLoaderCouplingTrainingSession.py index 8001e2798..668b56260 100644 --- a/src/MEDLoader/Swig/MEDLoaderCouplingTrainingSession.py +++ b/src/MEDLoader/Swig/MEDLoaderCouplingTrainingSession.py @@ -480,8 +480,13 @@ print "IntegralGlobConstraint %lf == %lf"%(srcField.getArray().accumulate()[0],t from numpy import * from math import acos -med_root_dir=os.getenv("MED_ROOT_DIR") -agitateur_file=os.path.join(os.getenv("MED_ROOT_DIR"),"share","salome","resources","med","agitateur.med") +med_root_dir=os.getenv("MEDTOOL_ROOT_DIR") +if med_root_dir: + agitateur_file=os.path.join(os.getenv("MEDTOOL_ROOT_DIR"),"share","resources","med","agitateur.med") +else: + current_dir = os.path.dirname(os.path.realpath(__file__)) + agitateur_file=os.path.join(current_dir, "..", "..", "..", "resources","agitateur.med") + pass data=MEDFileData(agitateur_file) ts=data.getFields()[0].getTimeSteps() print ts diff --git a/src/MEDLoader/Swig/SauvLoaderTest.py b/src/MEDLoader/Swig/SauvLoaderTest.py index 502e4e468..b60a4fd3d 100644 --- a/src/MEDLoader/Swig/SauvLoaderTest.py +++ b/src/MEDLoader/Swig/SauvLoaderTest.py @@ -25,11 +25,18 @@ from MEDLoaderDataForTest import MEDLoaderDataForTest class SauvLoaderTest(unittest.TestCase): + def __getResourcesDirectory(self): + med_root_dir=os.getenv("MEDTOOL_ROOT_DIR") + if med_root_dir: + return os.path.join( os.getenv("MEDTOOL_ROOT_DIR"), "share","resources","med") + else: + current_dir = os.path.dirname(os.path.realpath(__file__)) + return os.path.join(current_dir, "..", "..", "..", "resources") + pass + def testSauv2Med(self): # get a file containing all types of readable piles - self.assertTrue( os.getenv("MED_ROOT_DIR") ) - sauvFile = os.path.join( os.getenv("MED_ROOT_DIR"), "share","salome", - "resources","med","allPillesTest.sauv") + sauvFile = os.path.join( self.__getResourcesDirectory(),"allPillesTest.sauv") self.assertTrue( os.access( sauvFile, os.F_OK)) # read SAUV and write MED @@ -38,7 +45,7 @@ class SauvLoaderTest(unittest.TestCase): d2=sr.loadInMEDFileDS(); d2.write(medFile,0); - # check + # check self.assertEqual(1,d2.getNumberOfMeshes()) self.assertEqual(8+97,d2.getNumberOfFields()) mm = d2.getMeshes() @@ -50,9 +57,7 @@ class SauvLoaderTest(unittest.TestCase): def testMed2Sauv(self): # read pointe.med - self.assertTrue( os.getenv("MED_ROOT_DIR") ) - medFile = os.path.join( os.getenv("MED_ROOT_DIR"), "share","salome", - "resources","med","pointe.med") + medFile = os.path.join(self.__getResourcesDirectory(),"pointe.med") self.assertTrue( os.access( medFile, os.F_OK)) pointeMed = MEDFileData.New( medFile ) @@ -241,9 +246,7 @@ class SauvLoaderTest(unittest.TestCase): @unittest.skipUnless(MEDLoader.HasXDR(),"requires XDR") def testMissingGroups(self): """test for issue 0021749: [CEA 601] Some missing groups in mesh after reading a SAUV file with SauvReader.""" - self.assertTrue( os.getenv("MED_ROOT_DIR") ) - sauvFile = os.path.join( os.getenv("MED_ROOT_DIR"), "share","salome", - "resources","med","BDC-714.sauv") + sauvFile = os.path.join(self.__getResourcesDirectory(),"BDC-714.sauv") self.assertTrue( os.access( sauvFile, os.F_OK)) name_of_group_on_cells='Slice10:ABSORBER' name_of_group_on_cells2='Slice10:00LR' @@ -336,13 +339,13 @@ class SauvLoaderTest(unittest.TestCase): sw.setCpyGrpIfOnASingleFamilyStatus(True) self.assertTrue(sw.getCpyGrpIfOnASingleFamilyStatus()) sw.write(sauvFile) - + f = open(sauvFile) # String pattern for the header of the sub meshes record ("PILE" number, number of named objects, number of objects) pattern_pile= re.compile(r'\sPILE\sNUMERO\s+(?P[0-9]+)NBRE\sOBJETS\sNOMMES\s+(?P[0-9]+)NBRE\sOBJETS\s+(?P[0-9]+)') # String pattern for a sub mesh header (cell type, number of components and three numbers) pattern_header=re.compile(r'\s+(?P[0-9]+)\s+(?P[0-9]+)\s+[0-9]+\s+[0-9]+\s+[0-9]+') - + nbobjects=0 line = f.readline() while(line): @@ -356,13 +359,13 @@ class SauvLoaderTest(unittest.TestCase): pass line=f.readline() pass - + # Skipping the objects names f.readline() # Skipping the objects ids f.readline() - # Looking for each sub-mesh header + # Looking for each sub-mesh header line = f.readline() cur_object=0 while(line and cur_object < nbobjects): diff --git a/src/MEDLoader/Test/CMakeLists.txt b/src/MEDLoader/Test/CMakeLists.txt index 96d121401..e61fc9378 100644 --- a/src/MEDLoader/Test/CMakeLists.txt +++ b/src/MEDLoader/Test/CMakeLists.txt @@ -39,18 +39,14 @@ SET(TestSauvLoader_SOURCES SauvLoaderTest.cxx ) -#SALOME_GENERATE_TESTS_ENVIRONMENT(tests_env) - ADD_EXECUTABLE(TestMEDLoader ${TestMEDLoader_SOURCES}) TARGET_LINK_LIBRARIES(TestMEDLoader medloader ${CPPUNIT_LIBRARIES} ${PLATFORM_LIBS}) ADD_TEST(TestMEDLoader TestMEDLoader) -SET_TESTS_PROPERTIES(TestMEDLoader PROPERTIES ENVIRONMENT "${tests_env}") ADD_EXECUTABLE(TestSauvLoader ${TestSauvLoader_SOURCES}) TARGET_LINK_LIBRARIES(TestSauvLoader medloader ${CPPUNIT_LIBRARIES} ${PLATFORM_LIBS}) ADD_TEST(TestSauvLoader TestSauvLoader) -SET_TESTS_PROPERTIES(TestSauvLoader PROPERTIES ENVIRONMENT "${tests_env}") INSTALL(TARGETS TestMEDLoader TestSauvLoader DESTINATION ${MEDTOOL_INSTALL_BINS}) diff --git a/src/MEDLoader/Test/SauvLoaderTest.cxx b/src/MEDLoader/Test/SauvLoaderTest.cxx index b6195f6df..df1570008 100644 --- a/src/MEDLoader/Test/SauvLoaderTest.cxx +++ b/src/MEDLoader/Test/SauvLoaderTest.cxx @@ -44,7 +44,7 @@ void SauvLoaderTest::testSauv2Med() MEDCouplingAutoRefCountObjectPtr d2=sr->loadInMEDFileDS(); // write MED d2->write("allPillesTest.med",0); - // check + // check CPPUNIT_ASSERT_EQUAL(1,d2->getNumberOfMeshes()); CPPUNIT_ASSERT_EQUAL(8+97,d2->getNumberOfFields()); MEDFileMesh * m = d2->getMeshes()->getMeshAtPos(0); @@ -332,16 +332,16 @@ std::string SauvLoaderTest::getResourceFile( const std::string& filename ) { std::string resourceFile = ""; - if ( getenv("top_srcdir") ) { - // we are in 'make test' step - resourceFile = getenv("top_srcdir"); - resourceFile += "/resources/"; + if ( getenv("MEDTOOL_ROOT_DIR") ) { + // use MEDTOOL_ROOT_DIR env.var + resourceFile = getenv("MEDTOOL_ROOT_DIR"); + resourceFile += "/share/resources/med/"; } - else if ( getenv("MED_ROOT_DIR") ) { - // use MED_ROOT_DIR env.var - resourceFile = getenv("MED_ROOT_DIR"); - resourceFile += "/share/salome/resources/med/"; + else { + resourceFile = get_current_dir_name(); + resourceFile += "/../../../resources/"; } + resourceFile += filename; #ifdef WIN32 std::string fixedpath = resourceFile; diff --git a/src/MEDPartitioner/CMakeLists.txt b/src/MEDPartitioner/CMakeLists.txt index d1642c5cf..a57506609 100644 --- a/src/MEDPartitioner/CMakeLists.txt +++ b/src/MEDPartitioner/CMakeLists.txt @@ -131,7 +131,7 @@ IF(${SALOME_USE_MPI}) SET(medpartitionercpp_LDFLAGS ${medpartitionercpp_LDFLAGS} ${MPI_LIBRARIES}) SET_TARGET_PROPERTIES(medpartitioner_para PROPERTIES COMPILE_FLAGS "${medpartitionercpp_DEFINITIONS}") TARGET_LINK_LIBRARIES(medpartitioner_para medpartitionercpp ${medpartitionercpp_LDFLAGS}) - INSTALL(TARGETS medpartitioner_para DESTINATION ${SALOME_INSTALL_BINS}) + INSTALL(TARGETS medpartitioner_para DESTINATION ${MEDTOOL_INSTALL_BINS}) ENDIF(${SALOME_USE_MPI}) ADD_DEFINITIONS(${medpartitionercpp_DEFINITIONS}) diff --git a/src/MEDPartitioner/MEDPARTITIONER_metis.c b/src/MEDPartitioner/MEDPARTITIONER_metis.c index f67c84932..7967cab1c 100644 --- a/src/MEDPartitioner/MEDPARTITIONER_metis.c +++ b/src/MEDPartitioner/MEDPARTITIONER_metis.c @@ -38,42 +38,42 @@ typedef int idxtype; #endif // defined(MED_ENABLE_METIS) & !defined(MED_ENABLE_PARMETIS) -void MEDPARTITIONER_METIS_PartGraphRecursive(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, - idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, +void MEDPARTITIONER_METIS_PartGraphRecursive(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, + idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, int *options, int *edgecut, idxtype *part) { #if defined(MED_ENABLE_METIS) #ifndef MED_ENABLE_METIS_V5 - METIS_PartGraphRecursive(nvtxs, xadj, adjncy, vwgt, - adjwgt, wgtflag, numflag, nparts, + METIS_PartGraphRecursive(nvtxs, xadj, adjncy, vwgt, + adjwgt, wgtflag, numflag, nparts, options, edgecut, part); #else int ncon=1; options[METIS_OPTION_NCUTS]=1; options[METIS_OPTION_NITER]=1; options[METIS_OPTION_UFACTOR]=1; - METIS_PartGraphRecursive(nvtxs, &ncon, xadj, adjncy, vwgt, 0 /* vsize*/, + METIS_PartGraphRecursive(nvtxs, &ncon, xadj, adjncy, vwgt, 0 /* vsize*/, adjwgt, nparts,/* tpwgts*/ 0,/* ubvec */ 0, options, edgecut, part); #endif #endif } -void MEDPARTITIONER_METIS_PartGraphKway(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, - idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, +void MEDPARTITIONER_METIS_PartGraphKway(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, + idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, int *options, int *edgecut, idxtype *part) { #if defined(MED_ENABLE_METIS) #ifndef MED_ENABLE_METIS_V5 - METIS_PartGraphKway(nvtxs, xadj, adjncy, vwgt, - adjwgt, wgtflag, numflag, nparts, + METIS_PartGraphKway(nvtxs, xadj, adjncy, vwgt, + adjwgt, wgtflag, numflag, nparts, options, edgecut, part); #else int ncon=1; options[METIS_OPTION_NCUTS]=1; options[METIS_OPTION_NITER]=1; options[METIS_OPTION_UFACTOR]=1; - METIS_PartGraphKway(nvtxs, &ncon, xadj, adjncy, vwgt, 0 /* vsize*/, + METIS_PartGraphKway(nvtxs, &ncon, xadj, adjncy, vwgt, 0 /* vsize*/, adjwgt, nparts, 0 , 0 /* ubvec */, options, edgecut, part); #endif diff --git a/src/MEDPartitioner/Test/CMakeLists.txt b/src/MEDPartitioner/Test/CMakeLists.txt index 25e10b994..c1dd6f3bf 100644 --- a/src/MEDPartitioner/Test/CMakeLists.txt +++ b/src/MEDPartitioner/Test/CMakeLists.txt @@ -51,9 +51,7 @@ INSTALL(TARGETS TestMEDPARTITIONER DESTINATION ${MEDTOOL_INSTALL_BINS}) INSTALL(FILES ${MEDPARTITIONERTest_HEADERS_HXX} DESTINATION ${MEDTOOL_INSTALL_HEADERS}) -#SALOME_GENERATE_TESTS_ENVIRONMENT(tests_env) ADD_TEST(TestMEDPARTITIONER TestMEDPARTITIONER) -SET_TESTS_PROPERTIES(TestMEDPARTITIONER PROPERTIES ENVIRONMENT "${tests_env}") # Application tests diff --git a/src/MEDPartitioner/Test/MEDPARTITIONERTest.cxx b/src/MEDPartitioner/Test/MEDPARTITIONERTest.cxx index 5144d40d3..9b6743a1c 100644 --- a/src/MEDPartitioner/Test/MEDPARTITIONERTest.cxx +++ b/src/MEDPartitioner/Test/MEDPARTITIONERTest.cxx @@ -37,11 +37,13 @@ #include #include +#include #include #include #include #include #include +#include #ifdef HAVE_MPI #include @@ -83,19 +85,17 @@ void MEDPARTITIONERTest::setbigSize() std::string MEDPARTITIONERTest::getPartitionerExe() const { std::string execName; - if ( getenv("top_builddir")) // make distcheck + if ( getenv("MEDTOOL_ROOT_DIR") ) { - execName = getenv("top_builddir"); - execName += "/src/MEDPartitioner/medpartitioner"; - } - else if ( getenv("MED_ROOT_DIR") ) - { - execName=getenv("MED_ROOT_DIR"); //.../INSTALL/MED - execName+="/bin/salome/medpartitioner"; + execName=getenv("MEDTOOL_ROOT_DIR"); //.../INSTALL/MED + execName+="/bin/medpartitioner"; } else { - CPPUNIT_FAIL("Can't find medpartitioner, neither MED_ROOT_DIR nor top_builddir is set"); + execName = get_current_dir_name(); + execName += "/../../MEDPartitioner/medpartitioner"; + if (! std::ifstream(execName.c_str())) + CPPUNIT_FAIL("Can't find medpartitioner, please set MEDTOOL_ROOT_DIR"); } return execName; } @@ -179,7 +179,7 @@ ParaMEDMEM::MEDCouplingUMesh * MEDPARTITIONERTest::buildCUBE3DMesh() ii=ii + _ni + 2 ; conn.push_back(ii); conn.push_back(ii-1); - + ii=i + j*(_ni+1) + (k+1)*(_ni+1)*(_nj+1); conn.push_back(ii); conn.push_back(ii+1); @@ -197,7 +197,7 @@ ParaMEDMEM::MEDCouplingUMesh * MEDPARTITIONERTest::buildCUBE3DMesh() cout << endl; cout << "\nnb conn " << (_ni)*(_nj)*(_nk)*8 << " " << conn.size() << endl; for (int i=0; i<(int)conn.size(); i=i+8) - { + { for (int j=0; j<8; j++) cout << conn[i+j] << " "; cout << endl; @@ -205,7 +205,7 @@ ParaMEDMEM::MEDCouplingUMesh * MEDPARTITIONERTest::buildCUBE3DMesh() cout << endl; } */ - + MEDCouplingUMesh *mesh=MEDCouplingUMesh::New(); mesh->setMeshDimension(3); int nbc=conn.size()/8; //nb of cells @@ -267,13 +267,13 @@ ParaMEDMEM::MEDCouplingUMesh * MEDPARTITIONERTest::buildCARRE3DMesh() cout<setMeshDimension(2); int nbc=conn.size()/4; //nb of cells @@ -335,14 +335,14 @@ ParaMEDMEM::MEDCouplingUMesh * MEDPARTITIONERTest::buildFACE3DMesh() cout<setMeshDimension(2); int nbc=conn.size()/4; //nb of cells @@ -415,7 +415,7 @@ MEDCouplingFieldDouble * MEDPARTITIONERTest::buildVecFieldOnNodes() field.push_back(j+.2); field.push_back(k+.3); } - + MEDCouplingUMesh *mesh=MEDLoader::ReadUMeshFromFile(_file_name.c_str(),_mesh_name.c_str(),0); int nbOfNodes=mesh->getNumberOfNodes(); MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_NODES,ONE_TIME); @@ -452,7 +452,7 @@ void MEDPARTITIONERTest::createTestMeshWithoutField() } mesh->decrRef(); } - + { vector meshes; MEDCouplingUMesh * mesh1 = buildCUBE3DMesh(); @@ -465,7 +465,7 @@ void MEDPARTITIONERTest::createTestMeshWithoutField() meshes.push_back(mesh1); meshes.push_back(mesh2); MEDLoader::WriteUMeshes(_file_name_with_faces.c_str(), meshes, true); - + ParaMEDMEM::MEDFileUMesh* mfm=ParaMEDMEM::MEDFileUMesh::New(_file_name_with_faces.c_str(), mesh1->getName().c_str()); DataArrayInt* FacesFam=DataArrayInt::New(); FacesFam->alloc(mfm->getSizeAtLevel(-1),1); @@ -487,7 +487,7 @@ void MEDPARTITIONERTest::createTestMeshWithoutField() mfm->write(_file_name_with_faces.c_str(),0); FacesFam->decrRef(); CellsFam->decrRef(); - + /*ce truc marche pas! ParaMEDMEM::MEDFileUMesh* mfm=ParaMEDMEM::MEDFileUMesh::New(_file_name_with_faces.c_str(), mesh1->getName()); vector ms; @@ -495,7 +495,7 @@ void MEDPARTITIONERTest::createTestMeshWithoutField() mfm->setGroupsFromScratch(-1, ms); mfm->write(_file_name_with_faces.c_str(),0); */ - + if (_verbose) cout<decrRef(); mfm->decrRef(); } - + { MEDCouplingUMesh * mesh = buildCARRE3DMesh(); MEDLoader::WriteUMesh(_file_name2.c_str(),mesh,true); @@ -553,7 +553,7 @@ void MEDPARTITIONERTest::createHugeTestMesh(int ni, int nj, int nk, int nbx, int \n$tagMesh \ \n \ \n"; - + string tagSubfiles, tagSubfile="\ \n \ $fileName\n \ @@ -565,7 +565,7 @@ void MEDPARTITIONERTest::createHugeTestMesh(int ni, int nj, int nk, int nbx, int testMesh\n \ \n \ \n"; - + int xyz=1; string sxyz; DataArrayDouble* coordsInit=mesh->getCoords()->deepCpy(); @@ -573,7 +573,7 @@ void MEDPARTITIONERTest::createHugeTestMesh(int ni, int nj, int nk, int nbx, int double deltax=cooFin[0]-cooDep[0]; double deltay=cooFin[1]-cooDep[1]; double deltaz=cooFin[2]-cooDep[2]; - + double dz=0.; for (int z=0; zgetCoords(); //int nbOfComp=coords->getNumberOfComponents(); //be 3D int nbOfTuple=coords->getNumberOfTuples(); @@ -600,11 +600,11 @@ void MEDPARTITIONERTest::createHugeTestMesh(int ni, int nj, int nk, int nbx, int } MEDLoader::WriteUMesh(fileName.c_str(),mesh,true); - + tagSubfiles+=tagSubfile; tagSubfiles.replace(tagSubfiles.find("$xyz"),4,sxyz); tagSubfiles.replace(tagSubfiles.find("$fileName"),9,fileName); - + tagMeshes+=tagMesh; tagMeshes.replace(tagMeshes.find("$xyz"),4,sxyz); xyz++; @@ -615,7 +615,7 @@ void MEDPARTITIONERTest::createHugeTestMesh(int ni, int nj, int nk, int nbx, int dz+=deltaz; } coordsInit->decrRef(); - + tagXml.replace(tagXml.find("$subdomainNumber"),16,sxyz); tagXml.replace(tagXml.find("$tagSubfile"),11,tagSubfiles); tagXml.replace(tagXml.find("$tagMesh"),8,tagMeshes); @@ -626,7 +626,7 @@ void MEDPARTITIONERTest::createHugeTestMesh(int ni, int nj, int nk, int nbx, int f<decrRef(); } @@ -666,17 +666,17 @@ void MEDPARTITIONERTest::createTestMeshWithVecFieldOnCells() f3->setDescription("MyDescriptionNE"); DataArrayDouble *array=DataArrayDouble::New(); //int nb=f1->getMesh()->getNumberOfNodes(); - + /*8 pt de gauss by cell int nb=f3->getMesh()->getNumberOfCells()*8; array->alloc(nb,2); double *ptr=array->getPointer(); for (int i=0; igetMesh()->getNumberOfCells(); int nb=nbcell*nbptgauss; int nbcomp=2; @@ -753,7 +753,7 @@ void MEDPARTITIONERTest::verifyTestMeshWithVecFieldOnNodes() { cout<<"\n types in "<::iterator t=types.begin(); t!=types.end(); ++t) cout<<" "<<*t; - for (std::set::const_iterator t=types.begin(); t!=types.end(); ++t) + for (std::set::const_iterator t=types.begin(); t!=types.end(); ++t) { //INTERP_KERNEL::CellModel essai=INTERP_KERNEL::CellModel::GetCellModel(*t); cout<<" "<<(INTERP_KERNEL::CellModel::GetCellModel(*t)).getRepr(); @@ -761,7 +761,7 @@ void MEDPARTITIONERTest::verifyTestMeshWithVecFieldOnNodes() cout<decrRef(); - + MEDFileUMesh * mf = MEDFileUMesh::New(_file_name.c_str(),_mesh_name.c_str(),-1,-1); vector lev; lev=mf->getNonEmptyLevels(); @@ -839,7 +839,7 @@ void MEDPARTITIONERTest::testMeshCollectionSinglePartitionMetis() bool empty_groups=false; MEDPARTITIONER::ParaDomainSelector parallelizer(false); MEDPARTITIONER::MeshCollection collection(fileName,parallelizer); - + MEDPARTITIONER::ParallelTopology* aPT = (MEDPARTITIONER::ParallelTopology*) collection.getTopology(); aPT->setGlobalNumerotationDefault(collection.getParaDomainSelector()); //Creating the graph and partitioning it @@ -847,13 +847,13 @@ void MEDPARTITIONERTest::testMeshCollectionSinglePartitionMetis() new_topo.reset( collection.createPartition(ndomains,MEDPARTITIONER::Graph::METIS) ); //Creating a new mesh collection from the partitioning MEDPARTITIONER::MeshCollection new_collection(collection,new_topo.get(),split_family,empty_groups); - + //example to create files //MyGlobals::_General_Informations.clear(); //MyGlobals::_General_Informations.push_back(SerializeFromString("finalMeshName=Merge")); //if (MyGlobals::_Verbose>100) cout << "generalInformations : \n"<setGlobalNumerotationDefault(collection.getParaDomainSelector()); - + for (int ndomains=2 ; ndomains<=16 ; ndomains++) { //Creating the graph and partitioning it @@ -883,7 +883,7 @@ void MEDPARTITIONERTest::testMeshCollectionComplexPartitionMetis() new_topo.reset( collection.createPartition(ndomains,MEDPARTITIONER::Graph::METIS) ); //Creating a new mesh collection from the partitioning MEDPARTITIONER::MeshCollection new_collection(collection,new_topo.get(),split_family,empty_groups); - + CPPUNIT_ASSERT_EQUAL(ndomains,new_collection.getNbOfLocalMeshes()); CPPUNIT_ASSERT_EQUAL(ndomains,new_collection.getNbOfGlobalMeshes()); CPPUNIT_ASSERT_EQUAL(collection.getNbOfLocalCells(),new_collection.getNbOfLocalCells()); @@ -921,7 +921,7 @@ void MEDPARTITIONERTest::testMeshCollectionSinglePartitionScotch() bool empty_groups=false; MEDPARTITIONER::ParaDomainSelector parallelizer(false); MEDPARTITIONER::MeshCollection collection(fileName,parallelizer); - + MEDPARTITIONER::ParallelTopology* aPT = (MEDPARTITIONER::ParallelTopology*) collection.getTopology(); aPT->setGlobalNumerotationDefault(collection.getParaDomainSelector()); //Creating the graph and partitioning it @@ -929,13 +929,13 @@ void MEDPARTITIONERTest::testMeshCollectionSinglePartitionScotch() new_topo.reset( collection.createPartition(ndomains,MEDPARTITIONER::Graph::SCOTCH) ); //Creating a new mesh collection from the partitioning MEDPARTITIONER::MeshCollection new_collection(collection,new_topo.get(),split_family,empty_groups); - + //example to create files //MyGlobals::_General_Informations.clear(); //MyGlobals::_General_Informations.push_back(SerializeFromString("finalMeshName=Merge")); //if (MyGlobals::_Verbose>100) cout << "generalInformations : \n"<setGlobalNumerotationDefault(collection.getParaDomainSelector()); - + for (int ndomains=2 ; ndomains<=16 ; ndomains++) { //Creating the graph and partitioning it @@ -965,7 +965,7 @@ void MEDPARTITIONERTest::testMeshCollectionComplexPartitionScotch() new_topo.reset( collection.createPartition(ndomains,MEDPARTITIONER::Graph::SCOTCH) ); //Creating a new mesh collection from the partitioning MEDPARTITIONER::MeshCollection new_collection(collection,new_topo.get(),split_family,empty_groups); - + CPPUNIT_ASSERT_EQUAL(ndomains,new_collection.getNbOfLocalMeshes()); CPPUNIT_ASSERT_EQUAL(ndomains,new_collection.getNbOfGlobalMeshes()); CPPUNIT_ASSERT_EQUAL(collection.getNbOfLocalCells(),new_collection.getNbOfLocalCells()); @@ -991,13 +991,13 @@ void MEDPARTITIONERTest::launchMetisOrScotchMedpartitionerOnTestMeshes(std::stri { int res; string cmd,execName,sourceName,targetName; - + execName=getPartitionerExe(); - + cmd="which "+execName+" 2>/dev/null 1>/dev/null"; //no trace res=system(cmd.c_str()); CPPUNIT_ASSERT_EQUAL_MESSAGE(execName + " - INVALID PATH TO medpartitioner", 0, res); - + cmd=execName+" --ndomains=2 --split-method="+MetisOrScotch; //on same proc sourceName=_file_name; targetName=_file_name; @@ -1006,7 +1006,7 @@ void MEDPARTITIONERTest::launchMetisOrScotchMedpartitionerOnTestMeshes(std::stri if (_verbose) cout<getLevel0Mesh(false); ParaMEDMEM::MEDCouplingUMesh* faceMesh=initialMesh->getLevelM1Mesh(false); - + cmd=execName+" --ndomains=5 --split-method="+MetisOrScotch; //on same proc sourceName=fileName; targetName=fileName; @@ -1055,7 +1055,7 @@ void MEDPARTITIONERTest::verifyMetisOrScotchMedpartitionerOnSmallSizeForMesh(std res=system(cmd.c_str()); CPPUNIT_ASSERT_EQUAL(0, res); input=targetName+".xml"; - + MEDPARTITIONER::ParaDomainSelector parallelizer(false); MEDPARTITIONER::MeshCollection collection(input,parallelizer); CPPUNIT_ASSERT_EQUAL(3, collection.getMeshDimension()); @@ -1065,14 +1065,14 @@ void MEDPARTITIONERTest::verifyMetisOrScotchMedpartitionerOnSmallSizeForMesh(std for (std::size_t i = 0; i < cellMeshes.size(); i++) nbcells+=cellMeshes[i]->getNumberOfCells(); CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), nbcells); - + std::vectorfaceMeshes=collection.getFaceMesh(); CPPUNIT_ASSERT_EQUAL(5, (int) faceMeshes.size()); int nbfaces=0; for (std::size_t i=0; i < faceMeshes.size(); i++) nbfaces+=faceMeshes[i]->getNumberOfCells(); CPPUNIT_ASSERT_EQUAL(faceMesh->getNumberOfCells(), nbfaces); - + //merge split meshes and test equality cmd=execName+" --ndomains=1 --split-method="+MetisOrScotch; //on same proc sourceName=targetName+".xml"; @@ -1082,25 +1082,25 @@ void MEDPARTITIONERTest::verifyMetisOrScotchMedpartitionerOnSmallSizeForMesh(std if (_verbose) cout<getLevel0Mesh(false); ParaMEDMEM::MEDCouplingUMesh* refusedFaceMesh=refusedMesh->getLevelM1Mesh(false); - + CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), refusedCellMesh->getNumberOfCells()); CPPUNIT_ASSERT_EQUAL(faceMesh->getNumberOfCells(), refusedFaceMesh->getNumberOfCells()); - + /*not the good job ParaMEDMEM::MEDCouplingMesh* mergeCell=cellMesh->mergeMyselfWith(refusedCellMesh); CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), mergeCell->getNumberOfCells()); - + ParaMEDMEM::MEDCouplingMesh* mergeFace=faceMesh->mergeMyselfWith(refusedFaceMesh); CPPUNIT_ASSERT_EQUAL(faceMesh->getNumberOfCells(), mergeFace->getNumberOfCells()); - + CPPUNIT_ASSERT(faceMesh->isEqual(refusedFaceMesh,1e-12)); */ - + std::vector meshes; std::vector corr; meshes.push_back(cellMesh); @@ -1108,7 +1108,7 @@ void MEDPARTITIONERTest::verifyMetisOrScotchMedpartitionerOnSmallSizeForMesh(std meshes.push_back(refusedCellMesh); MEDCouplingUMesh* fusedCell=MEDCouplingUMesh::FuseUMeshesOnSameCoords(meshes,0,corr); CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), fusedCell->getNumberOfCells()); - + meshes.resize(0); for (std::size_t i = 0; i < corr.size(); i++) corr[i]->decrRef(); @@ -1118,7 +1118,7 @@ void MEDPARTITIONERTest::verifyMetisOrScotchMedpartitionerOnSmallSizeForMesh(std meshes.push_back(refusedFaceMesh); MEDCouplingUMesh* fusedFace=MEDCouplingUMesh::FuseUMeshesOnSameCoords(meshes,0,corr); CPPUNIT_ASSERT_EQUAL(faceMesh->getNumberOfCells(), fusedFace->getNumberOfCells()); - + for (std::size_t i = 0; i < corr.size(); i++) corr[i]->decrRef(); fusedFace->decrRef(); @@ -1141,10 +1141,10 @@ void MEDPARTITIONERTest::verifyMetisOrScotchMedpartitionerOnSmallSizeForFieldOnC execName=getPartitionerExe(); fileName=_file_name; fileName.replace(fileName.find(".med"),4,"_WithVecFieldOnCells.med"); - + ParaMEDMEM::MEDFileUMesh* initialMesh=ParaMEDMEM::MEDFileUMesh::New(fileName.c_str(),_mesh_name.c_str()); ParaMEDMEM::MEDCouplingUMesh* cellMesh=initialMesh->getLevel0Mesh(false); - + cmd=execName+" --ndomains=5 --split-method="+MetisOrScotch; //on same proc sourceName=fileName; targetName=fileName; @@ -1154,7 +1154,7 @@ void MEDPARTITIONERTest::verifyMetisOrScotchMedpartitionerOnSmallSizeForFieldOnC res=system(cmd.c_str()); CPPUNIT_ASSERT_EQUAL(0, res); input=targetName+".xml"; - + //merge split meshes and test equality cmd=execName+" --ndomains=1 --split-method="+MetisOrScotch; //on same proc sourceName=targetName+".xml"; @@ -1164,13 +1164,13 @@ void MEDPARTITIONERTest::verifyMetisOrScotchMedpartitionerOnSmallSizeForFieldOnC if (_verbose) cout<getLevel0Mesh(false); - + CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), refusedCellMesh->getNumberOfCells()); - + std::vector meshes; std::vector corr; meshes.push_back(cellMesh); @@ -1178,22 +1178,22 @@ void MEDPARTITIONERTest::verifyMetisOrScotchMedpartitionerOnSmallSizeForFieldOnC meshes.push_back(refusedCellMesh); MEDCouplingUMesh* fusedCell=MEDCouplingUMesh::FuseUMeshesOnSameCoords(meshes,0,corr); CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), fusedCell->getNumberOfCells()); - + MEDCouplingFieldDouble* field1=MEDLoader::ReadFieldCell(fileName.c_str(),initialMesh->getName().c_str(),0,"VectorFieldOnCells",0,1); MEDCouplingFieldDouble* field2=MEDLoader::ReadFieldCell(refusedName.c_str(),refusedCellMesh->getName().c_str(),0,"VectorFieldOnCells",0,1); - + int nbcells=corr[1]->getNumberOfTuples(); CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), nbcells); //use corr to test equality of field DataArrayDouble* f1=field1->getArray(); DataArrayDouble* f2=field2->getArray(); - if (_verbose>300) + if (_verbose>300) { cout<<"\nf1 : "<reprZip(); cout<<"\nf2 : "<reprZip(); //field2->advancedRepradvancedRepr(); for (std::size_t i = 0; i < corr.size(); i++) cout << "\ncorr " << i << " : " << corr[i]->reprZip(); - + } int nbequal=0; int nbcomp=field1->getNumberOfComponents(); @@ -1211,7 +1211,7 @@ void MEDPARTITIONERTest::verifyMetisOrScotchMedpartitionerOnSmallSizeForFieldOnC } } CPPUNIT_ASSERT_EQUAL(nbcells*nbcomp, nbequal); - + for (std::size_t i = 0; i < corr.size(); i++) corr[i]->decrRef(); field1->decrRef(); @@ -1230,10 +1230,10 @@ void MEDPARTITIONERTest::verifyMetisOrScotchMedpartitionerOnSmallSizeForFieldOnG execName=getPartitionerExe(); fileName=_file_name; fileName.replace(fileName.find(".med"),4,"_WithVecFieldOnGaussNe.med"); - + ParaMEDMEM::MEDFileUMesh* initialMesh=ParaMEDMEM::MEDFileUMesh::New(fileName.c_str(),_mesh_name.c_str()); ParaMEDMEM::MEDCouplingUMesh* cellMesh=initialMesh->getLevel0Mesh(false); - + cmd=execName+" --ndomains=5 --split-method="+MetisOrScotch; //on same proc sourceName=fileName; targetName=fileName; @@ -1243,7 +1243,7 @@ void MEDPARTITIONERTest::verifyMetisOrScotchMedpartitionerOnSmallSizeForFieldOnG res=system(cmd.c_str()); CPPUNIT_ASSERT_EQUAL(0, res); input=targetName+".xml"; - + //merge split meshes and test equality cmd=execName+" --ndomains=1 --split-method="+MetisOrScotch; //on same proc sourceName=targetName+".xml"; @@ -1253,13 +1253,13 @@ void MEDPARTITIONERTest::verifyMetisOrScotchMedpartitionerOnSmallSizeForFieldOnG if (_verbose) cout<getLevel0Mesh(false); - + CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), refusedCellMesh->getNumberOfCells()); - + std::vector meshes; std::vector corr; meshes.push_back(cellMesh); @@ -1267,22 +1267,22 @@ void MEDPARTITIONERTest::verifyMetisOrScotchMedpartitionerOnSmallSizeForFieldOnG meshes.push_back(refusedCellMesh); MEDCouplingUMesh* fusedCell=MEDCouplingUMesh::FuseUMeshesOnSameCoords(meshes,0,corr); CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), fusedCell->getNumberOfCells()); - + MEDCouplingFieldDouble* field1=MEDLoader::ReadField(ON_GAUSS_NE,fileName.c_str(),initialMesh->getName().c_str(),0,"MyFieldOnGaussNE",5,6); MEDCouplingFieldDouble* field2=MEDLoader::ReadField(ON_GAUSS_NE,refusedName.c_str(),refusedCellMesh->getName().c_str(),0,"MyFieldOnGaussNE",5,6); - + int nbcells=corr[1]->getNumberOfTuples(); CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), nbcells); //use corr to test equality of field DataArrayDouble* f1=field1->getArray(); DataArrayDouble* f2=field2->getArray(); - if (_verbose>300) + if (_verbose>300) { cout << "\nf1 : " << f1->reprZip(); //123.4 for 12th cell,3rd component, 4th gausspoint cout << "\nf2 : " << f2->reprZip(); //field2->advancedRepradvancedRepr(); for (std::size_t i = 0; i < corr.size(); i++) cout << "\ncorr " << i << " : " << corr[i]->reprZip(); - + } int nbequal=0; int nbptgauss=8; @@ -1301,7 +1301,7 @@ void MEDPARTITIONERTest::verifyMetisOrScotchMedpartitionerOnSmallSizeForFieldOnG } } CPPUNIT_ASSERT_EQUAL(nbcells*nbcomp*nbptgauss, nbequal); - + for (std::size_t i = 0; i < corr.size(); i++) corr[i]->decrRef(); field1->decrRef(); diff --git a/src/MEDPartitioner/Test/MEDPARTITIONERTest.hxx b/src/MEDPartitioner/Test/MEDPARTITIONERTest.hxx index 5e437cb32..f6cd5a13b 100644 --- a/src/MEDPartitioner/Test/MEDPARTITIONERTest.hxx +++ b/src/MEDPartitioner/Test/MEDPARTITIONERTest.hxx @@ -56,7 +56,7 @@ class MEDPARTITIONERTEST_EXPORT MEDPARTITIONERTest : public CppUnit::TestFixture CPPUNIT_TEST( testMeshCollectionComplexPartitionScotch ); CPPUNIT_TEST( testScotchSmallSize ); #endif - + #if defined(HAVE_MPI) #if defined(MED_ENABLE_PARMETIS) //test with mpi on system @@ -85,13 +85,14 @@ public: int _nb_target_huge; std::string _mesh_name; //initial test mesh file med int _verbose; - + //for utils void setSize(int ni, int nj, int nk); void setSmallSize(); void setMedianSize(); void setbigSize(); std::string getPartitionerExe() const; + std::string getPartitionerParaExe() const; ParaMEDMEM::MEDCouplingUMesh * buildCUBE3DMesh(); ParaMEDMEM::MEDCouplingUMesh * buildFACE3DMesh(); ParaMEDMEM::MEDCouplingUMesh * buildCARRE3DMesh(); @@ -113,7 +114,7 @@ public: void launchMedpartitionerOnTestMeshes(); void launchMedpartitionerOnHugeTestMeshes(); void deleteTestMeshes(); - + //for CPPUNIT_TEST void setUp(); void tearDown(); @@ -129,7 +130,7 @@ public: void testMeshCollectionComplexPartitionScotch(); void testScotchSmallSize(); #endif - + #if defined(HAVE_MPI) void testMpirunSmallSize(); void testMpirunMedianSize(); diff --git a/src/MEDPartitioner/Test/MEDPARTITIONERTestPara.cxx b/src/MEDPartitioner/Test/MEDPARTITIONERTestPara.cxx index 5daaa525d..c38d51755 100644 --- a/src/MEDPartitioner/Test/MEDPARTITIONERTestPara.cxx +++ b/src/MEDPartitioner/Test/MEDPARTITIONERTestPara.cxx @@ -50,18 +50,35 @@ using namespace ParaMEDMEM; using namespace MEDPARTITIONER; #if defined(HAVE_MPI) +std::string MEDPARTITIONERTest::getPartitionerParaExe() const +{ + std::string execName; + if ( getenv("MEDTOOL_ROOT_DIR") ) + { + execName=getenv("MEDTOOL_ROOT_DIR"); //.../INSTALL/MED + execName+="/bin/medpartitioner_para"; + } + else + { + execName = get_current_dir_name(); + execName += "/../../MEDPartitioner/medpartitioner_para"; + if (! std::ifstream(execName.c_str())) + CPPUNIT_FAIL("Can't find medpartitioner_para, please set MEDTOOL_ROOT_DIR"); + } + return execName; +} + void MEDPARTITIONERTest::verifyMedpartitionerOnSmallSizeForMesh() { int res; string fileName,cmd,execName,sourceName,targetName,input; - execName=getenv("MED_ROOT_DIR"); //.../INSTALL/MED - execName+="/bin/salome/medpartitioner_para"; + execName=getPartitionerParaExe(); fileName=_file_name_with_faces; - + ParaMEDMEM::MEDFileUMesh* initialMesh=ParaMEDMEM::MEDFileUMesh::New(fileName.c_str(),_mesh_name.c_str()); ParaMEDMEM::MEDCouplingUMesh* cellMesh=initialMesh->getLevel0Mesh(false); ParaMEDMEM::MEDCouplingUMesh* faceMesh=initialMesh->getLevelM1Mesh(false); - + cmd="mpirun -np 5 "+execName+" --ndomains=5 --split-method=metis"; //on same proc sourceName=fileName; targetName=fileName; @@ -71,7 +88,7 @@ void MEDPARTITIONERTest::verifyMedpartitionerOnSmallSizeForMesh() res=system(cmd.c_str()); CPPUNIT_ASSERT_EQUAL(0, res); input=targetName+".xml"; - + MEDPARTITIONER::ParaDomainSelector parallelizer(false); MEDPARTITIONER::MeshCollection collection(input,parallelizer); CPPUNIT_ASSERT_EQUAL(3, collection.getMeshDimension()); @@ -81,14 +98,14 @@ void MEDPARTITIONERTest::verifyMedpartitionerOnSmallSizeForMesh() for (std::size_t i = 0; i < cellMeshes.size(); i++) nbcells+=cellMeshes[i]->getNumberOfCells(); CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), nbcells); - + std::vectorfaceMeshes=collection.getFaceMesh(); CPPUNIT_ASSERT_EQUAL(5, (int) faceMeshes.size()); int nbfaces=0; for (std::size_t i=0; i < faceMeshes.size(); i++) nbfaces+=faceMeshes[i]->getNumberOfCells(); CPPUNIT_ASSERT_EQUAL(faceMesh->getNumberOfCells(), nbfaces); - + //merge split meshes and test equality cmd="mpirun -np 1 "+execName+" --ndomains=1 --split-method=metis"; //on same proc sourceName=targetName+".xml"; @@ -98,25 +115,25 @@ void MEDPARTITIONERTest::verifyMedpartitionerOnSmallSizeForMesh() if (_verbose) cout<getLevel0Mesh(false); ParaMEDMEM::MEDCouplingUMesh* refusedFaceMesh=refusedMesh->getLevelM1Mesh(false); - + CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), refusedCellMesh->getNumberOfCells()); CPPUNIT_ASSERT_EQUAL(faceMesh->getNumberOfCells(), refusedFaceMesh->getNumberOfCells()); - + /*not the good job ParaMEDMEM::MEDCouplingMesh* mergeCell=cellMesh->mergeMyselfWith(refusedCellMesh); CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), mergeCell->getNumberOfCells()); - + ParaMEDMEM::MEDCouplingMesh* mergeFace=faceMesh->mergeMyselfWith(refusedFaceMesh); CPPUNIT_ASSERT_EQUAL(faceMesh->getNumberOfCells(), mergeFace->getNumberOfCells()); - + CPPUNIT_ASSERT(faceMesh->isEqual(refusedFaceMesh,1e-12)); */ - + std::vector meshes; std::vector corr; meshes.push_back(cellMesh); @@ -124,7 +141,7 @@ void MEDPARTITIONERTest::verifyMedpartitionerOnSmallSizeForMesh() meshes.push_back(refusedCellMesh); MEDCouplingUMesh* fusedCell=MEDCouplingUMesh::FuseUMeshesOnSameCoords(meshes,0,corr); CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), fusedCell->getNumberOfCells()); - + meshes.resize(0); for (std::size_t i = 0; i < corr.size(); i++) corr[i]->decrRef(); @@ -134,7 +151,7 @@ void MEDPARTITIONERTest::verifyMedpartitionerOnSmallSizeForMesh() meshes.push_back(refusedFaceMesh); MEDCouplingUMesh* fusedFace=MEDCouplingUMesh::FuseUMeshesOnSameCoords(meshes,0,corr); CPPUNIT_ASSERT_EQUAL(faceMesh->getNumberOfCells(), fusedFace->getNumberOfCells()); - + for (std::size_t i = 0; i < corr.size(); i++) corr[i]->decrRef(); fusedFace->decrRef(); @@ -152,14 +169,13 @@ void MEDPARTITIONERTest::verifyMedpartitionerOnSmallSizeForFieldOnCells() { int res; string fileName,cmd,execName,sourceName,targetName,input; - execName=getenv("MED_ROOT_DIR"); //.../INSTALL/MED - execName+="/bin/salome/medpartitioner_para"; + execName=getPartitionerParaExe(); fileName=_file_name; fileName.replace(fileName.find(".med"),4,"_WithVecFieldOnCells.med"); - + ParaMEDMEM::MEDFileUMesh* initialMesh=ParaMEDMEM::MEDFileUMesh::New(fileName.c_str(),_mesh_name.c_str()); ParaMEDMEM::MEDCouplingUMesh* cellMesh=initialMesh->getLevel0Mesh(false); - + cmd="mpirun -np 5 "+execName+" --ndomains=5 --split-method=metis"; //on same proc sourceName=fileName; targetName=fileName; @@ -169,7 +185,7 @@ void MEDPARTITIONERTest::verifyMedpartitionerOnSmallSizeForFieldOnCells() res=system(cmd.c_str()); CPPUNIT_ASSERT_EQUAL(0, res); input=targetName+".xml"; - + //merge split meshes and test equality cmd="mpirun -np 1 "+execName+" --ndomains=1 --split-method=metis"; //on same proc sourceName=targetName+".xml"; @@ -179,13 +195,13 @@ void MEDPARTITIONERTest::verifyMedpartitionerOnSmallSizeForFieldOnCells() if (_verbose) cout<getLevel0Mesh(false); - + CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), refusedCellMesh->getNumberOfCells()); - + std::vector meshes; std::vector corr; meshes.push_back(cellMesh); @@ -193,22 +209,22 @@ void MEDPARTITIONERTest::verifyMedpartitionerOnSmallSizeForFieldOnCells() meshes.push_back(refusedCellMesh); MEDCouplingUMesh* fusedCell=MEDCouplingUMesh::FuseUMeshesOnSameCoords(meshes,0,corr); CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), fusedCell->getNumberOfCells()); - + MEDCouplingFieldDouble* field1=MEDLoader::ReadFieldCell(fileName.c_str(),initialMesh->getName().c_str(),0,"VectorFieldOnCells",0,1); MEDCouplingFieldDouble* field2=MEDLoader::ReadFieldCell(refusedName.c_str(),refusedCellMesh->getName().c_str(),0,"VectorFieldOnCells",0,1); - + int nbcells=corr[1]->getNumberOfTuples(); CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), nbcells); //use corr to test equality of field DataArrayDouble* f1=field1->getArray(); DataArrayDouble* f2=field2->getArray(); - if (_verbose>300) + if (_verbose>300) { cout<<"\nf1 : "<reprZip(); cout<<"\nf2 : "<reprZip(); //field2->advancedRepradvancedRepr(); for (std::size_t i = 0; i < corr.size(); i++) cout << "\ncorr " << i << " : " << corr[i]->reprZip(); - + } int nbequal=0; int nbcomp=field1->getNumberOfComponents(); @@ -226,7 +242,7 @@ void MEDPARTITIONERTest::verifyMedpartitionerOnSmallSizeForFieldOnCells() } } CPPUNIT_ASSERT_EQUAL(nbcells*nbcomp, nbequal); - + for (std::size_t i = 0; i < corr.size(); i++) corr[i]->decrRef(); field1->decrRef(); @@ -240,14 +256,13 @@ void MEDPARTITIONERTest::verifyMedpartitionerOnSmallSizeForFieldOnGaussNe() { int res; string fileName,cmd,execName,sourceName,targetName,input; - execName=getenv("MED_ROOT_DIR"); //.../INSTALL/MED - execName+="/bin/salome/medpartitioner_para"; + execName=getPartitionerParaExe(); fileName=_file_name; fileName.replace(fileName.find(".med"),4,"_WithVecFieldOnGaussNe.med"); - + ParaMEDMEM::MEDFileUMesh* initialMesh=ParaMEDMEM::MEDFileUMesh::New(fileName.c_str(),_mesh_name.c_str()); ParaMEDMEM::MEDCouplingUMesh* cellMesh=initialMesh->getLevel0Mesh(false); - + cmd="mpirun -np 5 "+execName+" --ndomains=5 --split-method=metis"; //on same proc sourceName=fileName; targetName=fileName; @@ -257,7 +272,7 @@ void MEDPARTITIONERTest::verifyMedpartitionerOnSmallSizeForFieldOnGaussNe() res=system(cmd.c_str()); CPPUNIT_ASSERT_EQUAL(0, res); input=targetName+".xml"; - + //merge split meshes and test equality cmd="mpirun -np 1 "+execName+" --ndomains=1 --split-method=metis"; //on same proc sourceName=targetName+".xml"; @@ -267,13 +282,13 @@ void MEDPARTITIONERTest::verifyMedpartitionerOnSmallSizeForFieldOnGaussNe() if (_verbose) cout<getLevel0Mesh(false); - + CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), refusedCellMesh->getNumberOfCells()); - + std::vector meshes; std::vector corr; meshes.push_back(cellMesh); @@ -281,22 +296,22 @@ void MEDPARTITIONERTest::verifyMedpartitionerOnSmallSizeForFieldOnGaussNe() meshes.push_back(refusedCellMesh); MEDCouplingUMesh* fusedCell=MEDCouplingUMesh::FuseUMeshesOnSameCoords(meshes,0,corr); CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), fusedCell->getNumberOfCells()); - + MEDCouplingFieldDouble* field1=MEDLoader::ReadField(ON_GAUSS_NE,fileName.c_str(),initialMesh->getName().c_str(),0,"MyFieldOnGaussNE",5,6); MEDCouplingFieldDouble* field2=MEDLoader::ReadField(ON_GAUSS_NE,refusedName.c_str(),refusedCellMesh->getName().c_str(),0,"MyFieldOnGaussNE",5,6); - + int nbcells=corr[1]->getNumberOfTuples(); CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), nbcells); //use corr to test equality of field DataArrayDouble* f1=field1->getArray(); DataArrayDouble* f2=field2->getArray(); - if (_verbose>300) + if (_verbose>300) { cout << "\nf1 : " << f1->reprZip(); //123.4 for 12th cell,3rd component, 4th gausspoint cout << "\nf2 : " << f2->reprZip(); //field2->advancedRepradvancedRepr(); for (std::size_t i = 0; i < corr.size(); i++) cout << "\ncorr " << i << " : " << corr[i]->reprZip(); - + } int nbequal=0; int nbptgauss=8; @@ -315,7 +330,7 @@ void MEDPARTITIONERTest::verifyMedpartitionerOnSmallSizeForFieldOnGaussNe() } } CPPUNIT_ASSERT_EQUAL(nbcells*nbcomp*nbptgauss, nbequal); - + for (std::size_t i = 0; i < corr.size(); i++) corr[i]->decrRef(); field1->decrRef(); @@ -327,8 +342,8 @@ void MEDPARTITIONERTest::verifyMedpartitionerOnSmallSizeForFieldOnGaussNe() void MEDPARTITIONERTest::launchMedpartitionerOnTestMeshes() { - - /* examples + + /* examples export INFI=/home/vb144235/resources/blade.med //no need export MESH=Fuse_1 export INFI=tmp_testMeshxxx.med @@ -339,17 +354,16 @@ void MEDPARTITIONERTest::launchMedpartitionerOnTestMeshes() */ int res; string cmd,execName,sourceName,targetName; - + res=system("which mpirun 2>/dev/null 1>/dev/null"); //no trace CPPUNIT_ASSERT_EQUAL(0, res); - - execName=getenv("MED_ROOT_DIR"); //.../INSTALL/MED - execName+="/bin/salome/medpartitioner_para"; - + + execName=getPartitionerParaExe(); + cmd="which "+execName+" 2>/dev/null 1>/dev/null"; //no trace res=system(cmd.c_str()); CPPUNIT_ASSERT_EQUAL(0, res); - + cmd="mpirun -np 2 "+execName+" --ndomains=2 --split-method=metis"; //on same proc sourceName=_file_name; targetName=_file_name; @@ -358,7 +372,7 @@ void MEDPARTITIONERTest::launchMedpartitionerOnTestMeshes() if (_verbose) cout< ret; + int meshDim, spaceDim, numberOfNodes; + std::vector< std::vector< std::pair > > typesDistrib(MEDLoader::GetUMeshGlobalInfo(fileName,mName,meshDim,spaceDim,numberOfNodes)); + std::vector types; + std::vector distrib; + for(std::vector< std::vector< std::pair > >::const_iterator it0=typesDistrib.begin();it0!=typesDistrib.end();it0++) + for(std::vector< std::pair >::const_iterator it1=(*it0).begin();it1!=(*it0).end();it1++) + { + types.push_back((*it1).first); + int tmp[3]; + DataArray::GetSlice(0,(*it1).second,1,iPart,nbOfParts,tmp[0],tmp[1]); + tmp[2]=1; + distrib.insert(distrib.end(),tmp,tmp+3); + } + ret=MEDFileUMesh::LoadPartOf(fid,mName,types,distrib,dt,it,mrs); + return ret.retn(); +} + +MEDFileMeshes *ParaMEDFileMeshes::New(int iPart, int nbOfParts, const std::string& fileName) +{ + std::vector ms(MEDLoader::GetMeshNames(fileName)); + MEDCouplingAutoRefCountObjectPtr ret(MEDFileMeshes::New()); + for(std::vector::const_iterator it=ms.begin();it!=ms.end();it++) + { + MEDCouplingAutoRefCountObjectPtr mesh(ParaMEDFileMesh::New(iPart,nbOfParts,fileName,(*it))); + ret->pushMesh(mesh); + } + return ret.retn(); +} + +MEDFileMeshes *ParaMEDFileMeshes::ParaNew(int iPart, int nbOfParts, const MPI_Comm& com, const MPI_Info& nfo, const std::string& fileName) +{ + std::vector ms(MEDLoader::GetMeshNames(fileName)); + MEDCouplingAutoRefCountObjectPtr ret(MEDFileMeshes::New()); + for(std::vector::const_iterator it=ms.begin();it!=ms.end();it++) + { + MEDCouplingAutoRefCountObjectPtr mesh(ParaMEDFileMesh::ParaNew(iPart,nbOfParts,com,nfo,fileName,(*it))); + ret->pushMesh(mesh); + } + return ret.retn(); +} diff --git a/src/ParaMEDLoader/ParaMEDFileMesh.hxx b/src/ParaMEDLoader/ParaMEDFileMesh.hxx new file mode 100644 index 000000000..f034c471d --- /dev/null +++ b/src/ParaMEDLoader/ParaMEDFileMesh.hxx @@ -0,0 +1,61 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// Author : Anthony Geay (EDF R&D) + +#ifndef __PARAMEDFILEMESH_HXX__ +#define __PARAMEDFILEMESH_HXX__ + +#include "med.h" + +#include "mpi.h" + +#include + +namespace ParaMEDMEM +{ + class MEDFileMesh; + class MEDFileUMesh; + class MEDFileMeshes; + class MEDFileMeshReadSelector; + + class ParaMEDFileMesh + { + public: + static MEDFileMesh *New(int iPart, int nbOfParts, const std::string& fileName, const std::string& mName, int dt=-1, int it=-1, MEDFileMeshReadSelector *mrs=0); + static MEDFileMesh *ParaNew(int iPart, int nbOfParts, const MPI_Comm& com, const MPI_Info& nfo, const std::string& fileName, const std::string& mName, int dt=-1, int it=-1, MEDFileMeshReadSelector *mrs=0); + }; + + class ParaMEDFileUMesh + { + public: + static MEDFileUMesh *New(int iPart, int nbOfParts, const std::string& fileName, const std::string& mName, int dt=-1, int it=-1, MEDFileMeshReadSelector *mrs=0); + static MEDFileUMesh *ParaNew(int iPart, int nbOfParts, const MPI_Comm& com, const MPI_Info& nfo, const std::string& fileName, const std::string& mName, int dt=-1, int it=-1, MEDFileMeshReadSelector *mrs=0); + private: + static MEDFileUMesh *NewPrivate(med_idt fid, int iPart, int nbOfParts, const std::string& fileName, const std::string& mName, int dt, int it, MEDFileMeshReadSelector *mrs); + }; + + class ParaMEDFileMeshes + { + public: + static MEDFileMeshes *New(int iPart, int nbOfParts, const std::string& fileName); + static MEDFileMeshes *ParaNew(int iPart, int nbOfParts, const MPI_Comm& com, const MPI_Info& nfo, const std::string& fileName); + }; +} + +#endif diff --git a/src/ParaMEDLoader/ParaMEDLoader.cxx b/src/ParaMEDLoader/ParaMEDLoader.cxx new file mode 100644 index 000000000..43a4eec9d --- /dev/null +++ b/src/ParaMEDLoader/ParaMEDLoader.cxx @@ -0,0 +1,65 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// Author : Anthony Geay (CEA/DEN) + +#include "ParaMEDLoader.hxx" +#include "MEDLoader.hxx" +#include "ParaMESH.hxx" +#include "BlockTopology.hxx" +#include "MEDCouplingUMesh.hxx" + +#include + +using namespace ParaMEDMEM; + +ParaMEDLoader::ParaMEDLoader() +{ +} + +void ParaMEDLoader::WriteParaMesh(const char *fileName, ParaMEDMEM::ParaMESH *mesh) +{ + if(!mesh->getBlockTopology()->getProcGroup()->containsMyRank()) + return ; + int myRank=mesh->getBlockTopology()->getProcGroup()->myRank(); + int nbDomains=mesh->getBlockTopology()->getProcGroup()->size(); + std::vector fileNames(nbDomains); + for(int i=0;igetCellMesh()->getName().c_str()); + MEDLoader::WriteUMesh(fileNames[myRank].c_str(),dynamic_cast(mesh->getCellMesh()),true); +} + +/*! + * This method builds the master file 'fileName' of a parallel MED file defined in 'fileNames'. + */ +void ParaMEDLoader::WriteMasterFile(const char *fileName, const std::vector& fileNames, const char *meshName) +{ + int nbOfDom=fileNames.size(); + std::ofstream fs(fileName); + fs << "#MED Fichier V 2.3" << " " << std::endl; + fs << "#"<<" " << std::endl; + fs << nbOfDom <<" " << std::endl; + for(int i=0;i +#include + +namespace ParaMEDMEM +{ + class ParaMESH; + class ParaFIELD; +} + +class ParaMEDLoader +{ +public: + static void WriteParaMesh(const char *fileName, ParaMEDMEM::ParaMESH *mesh); + static void WriteMasterFile(const char *fileName, const std::vector& fileNames, const char *meshName); +private: + ParaMEDLoader(); +}; + +#endif diff --git a/src/ParaMEDMEM/BASICS_JR b/src/ParaMEDMEM/BASICS_JR new file mode 100644 index 000000000..61a724d45 --- /dev/null +++ b/src/ParaMEDMEM/BASICS_JR @@ -0,0 +1,339 @@ + +Le document de specification : +============================== + +Globalement le document de specification correspond a +l'implementation qui a ete faite avec : + +. Transport-ParaMEDMEM qui a ete enrichi avec la classe MPI_Access + +. Presentation-ParaMEDMEM qui a ete enrichi avec la classe + MPI_AccessDEC + + +La conception correspondant a cette specification est restee +la meme : + +. MPI_Access gere pour un ProcessorGroup (IntraCommunicator) : + - Les structures MPI_Request et MPI_Status + - La valeur des "tags" MPI + - Les requetes d'ecritures et de lectures asynchrones + - Les communications en "Point a Point" [I]Send, [I]Recv ainsi + que [I]SendRecv. + - A la difference de l'API MPI [I]SendRecv ne concerne qu'un + seul et meme "target". + - Les controles de communications asynchrones Wait, Test, + WaitAll, TestAll, [I]Probe, Cancel et CancelAll. + - Comme c'etait demande seules les methodes "utiles" ont ete + implementees. + - Les appels a [I]Send ou a [I]Recv avec des sendbuff/recvbuff + de valeur NULL ou avec des sendcount/recvcount de valeur + nulle sont ignores. + - Les methodes de communications collectives ne sont pas + implementees dans MPI_Access. + - Les deux methodes "Cancel" concernent soit un IRecv deja + soumis soit un message en attente (sans IRecv deja soumis). + Elles regroupent les differents appels de l'API MPI + necessaires (IProbe, IRecv, Wait, Test_Canceled ...). + +. MPI_AccessDEC utilise les services de MPI_Access pour un + ProcessorGroup (IntraCommunicator) et gere : + - Les communications collectives en "Point a Point". + (AllToAll[v] synchrone ou asynchrone). + - Les temps et l'interpolation + - Les [I]Send avec leurs buffers (delete []) + - Les [I]Recv + - La finalisation des envois et receptions de messages dans + le destructeur afin qu'il n'y ait plus de message en attente + et afin de liberer les buffers + + +MPI_Access et "tags" (ou "MPITags") : +===================================== + +. Le constructeur permet optionnellement de fixer une plage de tags + a utiliser : [BaseTag , MaxTag]. + Par defaut c'est [ 0 , MPI_TAG_UB], MPI_TAG_UB etant la valeur + maximum d'une implementation de MPI (valeur minimum 32767 + soit 2**15-1). Sur awa avec l'implementation lam MPI_TAG_UB + vaut 7353944. La norme MPI specifie que cette valeur doit + etre la meme dans les process demarres avec mpirun. + Dans le cas de l'usage simultane du meme IntraCommunicator + dans un meme process (ou de plusieurs IntraCommunicator + d'intersection non nulle) cela peut eviter toute ambiguite + et aider au debug. + +. Dans MPI_Access les tags sont constitues de deux parties + (#define ModuloTag 10) : + + Le dernier digit decimal correspond au MPI_DataType ( 1 pour + les messages "temps", 2 pour MPI_INT et 3 pour MPI_DOUBLE) + + La valeur des autres digits correspond a une numerotation + circulaire des messages. + + Un message "temps" et le message de donnees associe ont le + meme numero de message (mais des types et donc des tags + differents). + +. Pour un envoi de message d'un process "source" vers un process + "target", on dispose de _SendMPITag[target] dans le process + source (il contient le dernier "tag" utilise pour l'envoi de + messages vers le process target). + Et dans le process "target" qui recoit ce message, on dispose + de _RecvMPITag[source] (il contient le dernier "tag" utilise + pour la reception de messages du process source). + Naturellement d'apres la norme MPI les valeurs de ces tags sont + les memes. + + +MPI_Access et "RequestIds" : +============================ + +. ATTENTION : Dans le document de specification, la distinction + n'est pas faite clairement entre les "MPITags" (voir ci-dessus) + qui sont un argument des appels a MPI et les "RequestIds" qui + ne concernent pas les appels MPI. Ces "RequestIds" figurent + en effet sous le nom de tag comme argument d'entree/sortie dans l'API + de MPI_Access decrite dans le document de specification. Mais + dans l'implementation on a bien le nom RequestId (ou bien + RecvRequestId/SendRequestId). + +. Lors de la soumission d'une requete d'ecriture ou de lecture MPI + via MPI_Access, on obtient un identifieur "RequestId". + Cet identifieur "RequestId" correspond a une structure RequestStruct + de MPI_Access a laquelle on accede avec la map + "_MapOfRequestStruct". + Cette structure RequestStruct permet de gerer MPI_Request et + MPI_Status * de MPI et permet d'obtenir des informations sur + la requete : target, send/recv, tag, [a]synchrone, type, outcount. + +. C'est cet identifieur qui peut etre utilise pour controler une + requete asynchrone via MPI_Access : Wait, Test, Probe, etc... + +. En pratique "RequestId" est simplement un entier de l'intervalle + [0 , 2**32-1]. Il y a uniquement un compteur cyclique global + aussi bien pour les [I]Send que pour les [I]Recv. + +. Ces "RequestIds" et leur structures associees facilitent les + communications asynchrones. + Par exemple on a mpi_access->Wait( int RequestId ) + au lieu de MPI_Wait(MPI_Request *request, MPI_Status *status) + avec gestion de status. + +. L'API de MPI_Access peut fournir les "SendRequestIds" d'un "target", + les "RecvRequestIds" d'un "source" ou bien les "SendRequestIds" de + tous les "targets" ou les "RecvRequestIds" de tous les "sources". + Cela permet d'eviter leur gestion au niveau de Presentation-ParaMEDMEM. + + +MPI_AccessDEC : +=============== + +. Comme la classe DEC, il est base sur local_group et distant_group + ce qui forme un MPI_union_group et donc un IntraCommunicator. + +. Il permet de choisir le mode synchrone ou asynchrone (par defaut). + Le meme programme peut fonctionner en synchrone ou en asynchrone + sans devoir etre modifie. + +. Il permet de choisir un mode d'interpolation (actuellement + uniquement une interpolation lineaire) ou bien un mode sans + interpolation (par defaut). Ceci pour les communications collectives. + Avec interpolation les communications collectives transmettent et + recoivent un message "temps" en plus des donnees. + +. Il implemente AllToAll[v] en "Point a Point" avec ou sans interpolation. + +. Il gere les buffers d'envoi de messages. Il les detruit donc + lorsqu'ils sont disponibles. + +. Il cree et utilise MPI_Access. + + +MPI_AccessDEC et la gestion des SendBuffers : +============================================= + +. Comme dans les communications collectives on n'envoie que des + parties du meme buffer à chaque process "target", il faut s'assurer + en asynchrone que toutes ces parties sont disponibles pour + pouvoir liberer le buffer. + +. On suppose que ces buffers ont ete alloues avec un new double[] + +. La structure SendBuffStruct permet de conserver l'adresse du buffer + et de gerer un compteur de references de ce buffer. Elle comporte + aussi MPI_Datatype pour pouvoir faire un delete [] (double *) ... + lorsque le compteur est null. + +. La map _MapOfSendBuffers etablit la correspondance entre chaque + RequestId obtenu de MPI_Access->ISend(...) et un SendBuffStruct + pour chaque "target" d'une partie du buffer. + +. Tout cela ne concerne que les envois asynchrones. En synchrone, + on detruit senbuf juste apres l'avoir transmis. + + +MPI_AccessDEC et la gestion des RecvBuffers : +============================================= + +S'il n'y a pas d'interpolation, rien de particulier n'est fait. + +Avec interpolation pour chaque target : +--------------------------------------- +. On a _TimeMessages[target] qui est un vecteur de TimesMessages. + On en a 2 dans notre cas avec une interpolation lineaire qui + contiennent le time(t0)/deltatime precedent et le dernier + time(t1)/deltatime. + +. On a _DataMessages[target] qui est un vecteur de DatasMessages + On en a 2 dans notre cas avec une interpolation lineaire qui + contiennent les donnees obtenues par Recv au time(t0)/deltatime + precedent et au dernier time(t1)/deltatime. + +. Au temps _t(t*) du processus courrant on effectue l'interpolation + entre les valeurs des 2 DatasMessages que l'on rend dans la + partie de recvbuf correspondant au target pourvu que t0 < t* <= t1. + +. Par suite de la difference des "deltatimes" entre process, on + peut avoir t0 < t1 < t* auquel cas on aura une extrapolation. + +. Les vecteurs _OutOfTime, _DataMessagesRecvCount et _DataMessagesType + contiennent pour chaque target true si t* > dernier t1, recvcount et + MPI_Datatype pour finaliser la gestion des messages a la fin. + + +Etapes des communications collectives de MPI_AccessDEC : +======================================================== + +AllToAll[v] : Les arguments sont les memes que dans MPI sauf MPI_Comm +------------- inutile (deja connu de MPI_AccessDEC et MPI_Access). + + Si on a un TimeInterpolator, appel de AllToAll[v]Time. + + Sinon, on appelle CheckSent pour les echanges + asynchrones (voir ci-apres) et on appelle SendRecv + pour chaque "target". + +AllToAll[v]Time : +----------------- + +. CheckSent() : + + appelle SendRequestIds de MPI_Access afin d'obtenir tous les + RequestIds d'envoi de messages a tous les "targets". + + Pour chaque RequestId, appelle Test de MPI_Access pour savoir + si le buffer est libre (flag = true). Lorsqu'il s'agit du + FinalCheckSent, on appelle Wait au lieu de Test. + + Si le buffer est libre, on decremente le compteur de la + structure SendBuffStruct obtenue avec _MapOfSendBuffers. + (voir MPI_AccessDEC et la gestion des SendBuffers ci-dessus) + + Si le compteur est nul on detruit le TimeMessage ou le + SendBuffer en fonction du DataType. + + Puis on detruit la structure SendBuffStruct avant de supprimer + (erase) cet item de _MapOfSendBuffers + +. DoSend : + + On cree un TimeMessage (voir cette structure dans MPI_Access). + + Si l'on est en asynchrone on cree deux structures SendBuffStruct + aSendTimeStruct et aSendDataStruct que l'on remplit. + + On remplit la structure aSendTimeMessage avec time/deltatime du + process courant. "deltatime" doit etre nul s'il s'agit du dernier + pas de temps. + + Puis pour chaque "target", on envoie le TimeMessage et la partie + de sendbuf concernee par ce target. + + Si l'on est en asynchrone, on incremente le compteur et on ajoute + a _MapOfSendBuffers aSendTimeStruct et aSendDataStruct avec les + identifieurs SendTimeRequestId et SendDataRequestId recus de + MPI_Access->Send(...). + + Et enfin si l'on est en synchrone, on detruit les SendMessages. + +. CheckTime(recvcount , recvtype , target , UntilEnd) + + Au depart, on lit le premier "Message-temps" dans + &(*_TimeMessages)[target][1] et le premier message de donnees + dans le buffer alloue (*_DataMessages)[target][1]. + + Par convention deltatime des messages temps est nul si c'est le + dernier. + + Boucle while : _t(t*) est le temps courant du processus. + "tant que _t(t*) est superieur au temps du "target" + (*_TimeMessages)[target][1].time et que + (*_TimeMessages)[target][1].deltatime n'est pas nul", + ainsi en fin de boucle on aura : + _t(t*) <= (*_TimeMessages)[target][1].time avec + _t(t*) > (*_TimeMessages)[target][0].time + ou bien on aura le dernier message temps du "target". + + S'il s'agit de la finalisation des receptions des messages + temps et donnees (UntilEnd vaut true), on effectue la + boucle jusqu'a ce que l'on trouve + (*_TimeMessages)[target][1].deltatime nul. + + Dans la boucle : + On recopie le dernier message temps dans le message temps + precedent et on lit le message temps suivant. + On detruit le buffer de donnees du temps precedent. + On recopie le pointeur du dernier buffer de donnees dans + le precedent. + On alloue un nouveau dernier buffer de donnees + (*_DataMessages)[target][1] et on lit les donnees + correspondantes dans ce buffer. + + Si le temps courant du process est plus grand que le dernier + temps (*_TimeMessages)[target][1].time du target, on donne + la valeur true a (*_OutOfTime)[target]. + (*_TimeMessages)[target][1].deltatime est alors nul. + +. CheckTime + DoRecv + DoInterp + + Pour chaque target on appelle CheckTime + + Si on a un TimeInterpolator et si le message temps du target + n'est pas le premier, on appelle l'interpolateur qui stocke + ses resultats dans la partie du buffer de reception qui + correspond au "target". + + Sinon, on recopie les donnees recues pour ce premier pas de + temps dans la partie du buffer de reception qui correspond au + "target". + + +Presentation-ParaMEDMEM : +========================= + +. Des modifications mineures ont ete effectuees dans Presentation-ParaMEDMEM + afin de pouvoir utiliser ces nouvelles fonctionnalites. Il n'y + a surtout pas eu de bouleversement destabilisateur. L'ancien + mode de fonctionnement reste naturellement disponible. + +. Cela repose sur trois nouvelles options creees avec registerOption + dans le constructeur de InterpKernelDEC : + + Asynchronous : true ou false (par defaut) + + TimeInterpolation : WithoutTimeInterp (par defaut) ou LinearTimeInterp + typedef enum{WithoutTimeInterp,LinearTimeInterp} TimeInterpolationMethod; + dans MPI_AccessDEC.hxx + + AllToAllMethod : Native (par defaut) ou PointToPoint + typedef enum{Native,PointToPoint} AllToAllMethod; + dans MxN_Mapping.hxx + +. Le choix des options se fait avec le Data Exchange Channel : + + ParaMEDMEM::InterpKernelDEC dec (*source_group,*target_group); + + dec.setOption("Asynchronous",true); + + dec.setOption("TimeInterpolation",LinearTimeInterp); + + dec.setOption("AllToAllMethod",PointToPoint); + +. Dans dec.synchronize(), + + on cree un objet InterpolationMatrix + qui lui-meme cree un objet MxN_Mapping + qui lui-meme cree maintenant un objet MPI_AccessDEC + + on transmet a MxN_Mapping via l'InterpolationMatrix l'option + choisie de AllToAllMethod + + on transmet a MPI_AccessDEC les valeurs des options Asynchronous + et TimeInterpolation : methodes Asynchronous et + SetTimeInterpolator de MPI_AccessDEC. + +. ParaMEDMEM::InterpKernelDEC comporte maintenant une surcharge des + methodes recvData() et sendData() : + + void InterpKernelDEC::recvData( double time ) qui appelle + SetTime(time) de MPI_AccessDEC et + recvData() + + void InterpKernelDEC::sendData( double time , double deltatime ) + qui appelle + SetTime(time,deltatime) de MPI_AccessDEC et + sendData() + +. recvData() et sendData() de ParaMEDMEM::InterpKernelDEC + appellent multiply et transposeMultiply de l'InterpolationMatrix + qui appellent sendRecv et reverseSendRecv de MxN_Mapping + qui appellent comm_interface.allToAllV en mode "Native" + ou bien MPI_AccessDEC::AllToAllv en mode "PointToPoint" + diff --git a/src/ParaMEDMEM/BlockTopology.cxx b/src/ParaMEDMEM/BlockTopology.cxx new file mode 100644 index 000000000..8f6b4cea8 --- /dev/null +++ b/src/ParaMEDMEM/BlockTopology.cxx @@ -0,0 +1,336 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "BlockTopology.hxx" +#include "MEDCouplingMemArray.hxx" +#include "MEDCouplingCMesh.hxx" +#include "CommInterface.hxx" +#include "ProcessorGroup.hxx" +#include "MPIProcessorGroup.hxx" +#include "ComponentTopology.hxx" +#include "InterpKernelUtilities.hxx" + +#include +#include +#include +#include + +using namespace std; + +namespace ParaMEDMEM +{ + + //!converts a pair to a global number + std::pair BlockTopology::globalToLocal(const int global) const + { + int subdomain_id=0; + int position=global; + int size=_nb_elems; + int size_procs=_proc_group->size(); + int increment=size; + vectoraxis_position(_dimension); + vectoraxis_offset(_dimension); + for (int idim=0; idim<_dimension; idim++) + { + int axis_size=_local_array_indices[idim].size()-1; + int axis_nb_elem=_local_array_indices[idim][axis_size]; + increment=increment/axis_nb_elem; + int proc_increment = size_procs/(axis_size); + int axis_pos=position/increment; + position=position%increment; + int iaxis=1; + while (_local_array_indices[idim][iaxis]<=axis_pos) + { + subdomain_id+=proc_increment; + iaxis++; + } + axis_position[idim]=axis_pos-_local_array_indices[idim][iaxis-1]; + axis_offset[idim]=iaxis; + } + int local=0; + int local_increment=1; + for (int idim=_dimension-1; idim>=0; idim--) + { + local+=axis_position[idim]*local_increment; + local_increment*=_local_array_indices[idim][axis_offset[idim]]-_local_array_indices[idim][axis_offset[idim]-1]; + } + return make_pair(subdomain_id,local); + } + + //!converts local number to a global number + int BlockTopology::localToGlobal(const pair local) const + { + + int subdomain_id=local.first; + int global=0; + int loc=local.second; + int increment=_nb_elems; + int proc_increment=_proc_group->size(); + int local_increment=getNbLocalElements(); + for (int idim=0; idim < _dimension; idim++) + { + int axis_size=_local_array_indices[idim].size()-1; + int axis_nb_elem=_local_array_indices[idim][axis_size]; + increment=axis_nb_elem==0?0:increment/axis_nb_elem; + proc_increment = proc_increment/(axis_size); + int proc_axis=subdomain_id/proc_increment; + subdomain_id=subdomain_id%proc_increment; + int local_axis_nb_elem=_local_array_indices[idim][proc_axis+1]-_local_array_indices[idim][proc_axis]; + local_increment = (local_axis_nb_elem==0)?0:(local_increment/local_axis_nb_elem); + int iaxis=((local_increment==0)?0:(loc/local_increment))+_local_array_indices[idim][proc_axis]; + global+=increment*iaxis; + loc = (local_increment==0)?0:(loc%local_increment); + } + return global; + } + + //Retrieves the local number of elements + int BlockTopology::getNbLocalElements()const + { + int position=_proc_group->myRank(); + int nb_elem = 1; + int increment=1; + for (int i=_dimension-1; i>=0; i--) + { + increment *=_nb_procs_per_dim[i]; + int idim=position%increment; + position=position/increment; + int imin=_local_array_indices[i][idim]; + int imax=_local_array_indices[i][idim+1]; + nb_elem*=(imax-imin); + } + return nb_elem; + } + + /*! + * Constructor of a block topology from a grid. + * This preliminary version simply splits along the first axis + * instead of making the best choice with respect to the + * values of the different axes. + */ + BlockTopology::BlockTopology(const ProcessorGroup& group, MEDCouplingCMesh *grid): + _dimension(grid->getSpaceDimension()), _proc_group(&group), _owns_processor_group(false) + { + vector axis_length(_dimension); + _nb_elems=1; + for (int idim=0; idim <_dimension; idim++) + { + DataArrayDouble *arr=grid->getCoordsAt(idim); + axis_length[idim]=arr->getNbOfElems(); + _nb_elems*=axis_length[idim]; + } + //default splitting along 1st dimension + _local_array_indices.resize(_dimension); + _nb_procs_per_dim.resize(_dimension); + + _local_array_indices[0].resize(_proc_group->size()+1); + _local_array_indices[0][0]=0; + _nb_procs_per_dim[0]=_proc_group->size(); + + for (int i=1; i<=_proc_group->size(); i++) + { + _local_array_indices[0][i]=_local_array_indices[0][i-1]+ + axis_length[0]/_proc_group->size(); + if (i<= axis_length[0]%_proc_group->size()) + _local_array_indices[0][i]+=1; + } + for (int i=1; i<_dimension; i++) + { + _local_array_indices[i].resize(2); + _local_array_indices[i][0]=0; + _local_array_indices[i][1]=axis_length[i]; + _nb_procs_per_dim[i]=1; + } + _cycle_type.resize(_dimension); + for (int i=0; i<_dimension; i++) + _cycle_type[i]=ParaMEDMEM::Block; + } + + /*! + * Creation of a block topology by composing + * a geometrical topology and a component topology. + * This constructor is intended for creating fields + * for which the parallel distribution is made on the + * components of the field rather than on the geometrical + * partitioning of the underlying mesh. + * + */ + BlockTopology::BlockTopology(const BlockTopology& geom_topo, const ComponentTopology& comp_topo):_owns_processor_group(false) + { + // so far, the block topology can only be created if the proc group + // is either on geom_topo or on comp_topo + if (geom_topo.getProcGroup()->size()>1 && comp_topo.nbBlocks()>1) + throw INTERP_KERNEL::Exception(LOCALIZED("BlockTopology cannot yet be constructed with both complex geo and components topology")); + + if (comp_topo.nbComponents()==1) + { + *this=geom_topo; + return; + } + else + { + _dimension = geom_topo.getDimension()+1; + if (comp_topo.nbBlocks()>1) + _proc_group=comp_topo.getProcGroup(); + else + _proc_group=geom_topo.getProcGroup(); + _local_array_indices=geom_topo._local_array_indices; + vector comp_indices = *(comp_topo.getBlockIndices()); + _local_array_indices.push_back(comp_indices); + _nb_procs_per_dim=geom_topo._nb_procs_per_dim; + _nb_procs_per_dim.push_back(comp_topo.nbBlocks()); + _cycle_type=geom_topo._cycle_type; + _cycle_type.push_back(Block); + _nb_elems=geom_topo.getNbElements()*comp_topo.nbComponents(); + } + } + + /*! Constructor for creating a one-dimensional + * topology from a processor group and a local + * number of elements on each processor + * + * The function must be called only by the processors belonging + * to group \a group. Calling it from a processor not belonging + * to \a group will cause an MPI error, while calling from a subset + * of \a group will result in a deadlock. + */ + BlockTopology::BlockTopology(const ProcessorGroup& group, int nb_elem):_dimension(1),_proc_group(&group),_owns_processor_group(false) + { + int* nbelems_per_proc = new int[group.size()]; + const MPIProcessorGroup* mpi_group=dynamic_cast(_proc_group); + const MPI_Comm* comm=mpi_group->getComm(); + int nbtemp=nb_elem; + mpi_group->getCommInterface().allGather(&nbtemp, 1, MPI_INT, + nbelems_per_proc, 1, MPI_INT, + *comm); + _nb_elems=0; + + //splitting along only dimension + _local_array_indices.resize(1); + _nb_procs_per_dim.resize(1); + + _local_array_indices[0].resize(_proc_group->size()+1); + _local_array_indices[0][0]=0; + _nb_procs_per_dim[0]=_proc_group->size(); + + for (int i=1; i<=_proc_group->size(); i++) + { + _local_array_indices[0][i]=_local_array_indices[0][i-1]+ + nbelems_per_proc[i-1]; + _nb_elems+=nbelems_per_proc[i-1]; + } + _cycle_type.resize(1); + _cycle_type[0]=ParaMEDMEM::Block; + delete[] nbelems_per_proc; + } + + BlockTopology::~BlockTopology() + { + if (_owns_processor_group) + delete _proc_group; + } + + /*! Retrieves the min and max indices of the domain stored locally + * for each dimension. The output vector has the topology dimension + * as a size and each pair contains min and max. Indices + * range from min to max-1. + */ + std::vector > BlockTopology::getLocalArrayMinMax() const + { + vector > local_indices (_dimension); + int myrank=_proc_group->myRank(); + int increment=1; + for (int i=_dimension-1; i>=0; i--) + { + increment *=_nb_procs_per_dim[i]; + int idim=myrank%increment; + local_indices[i].first=_local_array_indices[i][idim]; + local_indices[i].second=_local_array_indices[i][idim+1]; + cout << local_indices[i].first << " "<< local_indices[i].second< buffer; + + buffer.push_back(_dimension); + buffer.push_back(_nb_elems); + for (int i=0; i<_dimension; i++) + { + buffer.push_back(_nb_procs_per_dim[i]); + buffer.push_back(_cycle_type[i]); + buffer.push_back(_local_array_indices[i].size()); + for (int j=0; j<(int)_local_array_indices[i].size(); j++) + buffer.push_back(_local_array_indices[i][j]); + } + + //serializing the comm group + int size_comm=_proc_group->size(); + buffer.push_back(size_comm); + MPIProcessorGroup world_group(_proc_group->getCommInterface()); + for (int i=0; i procs; + int size_comm=*(ptr_serializer++); + for (int i=0; i + +namespace ParaMEDMEM +{ + class ComponentTopology; + class MEDCouplingCMesh; + + typedef enum{Block,Cycle} CYCLE_TYPE; + + class BlockTopology : public Topology + { + public: + BlockTopology() { } + BlockTopology(const ProcessorGroup& group, MEDCouplingCMesh *grid); + BlockTopology(const BlockTopology& geom_topo, const ComponentTopology& comp_topo); + BlockTopology(const ProcessorGroup& group, int nb_elem); + virtual ~BlockTopology(); + //!Retrieves the number of elements for a given topology + int getNbElements()const { return _nb_elems; } + int getNbLocalElements() const; + const ProcessorGroup* getProcGroup()const { return _proc_group; } + std::pair globalToLocal (const int) const ; + int localToGlobal (const std::pair) const; + std::vector > getLocalArrayMinMax() const ; + int getDimension() const { return _dimension; } + void serialize(int* & serializer, int& size) const ; + void unserialize(const int* serializer, const CommInterface& comm_interface); + private: + //dimension : 2 or 3 + int _dimension; + //proc array + std::vector _nb_procs_per_dim; + //stores the offsets vector + std::vector > _local_array_indices; + //stores the cycle type (block or cyclic) + std::vector _cycle_type; + //Processor group + const ProcessorGroup* _proc_group; + //nb of elements + int _nb_elems; + bool _owns_processor_group; + }; +} + +#endif diff --git a/src/ParaMEDMEM/CMakeLists.txt b/src/ParaMEDMEM/CMakeLists.txt new file mode 100644 index 000000000..a94cb3ede --- /dev/null +++ b/src/ParaMEDMEM/CMakeLists.txt @@ -0,0 +1,71 @@ +# Copyright (C) 2012-2015 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +# Author : Anthony Geay (CEA/DEN) + +ADD_DEFINITIONS(${MPI_DEFINITIONS}) + +INCLUDE_DIRECTORIES( + ${MPI_INCLUDE_DIRS} + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/../MEDCoupling + ${CMAKE_CURRENT_SOURCE_DIR}/../INTERP_KERNEL + ${CMAKE_CURRENT_SOURCE_DIR}/../INTERP_KERNEL/Bases + ${CMAKE_CURRENT_SOURCE_DIR}/../INTERP_KERNEL/Geometric2D + ${CMAKE_CURRENT_SOURCE_DIR}/../INTERP_KERNEL/ExprEval + ${CMAKE_CURRENT_SOURCE_DIR}/../INTERP_KERNEL/GaussPoints + ) + +SET(paramedmem_SOURCES + ProcessorGroup.cxx + MPIProcessorGroup.cxx + ParaMESH.cxx + ComponentTopology.cxx + MPIAccess.cxx + InterpolationMatrix.cxx + OverlapInterpolationMatrix.cxx + StructuredCoincidentDEC.cxx + ExplicitCoincidentDEC.cxx + InterpKernelDEC.cxx + ElementLocator.cxx + OverlapElementLocator.cxx + MPIAccessDEC.cxx + TimeInterpolator.cxx + LinearTimeInterpolator.cxx + DEC.cxx + DisjointDEC.cxx + OverlapDEC.cxx + ExplicitTopology.cxx + MxN_Mapping.cxx + OverlapMapping.cxx + ICoCoMEDField.cxx + ICoCoField.cxx + ParaFIELD.cxx + ParaGRID.cxx + BlockTopology.cxx + ) + +ADD_LIBRARY(paramedmem SHARED ${paramedmem_SOURCES}) +TARGET_LINK_LIBRARIES(paramedmem medcoupling ${MPI_LIBRARIES}) +INSTALL(TARGETS paramedmem EXPORT ${PROJECT_NAME}TargetGroup DESTINATION ${MEDTOOL_INSTALL_LIBS}) + +FILE(GLOB paramedmem_HEADERS_HXX "${CMAKE_CURRENT_SOURCE_DIR}/*.hxx") +INSTALL(FILES ${paramedmem_HEADERS_HXX} DESTINATION ${MEDTOOL_INSTALL_HEADERS}) + +# To allow usage as SWIG dependencies: +SET(paramedmem_HEADERS_HXX PARENT_SCOPE) diff --git a/src/ParaMEDMEM/CommInterface.cxx b/src/ParaMEDMEM/CommInterface.cxx new file mode 100644 index 000000000..ae9e2d9f1 --- /dev/null +++ b/src/ParaMEDMEM/CommInterface.cxx @@ -0,0 +1,63 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "CommInterface.hxx" + +namespace ParaMEDMEM +{ + /*! \defgroup comm_interface CommInterface + Class \a CommInterface is the gateway to the MPI library. + It is a helper class that gathers the calls to the MPI + library that are made in the ParaMEDMEM library. This gathering + allows easier gathering of information about the communication + in the library. + + It is typically called after the MPI_Init() call in a program. It is afterwards passed as a parameter to the constructors of ParaMEDMEM objects so that they access the MPI library via the CommInterface. + + As an example, the following code excerpt initializes a processor group made of the zero processor. + + \verbatim + #include "CommInterface.hxx" + #include "ProcessorGroup.hxx" + + int main(int argc, char** argv) + { + //initialization + MPI_Init(&argc, &argv); + ParaMEDMEM::CommInterface comm_interface; + + //setting up a processor group with proc 0 + set procs; + procs.insert(0); + ParaMEDMEM::ProcessorGroup group(procs, comm_interface); + + //cleanup + MPI_Finalize(); + } + \endverbatim + */ + + CommInterface::CommInterface() + { + } + + CommInterface::~CommInterface() + { + } +} diff --git a/src/ParaMEDMEM/CommInterface.hxx b/src/ParaMEDMEM/CommInterface.hxx new file mode 100644 index 000000000..ae430eddd --- /dev/null +++ b/src/ParaMEDMEM/CommInterface.hxx @@ -0,0 +1,92 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __COMMINTERFACE_HXX__ +#define __COMMINTERFACE_HXX__ + +#include +namespace ParaMEDMEM +{ + + class CommInterface + { + public: + CommInterface(){} + virtual ~CommInterface(){} + int worldSize() const { + int size; + MPI_Comm_size(MPI_COMM_WORLD, &size); + return size;} + int commSize(MPI_Comm comm, int* size) const { return MPI_Comm_size(comm,size); } + int commRank(MPI_Comm comm, int* rank) const { return MPI_Comm_rank(comm,rank); } + int commGroup(MPI_Comm comm, MPI_Group* group) const { return MPI_Comm_group(comm, group); } + int groupIncl(MPI_Group group, int size, int* ranks, MPI_Group* group_output) const { return MPI_Group_incl(group, size, ranks, group_output); } + int commCreate(MPI_Comm comm, MPI_Group group, MPI_Comm* comm_output) const { return MPI_Comm_create(comm,group,comm_output); } + int groupFree(MPI_Group* group) const { return MPI_Group_free(group); } + int commFree(MPI_Comm* comm) const { return MPI_Comm_free(comm); } + + int send(void* buffer, int count, MPI_Datatype datatype, int target, int tag, MPI_Comm comm) const { return MPI_Send(buffer,count, datatype, target, tag, comm); } + int recv(void* buffer, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status* status) const { return MPI_Recv(buffer,count, datatype, source, tag, comm, status); } + int sendRecv(void* sendbuf, int sendcount, MPI_Datatype sendtype, + int dest, int sendtag, void* recvbuf, int recvcount, + MPI_Datatype recvtype, int source, int recvtag, MPI_Comm comm, + MPI_Status* status) { return MPI_Sendrecv(sendbuf, sendcount, sendtype, dest, sendtag, recvbuf, recvcount, recvtype, source, recvtag, comm,status); } + + int Isend(void* buffer, int count, MPI_Datatype datatype, int target, + int tag, MPI_Comm comm, MPI_Request *request) const { return MPI_Isend(buffer,count, datatype, target, tag, comm, request); } + int Irecv(void* buffer, int count, MPI_Datatype datatype, int source, + int tag, MPI_Comm comm, MPI_Request* request) const { return MPI_Irecv(buffer,count, datatype, source, tag, comm, request); } + + int wait(MPI_Request *request, MPI_Status *status) const { return MPI_Wait(request, status); } + int test(MPI_Request *request, int *flag, MPI_Status *status) const { return MPI_Test(request, flag, status); } + int requestFree(MPI_Request *request) const { return MPI_Request_free(request); } + int waitany(int count, MPI_Request *array_of_requests, int *index, MPI_Status *status) const { return MPI_Waitany(count, array_of_requests, index, status); } + int testany(int count, MPI_Request *array_of_requests, int *index, int *flag, MPI_Status *status) const { return MPI_Testany(count, array_of_requests, index, flag, status); } + int waitall(int count, MPI_Request *array_of_requests, MPI_Status *array_of_status) const { return MPI_Waitall(count, array_of_requests, array_of_status); } + int testall(int count, MPI_Request *array_of_requests, int *flag, MPI_Status *array_of_status) const { return MPI_Testall(count, array_of_requests, flag, array_of_status); } + int waitsome(int incount, MPI_Request *array_of_requests,int *outcount, int *array_of_indices, MPI_Status *array_of_status) const { return MPI_Waitsome(incount, array_of_requests, outcount, array_of_indices, array_of_status); } + int testsome(int incount, MPI_Request *array_of_requests, int *outcount, + int *array_of_indices, MPI_Status *array_of_status) const { return MPI_Testsome(incount, array_of_requests, outcount, array_of_indices, array_of_status); } + int probe(int source, int tag, MPI_Comm comm, MPI_Status *status) const { return MPI_Probe(source, tag, comm, status) ; } + int Iprobe(int source, int tag, MPI_Comm comm, int *flag, MPI_Status *status) const { return MPI_Iprobe(source, tag, comm, flag, status) ; } + int cancel(MPI_Request *request) const { return MPI_Cancel(request); } + int testCancelled(MPI_Status *status, int *flag) const { return MPI_Test_cancelled(status, flag); } + int barrier(MPI_Comm comm) const { return MPI_Barrier(comm); } + int errorString(int errorcode, char *string, int *resultlen) const { return MPI_Error_string(errorcode, string, resultlen); } + int getCount(MPI_Status *status, MPI_Datatype datatype, int *count) const { return MPI_Get_count(status, datatype, count); } + + int broadcast(void* buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm) const { return MPI_Bcast(buffer, count, datatype, root, comm); } + int allGather(void* sendbuf, int sendcount, MPI_Datatype sendtype, + void* recvbuf, int recvcount, MPI_Datatype recvtype, + MPI_Comm comm) const { return MPI_Allgather(sendbuf,sendcount, sendtype, recvbuf, recvcount, recvtype, comm); } + int allToAll(void* sendbuf, int sendcount, MPI_Datatype sendtype, + void* recvbuf, int recvcount, MPI_Datatype recvtype, + MPI_Comm comm) const { return MPI_Alltoall(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm); } + int allToAllV(void* sendbuf, int* sendcounts, int* senddispls, + MPI_Datatype sendtype, void* recvbuf, int* recvcounts, + int* recvdispls, MPI_Datatype recvtype, + MPI_Comm comm) const { return MPI_Alltoallv(sendbuf, sendcounts, senddispls, sendtype, recvbuf, recvcounts, recvdispls, recvtype, comm); } + + int reduce(void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, + MPI_Op op, int root, MPI_Comm comm) const { return MPI_Reduce(sendbuf, recvbuf, count, datatype, op, root, comm); } + int allReduce(void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) const { return MPI_Allreduce(sendbuf, recvbuf, count, datatype, op, comm); } + }; +} + +#endif /*COMMINTERFACE_HXX_*/ diff --git a/src/ParaMEDMEM/ComponentTopology.cxx b/src/ParaMEDMEM/ComponentTopology.cxx new file mode 100644 index 000000000..8af706e59 --- /dev/null +++ b/src/ParaMEDMEM/ComponentTopology.cxx @@ -0,0 +1,115 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "ComponentTopology.hxx" +#include "ProcessorGroup.hxx" +#include "InterpolationUtils.hxx" + +namespace ParaMEDMEM +{ + /* Generic constructor for \a nb_comp components equally parted + * in \a nb_blocks blocks + */ + ComponentTopology::ComponentTopology(int nb_comp, ProcessorGroup* group):_proc_group(group) + { + int nb_blocks=group->size(); + + if (nb_blocks>nb_comp) + throw INTERP_KERNEL::Exception("ComponentTopology Number of components must be larger than number of blocks"); + + _component_array.resize(nb_blocks+1); + _component_array[0]=0; + for (int i=1; i<=nb_blocks; i++) + { + _component_array[i]=_component_array[i-1]+nb_comp/nb_blocks; + if (i<=nb_comp%nb_blocks) + _component_array[i]++; + } + } + + /* Generic constructor for \a nb_comp components equally parted + * in \a nb_blocks blocks + */ + ComponentTopology::ComponentTopology(int nb_comp, int nb_blocks):_proc_group(0) + { + if (nb_blocks>nb_comp) + throw INTERP_KERNEL::Exception("ComponentTopology Number of components must be larger than number of blocks"); + + _component_array.resize(nb_blocks+1); + _component_array[0]=0; + for (int i=1; i<=nb_blocks; i++) + { + _component_array[i]=_component_array[i-1]+nb_comp/nb_blocks; + if (i<=nb_comp%nb_blocks) + _component_array[i]++; + } + + } + + //!Constructor for one block of \a nb_comp components + ComponentTopology::ComponentTopology(int nb_comp):_proc_group(0) + { + + _component_array.resize(2); + _component_array[0]=0; + _component_array[1]=nb_comp; + + } + + //! Constructor for one component + ComponentTopology::ComponentTopology():_proc_group(0) + { + _component_array.resize(2); + _component_array[0]=0; + _component_array[1]=1; + + } + + ComponentTopology::~ComponentTopology() + { + } + + int ComponentTopology::nbLocalComponents() const + { + if (_proc_group==0) + return nbComponents(); + + int nbcomp; + int myrank = _proc_group->myRank(); + if (myrank!=-1) + nbcomp = _component_array[myrank+1]-_component_array[myrank]; + else + nbcomp=0; + return nbcomp; + } + + int ComponentTopology::firstLocalComponent() const + { + if (_proc_group==0) + return 0; + + int icomp; + int myrank = _proc_group->myRank(); + if (myrank!=-1) + icomp = _component_array[myrank]; + else + icomp=-1; + return icomp; + } +} diff --git a/src/ParaMEDMEM/ComponentTopology.hxx b/src/ParaMEDMEM/ComponentTopology.hxx new file mode 100644 index 000000000..de11e3efe --- /dev/null +++ b/src/ParaMEDMEM/ComponentTopology.hxx @@ -0,0 +1,56 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __COMPONENTTOPOLOGY_HXX__ +#define __COMPONENTTOPOLOGY_HXX__ + +#include "Topology.hxx" + +#include + +namespace ParaMEDMEM +{ + class ProcessorGroup; + + class ComponentTopology + { + public: + ComponentTopology(int nb_comp, ProcessorGroup* group); + ComponentTopology(int nb_comp, int nb_blocks); + ComponentTopology(int nb_comp); + ComponentTopology(); + virtual ~ComponentTopology(); + //!returns the number of MED components in the topology + int nbComponents() const { return _component_array.back(); } + //!returns the number of MED components on local processor + int nbLocalComponents() const ; + //!returns the number of the first MED component on local processor + int firstLocalComponent() const ; + //!returns the number of blocks in the topology + int nbBlocks()const {return _component_array.size()-1;} + //!returns the block structure + const std::vector* getBlockIndices() const { return &_component_array; } + const ProcessorGroup* getProcGroup()const { return _proc_group; } + private: + std::vector _component_array; + ProcessorGroup* _proc_group; + }; +} + +#endif /*COMPONENTTOPOLOGY_HXX_*/ diff --git a/src/ParaMEDMEM/DEC.cxx b/src/ParaMEDMEM/DEC.cxx new file mode 100644 index 000000000..cbd0ea45d --- /dev/null +++ b/src/ParaMEDMEM/DEC.cxx @@ -0,0 +1,47 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "CommInterface.hxx" +#include "Topology.hxx" +#include "BlockTopology.hxx" +#include "ComponentTopology.hxx" +#include "ParaFIELD.hxx" +#include "ParaMESH.hxx" +#include "DEC.hxx" +#include "ICoCoField.hxx" +#include "ICoCoMEDField.hxx" +#include "MPIProcessorGroup.hxx" + +#include + +namespace ParaMEDMEM +{ + DEC::DEC():_comm_interface(0) + { + } + + void DEC::copyFrom(const DEC& other) + { + _comm_interface=other._comm_interface; + } + + DEC::~DEC() + { + } +} diff --git a/src/ParaMEDMEM/DEC.hxx b/src/ParaMEDMEM/DEC.hxx new file mode 100644 index 000000000..1b0a8675f --- /dev/null +++ b/src/ParaMEDMEM/DEC.hxx @@ -0,0 +1,43 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __DEC_HXX__ +#define __DEC_HXX__ + +#include "MEDCouplingFieldDouble.hxx" +#include "NormalizedUnstructuredMesh.hxx" +#include "DECOptions.hxx" + +namespace ParaMEDMEM +{ + class CommInterface; + class DEC : public DECOptions + { + public: + DEC(); + void copyFrom(const DEC& other); + virtual void synchronize() = 0; + virtual void sendRecvData(bool way=true) = 0; + virtual ~DEC(); + protected: + const CommInterface* _comm_interface; + }; +} + +#endif diff --git a/src/ParaMEDMEM/DECOptions.hxx b/src/ParaMEDMEM/DECOptions.hxx new file mode 100644 index 000000000..5572ffdca --- /dev/null +++ b/src/ParaMEDMEM/DECOptions.hxx @@ -0,0 +1,74 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __DECOPTIONS_HXX__ +#define __DECOPTIONS_HXX__ + +#include + +namespace ParaMEDMEM +{ + //Enum describing the allToAll method used in the communication pattern + typedef enum { Native, PointToPoint } AllToAllMethod; + typedef enum { WithoutTimeInterp, LinearTimeInterp } TimeInterpolationMethod; + + class DECOptions + { + protected: + std::string _method; + bool _asynchronous; + TimeInterpolationMethod _timeInterpolationMethod; + AllToAllMethod _allToAllMethod; + bool _forcedRenormalization; + public: + DECOptions():_method("P0"), + _asynchronous(false), + _timeInterpolationMethod(WithoutTimeInterp), + _allToAllMethod(Native), + _forcedRenormalization(false) + { + } + + DECOptions(const DECOptions& deco) + { + _method=deco._method; + _timeInterpolationMethod=deco._timeInterpolationMethod; + _asynchronous=deco._asynchronous; + _forcedRenormalization=deco._forcedRenormalization; + _allToAllMethod=deco._allToAllMethod; + } + + const std::string& getMethod() const { return _method; } + void setMethod(const char *m) { _method=m; } + + TimeInterpolationMethod getTimeInterpolationMethod() const { return DECOptions::_timeInterpolationMethod; } + void setTimeInterpolationMethod(TimeInterpolationMethod it) { DECOptions::_timeInterpolationMethod=it; } + + bool getForcedRenormalization() const { return DECOptions::_forcedRenormalization; } + void setForcedRenormalization( bool dr) { DECOptions::_forcedRenormalization = dr; } + + bool getAsynchronous() const { return DECOptions::_asynchronous; } + void setAsynchronous( bool dr) { DECOptions::_asynchronous = dr; } + + AllToAllMethod getAllToAllMethod() const { return _allToAllMethod; } + void setAllToAllMethod(AllToAllMethod sp) { _allToAllMethod=sp; } + }; +} + +#endif diff --git a/src/ParaMEDMEM/DisjointDEC.cxx b/src/ParaMEDMEM/DisjointDEC.cxx new file mode 100644 index 000000000..f3f9bf666 --- /dev/null +++ b/src/ParaMEDMEM/DisjointDEC.cxx @@ -0,0 +1,386 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "DisjointDEC.hxx" +#include "CommInterface.hxx" +#include "Topology.hxx" +#include "BlockTopology.hxx" +#include "ComponentTopology.hxx" +#include "ParaFIELD.hxx" +#include "ParaMESH.hxx" +#include "ICoCoField.hxx" +#include "ICoCoMEDField.hxx" +#include "MPIProcessorGroup.hxx" + +#include +#include + +/*! \defgroup dec DEC + * + * \section decintroduction Introduction + * + * Interface class for creation of a link between two + * processor groups for exhanging mesh or field data. + * The \c DEC is defined by attaching a field on the receiving or on the + * sending side. + * On top of attaching a \c ParaMEDMEM::FIELD, it is possible to + * attach a ICoCo::Field. This class is an abstract class that enables + * coupling of codes that respect the ICoCo interface \ref icoco. It has two implementations: + * one for codes that express their fields as \ref medoupling fields (ICoCo::MEDField). + * + * \section dec_options DEC Options + * Options supported by \c DEC objects are + * + * + * + * + *
OptionDescriptionDefault value
ForcedRenormalizationAfter receiving data, the target field is renormalized so that L2-norms of the source and target fields match. false
+ + + The following code excerpt shows how to set options for an object that inherits from \c DEC : + + \code + InterpKernelDEC dec(source_group,target_group); + dec.setOptions("ForcedRenormalization",true); + dec.attachLocalField(field); + dec.synchronize(); + if (source_group.containsMyRank()) + dec.sendData(); + else + dec.recvData(); + \endcode +*/ + +namespace ParaMEDMEM +{ + + + /*! \addtogroup dec + @{ + */ + DisjointDEC::DisjointDEC(ProcessorGroup& source_group, ProcessorGroup& target_group):_local_field(0), + _source_group(&source_group), + _target_group(&target_group), + _owns_field(false), + _owns_groups(false) + { + _union_group = source_group.fuse(target_group); + } + + DisjointDEC::DisjointDEC(const DisjointDEC& s):DEC(s),_local_field(0),_union_group(0),_source_group(0),_target_group(0),_owns_field(false),_owns_groups(false) + { + copyInstance(s); + } + + DisjointDEC & DisjointDEC::operator=(const DisjointDEC& s) + { + cleanInstance(); + copyInstance(s); + return *this; + + } + + void DisjointDEC::copyInstance(const DisjointDEC& other) + { + DEC::copyFrom(other); + if(other._target_group) + { + _target_group=other._target_group->deepCpy(); + _owns_groups=true; + } + if(other._source_group) + { + _source_group=other._source_group->deepCpy(); + _owns_groups=true; + } + if (_source_group && _target_group) + _union_group = _source_group->fuse(*_target_group); + } + + DisjointDEC::DisjointDEC(const std::set& source_ids, const std::set& target_ids, const MPI_Comm& world_comm):_local_field(0), + _owns_field(false), + _owns_groups(true) + { + ParaMEDMEM::CommInterface comm; + // Create the list of procs including source and target + std::set union_ids; // source and target ids in world_comm + union_ids.insert(source_ids.begin(),source_ids.end()); + union_ids.insert(target_ids.begin(),target_ids.end()); + if(union_ids.size()!=(source_ids.size()+target_ids.size())) + throw INTERP_KERNEL::Exception("DisjointDEC constructor : source_ids and target_ids overlap partially or fully. This type of DEC does not support it ! OverlapDEC class could be the solution !"); + int* union_ranks_world=new int[union_ids.size()]; // ranks of sources and targets in world_comm + std::copy(union_ids.begin(), union_ids.end(), union_ranks_world); + + // Create a communicator on these procs + MPI_Group union_group,world_group; + comm.commGroup(world_comm,&world_group); + comm.groupIncl(world_group,union_ids.size(),union_ranks_world,&union_group); + MPI_Comm union_comm; + comm.commCreate(world_comm,union_group,&union_comm); + delete[] union_ranks_world; + + if (union_comm==MPI_COMM_NULL) + { // This process is not in union + _source_group=0; + _target_group=0; + _union_group=0; + return; + } + + // Translate source_ids and target_ids from world_comm to union_comm + int* source_ranks_world=new int[source_ids.size()]; // ranks of sources in world_comm + std::copy(source_ids.begin(), source_ids.end(),source_ranks_world); + int* source_ranks_union=new int[source_ids.size()]; // ranks of sources in union_comm + int* target_ranks_world=new int[target_ids.size()]; // ranks of targets in world_comm + std::copy(target_ids.begin(), target_ids.end(),target_ranks_world); + int* target_ranks_union=new int[target_ids.size()]; // ranks of targets in union_comm + MPI_Group_translate_ranks(world_group,source_ids.size(),source_ranks_world,union_group,source_ranks_union); + MPI_Group_translate_ranks(world_group,target_ids.size(),target_ranks_world,union_group,target_ranks_union); + std::set source_ids_union; + for (int i=0;i<(int)source_ids.size();i++) + source_ids_union.insert(source_ranks_union[i]); + std::set target_ids_union; + for (int i=0;i<(int)target_ids.size();i++) + target_ids_union.insert(target_ranks_union[i]); + delete [] source_ranks_world; + delete [] source_ranks_union; + delete [] target_ranks_world; + delete [] target_ranks_union; + + // Create the MPIProcessorGroups + _source_group = new MPIProcessorGroup(comm,source_ids_union,union_comm); + _target_group = new MPIProcessorGroup(comm,target_ids_union,union_comm); + _union_group = _source_group->fuse(*_target_group); + + } + + DisjointDEC::~DisjointDEC() + { + cleanInstance(); + } + + void DisjointDEC::cleanInstance() + { + if(_owns_field) + { + delete _local_field; + } + _local_field=0; + _owns_field=false; + if(_owns_groups) + { + delete _source_group; + delete _target_group; + } + _owns_groups=false; + _source_group=0; + _target_group=0; + delete _union_group; + _union_group=0; + } + + void DisjointDEC::setNature(NatureOfField nature) + { + if(_local_field) + _local_field->getField()->setNature(nature); + } + + /*! Attaches a local field to a DEC. + If the processor is on the receiving end of the DEC, the field + will be updated by a recvData() call. + Reversely, if the processor is on the sending end, the field will be read, possibly transformed, and sent appropriately to the other side. + */ + void DisjointDEC::attachLocalField(const ParaFIELD *field, bool ownPt) + { + if(!isInUnion()) + return ; + if(_owns_field) + delete _local_field; + _local_field=field; + _owns_field=ownPt; + _comm_interface=&(field->getTopology()->getProcGroup()->getCommInterface()); + compareFieldAndMethod(); + } + + /*! Attaches a local field to a DEC. The method will test whether the processor + is on the source or the target side and will associate the mesh underlying the + field to the local side. + + If the processor is on the receiving end of the DEC, the field + will be updated by a recvData() call. + Reversely, if the processor is on the sending end, the field will be read, possibly transformed, + and sent appropriately to the other side. + */ + + void DisjointDEC::attachLocalField(MEDCouplingFieldDouble *field) + { + if(!isInUnion()) + return ; + ProcessorGroup* local_group; + if (_source_group->containsMyRank()) + local_group=_source_group; + else if (_target_group->containsMyRank()) + local_group=_target_group; + else + throw INTERP_KERNEL::Exception("Invalid procgroup for field attachment to DEC"); + ParaMESH *paramesh=new ParaMESH(static_cast(const_cast(field->getMesh())),*local_group,field->getMesh()->getName()); + ParaFIELD *tmp=new ParaFIELD(field, paramesh, *local_group); + tmp->setOwnSupport(true); + attachLocalField(tmp,true); + //_comm_interface=&(local_group->getCommInterface()); + } + + /*! + Attaches a local field to a DEC. + If the processor is on the receiving end of the DEC, the field + will be updated by a recvData() call. + Reversely, if the processor is on the sending end, the field will be read, possibly transformed, and sent appropriately to the other side. + The field type is a generic ICoCo Field, so that the DEC can couple a number of different fields : + - a ICoCo::MEDField, that is created from a MEDCoupling structure + + */ + void DisjointDEC::attachLocalField(const ICoCo::MEDField *field) + { + if(!isInUnion()) + return ; + if(!field) + throw INTERP_KERNEL::Exception("DisjointDEC::attachLocalField : ICoCo::MEDField pointer is NULL !"); + attachLocalField(field->getField()); + } + + /*! + Computes the field norm over its support + on the source side and renormalizes the field on the target side + so that the norms match. + + \f[ + I_{source}=\sum_{i=1}^{n_{source}}V_{i}.|\Phi^{source}_{i}|^2, + \f] + + \f[ + I_{target}=\sum_{i=1}^{n_{target}}V_{i}.|\Phi^{target}_{i}|^2, + \f] + + \f[ + \Phi^{target}:=\Phi^{target}.\sqrt{I_{source}/I_{target}}. + \f] + + */ + void DisjointDEC::renormalizeTargetField(bool isWAbs) + { + if (_source_group->containsMyRank()) + for (int icomp=0; icomp<_local_field->getField()->getArray()->getNumberOfComponents(); icomp++) + { + double total_norm = _local_field->getVolumeIntegral(icomp+1,isWAbs); + double source_norm = total_norm; + _comm_interface->broadcast(&source_norm, 1, MPI_DOUBLE, 0,* dynamic_cast(_union_group)->getComm()); + + } + if (_target_group->containsMyRank()) + { + for (int icomp=0; icomp<_local_field->getField()->getArray()->getNumberOfComponents(); icomp++) + { + double total_norm = _local_field->getVolumeIntegral(icomp+1,isWAbs); + double source_norm=total_norm; + _comm_interface->broadcast(&source_norm, 1, MPI_DOUBLE, 0,* dynamic_cast(_union_group)->getComm()); + + if (fabs(total_norm)>1e-100) + _local_field->getField()->applyLin(source_norm/total_norm,0.0,icomp+1); + } + } + } + /*! @} */ + + bool DisjointDEC::isInSourceSide() const + { + if(!_source_group) + return false; + return _source_group->containsMyRank(); + } + + bool DisjointDEC::isInTargetSide() const + { + if(!_target_group) + return false; + return _target_group->containsMyRank(); + } + + bool DisjointDEC::isInUnion() const + { + if(!_union_group) + return false; + return _union_group->containsMyRank(); + } + + void DisjointDEC::compareFieldAndMethod() const throw(INTERP_KERNEL::Exception) + { + if (_local_field) + { + TypeOfField entity = _local_field->getField()->getTypeOfField(); + if ( getMethod() == "P0" ) + { + if ( entity != ON_CELLS ) + throw INTERP_KERNEL::Exception("Field support and interpolation method mismatch." + " For P0 interpolation, field must be on MED_CELL's"); + } + else if ( getMethod() == "P1" ) + { + if ( entity != ON_NODES ) + throw INTERP_KERNEL::Exception("Field support and interpolation method mismatch." + " For P1 interpolation, field must be on MED_NODE's"); + } + else if ( getMethod() == "P1d" ) + { + if ( entity != ON_CELLS ) + throw INTERP_KERNEL::Exception("Field support and interpolation method mismatch." + " For P1d interpolation, field must be on MED_CELL's"); + if ( _target_group->containsMyRank() ) + throw INTERP_KERNEL::Exception("Projection to P1d field not supported"); + } + else + { + throw INTERP_KERNEL::Exception("Unknown interpolation method. Possible methods: P0, P1, P1d"); + } + } + } + + /*! + If way==true, source procs call sendData() and target procs call recvData(). + if way==false, it's the other way round. + */ + void DisjointDEC::sendRecvData(bool way) + { + if(!isInUnion()) + return; + if(isInSourceSide()) + { + if(way) + sendData(); + else + recvData(); + } + else if(isInTargetSide()) + { + if(way) + recvData(); + else + sendData(); + } + } +} diff --git a/src/ParaMEDMEM/DisjointDEC.hxx b/src/ParaMEDMEM/DisjointDEC.hxx new file mode 100644 index 000000000..521353f5e --- /dev/null +++ b/src/ParaMEDMEM/DisjointDEC.hxx @@ -0,0 +1,86 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __DISJOINTDEC_HXX__ +#define __DISJOINTDEC_HXX__ + +#include "MEDCouplingFieldDouble.hxx" +#include "NormalizedUnstructuredMesh.hxx" +#include "DEC.hxx" + +#include +#include + +namespace ICoCo +{ + class MEDField; +} + +namespace ParaMEDMEM +{ + class ProcessorGroup; + class ParaFIELD; + + class DisjointDEC : public DEC + { + public: + DisjointDEC():_local_field(0),_union_group(0),_source_group(0),_target_group(0),_owns_field(false),_owns_groups(false) { } + DisjointDEC(ProcessorGroup& source_group, ProcessorGroup& target_group); + DisjointDEC(const DisjointDEC&); + DisjointDEC &operator=(const DisjointDEC& s); + DisjointDEC(const std::set& src_ids, const std::set& trg_ids, + const MPI_Comm& world_comm=MPI_COMM_WORLD); + void setNature(NatureOfField nature); + void attachLocalField( MEDCouplingFieldDouble *field); + void attachLocalField(const ParaFIELD *field, bool ownPt=false); + void attachLocalField(const ICoCo::MEDField *field); + + virtual void prepareSourceDE() = 0; + virtual void prepareTargetDE() = 0; + virtual void recvData() = 0; + virtual void sendData() = 0; + void sendRecvData(bool way=true); + virtual void synchronize() = 0; + virtual ~DisjointDEC(); + virtual void computeProcGroup() { } + void renormalizeTargetField(bool isWAbs); + // + ProcessorGroup *getSourceGrp() const { return _source_group; } + ProcessorGroup *getTargetGrp() const { return _target_group; } + bool isInSourceSide() const; + bool isInTargetSide() const; + bool isInUnion() const; + protected: + void compareFieldAndMethod() const throw(INTERP_KERNEL::Exception); + void cleanInstance(); + void copyInstance(const DisjointDEC& other); + protected: + const ParaFIELD* _local_field; + //! Processor group representing the union of target and source processors + ProcessorGroup* _union_group; + ProcessorGroup* _source_group; + ProcessorGroup* _target_group; + + const CommInterface* _comm_interface; + bool _owns_field; + bool _owns_groups; + }; +} + +#endif diff --git a/src/ParaMEDMEM/ElementLocator.cxx b/src/ParaMEDMEM/ElementLocator.cxx new file mode 100644 index 000000000..a7fcfc28e --- /dev/null +++ b/src/ParaMEDMEM/ElementLocator.cxx @@ -0,0 +1,718 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include "CommInterface.hxx" +#include "ElementLocator.hxx" +#include "Topology.hxx" +#include "BlockTopology.hxx" +#include "ParaFIELD.hxx" +#include "ParaMESH.hxx" +#include "ProcessorGroup.hxx" +#include "MPIProcessorGroup.hxx" +#include "MEDCouplingFieldDouble.hxx" +#include "MEDCouplingAutoRefCountObjectPtr.hxx" +#include "DirectedBoundingBox.hxx" + +#include +#include +#include + +using namespace std; + +//#define USE_DIRECTED_BB + +namespace ParaMEDMEM +{ + ElementLocator::ElementLocator(const ParaFIELD& sourceField, + const ProcessorGroup& distant_group, + const ProcessorGroup& local_group) + : _local_para_field(sourceField), + _local_cell_mesh(sourceField.getSupport()->getCellMesh()), + _local_face_mesh(sourceField.getSupport()->getFaceMesh()), + _distant_group(distant_group), + _local_group(local_group) + { + _union_group = _local_group.fuse(distant_group); + _computeBoundingBoxes(); + _comm=getCommunicator(); + } + + ElementLocator::~ElementLocator() + { + delete _union_group; + delete [] _domain_bounding_boxes; + } + + const MPI_Comm *ElementLocator::getCommunicator() const + { + MPIProcessorGroup* group=static_cast (_union_group); + return group->getComm(); + } + + NatureOfField ElementLocator::getLocalNature() const + { + return _local_para_field.getField()->getNature(); + } + + // ========================================================================== + // Procedure for exchanging mesh between a distant proc and a local processor + // param idistantrank proc id on distant group + // param distant_mesh on return , points to a local reconstruction of + // the distant mesh + // param distant_ids on return, contains a vector defining a correspondence + // between the distant ids and the ids of the local reconstruction + // ========================================================================== + void ElementLocator::exchangeMesh(int idistantrank, + MEDCouplingPointSet*& distant_mesh, + int*& distant_ids) + { + int rank = _union_group->translateRank(&_distant_group,idistantrank); + + if (find(_distant_proc_ids.begin(), _distant_proc_ids.end(),rank)==_distant_proc_ids.end()) + return; + + MEDCouplingAutoRefCountObjectPtr elems; +#ifdef USE_DIRECTED_BB + INTERP_KERNEL::DirectedBoundingBox dbb; + double* distant_bb = _domain_bounding_boxes+rank*dbb.dataSize(_local_cell_mesh_space_dim); + dbb.setData(distant_bb); + elems=_local_cell_mesh->getCellsInBoundingBox(dbb,getBoundingBoxAdjustment()); +#else + double* distant_bb = _domain_bounding_boxes+rank*2*_local_cell_mesh_space_dim; + elems=_local_cell_mesh->getCellsInBoundingBox(distant_bb,getBoundingBoxAdjustment()); +#endif + + DataArrayInt *distant_ids_send; + MEDCouplingPointSet *send_mesh = (MEDCouplingPointSet *)_local_para_field.getField()->buildSubMeshData(elems->begin(),elems->end(),distant_ids_send); + _exchangeMesh(send_mesh, distant_mesh, idistantrank, distant_ids_send, distant_ids); + distant_ids_send->decrRef(); + + if(send_mesh) + send_mesh->decrRef(); + } + + void ElementLocator::exchangeMethod(const std::string& sourceMeth, int idistantrank, std::string& targetMeth) + { + CommInterface comm_interface=_union_group->getCommInterface(); + MPIProcessorGroup* group=static_cast (_union_group); + const MPI_Comm* comm=(group->getComm()); + MPI_Status status; + // it must be converted to union numbering before communication + int idistRankInUnion = group->translateRank(&_distant_group,idistantrank); + char *recv_buffer=new char[4]; + std::vector send_buffer(4); + std::copy(sourceMeth.begin(),sourceMeth.end(),send_buffer.begin()); + comm_interface.sendRecv(&send_buffer[0], 4, MPI_CHAR,idistRankInUnion, 1112, + recv_buffer, 4, MPI_CHAR,idistRankInUnion, 1112, + *comm, &status); + targetMeth=recv_buffer; + delete [] recv_buffer; + } + + + // ====================== + // Compute bounding boxes + // ====================== + + void ElementLocator::_computeBoundingBoxes() + { + CommInterface comm_interface =_union_group->getCommInterface(); + MPIProcessorGroup* group=static_cast (_union_group); + const MPI_Comm* comm = group->getComm(); + _local_cell_mesh_space_dim = -1; + if(_local_cell_mesh->getMeshDimension() != -1) + _local_cell_mesh_space_dim=_local_cell_mesh->getSpaceDimension(); + int *spaceDimForAll=new int[_union_group->size()]; + comm_interface.allGather(&_local_cell_mesh_space_dim, 1, MPI_INT, + spaceDimForAll,1, MPI_INT, + *comm); + _local_cell_mesh_space_dim=*std::max_element(spaceDimForAll,spaceDimForAll+_union_group->size()); + _is_m1d_corr=((*std::min_element(spaceDimForAll,spaceDimForAll+_union_group->size()))==-1); + for(int i=0;i<_union_group->size();i++) + if(spaceDimForAll[i]!=_local_cell_mesh_space_dim && spaceDimForAll[i]!=-1) + throw INTERP_KERNEL::Exception("Spacedim not matches !"); + delete [] spaceDimForAll; +#ifdef USE_DIRECTED_BB + INTERP_KERNEL::DirectedBoundingBox dbb; + int bbSize = dbb.dataSize(_local_cell_mesh_space_dim); + _domain_bounding_boxes = new double[bbSize*_union_group->size()]; + if(_local_cell_mesh->getMeshDimension() != -1) + dbb = INTERP_KERNEL::DirectedBoundingBox(_local_cell_mesh->getCoords()->getPointer(), + _local_cell_mesh->getNumberOfNodes(), + _local_cell_mesh_space_dim); + std::vector dbbData = dbb.getData(); + if ( dbbData.size() < bbSize ) dbbData.resize(bbSize,0); + double * minmax= &dbbData[0]; +#else + int bbSize = 2*_local_cell_mesh_space_dim; + _domain_bounding_boxes = new double[bbSize*_union_group->size()]; + double * minmax=new double [bbSize]; + if(_local_cell_mesh->getMeshDimension() != -1) + _local_cell_mesh->getBoundingBox(minmax); + else + for(int i=0;i<_local_cell_mesh_space_dim;i++) + { + minmax[i*2]=-std::numeric_limits::max(); + minmax[i*2+1]=std::numeric_limits::max(); + } +#endif + + comm_interface.allGather(minmax, bbSize, MPI_DOUBLE, + _domain_bounding_boxes,bbSize, MPI_DOUBLE, + *comm); + + for (int i=0; i< _distant_group.size(); i++) + { + int rank=_union_group->translateRank(&_distant_group,i); + + if (_intersectsBoundingBox(rank)) + { + _distant_proc_ids.push_back(rank); + } + } +#ifdef USE_DIRECTED_BB +#else + delete [] minmax; +#endif + } + + + // ============================================= + // Intersect Bounding Box (with a given "irank") + // ============================================= + bool ElementLocator::_intersectsBoundingBox(int irank) + { +#ifdef USE_DIRECTED_BB + INTERP_KERNEL::DirectedBoundingBox local_dbb, distant_dbb; + local_dbb.setData( _domain_bounding_boxes+_union_group->myRank()*local_dbb.dataSize( _local_cell_mesh_space_dim )); + distant_dbb.setData( _domain_bounding_boxes+irank*distant_dbb.dataSize( _local_cell_mesh_space_dim )); + return !local_dbb.isDisjointWith( distant_dbb ); +#else + double* local_bb = _domain_bounding_boxes+_union_group->myRank()*2*_local_cell_mesh_space_dim; + double* distant_bb = _domain_bounding_boxes+irank*2*_local_cell_mesh_space_dim; + + for (int idim=0; idim < _local_cell_mesh_space_dim; idim++) + { + const double eps = 1e-12; + bool intersects = (distant_bb[idim*2]getCommInterface(); + + // First stage : exchanging sizes + // ------------------------------ + vector tinyInfoLocalD,tinyInfoDistantD(1);//not used for the moment + vector tinyInfoLocal,tinyInfoDistant; + vector tinyInfoLocalS; + //Getting tiny info of local mesh to allow the distant proc to initialize and allocate + //the transmitted mesh. + local_mesh->getTinySerializationInformation(tinyInfoLocalD,tinyInfoLocal,tinyInfoLocalS); + tinyInfoLocal.push_back(distant_ids_send->getNumberOfTuples()); + tinyInfoDistant.resize(tinyInfoLocal.size()); + std::fill(tinyInfoDistant.begin(),tinyInfoDistant.end(),0); + MPIProcessorGroup* group=static_cast (_union_group); + const MPI_Comm* comm=group->getComm(); + MPI_Status status; + + // iproc_distant is the number of proc in distant group + // it must be converted to union numbering before communication + int iprocdistant_in_union = group->translateRank(&_distant_group, + iproc_distant); + + comm_interface.sendRecv(&tinyInfoLocal[0], tinyInfoLocal.size(), MPI_INT, iprocdistant_in_union, 1112, + &tinyInfoDistant[0], tinyInfoDistant.size(), MPI_INT,iprocdistant_in_union,1112, + *comm, &status); + DataArrayInt *v1Local=0; + DataArrayDouble *v2Local=0; + DataArrayInt *v1Distant=DataArrayInt::New(); + DataArrayDouble *v2Distant=DataArrayDouble::New(); + //serialization of local mesh to send data to distant proc. + local_mesh->serialize(v1Local,v2Local); + //Building the right instance of copy of distant mesh. + MEDCouplingPointSet *distant_mesh_tmp=MEDCouplingPointSet::BuildInstanceFromMeshType((MEDCouplingMeshType)tinyInfoDistant[0]); + std::vector unusedTinyDistantSts; + distant_mesh_tmp->resizeForUnserialization(tinyInfoDistant,v1Distant,v2Distant,unusedTinyDistantSts); + int nbLocalElems=0; + int nbDistElem=0; + int *ptLocal=0; + int *ptDist=0; + if(v1Local) + { + nbLocalElems=v1Local->getNbOfElems(); + ptLocal=v1Local->getPointer(); + } + if(v1Distant) + { + nbDistElem=v1Distant->getNbOfElems(); + ptDist=v1Distant->getPointer(); + } + comm_interface.sendRecv(ptLocal, nbLocalElems, MPI_INT, + iprocdistant_in_union, 1111, + ptDist, nbDistElem, MPI_INT, + iprocdistant_in_union,1111, + *comm, &status); + nbLocalElems=0; + double *ptLocal2=0; + double *ptDist2=0; + if(v2Local) + { + nbLocalElems=v2Local->getNbOfElems(); + ptLocal2=v2Local->getPointer(); + } + nbDistElem=0; + if(v2Distant) + { + nbDistElem=v2Distant->getNbOfElems(); + ptDist2=v2Distant->getPointer(); + } + comm_interface.sendRecv(ptLocal2, nbLocalElems, MPI_DOUBLE, + iprocdistant_in_union, 1112, + ptDist2, nbDistElem, MPI_DOUBLE, + iprocdistant_in_union, 1112, + *comm, &status); + // + distant_mesh=distant_mesh_tmp; + //finish unserialization + distant_mesh->unserialization(tinyInfoDistantD,tinyInfoDistant,v1Distant,v2Distant,unusedTinyDistantSts); + // + distant_ids_recv=new int[tinyInfoDistant.back()]; + comm_interface.sendRecv(const_cast(reinterpret_cast(distant_ids_send->getConstPointer())),tinyInfoLocal.back(), MPI_INT, + iprocdistant_in_union, 1113, + distant_ids_recv,tinyInfoDistant.back(), MPI_INT, + iprocdistant_in_union,1113, + *comm, &status); + if(v1Local) + v1Local->decrRef(); + if(v2Local) + v2Local->decrRef(); + if(v1Distant) + v1Distant->decrRef(); + if(v2Distant) + v2Distant->decrRef(); + } + + /*! + * connected with ElementLocator::sendPolicyToWorkingSideL + */ + void ElementLocator::recvPolicyFromLazySideW(std::vector& policy) + { + policy.resize(_distant_proc_ids.size()); + int procId=0; + CommInterface comm; + MPI_Status status; + for(vector::const_iterator iter=_distant_proc_ids.begin();iter!=_distant_proc_ids.end();iter++,procId++) + { + int toRecv; + comm.recv((void *)&toRecv,1,MPI_INT,*iter,1120,*_comm,&status); + policy[procId]=toRecv; + } + } + + /*! + * connected with ElementLocator::recvFromWorkingSideL + */ + void ElementLocator::sendSumToLazySideW(const std::vector< std::vector >& distantLocEltIds, const std::vector< std::vector >& partialSumRelToDistantIds) + { + int procId=0; + CommInterface comm; + for(vector::const_iterator iter=_distant_proc_ids.begin();iter!=_distant_proc_ids.end();iter++,procId++) + { + const vector& eltIds=distantLocEltIds[procId]; + const vector& valued=partialSumRelToDistantIds[procId]; + int lgth=eltIds.size(); + comm.send(&lgth,1,MPI_INT,*iter,1114,*_comm); + comm.send(const_cast(reinterpret_cast(&eltIds[0])),lgth,MPI_INT,*iter,1115,*_comm); + comm.send(const_cast(reinterpret_cast(&valued[0])),lgth,MPI_DOUBLE,*iter,1116,*_comm); + } + } + + /*! + * connected with ElementLocator::sendToWorkingSideL + */ + void ElementLocator::recvSumFromLazySideW(std::vector< std::vector >& globalSumRelToDistantIds) + { + int procId=0; + CommInterface comm; + MPI_Status status; + for(vector::const_iterator iter=_distant_proc_ids.begin();iter!=_distant_proc_ids.end();iter++,procId++) + { + std::vector& vec=globalSumRelToDistantIds[procId]; + comm.recv(&vec[0],vec.size(),MPI_DOUBLE,*iter,1117,*_comm,&status); + } + } + + /*! + * connected with ElementLocator::recvLocalIdsFromWorkingSideL + */ + void ElementLocator::sendLocalIdsToLazyProcsW(const std::vector< std::vector >& distantLocEltIds) + { + int procId=0; + CommInterface comm; + for(vector::const_iterator iter=_distant_proc_ids.begin();iter!=_distant_proc_ids.end();iter++,procId++) + { + const vector& eltIds=distantLocEltIds[procId]; + int lgth=eltIds.size(); + comm.send(&lgth,1,MPI_INT,*iter,1121,*_comm); + comm.send(const_cast(reinterpret_cast(&eltIds[0])),lgth,MPI_INT,*iter,1122,*_comm); + } + } + + /*! + * connected with ElementLocator::sendGlobalIdsToWorkingSideL + */ + void ElementLocator::recvGlobalIdsFromLazyProcsW(const std::vector< std::vector >& distantLocEltIds, std::vector< std::vector >& globalIds) + { + int procId=0; + CommInterface comm; + MPI_Status status; + globalIds.resize(_distant_proc_ids.size()); + for(vector::const_iterator iter=_distant_proc_ids.begin();iter!=_distant_proc_ids.end();iter++,procId++) + { + const std::vector& vec=distantLocEltIds[procId]; + std::vector& global=globalIds[procId]; + global.resize(vec.size()); + comm.recv(&global[0],vec.size(),MPI_INT,*iter,1123,*_comm,&status); + } + } + + /*! + * connected with ElementLocator::sendCandidatesGlobalIdsToWorkingSideL + */ + void ElementLocator::recvCandidatesGlobalIdsFromLazyProcsW(std::vector< std::vector >& globalIds) + { + int procId=0; + CommInterface comm; + MPI_Status status; + globalIds.resize(_distant_proc_ids.size()); + for(vector::const_iterator iter=_distant_proc_ids.begin();iter!=_distant_proc_ids.end();iter++,procId++) + { + std::vector& global=globalIds[procId]; + int lgth; + comm.recv(&lgth,1,MPI_INT,*iter,1132,*_comm,&status); + global.resize(lgth); + comm.recv(&global[0],lgth,MPI_INT,*iter,1133,*_comm,&status); + } + } + + /*! + * connected with ElementLocator::recvSumFromWorkingSideL + */ + void ElementLocator::sendPartialSumToLazyProcsW(const std::vector& distantGlobIds, const std::vector& sum) + { + int procId=0; + CommInterface comm; + int lgth=distantGlobIds.size(); + for(vector::const_iterator iter=_distant_proc_ids.begin();iter!=_distant_proc_ids.end();iter++,procId++) + { + comm.send(&lgth,1,MPI_INT,*iter,1124,*_comm); + comm.send(const_cast(reinterpret_cast(&distantGlobIds[0])),lgth,MPI_INT,*iter,1125,*_comm); + comm.send(const_cast(reinterpret_cast(&sum[0])),lgth,MPI_DOUBLE,*iter,1126,*_comm); + } + } + + /*! + * connected with ElementLocator::recvCandidatesForAddElementsL + */ + void ElementLocator::sendCandidatesForAddElementsW(const std::vector& distantGlobIds) + { + int procId=0; + CommInterface comm; + int lgth=distantGlobIds.size(); + for(vector::const_iterator iter=_distant_proc_ids.begin();iter!=_distant_proc_ids.end();iter++,procId++) + { + comm.send(const_cast(reinterpret_cast(&lgth)),1,MPI_INT,*iter,1128,*_comm); + comm.send(const_cast(reinterpret_cast(&distantGlobIds[0])),lgth,MPI_INT,*iter,1129,*_comm); + } + } + + /*! + * connected with ElementLocator::sendAddElementsToWorkingSideL + */ + void ElementLocator::recvAddElementsFromLazyProcsW(std::vector >& elementsToAdd) + { + int procId=0; + CommInterface comm; + MPI_Status status; + int lgth=_distant_proc_ids.size(); + elementsToAdd.resize(lgth); + for(vector::const_iterator iter=_distant_proc_ids.begin();iter!=_distant_proc_ids.end();iter++,procId++) + { + int locLgth; + std::vector& eltToFeed=elementsToAdd[procId]; + comm.recv(&locLgth,1,MPI_INT,*iter,1130,*_comm,&status); + eltToFeed.resize(locLgth); + comm.recv(&eltToFeed[0],locLgth,MPI_INT,*iter,1131,*_comm,&status); + } + } + + /*! + * connected with ElementLocator::recvPolicyFromLazySideW + */ + int ElementLocator::sendPolicyToWorkingSideL() + { + CommInterface comm; + int toSend; + DataArrayInt *isCumulative=_local_para_field.returnCumulativeGlobalNumbering(); + if(isCumulative) + { + toSend=CUMULATIVE_POLICY; + isCumulative->decrRef(); + } + else + toSend=NO_POST_TREATMENT_POLICY; + for(vector::const_iterator iter=_distant_proc_ids.begin();iter!=_distant_proc_ids.end();iter++) + comm.send(&toSend,1,MPI_INT,*iter,1120,*_comm); + return toSend; + } + + /*! + * connected with ElementLocator::sendSumToLazySideW + */ + void ElementLocator::recvFromWorkingSideL() + { + _values_added.resize(_local_para_field.getField()->getNumberOfTuples()); + int procId=0; + CommInterface comm; + _ids_per_working_proc.resize(_distant_proc_ids.size()); + MPI_Status status; + for(vector::const_iterator iter=_distant_proc_ids.begin();iter!=_distant_proc_ids.end();iter++,procId++) + { + int lgth; + comm.recv(&lgth,1,MPI_INT,*iter,1114,*_comm,&status); + vector& ids=_ids_per_working_proc[procId]; + ids.resize(lgth); + vector values(lgth); + comm.recv(&ids[0],lgth,MPI_INT,*iter,1115,*_comm,&status); + comm.recv(&values[0],lgth,MPI_DOUBLE,*iter,1116,*_comm,&status); + for(int i=0;i::const_iterator iter=_distant_proc_ids.begin();iter!=_distant_proc_ids.end();iter++,procId++) + { + vector& ids=_ids_per_working_proc[procId]; + vector valsToSend(ids.size()); + vector::iterator iter3=valsToSend.begin(); + for(vector::const_iterator iter2=ids.begin();iter2!=ids.end();iter2++,iter3++) + *iter3=_values_added[*iter2]; + comm.send(&valsToSend[0],ids.size(),MPI_DOUBLE,*iter,1117,*_comm); + //ids.clear(); + } + //_ids_per_working_proc.clear(); + } + + /*! + * connected with ElementLocator::sendLocalIdsToLazyProcsW + */ + void ElementLocator::recvLocalIdsFromWorkingSideL() + { + int procId=0; + CommInterface comm; + _ids_per_working_proc.resize(_distant_proc_ids.size()); + MPI_Status status; + for(vector::const_iterator iter=_distant_proc_ids.begin();iter!=_distant_proc_ids.end();iter++,procId++) + { + int lgth; + vector& ids=_ids_per_working_proc[procId]; + comm.recv(&lgth,1,MPI_INT,*iter,1121,*_comm,&status); + ids.resize(lgth); + comm.recv(&ids[0],lgth,MPI_INT,*iter,1122,*_comm,&status); + } + } + + /*! + * connected with ElementLocator::recvGlobalIdsFromLazyProcsW + */ + void ElementLocator::sendGlobalIdsToWorkingSideL() + { + int procId=0; + CommInterface comm; + DataArrayInt *globalIds=_local_para_field.returnGlobalNumbering(); + const int *globalIdsC=globalIds->getConstPointer(); + for(vector::const_iterator iter=_distant_proc_ids.begin();iter!=_distant_proc_ids.end();iter++,procId++) + { + const vector& ids=_ids_per_working_proc[procId]; + vector valsToSend(ids.size()); + vector::iterator iter1=valsToSend.begin(); + for(vector::const_iterator iter2=ids.begin();iter2!=ids.end();iter2++,iter1++) + *iter1=globalIdsC[*iter2]; + comm.send(&valsToSend[0],ids.size(),MPI_INT,*iter,1123,*_comm); + } + if(globalIds) + globalIds->decrRef(); + } + + /*! + * connected with ElementLocator::sendPartialSumToLazyProcsW + */ + void ElementLocator::recvSumFromWorkingSideL() + { + int procId=0; + int wProcSize=_distant_proc_ids.size(); + CommInterface comm; + _ids_per_working_proc.resize(wProcSize); + _values_per_working_proc.resize(wProcSize); + MPI_Status status; + std::map sums; + for(vector::const_iterator iter=_distant_proc_ids.begin();iter!=_distant_proc_ids.end();iter++,procId++) + { + int lgth; + comm.recv(&lgth,1,MPI_INT,*iter,1124,*_comm,&status); + vector& ids=_ids_per_working_proc[procId]; + vector& vals=_values_per_working_proc[procId]; + ids.resize(lgth); + vals.resize(lgth); + comm.recv(&ids[0],lgth,MPI_INT,*iter,1125,*_comm,&status); + comm.recv(&vals[0],lgth,MPI_DOUBLE,*iter,1126,*_comm,&status); + vector::const_iterator iter1=ids.begin(); + vector::const_iterator iter2=vals.begin(); + for(;iter1!=ids.end();iter1++,iter2++) + sums[*iter1]+=*iter2; + } + //assign sum to prepare sending to working side + for(procId=0;procId& ids=_ids_per_working_proc[procId]; + vector& vals=_values_per_working_proc[procId]; + vector::const_iterator iter1=ids.begin(); + vector::iterator iter2=vals.begin(); + for(;iter1!=ids.end();iter1++,iter2++) + *iter2=sums[*iter1]; + ids.clear(); + } + } + + /*! + * Foreach working procs Wi compute and push it in _ids_per_working_proc3, + * if it exist, local id of nodes that are in interaction with an another lazy proc than this + * and that exists in this \b but with no interaction with this. + * The computation is performed here. sendAddElementsToWorkingSideL is only in charge to send + * precomputed _ids_per_working_proc3 attribute. + * connected with ElementLocator::sendCandidatesForAddElementsW + */ + void ElementLocator::recvCandidatesForAddElementsL() + { + int procId=0; + int wProcSize=_distant_proc_ids.size(); + CommInterface comm; + _ids_per_working_proc3.resize(wProcSize); + MPI_Status status; + std::map sums; + DataArrayInt *globalIds=_local_para_field.returnGlobalNumbering(); + const int *globalIdsC=globalIds->getConstPointer(); + int nbElts=globalIds->getNumberOfTuples(); + std::set globalIdsS(globalIdsC,globalIdsC+nbElts); + for(vector::const_iterator iter=_distant_proc_ids.begin();iter!=_distant_proc_ids.end();iter++,procId++) + { + const std::vector& ids0=_ids_per_working_proc[procId]; + int lgth0=ids0.size(); + std::set elts0; + for(int i=0;i ids(lgth); + comm.recv(&ids[0],lgth,MPI_INT,*iter,1129,*_comm,&status); + set ids1(ids.begin(),ids.end()); + ids.clear(); + set tmp5,tmp6; + set_intersection(globalIdsS.begin(),globalIdsS.end(),ids1.begin(),ids1.end(),inserter(tmp5,tmp5.begin())); + set_difference(tmp5.begin(),tmp5.end(),elts0.begin(),elts0.end(),inserter(tmp6,tmp6.begin())); + std::vector& ids2=_ids_per_working_proc3[procId]; + ids2.resize(tmp6.size()); + std::copy(tmp6.begin(),tmp6.end(),ids2.begin()); + //global->local + for(std::vector::iterator iter2=ids2.begin();iter2!=ids2.end();iter2++) + *iter2=std::find(globalIdsC,globalIdsC+nbElts,*iter2)-globalIdsC; + } + if(globalIds) + globalIds->decrRef(); + } + + /*! + * connected with ElementLocator::recvAddElementsFromLazyProcsW + */ + void ElementLocator::sendAddElementsToWorkingSideL() + { + int procId=0; + CommInterface comm; + for(vector::const_iterator iter=_distant_proc_ids.begin();iter!=_distant_proc_ids.end();iter++,procId++) + { + const std::vector& vals=_ids_per_working_proc3[procId]; + int size=vals.size(); + comm.send(const_cast(reinterpret_cast(&size)),1,MPI_INT,*iter,1130,*_comm); + comm.send(const_cast(reinterpret_cast(&vals[0])),size,MPI_INT,*iter,1131,*_comm); + } + } + + /*! + * This method sends to working side Wi only nodes in interaction with Wi \b and located on boundary, to reduce number. + * connected with ElementLocator::recvCandidatesGlobalIdsFromLazyProcsW + */ + void ElementLocator::sendCandidatesGlobalIdsToWorkingSideL() + { + int procId=0; + CommInterface comm; + DataArrayInt *globalIds=_local_para_field.returnGlobalNumbering(); + const int *globalIdsC=globalIds->getConstPointer(); + MEDCouplingAutoRefCountObjectPtr candidates=_local_para_field.getSupport()->getCellMesh()->findBoundaryNodes(); + for(int *iter1=candidates->getPointer();iter1!=candidates->getPointer()+candidates->getNumberOfTuples();iter1++) + (*iter1)=globalIdsC[*iter1]; + std::set candidatesS(candidates->begin(),candidates->end()); + for(vector::const_iterator iter=_distant_proc_ids.begin();iter!=_distant_proc_ids.end();iter++,procId++) + { + const vector& ids=_ids_per_working_proc[procId]; + vector valsToSend(ids.size()); + vector::iterator iter1=valsToSend.begin(); + for(vector::const_iterator iter2=ids.begin();iter2!=ids.end();iter2++,iter1++) + *iter1=globalIdsC[*iter2]; + std::set tmp2(valsToSend.begin(),valsToSend.end()); + std::vector tmp3; + set_intersection(candidatesS.begin(),candidatesS.end(),tmp2.begin(),tmp2.end(),std::back_insert_iterator< std::vector >(tmp3)); + int lgth=tmp3.size(); + comm.send(&lgth,1,MPI_INT,*iter,1132,*_comm); + comm.send(&tmp3[0],lgth,MPI_INT,*iter,1133,*_comm); + } + if(globalIds) + globalIds->decrRef(); + } +} diff --git a/src/ParaMEDMEM/ElementLocator.hxx b/src/ParaMEDMEM/ElementLocator.hxx new file mode 100644 index 000000000..4853c9766 --- /dev/null +++ b/src/ParaMEDMEM/ElementLocator.hxx @@ -0,0 +1,109 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __ELEMENTLOCATOR_HXX__ +#define __ELEMENTLOCATOR_HXX__ + +#include "InterpolationOptions.hxx" +#include "MEDCouplingNatureOfField.hxx" + +#include +#include +#include + +namespace ParaMEDMEM +{ + class ParaFIELD; + class ProcessorGroup; + class ParaSUPPORT; + class InterpolationMatrix; + class MEDCouplingPointSet; + class DataArrayInt; + + class ElementLocator : public INTERP_KERNEL::InterpolationOptions + { + public: + ElementLocator(const ParaFIELD& sourceField, const ProcessorGroup& distant_group, const ProcessorGroup& local_group); + + virtual ~ElementLocator(); + void exchangeMesh(int idistantrank, + MEDCouplingPointSet*& target_mesh, + int*& distant_ids); + void exchangeMethod(const std::string& sourceMeth, int idistantrank, std::string& targetMeth); + const std::vector& getDistantProcIds() const { return _distant_proc_ids; } + const MPI_Comm *getCommunicator() const; + NatureOfField getLocalNature() const; + //! This method is used to informed if there is -1D mesh on distant_group side or on local_group side. + bool isM1DCorr() const { return _is_m1d_corr; } + //Working side methods + void recvPolicyFromLazySideW(std::vector& policy); + void sendSumToLazySideW(const std::vector< std::vector >& distantLocEltIds, const std::vector< std::vector >& partialSumRelToDistantIds); + void recvSumFromLazySideW(std::vector< std::vector >& globalSumRelToDistantIds); + void sendCandidatesForAddElementsW(const std::vector& distantGlobIds); + void recvAddElementsFromLazyProcsW(std::vector >& elementsToAdd); + // + void sendLocalIdsToLazyProcsW(const std::vector< std::vector >& distantLocEltIds); + void recvGlobalIdsFromLazyProcsW(const std::vector< std::vector >& distantLocEltIds, std::vector< std::vector >& globalIds); + void recvCandidatesGlobalIdsFromLazyProcsW(std::vector< std::vector >& globalIds); + void sendPartialSumToLazyProcsW(const std::vector& distantGlobIds, const std::vector& sum); + //Lazy side methods + int sendPolicyToWorkingSideL(); + void recvFromWorkingSideL(); + void sendToWorkingSideL(); + // + void recvLocalIdsFromWorkingSideL(); + void sendGlobalIdsToWorkingSideL(); + void sendCandidatesGlobalIdsToWorkingSideL(); + // + void recvSumFromWorkingSideL(); + void recvCandidatesForAddElementsL(); + void sendAddElementsToWorkingSideL(); + private: + void _computeBoundingBoxes(); + bool _intersectsBoundingBox(int irank); + void _exchangeMesh(MEDCouplingPointSet* local_mesh, MEDCouplingPointSet*& distant_mesh, + int iproc_distant, const DataArrayInt* distant_ids_send, + int*& distant_ids_recv); + private: + const ParaFIELD& _local_para_field ; + MEDCouplingPointSet* _local_cell_mesh; + int _local_cell_mesh_space_dim; + bool _is_m1d_corr; + MEDCouplingPointSet* _local_face_mesh; + std::vector _distant_cell_meshes; + std::vector _distant_face_meshes; + double* _domain_bounding_boxes; + const ProcessorGroup& _distant_group; + const ProcessorGroup& _local_group; + ProcessorGroup* _union_group; + std::vector _distant_proc_ids; + const MPI_Comm *_comm; + //Attributes only used by lazy side + std::vector _values_added; + std::vector< std::vector > _ids_per_working_proc; + std::vector< std::vector > _ids_per_working_proc3; + std::vector< std::vector > _values_per_working_proc; + public: + static const int CUMULATIVE_POLICY=3; + static const int NO_POST_TREATMENT_POLICY=7; + }; + +} + +#endif diff --git a/src/ParaMEDMEM/ExplicitCoincidentDEC.cxx b/src/ParaMEDMEM/ExplicitCoincidentDEC.cxx new file mode 100644 index 000000000..79852a1ca --- /dev/null +++ b/src/ParaMEDMEM/ExplicitCoincidentDEC.cxx @@ -0,0 +1,395 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include "CommInterface.hxx" +#include "Topology.hxx" +#include "BlockTopology.hxx" +#include "ComponentTopology.hxx" +#include "ParaFIELD.hxx" +#include "MPIProcessorGroup.hxx" +#include "ExplicitCoincidentDEC.hxx" +#include "ExplicitMapping.hxx" +#include "InterpKernelUtilities.hxx" + +using namespace std; + +namespace ParaMEDMEM +{ + /*! \defgroup explicitcoincidentdec ExplicitCoincidentDEC + */ + ExplicitCoincidentDEC::ExplicitCoincidentDEC():_toposource(0),_topotarget(0) + { + } + + ExplicitCoincidentDEC::~ExplicitCoincidentDEC() + { + } + + + /*! + \addtogroup explicitcoincidentdec + @{ + */ + + /*! Synchronization process for exchanging topologies + */ + void ExplicitCoincidentDEC::synchronize() + { + if (_source_group->containsMyRank()) + { + _toposource = dynamic_cast(_local_field->getTopology()); + _sourcegroup= _toposource->getProcGroup()->createProcGroup(); + _targetgroup=_toposource->getProcGroup()->createComplementProcGroup(); + } + if (_target_group->containsMyRank()) + { + _topotarget = dynamic_cast(_local_field->getTopology()); + _sourcegroup= _topotarget->getProcGroup()->createComplementProcGroup(); + _targetgroup=_topotarget->getProcGroup()->createProcGroup(); + } + + // Exchanging + + // Transmitting source topology to target code + broadcastTopology(_toposource,_topotarget,1000); + transferMappingToSource(); + } + + /*! Creates the arrays necessary for the data transfer + * and fills the send array with the values of the + * source field + * */ + void ExplicitCoincidentDEC::prepareSourceDE() + { + //////////////////////////////////// + //Step 1 : buffer array creation + + if (!_toposource->getProcGroup()->containsMyRank()) + return; + MPIProcessorGroup* group=new MPIProcessorGroup(_sourcegroup->getCommInterface()); + + // Warning : the size of the target side is implicitly deduced + //from the size of MPI_COMM_WORLD + int target_size = _toposource->getProcGroup()->getCommInterface().worldSize()- _toposource->getProcGroup()->size() ; + + vector* target_arrays=new vector[target_size]; + + int nb_local = _toposource-> getNbLocalElements(); + + int union_size=group->size(); + + _sendcounts=new int[union_size]; + _senddispls=new int[union_size]; + _recvcounts=new int[union_size]; + _recvdispls=new int[union_size]; + + for (int i=0; i< union_size; i++) + { + _sendcounts[i]=0; + _recvcounts[i]=0; + _recvdispls[i]=0; + } + _senddispls[0]=0; + + int* counts=_explicit_mapping.getCounts(); + for (int i=0; isize(); i++) + _sendcounts[i]=counts[i]; + + for (int iproc=1; iprocsize();iproc++) + _senddispls[iproc]=_senddispls[iproc-1]+_sendcounts[iproc-1]; + + _sendbuffer = new double [nb_local * _toposource->getNbComponents()]; + + ///////////////////////////////////////////////////////////// + //Step 2 : filling the buffers with the source field values + + int* counter=new int [target_size]; + counter[0]=0; + for (int i=1; igetField()->getArray()->getPointer(); + + int* bufferindex= _explicit_mapping.getBufferIndex(); + + for (int ielem=0; ielemgetNbComponents(); + for (int icomp=0; icompgetProcGroup()->containsMyRank()) + return; + MPIProcessorGroup* group=new MPIProcessorGroup(_topotarget->getProcGroup()->getCommInterface()); + + vector < vector > source_arrays(_sourcegroup->size()); + int nb_local = _topotarget-> getNbLocalElements(); + for (int ielem=0; ielem< nb_local ; ielem++) + { + //pair source_local =_distant_elems[ielem]; + pair source_local=_explicit_mapping.getDistantNumbering(ielem); + source_arrays[source_local.first].push_back(source_local.second); + } + int union_size=group->size(); + _recvcounts=new int[union_size]; + _recvdispls=new int[union_size]; + _sendcounts=new int[union_size]; + _senddispls=new int[union_size]; + + for (int i=0; i< union_size; i++) + { + _sendcounts[i]=0; + _recvcounts[i]=0; + _recvdispls[i]=0; + } + for (int iproc=0; iproc < _sourcegroup->size(); iproc++) + { + //converts the rank in target to the rank in union communicator + int unionrank=group->translateRank(_sourcegroup,iproc); + _recvcounts[unionrank]=source_arrays[iproc].size()*_topotarget->getNbComponents(); + } + for (int i=1; igetNbComponents()]; + + } + + + /*! + * Synchronizing a topology so that all the + * group possesses it. + * + * \param toposend Topology that is transmitted. It is read on processes where it already exists, and it is created and filled on others. + * \param toporecv Topology which is received. + * \param tag Communication tag associated with this operation. + */ + void ExplicitCoincidentDEC::broadcastTopology(const ExplicitTopology* toposend, ExplicitTopology* toporecv, int tag) + { + MPI_Status status; + + int* serializer=0; + int size; + + MPIProcessorGroup* group=new MPIProcessorGroup(*_comm_interface); + + // The send processors serialize the send topology + // and send the buffers to the recv procs + if (toposend !=0 && toposend->getProcGroup()->containsMyRank()) + { + toposend->serialize(serializer, size); + for (int iproc=0; iproc< group->size(); iproc++) + { + int itarget=iproc; + if (!toposend->getProcGroup()->contains(itarget)) + { + _comm_interface->send(&size,1,MPI_INT, itarget,tag+itarget,*(group->getComm())); + _comm_interface->send(serializer, size, MPI_INT, itarget, tag+itarget,*(group->getComm())); + } + } + } + else + { + vector size2(group->size()); + int myworldrank=group->myRank(); + for (int iproc=0; iprocsize();iproc++) + { + int isource = iproc; + if (!toporecv->getProcGroup()->contains(isource)) + { + int nbelem; + _comm_interface->recv(&nbelem, 1, MPI_INT, isource, tag+myworldrank, *(group->getComm()), &status); + int* buffer = new int[nbelem]; + _comm_interface->recv(buffer, nbelem, MPI_INT, isource,tag+myworldrank, *(group->getComm()), &status); + + ExplicitTopology* topotemp=new ExplicitTopology(); + topotemp->unserialize(buffer, *_comm_interface); + delete[] buffer; + + for (int ielem=0; ielemgetNbLocalElements(); ielem++) + { + int global = toporecv->localToGlobal(ielem); + int sendlocal=topotemp->globalToLocal(global); + if (sendlocal!=-1) + { + size2[iproc]++; + _explicit_mapping.pushBackElem(make_pair(iproc,sendlocal)); + } + } + delete topotemp; + } + } + } + MESSAGE (" rank "<myRank()<< " broadcastTopology is over"); + } + + void ExplicitCoincidentDEC::transferMappingToSource() + { + + MPIProcessorGroup* group=new MPIProcessorGroup(*_comm_interface); + + // sending source->target mapping which is stored by target + //in _distant_elems from target to source + if (_topotarget!=0 && _topotarget->getProcGroup()->containsMyRank()) + { + int world_size = _topotarget->getProcGroup()->getCommInterface().worldSize() ; + int* nb_transfer_union=new int[world_size]; + int* dummy_recv=new int[world_size]; + for (int i=0; itranslateRank(_sourcegroup,_explicit_mapping.getDistantDomain(i)); + nb_transfer_union[unionrank]=_explicit_mapping.getNbDistantElems(i); + } + _comm_interface->allToAll(nb_transfer_union, 1, MPI_INT, dummy_recv, 1, MPI_INT, MPI_COMM_WORLD); + + int* sendbuffer= _explicit_mapping.serialize(_topotarget->getProcGroup()->myRank()); + + int* sendcounts= new int [world_size]; + int* senddispls = new int [world_size]; + for (int i=0; i< world_size; i++) + { + sendcounts[i]=2*nb_transfer_union[i]; + if (i==0) + senddispls[i]=0; + else + senddispls[i]=senddispls[i-1]+sendcounts[i-1]; + } + int* recvcounts=new int[world_size]; + int* recvdispls=new int[world_size]; + int *dummyrecv=0; + for (int i=0; i allToAllV(sendbuffer, sendcounts, senddispls, MPI_INT, dummyrecv, recvcounts, senddispls, MPI_INT, MPI_COMM_WORLD); + + } + //receiving in the source subdomains the mapping sent by targets + else + { + int world_size = _toposource->getProcGroup()->getCommInterface().worldSize() ; + int* nb_transfer_union=new int[world_size]; + int* dummy_send=new int[world_size]; + for (int i=0; iallToAll(dummy_send, 1, MPI_INT, nb_transfer_union, 1, MPI_INT, MPI_COMM_WORLD); + + int total_size=0; + for (int i=0; i< world_size; i++) + total_size+=nb_transfer_union[i]; + int nbtarget = _targetgroup->size(); + int* targetranks = new int[ nbtarget]; + for (int i=0; itranslateRank(_targetgroup,i); + int* mappingbuffer= new int [total_size*2]; + int* sendcounts= new int [world_size]; + int* senddispls = new int [world_size]; + int* recvcounts=new int[world_size]; + int* recvdispls=new int[world_size]; + for (int i=0; i< world_size; i++) + { + recvcounts[i]=2*nb_transfer_union[i]; + if (i==0) + recvdispls[i]=0; + else + recvdispls[i]=recvdispls[i-1]+recvcounts[i-1]; + } + + int *dummysend=0; + for (int i=0; i allToAllV(dummysend, sendcounts, senddispls, MPI_INT, mappingbuffer, recvcounts, recvdispls, MPI_INT, MPI_COMM_WORLD); + _explicit_mapping.unserialize(world_size,nb_transfer_union,nbtarget, targetranks, mappingbuffer); + } + } + + void ExplicitCoincidentDEC::recvData() + { + //MPI_COMM_WORLD is used instead of group because there is no + //mechanism for creating the union group yet + MESSAGE("recvData"); + + cout<<"start AllToAll"<allToAllV(_sendbuffer, _sendcounts, _senddispls, MPI_DOUBLE, + _recvbuffer, _recvcounts, _recvdispls, MPI_DOUBLE,MPI_COMM_WORLD); + cout<<"end AllToAll"<getNbLocalElements(); + double* value=new double[nb_local*_topotarget->getNbComponents()]; + + vector counters(_sourcegroup->size()); + counters[0]=0; + for (int i=0; i<_sourcegroup->size()-1; i++) + { + MPIProcessorGroup* group=new MPIProcessorGroup(*_comm_interface); + int worldrank=group->translateRank(_sourcegroup,i); + counters[i+1]=counters[i]+_recvcounts[worldrank]; + } + + for (int ielem=0; ielem distant_numbering=_explicit_mapping.getDistantNumbering(ielem); + int iproc=distant_numbering.first; + int ncomp = _topotarget->getNbComponents(); + for (int icomp=0; icomp< ncomp; icomp++) + value[ielem*ncomp+icomp]=_recvbuffer[counters[iproc]*ncomp+icomp]; + counters[iproc]++; + } + _local_field->getField()->getArray()->useArray(value,true,CPP_DEALLOC,nb_local,_topotarget->getNbComponents()); + } + + void ExplicitCoincidentDEC::sendData() + { + MESSAGE ("sendData"); + for (int i=0; i< 4; i++) + cout << _sendcounts[i]<<" "; + cout <allToAllV(_sendbuffer, _sendcounts, _senddispls, MPI_DOUBLE, + _recvbuffer, _recvcounts, _recvdispls, MPI_DOUBLE,MPI_COMM_WORLD); + } + /*! + @} + */ +} + diff --git a/src/ParaMEDMEM/ExplicitCoincidentDEC.hxx b/src/ParaMEDMEM/ExplicitCoincidentDEC.hxx new file mode 100644 index 000000000..6205e11ef --- /dev/null +++ b/src/ParaMEDMEM/ExplicitCoincidentDEC.hxx @@ -0,0 +1,62 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __EXPLICITCOINCIDENTDEC_HXX__ +#define __EXPLICITCOINCIDENTDEC_HXX__ + +#include "DisjointDEC.hxx" +#include "ExplicitMapping.hxx" +#include "ExplicitTopology.hxx" + +#include + +namespace ParaMEDMEM +{ + class BlockTopology; + + class ExplicitCoincidentDEC : public DisjointDEC + { + public: + ExplicitCoincidentDEC(); + virtual ~ExplicitCoincidentDEC(); + void synchronize(); + void broadcastTopology(BlockTopology*&, int tag); + void broadcastTopology(const ExplicitTopology* toposend, ExplicitTopology* toporecv, int tag); + void transferMappingToSource(); + void prepareSourceDE(); + void prepareTargetDE(); + void recvData(); + void sendData(); + private: + ExplicitTopology* _toposource; + ExplicitTopology* _topotarget; + ProcessorGroup* _targetgroup; + ProcessorGroup* _sourcegroup; + int* _sendcounts; + int* _recvcounts; + int* _senddispls; + int* _recvdispls; + double* _recvbuffer; + double* _sendbuffer; + std::map > _distant_elems; + ExplicitMapping _explicit_mapping; + }; +} + +#endif diff --git a/src/ParaMEDMEM/ExplicitMapping.hxx b/src/ParaMEDMEM/ExplicitMapping.hxx new file mode 100644 index 000000000..e83d0dc97 --- /dev/null +++ b/src/ParaMEDMEM/ExplicitMapping.hxx @@ -0,0 +1,176 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __EXPLICITMAPPING_HXX__ +#define __EXPLICITMAPPING_HXX__ + +#include +#include +#include + +namespace ParaMEDMEM +{ + class ExplicitMapping + { + public: + + ExplicitMapping():_numbers(0), _domains(0), _comm_buffer(0) { } + + ~ExplicitMapping() + { + if (_domains!=0) delete[] _domains; + if (_numbers!=0) delete[] _numbers; + if (_comm_buffer!=0) delete[] _comm_buffer; + } + + void pushBackElem(std::pair idistant) + { + _mapping.push_back(idistant); + } + + void setDistantElem(int ilocal, std::pair idistant) + { + _mapping[ilocal]=idistant; + } + + int nbDistantDomains() + { + if (_distant_domains.empty()) + { + for (std::vector >::const_iterator iter= _mapping.begin(); + iter!=_mapping.end(); + iter++) + _distant_domains.insert(iter->first); + } + return _distant_domains.size(); + } + + std::pair getDistantNumbering(int ielem)const + { + return _mapping[ielem]; + } + + int getDistantDomain(int i) + { + if (_domains==0) + computeNumbers(); + + return _domains[i]; + } + + int getNbDistantElems(int i) + { + if (_numbers==0) + computeNumbers(); + return _numbers[i]; + } + + int* serialize(int idproc) + { + _comm_buffer=new int[_mapping.size()*2]; + std::vector offsets(_distant_domains.size()); + offsets[0]=0; + for (int i=1; i<(int)_distant_domains.size();i++) + offsets[i]=offsets[i-1]+_numbers[i-1]; + + for (int i=0; i<(int)_mapping.size(); i++) + { + int offset= offsets[_mapping[i].first]; + _comm_buffer[offset*2]=idproc; + _comm_buffer[offset*2+1]=_mapping[i].second; + offsets[_mapping[i].first]++; + } + return _comm_buffer; + } + + void unserialize(int nbprocs, int* sizes,int nbtarget, int* targetrank, int* commbuffer) + { + int total_size=0; + for (int i=0; i< nbprocs; i++) + total_size+=sizes[i]; + + _mapping.resize(total_size); + _buffer_index=new int[total_size]; + int indmap=0; + for (int i=0; i0) + { + _numbers[index]=sizes[targetrank[i]]; + _domains[index]=i; + index++; + } + } + _send_counts=new int[nbprocs]; + for (int i=0; i > _mapping; + std::set _distant_domains; + int* _numbers; + int* _domains; + int* _comm_buffer; + int* _buffer_index; + int* _send_counts; + + void computeNumbers() + { + std::map counts; + if (_numbers==0) + { + _numbers=new int[nbDistantDomains()]; + _domains=new int[nbDistantDomains()]; + for (int i=0; i<(int)_mapping.size(); i++) + { + if ( counts.find(_mapping[i].first) == counts.end()) + counts.insert(std::make_pair(_mapping[i].first,1)); + else + (counts[_mapping[i].first])++; + } + int counter=0; + for (std::map::const_iterator iter=counts.begin(); + iter!=counts.end(); + iter++) + { + _numbers[counter]=iter->second; + _domains[counter]=iter->first; + counter++; + } + } + } + }; +} + +#endif diff --git a/src/ParaMEDMEM/ExplicitTopology.cxx b/src/ParaMEDMEM/ExplicitTopology.cxx new file mode 100644 index 000000000..a624623a9 --- /dev/null +++ b/src/ParaMEDMEM/ExplicitTopology.cxx @@ -0,0 +1,109 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "CommInterface.hxx" +#include "ProcessorGroup.hxx" +#include "MPIProcessorGroup.hxx" +#include "ParaMESH.hxx" +#include "Topology.hxx" +#include "ExplicitTopology.hxx" +#include "BlockTopology.hxx" +#include "ComponentTopology.hxx" + +#include +#include + +using namespace std; +namespace ParaMEDMEM +{ + +ExplicitTopology::ExplicitTopology(const ParaMESH& paramesh ): +_proc_group(paramesh.getBlockTopology()->getProcGroup()), +_nb_components(1) +{ + _nb_elems=paramesh.getCellMesh()->getNumberOfCells(); + const int* global=paramesh.getGlobalNumberingCell(); + _loc2glob=new int[_nb_elems]; + + for (int i=0; i<_nb_elems; i++) + { + _loc2glob[i]=global[i]; + _glob2loc[global[i]]=i; + } +} + +ExplicitTopology::ExplicitTopology(const ExplicitTopology& topo, int nb_components) +{ + _proc_group = topo._proc_group; + _nb_elems = topo._nb_elems; + _nb_components = nb_components; + _loc2glob=new int[_nb_elems]; + for (int i=0; i<_nb_elems; i++) + { + _loc2glob[i]=topo._loc2glob[i]; + } + _glob2loc=topo._glob2loc; +} + + +ExplicitTopology::~ExplicitTopology() +{ + if (_loc2glob != 0) delete[] _loc2glob; +} + + +/*! Serializes the data contained in the Explicit Topology + * for communication purposes*/ +void ExplicitTopology::serialize(int* & serializer, int& size) const +{ + vector buffer; + + buffer.push_back(_nb_elems); + for (int i=0; i<_nb_elems; i++) + { + buffer.push_back(_loc2glob[i]); + } + + serializer=new int[buffer.size()]; + size= buffer.size(); + copy(buffer.begin(), buffer.end(), serializer); + +} +/*! Unserializes the data contained in the Explicit Topology + * after communication. Uses the same structure as the one used for serialize() + * + * */ +void ExplicitTopology::unserialize(const int* serializer,const CommInterface& comm_interface) +{ + const int* ptr_serializer=serializer; + cout << "unserialize..."< +#include +#include + +namespace ParaMEDMEM +{ + class ParaMESH; + class Topology; + class ComponentTopology; + + class ExplicitTopology : public Topology + { + public: + ExplicitTopology() { } + ExplicitTopology( const ExplicitTopology& topo, int nbcomponents); + ExplicitTopology(const ParaMESH &mesh); + virtual ~ExplicitTopology(); + + inline int getNbElements()const; + inline int getNbLocalElements() const; + const ProcessorGroup* getProcGroup()const { return _proc_group; } + int localToGlobal (const std::pair local) const { return localToGlobal(local.second); } + inline int localToGlobal(int) const; + inline int globalToLocal(int) const; + void serialize(int* & serializer, int& size) const ; + void unserialize(const int* serializer, const CommInterface& comm_interface); + int getNbComponents() const { return _nb_components; } + private: + //Processor group + const ProcessorGroup* _proc_group; + //nb of elements + int _nb_elems; + //nb of components + int _nb_components; + //mapping local to global + int* _loc2glob; + //mapping global to local + INTERP_KERNEL::HashMap _glob2loc; + }; + + //!converts a pair to a global number + inline int ExplicitTopology::globalToLocal(const int global) const + { + return (_glob2loc.find(global))->second;; + } + + //!converts local number to a global number + int ExplicitTopology::localToGlobal(int local) const + { + return _loc2glob[local]; + } + + //!Retrieves the number of elements for a given topology + inline int ExplicitTopology::getNbElements() const + { + return _nb_elems; + } + + //Retrieves the local number of elements + inline int ExplicitTopology::getNbLocalElements()const + { + return _glob2loc.size(); + } +} + + +#endif diff --git a/src/ParaMEDMEM/ICoCoField.cxx b/src/ParaMEDMEM/ICoCoField.cxx new file mode 100644 index 000000000..3925945b7 --- /dev/null +++ b/src/ParaMEDMEM/ICoCoField.cxx @@ -0,0 +1,48 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +// ICoCo file common to several codes +// ICoCoField.cxx +// version 1.2 10/05/2010 + +#include +#include + +using namespace ICoCo; +using std::string; + +Field::Field() { + _name=new string; +} + +Field::~Field() { + delete _name; +} + +void Field::setName(const string& name) { + *_name=name; +} + +const string& Field::getName() const { + return *_name; +} + +const char* Field::getCharName() const { + return _name->c_str(); +} diff --git a/src/ParaMEDMEM/ICoCoField.hxx b/src/ParaMEDMEM/ICoCoField.hxx new file mode 100644 index 000000000..509dc68f5 --- /dev/null +++ b/src/ParaMEDMEM/ICoCoField.hxx @@ -0,0 +1,43 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +// ICoCo file common to several codes +// ICoCoField.h +// version 1.2 10/05/2010 + +#ifndef _ICoCoField_included_ +#define _ICoCoField_included_ +#include + + +namespace ICoCo { + + class Field { + public: + Field(); + virtual ~Field(); + void setName(const std::string& name); + const std::string& getName() const; + const char* getCharName() const; + + private: + std::string* _name; + }; +} +#endif diff --git a/src/ParaMEDMEM/ICoCoMEDField.cxx b/src/ParaMEDMEM/ICoCoMEDField.cxx new file mode 100644 index 000000000..1bf60fc75 --- /dev/null +++ b/src/ParaMEDMEM/ICoCoMEDField.cxx @@ -0,0 +1,62 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "ICoCoMEDField.hxx" +#include "ProcessorGroup.hxx" +#include "MEDCouplingUMesh.hxx" +#include "MEDCouplingFieldDouble.hxx" +#include "NormalizedUnstructuredMesh.hxx" + +namespace ICoCo +{ + + /*! Constructor directly attaching a MEDCouplingFieldDouble + the object does not take the control the objects pointed by + \a field. + */ + + MEDField::MEDField(ParaMEDMEM::MEDCouplingFieldDouble *field):_field(field) + { + if(_field) + _field->incrRef(); + } + MEDField::MEDField(const MEDField& field):_field(field.getField()) + { + if(_field) + _field->incrRef(); + } + + MEDField::~MEDField() + { + if(_field) + _field->decrRef(); + } + + + MEDField& MEDField::operator=(const MEDField& field) + { + if (_field) + _field->decrRef(); + + _field=field.getField(); + if(_field) + _field->incrRef(); + return *this; + } +} diff --git a/src/ParaMEDMEM/ICoCoMEDField.hxx b/src/ParaMEDMEM/ICoCoMEDField.hxx new file mode 100644 index 000000000..c5dbdbb14 --- /dev/null +++ b/src/ParaMEDMEM/ICoCoMEDField.hxx @@ -0,0 +1,46 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __ICOCOMEDFIELD_HXX__ +#define __ICOCOMEDFIELD_HXX__ + +#include "ICoCoField.hxx" +#include "MEDCouplingUMesh.hxx" +#include "MEDCouplingFieldDouble.hxx" + +#include + +namespace ICoCo +{ + class MEDField : public ICoCo::Field + { + public: + MEDField():_field(0) { } + MEDField(ParaMEDMEM::MEDCouplingFieldDouble* field); + MEDField(const MEDField& field); + MEDField& operator=(const MEDField& field); + virtual ~MEDField(); + ParaMEDMEM::MEDCouplingFieldDouble *getField() const { return _field; } + const ParaMEDMEM::MEDCouplingMesh *getMesh() const { return _field->getMesh(); } + private: + ParaMEDMEM::MEDCouplingFieldDouble *_field; + }; +} + +#endif diff --git a/src/ParaMEDMEM/InterpKernelDEC.cxx b/src/ParaMEDMEM/InterpKernelDEC.cxx new file mode 100644 index 000000000..e8605ded2 --- /dev/null +++ b/src/ParaMEDMEM/InterpKernelDEC.cxx @@ -0,0 +1,280 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include "CommInterface.hxx" +#include "Topology.hxx" +#include "BlockTopology.hxx" +#include "ComponentTopology.hxx" +#include "ParaFIELD.hxx" +#include "MPIProcessorGroup.hxx" +#include "ParaMESH.hxx" +#include "DEC.hxx" +#include "InterpolationMatrix.hxx" +#include "InterpKernelDEC.hxx" +#include "ElementLocator.hxx" + +namespace ParaMEDMEM +{ + + /*! + \defgroup interpkerneldec InterpKernelDEC + + \section overview Overview + + The InterpKernelDEC enables the \ref conservativeremapping of fields between two parallel codes. This remapping is based on the computation of intersection volumes between elements from code A and elements from code B. The computation is possible for 3D meshes, 2D meshes, and 3D-surface meshes. Dimensions must be similar for code A and code B (for instance, though it could be desirable, it is not yet possible to couple 3D surfaces with 2D surfaces). + + In the present version, only fields lying on elements are considered. + + \image html NonCoincident_small.png "Example showing the transfer from a field based on a quadrangular mesh to a triangular mesh. In a P0-P0 interpolation, to obtain the value on a triangle, the values on quadrangles are weighted by their intersection area and summed." + + \image latex NonCoincident_small.eps "Example showing the transfer from a field based on a quadrangular mesh to a triangular mesh. In a P0-P0 interpolation, to obtain the value on a triangle, the values on quadrangles are weighted by their intersection area and summed." + + A typical use of InterpKernelDEC encompasses two distinct phases : + - A setup phase during which the intersection volumes are computed and the communication structures are setup. This corresponds to calling the InterpKernelDEC::synchronize() method. + - A use phase during which the remappings are actually performed. This corresponds to the calls to sendData() and recvData() which actually trigger the data exchange. The data exchange are synchronous in the current version of the library so that recvData() and sendData() calls must be synchronized on code A and code B processor groups. + + The following code excerpt illutrates a typical use of the InterpKernelDEC class. + + \code + ... + InterpKernelDEC dec(groupA, groupB); + dec.attachLocalField(field); + dec.synchronize(); + if (groupA.containsMyRank()) + dec.recvData(); + else if (groupB.containsMyRank()) + dec.sendData(); + ... + \endcode + A \ref conservativeremapping of the field from the source mesh to the target mesh is performed by the function synchronise(), which computes the \ref remappingmatrix. + + Computing the field on the receiving side can be expressed in terms of a matrix-vector product : \f$ \phi_t=W.\phi_s\f$, with \f$ \phi_t \f$ the field on the target side and \f$ \phi_s \f$ the field on the source side. + When remapping a 3D surface to another 3D surface, a projection phase is necessary to match elements from both sides. Care must be taken when defining this projection to obtain a \ref conservative remapping. + + In the P0-P0 case, this matrix is a plain rectangular matrix with coefficients equal to the intersection areas between triangle and quadrangles. For instance, in the above figure, the matrix is : + + \f[ + \begin{tabular}{|cccc|} + 0.72 & 0 & 0.2 & 0 \\ + 0.46 & 0 & 0.51 & 0.03\\ + 0.42 & 0.53 & 0 & 0.05\\ + 0 & 0 & 0.92 & 0.05 \\ + \end{tabular} + \f] + + + + \section interpkerneldec_options Options + On top of \ref dec_options, options supported by %InterpKernelDEC objects are + related to the underlying Intersector class. + All the options available in the intersector objects are + available for the %InterpKernelDEC object. The various options available for * intersectors can be reviewed in \ref InterpKerIntersectors. + + For instance : + \verbatim + InterpKernelDEC dec(source_group, target_group); + dec.attachLocalField(field); + dec.setOptions("DoRotate",false); + dec.setOptions("Precision",1e-12); + dec.synchronize(); + \endverbatim + + \warning{ Options must be set before calling the synchronize method. } + */ + + /*! + \addtogroup interpkerneldec + @{ + */ + + InterpKernelDEC::InterpKernelDEC():_interpolation_matrix(0) + { + } + + /*! + This constructor creates an InterpKernelDEC which has \a source_group as a working side + and \a target_group as an idle side. All the processors will actually participate, but intersection computations will be performed on the working side during the \a synchronize() phase. + The constructor must be called synchronously on all processors of both processor groups. + + \param source_group working side ProcessorGroup + \param target_group lazy side ProcessorGroup + + */ + InterpKernelDEC::InterpKernelDEC(ProcessorGroup& source_group, ProcessorGroup& target_group): + DisjointDEC(source_group, target_group),_interpolation_matrix(0) + { + + } + + InterpKernelDEC::InterpKernelDEC(const std::set& src_ids, const std::set& trg_ids, + const MPI_Comm& world_comm):DisjointDEC(src_ids,trg_ids,world_comm), + _interpolation_matrix(0) + { + } + + InterpKernelDEC::~InterpKernelDEC() + { + if (_interpolation_matrix !=0) + delete _interpolation_matrix; + } + + /*! + \brief Synchronization process for exchanging topologies. + + This method prepares all the structures necessary for sending data from a processor group to the other. It uses the mesh underlying the fields that have been set with attachLocalField method. + It works in four steps : + -# Bounding boxes are computed for each subdomain, + -# The lazy side mesh parts that are likely to intersect the working side local processor are sent to the working side, + -# The working side calls the interpolation kernel to compute the intersection between local and imported mesh. + -# The lazy side is updated so that it knows the structure of the data that will be sent by + the working side during a \a sendData() call. + + */ + void InterpKernelDEC::synchronize() + { + if(!isInUnion()) + return ; + delete _interpolation_matrix; + _interpolation_matrix = new InterpolationMatrix (_local_field, *_source_group,*_target_group,*this,*this); + + //setting up the communication DEC on both sides + if (_source_group->containsMyRank()) + { + //locate the distant meshes + ElementLocator locator(*_local_field, *_target_group, *_source_group); + //transfering option from InterpKernelDEC to ElementLocator + locator.copyOptions(*this); + MEDCouplingPointSet* distant_mesh=0; + int* distant_ids=0; + std::string distantMeth; + for (int i=0; i<_target_group->size(); i++) + { + // int idistant_proc = (i+_source_group->myRank())%_target_group->size(); + int idistant_proc=i; + + //gathers pieces of the target meshes that can intersect the local mesh + locator.exchangeMesh(idistant_proc,distant_mesh,distant_ids); + if (distant_mesh !=0) + { + locator.exchangeMethod(_method,idistant_proc,distantMeth); + //adds the contribution of the distant mesh on the local one + int idistant_proc_in_union=_union_group->translateRank(_target_group,idistant_proc); + //std::cout <<"add contribution from proc "<myRank()<addContribution(*distant_mesh,idistant_proc_in_union,distant_ids,_method,distantMeth); + distant_mesh->decrRef(); + delete [] distant_ids; + distant_mesh=0; + distant_ids=0; + } + } + _interpolation_matrix->finishContributionW(locator); + } + + if (_target_group->containsMyRank()) + { + ElementLocator locator(*_local_field, *_source_group, *_target_group); + //transfering option from InterpKernelDEC to ElementLocator + locator.copyOptions(*this); + MEDCouplingPointSet* distant_mesh=0; + int* distant_ids=0; + for (int i=0; i<_source_group->size(); i++) + { + // int idistant_proc = (i+_target_group->myRank())%_source_group->size(); + int idistant_proc=i; + //gathers pieces of the target meshes that can intersect the local mesh + locator.exchangeMesh(idistant_proc,distant_mesh,distant_ids); + //std::cout << " Data sent from "<<_union_group->myRank()<<" to source proc "<< idistant_proc<decrRef(); + delete [] distant_ids; + distant_mesh=0; + distant_ids=0; + } + } + _interpolation_matrix->finishContributionL(locator); + } + _interpolation_matrix->prepare(); + } + + + /*! + Receives the data whether the processor is on the working side or on the lazy side. It must match a \a sendData() call on the other side. + */ + void InterpKernelDEC::recvData() + { + if (_source_group->containsMyRank()) + _interpolation_matrix->transposeMultiply(*_local_field->getField()); + else if (_target_group->containsMyRank()) + { + _interpolation_matrix->multiply(*_local_field->getField()); + if (getForcedRenormalization()) + renormalizeTargetField(getMeasureAbsStatus()); + } + } + + + /*! + Receives the data at time \a time in asynchronous mode. The value of the field + will be time-interpolated from the field values received. + \param time time at which the value is desired + */ + void InterpKernelDEC::recvData( double time ) + { + _interpolation_matrix->getAccessDEC()->setTime(time); + recvData() ; + } + + /*! + Sends the data whether the processor is on the working side or on the lazy side. + It must match a recvData() call on the other side. + */ + void InterpKernelDEC::sendData() + { + if (_source_group->containsMyRank()) + { + + _interpolation_matrix->multiply(*_local_field->getField()); + if (getForcedRenormalization()) + renormalizeTargetField(getMeasureAbsStatus()); + + } + else if (_target_group->containsMyRank()) + _interpolation_matrix->transposeMultiply(*_local_field->getField()); + } + + /*! + Sends the data available at time \a time in asynchronous mode. + \param time time at which the value is available + \param deltatime time interval between the value presently sent and the next one. + */ + void InterpKernelDEC::sendData( double time , double deltatime ) + { + _interpolation_matrix->getAccessDEC()->setTime(time,deltatime); + sendData() ; + } + + /*! + @} + */ + +} diff --git a/src/ParaMEDMEM/InterpKernelDEC.hxx b/src/ParaMEDMEM/InterpKernelDEC.hxx new file mode 100644 index 000000000..54b8819da --- /dev/null +++ b/src/ParaMEDMEM/InterpKernelDEC.hxx @@ -0,0 +1,57 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __INTERPKERNELDEC_HXX__ +#define __INTERPKERNELDEC_HXX__ + +#include "DisjointDEC.hxx" +#include "MxN_Mapping.hxx" +#include "InterpolationOptions.hxx" + +namespace ParaMEDMEM +{ + class InterpolationMatrix; + + class InterpKernelDEC : public DisjointDEC, public INTERP_KERNEL::InterpolationOptions + { + public: + InterpKernelDEC(); + InterpKernelDEC(ProcessorGroup& source_group, ProcessorGroup& target_group); + InterpKernelDEC(const std::set& src_ids, const std::set& trg_ids, + const MPI_Comm& world_comm=MPI_COMM_WORLD); + virtual ~InterpKernelDEC(); + void synchronize(); + void recvData(); + void recvData(double time); + void sendData(); + void sendData(double time , double deltatime); + void prepareSourceDE() { } + void prepareTargetDE() { } + private : + //Number of distant points to be located locally + int _nb_distant_points; + //coordinates of distant points + const double* _distant_coords; + //local element number containing the distant points + const int* _distant_locations; + InterpolationMatrix* _interpolation_matrix; + }; +} + +#endif diff --git a/src/ParaMEDMEM/InterpolationMatrix.cxx b/src/ParaMEDMEM/InterpolationMatrix.cxx new file mode 100644 index 000000000..99c12981a --- /dev/null +++ b/src/ParaMEDMEM/InterpolationMatrix.cxx @@ -0,0 +1,973 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "ParaMESH.hxx" +#include "ParaFIELD.hxx" +#include "ProcessorGroup.hxx" +#include "MxN_Mapping.hxx" +#include "InterpolationMatrix.hxx" +#include "TranslationRotationMatrix.hxx" +#include "Interpolation.hxx" +#include "Interpolation1D.txx" +#include "Interpolation2DCurve.hxx" +#include "Interpolation2D.txx" +#include "Interpolation3DSurf.hxx" +#include "Interpolation3D.txx" +#include "Interpolation3D2D.txx" +#include "Interpolation2D1D.txx" +#include "MEDCouplingUMesh.hxx" +#include "MEDCouplingNormalizedUnstructuredMesh.txx" +#include "InterpolationOptions.hxx" +#include "NormalizedUnstructuredMesh.hxx" +#include "ElementLocator.hxx" + +#include + +// class InterpolationMatrix +// This class enables the storage of an interpolation matrix Wij mapping +// source field Sj to target field Ti via Ti=Vi^(-1).Wij.Sj. +// The matrix is built and stored on the processors belonging to the source +// group. + +using namespace std; + +namespace ParaMEDMEM +{ + + // ==================================================================== + // Creates an empty matrix structure linking two distributed supports. + // The method must be called by all processors belonging to source + // and target groups. + // param source_support local support + // param source_group processor group containing the local processors + // param target_group processor group containing the distant processors + // param method interpolation method + // ==================================================================== + + InterpolationMatrix::InterpolationMatrix(const ParaMEDMEM::ParaFIELD *source_field, + const ProcessorGroup& source_group, + const ProcessorGroup& target_group, + const DECOptions& dec_options, + const INTERP_KERNEL::InterpolationOptions& interp_options): + INTERP_KERNEL::InterpolationOptions(interp_options), + DECOptions(dec_options), + _source_field(source_field), + _source_support(source_field->getSupport()->getCellMesh()), + _mapping(source_group, target_group, dec_options), + _source_group(source_group), + _target_group(target_group) + { + int nbelems = source_field->getField()->getNumberOfTuples(); + _row_offsets.resize(nbelems+1); + _coeffs.resize(nbelems); + _target_volume.resize(nbelems); + } + + InterpolationMatrix::~InterpolationMatrix() + { + } + + + // ====================================================================== + // \brief Adds the contribution of a distant subdomain to the* + // interpolation matrix. + // The method adds contribution to the interpolation matrix. + // For each row of the matrix, elements are addded as + // a (column, coeff) pair in the _coeffs array. This column number refers + // to an element on the target side via the _col_offsets array. + // It is made of a series of (iproc, ielem) pairs. + // The number of elements per row is stored in the row_offsets array. + + // param distant_support local representation of the distant subdomain + // param iproc_distant id of the distant subdomain (in the distant group) + // param distant_elems mapping between the local representation of + // the subdomain and the actual elem ids on the distant subdomain + // ====================================================================== + + void InterpolationMatrix::addContribution ( MEDCouplingPointSet& distant_support, + int iproc_distant, + const int* distant_elems, + const std::string& srcMeth, + const std::string& targetMeth) + { + std::string interpMethod(targetMeth); + interpMethod+=srcMeth; + //creating the interpolator structure + vector > surfaces; + //computation of the intersection volumes between source and target elements + MEDCouplingUMesh *distant_supportC=dynamic_cast(&distant_support); + MEDCouplingUMesh *source_supportC=dynamic_cast(_source_support); + if ( distant_support.getMeshDimension() == -1 ) + { + if(source_supportC->getMeshDimension()==2 && source_supportC->getSpaceDimension()==2) + { + MEDCouplingNormalizedUnstructuredMesh<2,2> source_mesh_wrapper(source_supportC); + INTERP_KERNEL::Interpolation2D interpolation(*this); + interpolation.fromIntegralUniform(source_mesh_wrapper,surfaces,srcMeth); + } + else if(source_supportC->getMeshDimension()==3 && source_supportC->getSpaceDimension()==3) + { + MEDCouplingNormalizedUnstructuredMesh<3,3> source_mesh_wrapper(source_supportC); + INTERP_KERNEL::Interpolation3D interpolation(*this); + interpolation.fromIntegralUniform(source_mesh_wrapper,surfaces,srcMeth); + } + else if(source_supportC->getMeshDimension()==2 && source_supportC->getSpaceDimension()==3) + { + MEDCouplingNormalizedUnstructuredMesh<3,2> source_mesh_wrapper(source_supportC); + INTERP_KERNEL::Interpolation3DSurf interpolation(*this); + interpolation.fromIntegralUniform(source_mesh_wrapper,surfaces,srcMeth); + } + else + throw INTERP_KERNEL::Exception("No para interpolation available for the given mesh and space dimension of source mesh to -1D targetMesh"); + } + else if ( source_supportC->getMeshDimension() == -1 ) + { + if(distant_supportC->getMeshDimension()==2 && distant_supportC->getSpaceDimension()==2) + { + MEDCouplingNormalizedUnstructuredMesh<2,2> distant_mesh_wrapper(distant_supportC); + INTERP_KERNEL::Interpolation2D interpolation(*this); + interpolation.toIntegralUniform(distant_mesh_wrapper,surfaces,srcMeth); + } + else if(distant_supportC->getMeshDimension()==3 && distant_supportC->getSpaceDimension()==3) + { + MEDCouplingNormalizedUnstructuredMesh<3,3> distant_mesh_wrapper(distant_supportC); + INTERP_KERNEL::Interpolation3D interpolation(*this); + interpolation.toIntegralUniform(distant_mesh_wrapper,surfaces,srcMeth); + } + else if(distant_supportC->getMeshDimension()==2 && distant_supportC->getSpaceDimension()==3) + { + MEDCouplingNormalizedUnstructuredMesh<3,2> distant_mesh_wrapper(distant_supportC); + INTERP_KERNEL::Interpolation3DSurf interpolation(*this); + interpolation.toIntegralUniform(distant_mesh_wrapper,surfaces,srcMeth); + } + else + throw INTERP_KERNEL::Exception("No para interpolation available for the given mesh and space dimension of distant mesh to -1D sourceMesh"); + } + else if ( distant_support.getMeshDimension() == 2 + && _source_support->getMeshDimension() == 3 + && distant_support.getSpaceDimension() == 3 && _source_support->getSpaceDimension() == 3) + { + MEDCouplingNormalizedUnstructuredMesh<3,3> target_wrapper(distant_supportC); + MEDCouplingNormalizedUnstructuredMesh<3,3> source_wrapper(source_supportC); + INTERP_KERNEL::Interpolation3D2D interpolator (*this); + interpolator.interpolateMeshes(target_wrapper,source_wrapper,surfaces,interpMethod); + target_wrapper.releaseTempArrays(); + source_wrapper.releaseTempArrays(); + } + else if ( distant_support.getMeshDimension() == 1 + && _source_support->getMeshDimension() == 2 + && distant_support.getSpaceDimension() == 2 && _source_support->getSpaceDimension() == 2) + { + MEDCouplingNormalizedUnstructuredMesh<2,2> target_wrapper(distant_supportC); + MEDCouplingNormalizedUnstructuredMesh<2,2> source_wrapper(source_supportC); + INTERP_KERNEL::Interpolation2D1D interpolator (*this); + interpolator.interpolateMeshes(target_wrapper,source_wrapper,surfaces,interpMethod); + target_wrapper.releaseTempArrays(); + source_wrapper.releaseTempArrays(); + } + else if ( distant_support.getMeshDimension() == 3 + && _source_support->getMeshDimension() == 1 + && distant_support.getSpaceDimension() == 3 && _source_support->getSpaceDimension() == 3) + { + MEDCouplingNormalizedUnstructuredMesh<3,3> target_wrapper(distant_supportC); + MEDCouplingNormalizedUnstructuredMesh<3,3> source_wrapper(source_supportC); + INTERP_KERNEL::Interpolation3D interpolator (*this); + interpolator.interpolateMeshes(target_wrapper,source_wrapper,surfaces,interpMethod); + target_wrapper.releaseTempArrays(); + source_wrapper.releaseTempArrays(); + } + else if (distant_support.getMeshDimension() != _source_support->getMeshDimension()) + { + throw INTERP_KERNEL::Exception("local and distant meshes do not have the same space and mesh dimensions"); + } + else if( distant_support.getMeshDimension() == 1 + && distant_support.getSpaceDimension() == 1 ) + { + MEDCouplingNormalizedUnstructuredMesh<1,1> target_wrapper(distant_supportC); + MEDCouplingNormalizedUnstructuredMesh<1,1> source_wrapper(source_supportC); + + INTERP_KERNEL::Interpolation1D interpolation(*this); + interpolation.interpolateMeshes(target_wrapper,source_wrapper,surfaces,interpMethod); + target_wrapper.releaseTempArrays(); + source_wrapper.releaseTempArrays(); + } + else if( distant_support.getMeshDimension() == 1 + && distant_support.getSpaceDimension() == 2 ) + { + MEDCouplingNormalizedUnstructuredMesh<2,1> target_wrapper(distant_supportC); + MEDCouplingNormalizedUnstructuredMesh<2,1> source_wrapper(source_supportC); + + INTERP_KERNEL::Interpolation2DCurve interpolation(*this); + interpolation.interpolateMeshes(target_wrapper,source_wrapper,surfaces,interpMethod); + target_wrapper.releaseTempArrays(); + source_wrapper.releaseTempArrays(); + } + else if ( distant_support.getMeshDimension() == 2 + && distant_support.getSpaceDimension() == 3 ) + { + MEDCouplingNormalizedUnstructuredMesh<3,2> target_wrapper(distant_supportC); + MEDCouplingNormalizedUnstructuredMesh<3,2> source_wrapper(source_supportC); + + INTERP_KERNEL::Interpolation3DSurf interpolator (*this); + interpolator.interpolateMeshes(target_wrapper,source_wrapper,surfaces,interpMethod); + target_wrapper.releaseTempArrays(); + source_wrapper.releaseTempArrays(); + } + else if ( distant_support.getMeshDimension() == 2 + && distant_support.getSpaceDimension() == 2) + { + MEDCouplingNormalizedUnstructuredMesh<2,2> target_wrapper(distant_supportC); + MEDCouplingNormalizedUnstructuredMesh<2,2> source_wrapper(source_supportC); + + INTERP_KERNEL::Interpolation2D interpolator (*this); + interpolator.interpolateMeshes(target_wrapper,source_wrapper,surfaces,interpMethod); + target_wrapper.releaseTempArrays(); + source_wrapper.releaseTempArrays(); + } + else if ( distant_support.getMeshDimension() == 3 + && distant_support.getSpaceDimension() == 3 ) + { + MEDCouplingNormalizedUnstructuredMesh<3,3> target_wrapper(distant_supportC); + MEDCouplingNormalizedUnstructuredMesh<3,3> source_wrapper(source_supportC); + + INTERP_KERNEL::Interpolation3D interpolator (*this); + interpolator.interpolateMeshes(target_wrapper,source_wrapper,surfaces,interpMethod); + target_wrapper.releaseTempArrays(); + source_wrapper.releaseTempArrays(); + } + else + { + throw INTERP_KERNEL::Exception("no interpolator exists for these mesh and space dimensions "); + } + bool needTargetSurf=isSurfaceComputationNeeded(targetMeth); + + MEDCouplingFieldDouble *target_triangle_surf=0; + if(needTargetSurf) + target_triangle_surf = distant_support.getMeasureField(getMeasureAbsStatus()); + fillDSFromVM(iproc_distant,distant_elems,surfaces,target_triangle_surf); + + if(needTargetSurf) + target_triangle_surf->decrRef(); + } + + void InterpolationMatrix::fillDSFromVM(int iproc_distant, const int* distant_elems, const std::vector< std::map >& values, MEDCouplingFieldDouble *surf) + { + //loop over the elements to build the interpolation + //matrix structures + int source_size=values.size(); + for (int ielem=0; ielem < source_size; ielem++) + { + _row_offsets[ielem+1] += values[ielem].size(); + for(map::const_iterator iter=values[ielem].begin();iter!=values[ielem].end();iter++) + { + int localId; + if(distant_elems) + localId=distant_elems[iter->first]; + else + localId=iter->first; + //locating the (iproc, itriangle) pair in the list of columns + map,int >::iterator iter2 = _col_offsets.find(make_pair(iproc_distant,localId)); + int col_id; + + if (iter2 == _col_offsets.end()) + { + //(iproc, itriangle) is not registered in the list + //of distant elements + col_id =_col_offsets.size(); + _col_offsets.insert(make_pair(make_pair(iproc_distant,localId),col_id)); + _mapping.addElementFromSource(iproc_distant,localId); + } + else + { + col_id = iter2->second; + } + //the non zero coefficient is stored + //ielem is the row, + //col_id is the number of the column + //iter->second is the value of the coefficient + if(surf) + { + double surface = surf->getIJ(iter->first,0); + _target_volume[ielem].push_back(surface); + } + _coeffs[ielem].push_back(make_pair(col_id,iter->second)); + } + } + } + + void InterpolationMatrix::serializeMe(std::vector< std::vector< std::map > >& data1, std::vector& data2) const + { + data1.clear(); + data2.clear(); + const std::vector >& sendingIds=_mapping.getSendingIds(); + std::set procsS; + for(std::vector >::const_iterator iter1=sendingIds.begin();iter1!=sendingIds.end();iter1++) + procsS.insert((*iter1).first); + data1.resize(procsS.size()); + data2.resize(procsS.size()); + std::copy(procsS.begin(),procsS.end(),data2.begin()); + std::map fastProcAcc; + int id=0; + for(std::set::const_iterator iter2=procsS.begin();iter2!=procsS.end();iter2++,id++) + fastProcAcc[*iter2]=id; + int nbOfSrcElt=_coeffs.size(); + for(std::vector< std::vector< std::map > >::iterator iter3=data1.begin();iter3!=data1.end();iter3++) + (*iter3).resize(nbOfSrcElt); + id=0; + for(std::vector< std::vector< std::pair > >::const_iterator iter4=_coeffs.begin();iter4!=_coeffs.end();iter4++,id++) + { + for(std::vector< std::pair >::const_iterator iter5=(*iter4).begin();iter5!=(*iter4).end();iter5++) + { + const std::pair& elt=sendingIds[(*iter5).first]; + data1[fastProcAcc[elt.first]][id][elt.second]=(*iter5).second; + } + } + } + + void InterpolationMatrix::initialize() + { + int lgth=_coeffs.size(); + _row_offsets.clear(); _row_offsets.resize(lgth+1); + _coeffs.clear(); _coeffs.resize(lgth); + _target_volume.clear(); _target_volume.resize(lgth); + _col_offsets.clear(); + _mapping.initialize(); + } + + void InterpolationMatrix::finishContributionW(ElementLocator& elementLocator) + { + NatureOfField nature=elementLocator.getLocalNature(); + switch(nature) + { + case ConservativeVolumic: + computeConservVolDenoW(elementLocator); + break; + case Integral: + { + if(!elementLocator.isM1DCorr()) + computeIntegralDenoW(elementLocator); + else + computeGlobConstraintDenoW(elementLocator); + break; + } + case IntegralGlobConstraint: + computeGlobConstraintDenoW(elementLocator); + break; + case RevIntegral: + { + if(!elementLocator.isM1DCorr()) + computeRevIntegralDenoW(elementLocator); + else + computeConservVolDenoW(elementLocator); + break; + } + default: + throw INTERP_KERNEL::Exception("Not recognized nature of field. Change nature of Field."); + break; + } + } + + void InterpolationMatrix::finishContributionL(ElementLocator& elementLocator) + { + NatureOfField nature=elementLocator.getLocalNature(); + switch(nature) + { + case ConservativeVolumic: + computeConservVolDenoL(elementLocator); + break; + case Integral: + { + if(!elementLocator.isM1DCorr()) + computeIntegralDenoL(elementLocator); + else + computeConservVolDenoL(elementLocator); + break; + } + case IntegralGlobConstraint: + //this is not a bug doing like ConservativeVolumic + computeConservVolDenoL(elementLocator); + break; + case RevIntegral: + { + if(!elementLocator.isM1DCorr()) + computeRevIntegralDenoL(elementLocator); + else + computeConservVolDenoL(elementLocator); + break; + } + default: + throw INTERP_KERNEL::Exception("Not recognized nature of field. Change nature of Field."); + break; + } + } + + void InterpolationMatrix::computeConservVolDenoW(ElementLocator& elementLocator) + { + computeGlobalColSum(_deno_reverse_multiply); + computeGlobalRowSum(elementLocator,_deno_multiply,_deno_reverse_multiply); + } + + void InterpolationMatrix::computeConservVolDenoL(ElementLocator& elementLocator) + { + int pol1=elementLocator.sendPolicyToWorkingSideL(); + if(pol1==ElementLocator::NO_POST_TREATMENT_POLICY) + { + elementLocator.recvFromWorkingSideL(); + elementLocator.sendToWorkingSideL(); + } + else if(ElementLocator::CUMULATIVE_POLICY) + { + //ask for lazy side to deduce ids eventually missing on working side and to send it back. + elementLocator.recvLocalIdsFromWorkingSideL(); + elementLocator.sendCandidatesGlobalIdsToWorkingSideL(); + elementLocator.recvCandidatesForAddElementsL(); + elementLocator.sendAddElementsToWorkingSideL(); + //Working side has updated its eventually missing ids updates its global ids with lazy side procs contribution + elementLocator.recvLocalIdsFromWorkingSideL(); + elementLocator.sendGlobalIdsToWorkingSideL(); + //like no post treatment + elementLocator.recvFromWorkingSideL(); + elementLocator.sendToWorkingSideL(); + } + else + throw INTERP_KERNEL::Exception("Not managed policy detected on lazy side : not implemented !"); + } + + void InterpolationMatrix::computeIntegralDenoW(ElementLocator& elementLocator) + { + MEDCouplingFieldDouble *source_triangle_surf = _source_support->getMeasureField(getMeasureAbsStatus()); + _deno_multiply.resize(_coeffs.size()); + vector >::iterator iter6=_deno_multiply.begin(); + const double *values=source_triangle_surf->getArray()->getConstPointer(); + for(vector > >::const_iterator iter4=_coeffs.begin();iter4!=_coeffs.end();iter4++,iter6++,values++) + { + (*iter6).resize((*iter4).size()); + std::fill((*iter6).begin(),(*iter6).end(),*values); + } + source_triangle_surf->decrRef(); + _deno_reverse_multiply=_target_volume; + } + + void InterpolationMatrix::computeRevIntegralDenoW(ElementLocator& elementLocator) + { + _deno_multiply=_target_volume; + MEDCouplingFieldDouble *source_triangle_surf = _source_support->getMeasureField(getMeasureAbsStatus()); + _deno_reverse_multiply.resize(_coeffs.size()); + vector >::iterator iter6=_deno_reverse_multiply.begin(); + const double *values=source_triangle_surf->getArray()->getConstPointer(); + for(vector > >::const_iterator iter4=_coeffs.begin();iter4!=_coeffs.end();iter4++,iter6++,values++) + { + (*iter6).resize((*iter4).size()); + std::fill((*iter6).begin(),(*iter6).end(),*values); + } + source_triangle_surf->decrRef(); + } + + /*! + * Nothing to do because surface computation is on working side. + */ + void InterpolationMatrix::computeIntegralDenoL(ElementLocator& elementLocator) + { + } + + /*! + * Nothing to do because surface computation is on working side. + */ + void InterpolationMatrix::computeRevIntegralDenoL(ElementLocator& elementLocator) + { + } + + + void InterpolationMatrix::computeGlobConstraintDenoW(ElementLocator& elementLocator) + { + computeGlobalColSum(_deno_multiply); + computeGlobalRowSum(elementLocator,_deno_reverse_multiply,_deno_multiply); + } + + void InterpolationMatrix::computeGlobalRowSum(ElementLocator& elementLocator, std::vector >& denoStrorage, std::vector >& denoStrorageInv) + { + //stores id in distant procs sorted by lazy procs connected with + vector< vector > rowsPartialSumI; + //stores for each lazy procs connected with, if global info is available and if it's the case the policy + vector policyPartial; + //stores the corresponding values. + vector< vector > rowsPartialSumD; + elementLocator.recvPolicyFromLazySideW(policyPartial); + int pol1=mergePolicies(policyPartial); + if(pol1==ElementLocator::NO_POST_TREATMENT_POLICY) + { + computeLocalRowSum(elementLocator.getDistantProcIds(),rowsPartialSumI,rowsPartialSumD); + elementLocator.sendSumToLazySideW(rowsPartialSumI,rowsPartialSumD); + elementLocator.recvSumFromLazySideW(rowsPartialSumD); + } + else if(pol1==ElementLocator::CUMULATIVE_POLICY) + { + //updateWithNewAdditionnalElements(addingElements); + //stores for each lazy procs connected with, the ids in global mode if it exists (regarding policyPartial). This array has exactly the size of rowsPartialSumI, + //if policyPartial has CUMALATIVE_POLICY in each. + vector< vector > globalIdsPartial; + computeLocalRowSum(elementLocator.getDistantProcIds(),rowsPartialSumI,rowsPartialSumD); + elementLocator.sendLocalIdsToLazyProcsW(rowsPartialSumI); + elementLocator.recvCandidatesGlobalIdsFromLazyProcsW(globalIdsPartial); + std::vector< std::vector > addingElements; + findAdditionnalElements(elementLocator,addingElements,rowsPartialSumI,globalIdsPartial); + addGhostElements(elementLocator.getDistantProcIds(),addingElements); + rowsPartialSumI.clear(); + globalIdsPartial.clear(); + computeLocalRowSum(elementLocator.getDistantProcIds(),rowsPartialSumI,rowsPartialSumD); + elementLocator.sendLocalIdsToLazyProcsW(rowsPartialSumI); + elementLocator.recvGlobalIdsFromLazyProcsW(rowsPartialSumI,globalIdsPartial); + // + elementLocator.sendSumToLazySideW(rowsPartialSumI,rowsPartialSumD); + elementLocator.recvSumFromLazySideW(rowsPartialSumD); + mergeRowSum3(globalIdsPartial,rowsPartialSumD); + mergeCoeffs(elementLocator.getDistantProcIds(),rowsPartialSumI,globalIdsPartial,denoStrorageInv); + } + else + throw INTERP_KERNEL::Exception("Not managed policy detected : not implemented !"); + divideByGlobalRowSum(elementLocator.getDistantProcIds(),rowsPartialSumI,rowsPartialSumD,denoStrorage); + } + + /*! + * @param distantProcs in parameter that indicates which lazy procs are concerned. + * @param resPerProcI out parameter that must be cleared before calling this method. The size of 1st dimension is equal to the size of 'distantProcs'. + * It contains the element ids (2nd dimension) of the corresponding lazy proc. + * @param resPerProcD out parameter with the same format than 'resPerProcI'. It contains corresponding sum values. + */ + void InterpolationMatrix::computeLocalRowSum(const std::vector& distantProcs, std::vector >& resPerProcI, + std::vector >& resPerProcD) const + { + resPerProcI.resize(distantProcs.size()); + resPerProcD.resize(distantProcs.size()); + std::vector res(_col_offsets.size()); + for(vector > >::const_iterator iter=_coeffs.begin();iter!=_coeffs.end();iter++) + for(vector >::const_iterator iter3=(*iter).begin();iter3!=(*iter).end();iter3++) + res[(*iter3).first]+=(*iter3).second; + set procsSet; + int id=-1; + const vector >& mapping=_mapping.getSendingIds(); + for(vector >::const_iterator iter2=mapping.begin();iter2!=mapping.end();iter2++) + { + std::pair::iterator,bool> isIns=procsSet.insert((*iter2).first); + if(isIns.second) + id=std::find(distantProcs.begin(),distantProcs.end(),(*iter2).first)-distantProcs.begin(); + resPerProcI[id].push_back((*iter2).second); + resPerProcD[id].push_back(res[iter2-mapping.begin()]); + } + } + + /*! + * This method is only usable when CUMULATIVE_POLICY detected. This method finds elements ids (typically nodes) lazy side that + * are not present in columns of 'this' and that should regarding cumulative merge of elements regarding their global ids. + */ + void InterpolationMatrix::findAdditionnalElements(ElementLocator& elementLocator, std::vector >& elementsToAdd, + const std::vector >& resPerProcI, const std::vector >& globalIdsPartial) + { + std::set globalIds; + int nbLazyProcs=globalIdsPartial.size(); + for(int i=0;i tmp(globalIds.size()); + std::copy(globalIds.begin(),globalIds.end(),tmp.begin()); + globalIds.clear(); + elementLocator.sendCandidatesForAddElementsW(tmp); + elementLocator.recvAddElementsFromLazyProcsW(elementsToAdd); + } + + void InterpolationMatrix::addGhostElements(const std::vector& distantProcs, const std::vector >& elementsToAdd) + { + std::vector< std::vector< std::map > > data1; + std::vector data2; + serializeMe(data1,data2); + initialize(); + int nbOfDistProcs=distantProcs.size(); + for(int i=0;i& eltsForThisProc=elementsToAdd[i]; + if(!eltsForThisProc.empty()) + { + std::vector::iterator iter1=std::find(data2.begin(),data2.end(),procId); + std::map *toFeed=0; + if(iter1!=data2.end()) + {//to test + int rank=iter1-data2.begin(); + toFeed=&(data1[rank].back()); + } + else + { + iter1=std::lower_bound(data2.begin(),data2.end(),procId); + int rank=iter1-data2.begin(); + data2.insert(iter1,procId); + std::vector< std::map > tmp(data1.front().size()); + data1.insert(data1.begin()+rank,tmp); + toFeed=&(data1[rank].back()); + } + for(std::vector::const_iterator iter2=eltsForThisProc.begin();iter2!=eltsForThisProc.end();iter2++) + (*toFeed)[*iter2]=0.; + } + } + // + nbOfDistProcs=data2.size(); + for(int j=0;j& policyPartial) + { + if(policyPartial.empty()) + return ElementLocator::NO_POST_TREATMENT_POLICY; + int ref=policyPartial[0]; + std::vector::const_iterator iter1=std::find_if(policyPartial.begin(),policyPartial.end(),std::bind2nd(std::not_equal_to(),ref)); + if(iter1!=policyPartial.end()) + { + std::ostringstream msg; msg << "Incompatible policies between lazy procs each other : proc # " << iter1-policyPartial.begin(); + throw INTERP_KERNEL::Exception(msg.str().c_str()); + } + return ref; + } + + /*! + * This method introduce global ids aspects in computed 'rowsPartialSumD'. + * As precondition rowsPartialSumD.size()==policyPartial.size()==globalIdsPartial.size(). Foreach i in [0;rowsPartialSumD.size() ) rowsPartialSumD[i].size()==globalIdsPartial[i].size() + * @param rowsPartialSumD : in parameter, Partial row sum computed for each lazy procs connected with. + * @param rowsPartialSumI : in parameter, Corresponding local ids for each lazy procs connected with. + * @param globalIdsPartial : in parameter, the global numbering, of elements connected with. + * @param globalIdsLazySideInteraction : out parameter, constituted from all global ids of lazy procs connected with. + * @para sumCorresponding : out parameter, relative to 'globalIdsLazySideInteraction' + */ + void InterpolationMatrix::mergeRowSum(const std::vector< std::vector >& rowsPartialSumD, const std::vector< std::vector >& globalIdsPartial, + std::vector& globalIdsLazySideInteraction, std::vector& sumCorresponding) + { + std::map sumToReturn; + int nbLazyProcs=rowsPartialSumD.size(); + for(int i=0;i& rowSumOfP=rowsPartialSumD[i]; + const std::vector& globalIdsOfP=globalIdsPartial[i]; + std::vector::const_iterator iter1=rowSumOfP.begin(); + std::vector::const_iterator iter2=globalIdsOfP.begin(); + for(;iter1!=rowSumOfP.end();iter1++,iter2++) + sumToReturn[*iter2]+=*iter1; + } + // + int lgth=sumToReturn.size(); + globalIdsLazySideInteraction.resize(lgth); + sumCorresponding.resize(lgth); + std::vector::iterator iter3=globalIdsLazySideInteraction.begin(); + std::vector::iterator iter4=sumCorresponding.begin(); + for(std::map::const_iterator iter5=sumToReturn.begin();iter5!=sumToReturn.end();iter5++,iter3++,iter4++) + { + *iter3=(*iter5).first; + *iter4=(*iter5).second; + } + } + + /*! + * This method simply reorganize the result contained in 'sumCorresponding' computed by lazy side into 'rowsPartialSumD' with help of 'globalIdsPartial' and 'globalIdsLazySideInteraction' + * + * @param globalIdsPartial : in parameter, global ids sorted by lazy procs + * @param rowsPartialSumD : in/out parameter, with exactly the same size as 'globalIdsPartial' + * @param globalIdsLazySideInteraction : in parameter that represents ALL the global ids of every lazy procs in interaction + * @param sumCorresponding : in parameter with same size as 'globalIdsLazySideInteraction' that stores the corresponding sum of 'globalIdsLazySideInteraction' + */ + void InterpolationMatrix::mergeRowSum2(const std::vector< std::vector >& globalIdsPartial, std::vector< std::vector >& rowsPartialSumD, + const std::vector& globalIdsLazySideInteraction, const std::vector& sumCorresponding) + { + std::map acc; + std::vector::const_iterator iter1=globalIdsLazySideInteraction.begin(); + std::vector::const_iterator iter2=sumCorresponding.begin(); + for(;iter1!=globalIdsLazySideInteraction.end();iter1++,iter2++) + acc[*iter1]=*iter2; + // + int nbLazyProcs=globalIdsPartial.size(); + for(int i=0;i& tmp1=globalIdsPartial[i]; + std::vector& tmp2=rowsPartialSumD[i]; + std::vector::const_iterator iter3=tmp1.begin(); + std::vector::iterator iter4=tmp2.begin(); + for(;iter3!=tmp1.end();iter3++,iter4++) + *iter4=acc[*iter3]; + } + } + + void InterpolationMatrix::mergeRowSum3(const std::vector< std::vector >& globalIdsPartial, std::vector< std::vector >& rowsPartialSumD) + { + std::map sum; + std::vector< std::vector >::const_iterator iter1=globalIdsPartial.begin(); + std::vector< std::vector >::iterator iter2=rowsPartialSumD.begin(); + for(;iter1!=globalIdsPartial.end();iter1++,iter2++) + { + std::vector::const_iterator iter3=(*iter1).begin(); + std::vector::const_iterator iter4=(*iter2).begin(); + for(;iter3!=(*iter1).end();iter3++,iter4++) + sum[*iter3]+=*iter4; + } + iter2=rowsPartialSumD.begin(); + for(iter1=globalIdsPartial.begin();iter1!=globalIdsPartial.end();iter1++,iter2++) + { + std::vector::const_iterator iter3=(*iter1).begin(); + std::vector::iterator iter4=(*iter2).begin(); + for(;iter3!=(*iter1).end();iter3++,iter4++) + *iter4=sum[*iter3]; + } + } + + /*! + * This method updates this->_coeffs attribute in order to take into account hidden (because having the same global number) similar nodes in _coeffs array. + * If in this->_coeffs two distant element id have the same global id their values will be replaced for each by the sum of the two. + * @param procsInInteraction input parameter : specifies the procId in absolute of distant lazy procs in interaction with + * @param rowsPartialSumI input parameter : local ids of distant lazy procs elements in interaction with + * @param globalIdsPartial input parameter : global ids of distant lazy procs elements in interaction with + */ + void InterpolationMatrix::mergeCoeffs(const std::vector& procsInInteraction, const std::vector< std::vector >& rowsPartialSumI, + const std::vector >& globalIdsPartial, std::vector >& denoStrorageInv) + { + //preparing fast access structures + std::map procT; + int localProcId=0; + for(std::vector::const_iterator iter1=procsInInteraction.begin();iter1!=procsInInteraction.end();iter1++,localProcId++) + procT[*iter1]=localProcId; + int size=procsInInteraction.size(); + std::vector > localToGlobal(size); + for(int i=0;i& myLocalToGlobal=localToGlobal[i]; + const std::vector& locals=rowsPartialSumI[i]; + const std::vector& globals=globalIdsPartial[i]; + std::vector::const_iterator iter3=locals.begin(); + std::vector::const_iterator iter4=globals.begin(); + for(;iter3!=locals.end();iter3++,iter4++) + myLocalToGlobal[*iter3]=*iter4; + } + // + const vector >& mapping=_mapping.getSendingIds(); + std::map globalIdVal; + //accumulate for same global id on lazy part. + for(vector > >::iterator iter1=_coeffs.begin();iter1!=_coeffs.end();iter1++) + for(vector >::iterator iter2=(*iter1).begin();iter2!=(*iter1).end();iter2++) + { + const std::pair& distantLocalLazyId=mapping[(*iter2).first]; + int localLazyProcId=procT[distantLocalLazyId.first]; + int globalDistantLazyId=localToGlobal[localLazyProcId][distantLocalLazyId.second]; + globalIdVal[globalDistantLazyId]+=(*iter2).second; + } + //perform merge + std::vector >::iterator iter3=denoStrorageInv.begin(); + for(vector > >::iterator iter1=_coeffs.begin();iter1!=_coeffs.end();iter1++,iter3++) + { + double val=(*iter3).back(); + (*iter3).resize((*iter1).size()); + std::vector::iterator iter4=(*iter3).begin(); + for(vector >::iterator iter2=(*iter1).begin();iter2!=(*iter1).end();iter2++,iter4++) + { + const std::pair& distantLocalLazyId=mapping[(*iter2).first]; + int localLazyProcId=procT[distantLocalLazyId.first]; + int globalDistantLazyId=localToGlobal[localLazyProcId][distantLocalLazyId.second]; + double newVal=globalIdVal[globalDistantLazyId]; + if((*iter2).second!=0.) + (*iter4)=val*newVal/(*iter2).second; + else + (*iter4)=std::numeric_limits::max(); + (*iter2).second=newVal; + } + } + } + + void InterpolationMatrix::divideByGlobalRowSum(const std::vector& distantProcs, const std::vector >& resPerProcI, + const std::vector >& resPerProcD, std::vector >& deno) + { + map fastSums; + int procId=0; + for(vector::const_iterator iter1=distantProcs.begin();iter1!=distantProcs.end();iter1++,procId++) + { + const std::vector& currentProcI=resPerProcI[procId]; + const std::vector& currentProcD=resPerProcD[procId]; + vector::const_iterator iter3=currentProcD.begin(); + for(vector::const_iterator iter2=currentProcI.begin();iter2!=currentProcI.end();iter2++,iter3++) + fastSums[_col_offsets[std::make_pair(*iter1,*iter2)]]=*iter3; + } + deno.resize(_coeffs.size()); + vector >::iterator iter6=deno.begin(); + for(vector > >::const_iterator iter4=_coeffs.begin();iter4!=_coeffs.end();iter4++,iter6++) + { + (*iter6).resize((*iter4).size()); + vector::iterator iter7=(*iter6).begin(); + for(vector >::const_iterator iter5=(*iter4).begin();iter5!=(*iter4).end();iter5++,iter7++) + *iter7=fastSums[(*iter5).first]; + } + } + + void InterpolationMatrix::computeGlobalColSum(std::vector >& denoStrorage) + { + denoStrorage.resize(_coeffs.size()); + vector >::iterator iter2=denoStrorage.begin(); + for(vector > >::const_iterator iter1=_coeffs.begin();iter1!=_coeffs.end();iter1++,iter2++) + { + (*iter2).resize((*iter1).size()); + double sumOfCurrentRow=0.; + for(vector >::const_iterator iter3=(*iter1).begin();iter3!=(*iter1).end();iter3++) + sumOfCurrentRow+=(*iter3).second; + std::fill((*iter2).begin(),(*iter2).end(),sumOfCurrentRow); + } + } + + void InterpolationMatrix::resizeGlobalColSum(std::vector >& denoStrorage) + { + vector >::iterator iter2=denoStrorage.begin(); + for(vector > >::const_iterator iter1=_coeffs.begin();iter1!=_coeffs.end();iter1++,iter2++) + { + double val=(*iter2).back(); + (*iter2).resize((*iter1).size()); + std::fill((*iter2).begin(),(*iter2).end(),val); + } + } + + // ================================================================== + // The call to this method updates the arrays on the target side + // so that they know which amount of data from which processor they + // should expect. + // That call makes actual interpolations via multiply method + // available. + // ================================================================== + + void InterpolationMatrix::prepare() + { + int nbelems = _source_field->getField()->getNumberOfTuples(); + for (int ielem=0; ielem < nbelems; ielem++) + { + _row_offsets[ielem+1]+=_row_offsets[ielem]; + } + _mapping.prepareSendRecv(); + } + + + // ======================================================================= + // brief performs t=Ws, where t is the target field, s is the source field + + // The call to this method must be called both on the working side + // and on the idle side. On the working side, the vector T=VT^(-1).(W.S) + // is computed and sent. On the idle side, no computation is done, but the + // result from the working side is received and the field is updated. + + // param field source field on processors involved on the source side, + // target field on processors on the target side + // ======================================================================= + + void InterpolationMatrix::multiply(MEDCouplingFieldDouble& field) const + { + int nbcomp = field.getArray()->getNumberOfComponents(); + vector target_value(_col_offsets.size()* nbcomp,0.0); + + //computing the matrix multiply on source side + if (_source_group.containsMyRank()) + { + int nbrows = _coeffs.size(); + + // performing W.S + // W is the intersection matrix + // S is the source vector + + for (int irow=0; irowgetNumberOfTuples() ; + double* value = const_cast (field.getArray()->getPointer()); + for (int i=0; igetNumberOfComponents(); + vector source_value(_col_offsets.size()* nbcomp,0.0); + _mapping.reverseSendRecv(&source_value[0],field); + + //treatment of the transpose matrix multiply on the source side + if (_source_group.containsMyRank()) + { + int nbrows = _coeffs.size(); + double *array = field.getArray()->getPointer() ; + + // Initialization + std::fill(array, array+nbrows*nbcomp, 0.0) ; + + //performing WT.T + //WT is W transpose + //T is the target vector + for (int irow = 0; irow < nbrows; irow++) + { + for (int icol = _row_offsets[irow]; icol < _row_offsets[irow+1]; icol++) + { + int colid = _coeffs[irow][icol-_row_offsets[irow]].first; + double value = _coeffs[irow][icol-_row_offsets[irow]].second; + double deno = _deno_reverse_multiply[irow][icol-_row_offsets[irow]]; + for (int icomp=0; icomp& res) const; + void computeLocalRowSum(const std::vector& distantProcs, std::vector >& resPerProcI, + std::vector >& resPerProcD) const; + void computeGlobalRowSum(ElementLocator& elementLocator, std::vector >& denoStrorage, std::vector >& denoStrorageInv); + void computeGlobalColSum(std::vector >& denoStrorage); + void resizeGlobalColSum(std::vector >& denoStrorage); + void fillDSFromVM(int iproc_distant, const int* distant_elems, const std::vector< std::map >& values, MEDCouplingFieldDouble *surf); + void serializeMe(std::vector< std::vector< std::map > >& data1, std::vector& data2) const; + void initialize(); + void findAdditionnalElements(ElementLocator& elementLocator, std::vector >& elementsToAdd, + const std::vector >& resPerProcI, const std::vector >& globalIdsPartial); + void addGhostElements(const std::vector& distantProcs, const std::vector >& elementsToAdd); + int mergePolicies(const std::vector& policyPartial); + void mergeRowSum(const std::vector< std::vector >& rowsPartialSumD, const std::vector< std::vector >& globalIdsPartial, + std::vector& globalIdsLazySideInteraction, std::vector& sumCorresponding); + void mergeRowSum2(const std::vector< std::vector >& globalIdsPartial, std::vector< std::vector >& rowsPartialSumD, + const std::vector& globalIdsLazySideInteraction, const std::vector& sumCorresponding); + void mergeRowSum3(const std::vector< std::vector >& globalIdsPartial, std::vector< std::vector >& rowsPartialSumD); + void mergeCoeffs(const std::vector& procsInInteraction, const std::vector< std::vector >& rowsPartialSumI, + const std::vector >& globalIdsPartial, std::vector >& denoStrorageInv); + void divideByGlobalRowSum(const std::vector& distantProcs, const std::vector >& resPerProcI, + const std::vector >& resPerProcD, std::vector >& deno); + private: + bool isSurfaceComputationNeeded(const std::string& method) const; + private: + const ParaMEDMEM::ParaFIELD *_source_field; + std::vector _row_offsets; + std::map, int > _col_offsets; + MEDCouplingPointSet *_source_support; + MxN_Mapping _mapping; + + const ProcessorGroup& _source_group; + const ProcessorGroup& _target_group; + std::vector< std::vector > _target_volume; + std::vector > > _coeffs; + std::vector > _deno_multiply; + std::vector > _deno_reverse_multiply; + }; +} + +#endif diff --git a/src/ParaMEDMEM/LinearTimeInterpolator.cxx b/src/ParaMEDMEM/LinearTimeInterpolator.cxx new file mode 100644 index 000000000..79524983e --- /dev/null +++ b/src/ParaMEDMEM/LinearTimeInterpolator.cxx @@ -0,0 +1,54 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "LinearTimeInterpolator.hxx" + +using namespace std; + +namespace ParaMEDMEM +{ + + LinearTimeInterpolator::LinearTimeInterpolator( double InterpPrecision, int nStepBefore, + int nStepAfter ): + TimeInterpolator( InterpPrecision, nStepBefore, nStepAfter ) + { + } + + LinearTimeInterpolator::~LinearTimeInterpolator() + { + } + + void LinearTimeInterpolator::doInterp( double time0, double time1, double time, + int recvcount , int nbuff0, int nbuff1, + int **recvbuff0, int **recvbuff1, int *result ) + { + for(int i = 0 ; i < recvcount ; i++ ) + result[i] = (int) ((recvbuff0[0][i]*(time1 - time) + recvbuff1[0][i]*(time - time0))/(time1 - time0) + _interp_precision); + } + + void LinearTimeInterpolator::doInterp( double time0, double time1, double time, + int recvcount , int nbuff0, int nbuff1, + double **recvbuff0, double **recvbuff1, + double *result ) + { + for(int i = 0 ; i < recvcount ; i++ ) + result[i] = (recvbuff0[0][i]*(time1 - time) + recvbuff1[0][i]*(time - time0))/(time1 - time0); + } + +} diff --git a/src/ParaMEDMEM/LinearTimeInterpolator.hxx b/src/ParaMEDMEM/LinearTimeInterpolator.hxx new file mode 100644 index 000000000..0128e42b2 --- /dev/null +++ b/src/ParaMEDMEM/LinearTimeInterpolator.hxx @@ -0,0 +1,47 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __LINEARTIMEINTERPOLATOR_HXX__ +#define __LINEARTIMEINTERPOLATOR_HXX__ + +#include "TimeInterpolator.hxx" + +#include +#include + +namespace ParaMEDMEM +{ + class DEC; + + class LinearTimeInterpolator : public TimeInterpolator + { + public: + LinearTimeInterpolator( double InterpPrecision=0, int nStepBefore=1, + int nStepAfter=1 ) ; + virtual ~LinearTimeInterpolator(); + void doInterp( double time0, double time1, double time, int recvcount, + int nbuff0, int nbuff1, + int **recvbuff0, int **recvbuff1, int *result ); + void doInterp( double time0, double time1, double time, int recvcount, + int nbuff0, int nbuff1, + double **recvbuff0, double **recvbuff1, double *result ); + }; +} + +#endif diff --git a/src/ParaMEDMEM/MPIAccess.cxx b/src/ParaMEDMEM/MPIAccess.cxx new file mode 100644 index 000000000..2ca867122 --- /dev/null +++ b/src/ParaMEDMEM/MPIAccess.cxx @@ -0,0 +1,1088 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "MPIAccess.hxx" +#include "InterpolationUtils.hxx" + +#include + +using namespace std; + +namespace ParaMEDMEM +{ + /*! \defgroup mpi_access MPIAccess + Class \a MPIAccess is the gateway to the MPI library. + It is a helper class that gathers the calls to the MPI + library that are made in the ParaMEDMEM library. This gathering + allows easier gathering of information about the communication + in the library. With MPIAccess, tags are managed automatically + and asynchronous operations are easier. + + It is typically called after the MPI_Init() call in a program. It is afterwards passed as a parameter to the constructors of ParaMEDMEM objects so that they access the MPI library via the MPIAccess. + + As an example, the following code initializes a processor group made of the zero processor. + + \verbatim + #include "MPIAccess.hxx" + #include "ProcessorGroup.hxx" + + int main(int argc, char** argv) + { + //initialization + MPI_Init(&argc, &argv); + ParaMEDMEM::CommInterface comm_interface; + + //setting up a processor group with proc 0 + set procs; + procs.insert(0); + ParaMEDMEM::ProcessorGroup group(procs, comm_interface); + + ParaMEDMEM::MPIAccess mpi_access(group); + + //cleanup + MPI_Finalize(); + } + \endverbatim + */ + + + /*! Creates a MPIAccess that is based on the processors included in \a ProcessorGroup. + This class may be called for easier use of MPI API. + + \param ProcessorGroup MPIProcessorGroup object giving access to group management + \param BaseTag and MaxTag define the range of tags to be used. + Tags are managed by MPIAccess. They are cyclically incremented. + When there is a Send or a Receive operation there is a new RequestId tag returned + to the caller. That RequestId may be used to manage the operation Wait, Check of + status etc... The MPITag internally managed by MPIAccess is used as "tag" argument + in MPI call. + */ + + MPIAccess::MPIAccess(MPIProcessorGroup * ProcessorGroup, int BaseTag, int MaxTag) : + _comm_interface( ProcessorGroup->getCommInterface() ) , + _intra_communicator( ProcessorGroup->getComm() ) + { + void *v ; + int mpitagub ; + int flag ; + //MPI_Comm_get_attr does not run with _IntraCommunicator ??? + //MPI_Comm_get_attr(*_IntraCommunicator,MPID_TAG_UB,&mpitagub,&flag) ; + MPI_Comm_get_attr(MPI_COMM_WORLD,MPI_TAG_UB,&v,&flag) ; + mpitagub=*(reinterpret_cast(v)); + if ( BaseTag != 0 ) + BaseTag = (BaseTag/MODULO_TAG)*MODULO_TAG ; + if ( MaxTag == 0 ) + MaxTag = (mpitagub/MODULO_TAG-1)*MODULO_TAG ; + MPI_Comm_rank( *_intra_communicator, &_my_rank ) ; + if ( !flag | (BaseTag < 0) | (BaseTag >= MaxTag) | (MaxTag > mpitagub) ) + throw INTERP_KERNEL::Exception("wrong call to MPIAccess constructor"); + + _processor_group = ProcessorGroup ; + _processor_group_size = _processor_group->size() ; + _trace = false ; + + _base_request = -1 ; + _max_request = std::numeric_limits::max() ; + _request = _base_request ; + + _base_MPI_tag = BaseTag ; + _max_MPI_tag = MaxTag ; + + _send_request = new int[ _processor_group_size ] ; + _recv_request = new int[ _processor_group_size ] ; + + _send_requests.resize( _processor_group_size ) ; + _recv_requests.resize( _processor_group_size ) ; + + _send_MPI_tag = new int[ _processor_group_size ] ; + _recv_MPI_Tag = new int[ _processor_group_size ] ; + int i ; + for (i = 0 ; i < _processor_group_size ; i++ ) + { + _send_request[ i ] = _max_request ; + _recv_request[ i ] = _max_request ; + _send_requests[ i ].resize(0) ; + _recv_requests[ i ].resize(0) ; + _send_MPI_tag[ i ] = _max_MPI_tag ; + _recv_MPI_Tag[ i ] = _max_MPI_tag ; + } + MPI_Datatype array_of_types[3] ; + array_of_types[0] = MPI_DOUBLE ; + array_of_types[1] = MPI_DOUBLE ; + array_of_types[2] = MPI_INT ; + int array_of_blocklengths[3] ; + array_of_blocklengths[0] = 1 ; + array_of_blocklengths[1] = 1 ; + array_of_blocklengths[2] = 1 ; + MPI_Aint array_of_displacements[3] ; + array_of_displacements[0] = 0 ; + array_of_displacements[1] = sizeof(double) ; + array_of_displacements[2] = 2*sizeof(double) ; + MPI_Type_struct(3, array_of_blocklengths, array_of_displacements, + array_of_types, &_MPI_TIME) ; + MPI_Type_commit(&_MPI_TIME) ; + } + + MPIAccess::~MPIAccess() + { + delete [] _send_request ; + delete [] _recv_request ; + delete [] _send_MPI_tag ; + delete [] _recv_MPI_Tag ; + MPI_Type_free(&_MPI_TIME) ; + } + + /* + MPIAccess and "RequestIds" : + ============================ + + . WARNING : In the specification document, the distinction + between "MPITags" and "RequestIds" is not clear. "MPITags" + are arguments of calls to MPI. "RequestIds" does not concern + calls to MPI. "RequestIds" are named "tag"as arguments in/out + in the MPIAccess API in the specification documentation. + But in the implementation we have the right name RequestId (or + RecvRequestId/SendRequestId). + + . When we have a MPI write/read request via MPIAccess, we get + an identifier "RequestId". + That identifier matches a structure RequestStruct of + MPIAccess. The access to that structure is done with the map + "_MapOfRequestStruct". + That structure RequestStruct give the possibility to manage + the structures MPI_Request and MPI_Status * of MPI. It give + also the possibility to get informations about that request : + target, send/recv, tag, [a]synchronous, type, outcount. + + . That identifier is used to control an asynchronous request + via MPIAccess : Wait, Test, Probe, etc... + + . In practise "RequestId" is simply an integer fo the interval + [0 , 2**32-1]. There is only one such a cyclic for + [I]Sends and [I]Recvs. + + . That "RequestIds" and their associated structures give an easy + way to manage asynchronous communications. + For example we have mpi_access->Wait( int RequestId ) instead of + MPI_Wait(MPI_Request *request, MPI_Status *status). + + . The API of MPIAccess may give the "SendRequestIds" of a "target", + the "RecvRequestIds" from a "source" or the "SendRequestIds" of + all "targets" or the "RecvRequestIds" of all "sources". + That avoid to manage them in Presentation-ParaMEDMEM. + */ + + int MPIAccess::newRequest( MPI_Datatype datatype, int tag , int destsourcerank , + bool fromsourcerank , bool asynchronous ) + { + RequestStruct *mpiaccessstruct = new RequestStruct; + mpiaccessstruct->MPITag = tag ; + mpiaccessstruct->MPIDatatype = datatype ; + mpiaccessstruct->MPITarget = destsourcerank ; + mpiaccessstruct->MPIIsRecv = fromsourcerank ; + MPI_Status *aStatus = new MPI_Status ; + mpiaccessstruct->MPIStatus = aStatus ; + mpiaccessstruct->MPIAsynchronous = asynchronous ; + mpiaccessstruct->MPICompleted = !asynchronous ; + mpiaccessstruct->MPIOutCount = -1 ; + if ( !asynchronous ) + { + mpiaccessstruct->MPIRequest = MPI_REQUEST_NULL ; + mpiaccessstruct->MPIStatus->MPI_SOURCE = destsourcerank ; + mpiaccessstruct->MPIStatus->MPI_TAG = tag ; + mpiaccessstruct->MPIStatus->MPI_ERROR = MPI_SUCCESS ; + } + if ( _request == _max_request ) + _request = _base_request ; + _request += 1 ; + _map_of_request_struct[_request] = mpiaccessstruct ; + if ( fromsourcerank ) + _recv_request[ destsourcerank ] = _request; + else + _send_request[ destsourcerank ] = _request; + if ( _trace ) + cout << "NewRequest" << _my_rank << "( " << _request << " ) " + << mpiaccessstruct << endl ; + return _request ; + } + + /* + MPIAccess and "tags" (or "MPITags") : + ===================================== + + . The constructor give the possibility to choose an interval of + tags to use : [BaseTag , MaxTag]. + The default is [ 0 , MPI_TAG_UB], MPI_TAG_UB being the maximum + value in an implementation of MPI (minimum 32767 = 2**15-1). + On awa with the implementation lam MPI_TAG_UB value is + 7353944. The norma MPI specify that value is the same in all + processes started by mpirun. + In the case of the use of the same IntraCommunicator in a process + for several distinct data flows (or for several IntraCommunicators + with common processes), that permits to avoid ambibuity + and may help debug. + + . In MPIAccess the tags have two parts (#define MODULO_TAG 10) : + + The last decimal digit decimal correspond to MPI_DataType ( 1 for + TimeMessages, 2 for MPI_INT and 3 for MPI_DOUBLE) + + The value of other digits correspond to a circular numero for each + message. + + A TimeMessage and the associated DataMessage have the same numero + (but the types are different and the tags also). + + . For a Send of a message from a process "source" to a process + "target", we have _send_MPI_tag[target] in the process + source (it contains the last "tag" used for the Send of a pour l'envoi de + message to the process target). + And in the process "target" which receive that message, we have + _recv_MPI_Tag[source] (it contains the last "tag" used for the Recv + of messages from the process source). + Naturally in the MPI norma the values of that tags must be the same. + */ + int MPIAccess::newSendTag( MPI_Datatype datatype, int destrank , int method , + bool asynchronous, int &RequestId ) + { + int tag ; + tag = incrTag( _send_MPI_tag[destrank] ) ; + tag = valTag( tag, method ) ; + _send_MPI_tag[ destrank ] = tag ; + RequestId = newRequest( datatype, tag, destrank , false , asynchronous ) ; + _send_request[ destrank ] = RequestId ; + _send_requests[ destrank ].push_back( RequestId ) ; + return tag ; + } + + int MPIAccess::newRecvTag( MPI_Datatype datatype, int sourcerank , int method , + bool asynchronous, int &RequestId ) + { + int tag ; + tag = incrTag( _recv_MPI_Tag[sourcerank] ) ; + tag = valTag( tag, method ) ; + _recv_MPI_Tag[ sourcerank ] = tag ; + RequestId = newRequest( datatype, tag , sourcerank , true , asynchronous ) ; + _recv_request[ sourcerank ] = RequestId ; + _recv_requests[ sourcerank ].push_back( RequestId ) ; + return tag ; + } + + // Returns the number of all SendRequestIds that may be used to allocate + // ArrayOfSendRequests for the call to SendRequestIds + int MPIAccess::sendRequestIdsSize() + { + int size = 0; + for (int i = 0 ; i < _processor_group_size ; i++ ) + size += _send_requests[ i ].size() ; + return size ; + } + + // Returns in ArrayOfSendRequests with the dimension "size" all the + // SendRequestIds + int MPIAccess::sendRequestIds(int size, int *ArrayOfSendRequests) + { + int destrank ; + int i = 0 ; + for ( destrank = 0 ; destrank < _processor_group_size ; destrank++ ) + { + list< int >::const_iterator iter ; + for (iter = _send_requests[ destrank ].begin() ; iter != _send_requests[destrank].end() ; iter++ ) + ArrayOfSendRequests[i++] = *iter ; + } + return i ; + } + + // Returns the number of all RecvRequestIds that may be used to allocate + // ArrayOfRecvRequests for the call to RecvRequestIds + int MPIAccess::recvRequestIdsSize() + { + int size = 0 ; + for (int i = 0 ; i < _processor_group_size ; i++ ) + size += _recv_requests[ i ].size() ; + return size ; + } + + // Returns in ArrayOfRecvRequests with the dimension "size" all the + // RecvRequestIds + int MPIAccess::recvRequestIds(int size, int *ArrayOfRecvRequests) + { + int sourcerank ; + int i = 0 ; + for ( sourcerank = 0 ; sourcerank < _processor_group_size ; sourcerank++ ) + { + list< int >::const_iterator iter ; + for (iter = _recv_requests[ sourcerank ].begin() ; iter != _recv_requests[sourcerank].end() ; iter++ ) + ArrayOfRecvRequests[i++] = *iter ; + } + return i ; + } + + // Returns in ArrayOfSendRequests with the dimension "size" all the + // SendRequestIds to a destination rank + int MPIAccess::sendRequestIds(int destrank, int size, int *ArrayOfSendRequests) + { + if (size < (int)_send_requests[destrank].size() ) + throw INTERP_KERNEL::Exception("wrong call to MPIAccess::SendRequestIds"); + int i = 0 ; + list< int >::const_iterator iter ; + for (iter = _send_requests[ destrank ].begin() ; iter != _send_requests[destrank].end() ; iter++ ) + ArrayOfSendRequests[i++] = *iter ; + return _send_requests[destrank].size() ; + } + + // Returns in ArrayOfRecvRequests with the dimension "size" all the + // RecvRequestIds from a sourcerank + int MPIAccess::recvRequestIds(int sourcerank, int size, int *ArrayOfRecvRequests) + { + if (size < (int)_recv_requests[sourcerank].size() ) + throw INTERP_KERNEL::Exception("wrong call to MPIAccess::RecvRequestIds"); + int i = 0 ; + list< int >::const_iterator iter ; + _recv_requests[ sourcerank ] ; + for (iter = _recv_requests[ sourcerank ].begin() ; iter != _recv_requests[sourcerank].end() ; iter++ ) + ArrayOfRecvRequests[i++] = *iter ; + return _recv_requests[sourcerank].size() ; + } + + // Send in synchronous mode count values of type datatype from buffer to target + // (returns RequestId identifier even if the corresponding structure is deleted : + // it is only in order to have the same signature as the asynchronous mode) + int MPIAccess::send(void* buffer, int count, MPI_Datatype datatype, int target, int &RequestId) + { + int sts = MPI_SUCCESS ; + RequestId = -1 ; + if ( count ) + { + _MessageIdent aMethodIdent = methodId( datatype ) ; + int MPItag = newSendTag( datatype, target , aMethodIdent , false , RequestId ) ; + if ( aMethodIdent == _message_time ) + { + TimeMessage *aTimeMsg = (TimeMessage *) buffer ; + aTimeMsg->tag = MPItag ; + } + deleteRequest( RequestId ) ; + sts = _comm_interface.send(buffer, count, datatype, target, MPItag, + *_intra_communicator ) ; + if ( _trace ) + cout << "MPIAccess::Send" << _my_rank << " SendRequestId " + << RequestId << " count " << count << " target " << target + << " MPItag " << MPItag << endl ; + } + return sts ; + } + + // Receive (read) in synchronous mode count values of type datatype in buffer from source + // (returns RequestId identifier even if the corresponding structure is deleted : + // it is only in order to have the same signature as the asynchronous mode) + // The output argument OutCount is optionnal : *OutCount <= count + int MPIAccess::recv(void* buffer, int count, MPI_Datatype datatype, int source, int &RequestId, int *OutCount) + { + int sts = MPI_SUCCESS ; + RequestId = -1 ; + if ( OutCount != NULL ) + *OutCount = -1 ; + if ( count ) + { + _MessageIdent aMethodIdent = methodId( datatype ) ; + int MPItag = newRecvTag( datatype, source , aMethodIdent , false , RequestId ) ; + sts = _comm_interface.recv(buffer, count, datatype, source, MPItag, + *_intra_communicator , MPIStatus( RequestId ) ) ; + int outcount = 0 ; + if ( sts == MPI_SUCCESS ) + { + MPI_Datatype datatype = MPIDatatype( RequestId ) ; + _comm_interface.getCount(MPIStatus( RequestId ), datatype, &outcount ) ; + setMPIOutCount( RequestId , outcount ) ; + setMPICompleted( RequestId , true ) ; + deleteStatus( RequestId ) ; + } + if ( OutCount != NULL ) + *OutCount = outcount ; + if ( _trace ) + cout << "MPIAccess::Recv" << _my_rank << " RecvRequestId " + << RequestId << " count " << count << " source " << source + << " MPItag " << MPItag << endl ; + deleteRequest( RequestId ) ; + } + return sts ; + } + + // Send in asynchronous mode count values of type datatype from buffer to target + // Returns RequestId identifier. + int MPIAccess::ISend(void* buffer, int count, MPI_Datatype datatype, int target, int &RequestId) + { + int sts = MPI_SUCCESS ; + RequestId = -1 ; + if ( count ) + { + _MessageIdent aMethodIdent = methodId( datatype ) ; + int MPItag = newSendTag( datatype, target , aMethodIdent , true , RequestId ) ; + if ( aMethodIdent == _message_time ) + { + TimeMessage *aTimeMsg = (TimeMessage *) buffer ; + aTimeMsg->tag = MPItag ; + } + MPI_Request *aSendRequest = MPIRequest( RequestId ) ; + if ( _trace ) + { + cout << "MPIAccess::ISend" << _my_rank << " ISendRequestId " + << RequestId << " count " << count << " target " << target + << " MPItag " << MPItag << endl ; + if ( MPItag == 1 ) + cout << "MPIAccess::ISend" << _my_rank << " time " + << ((TimeMessage *)buffer)->time << " " << ((TimeMessage *)buffer)->deltatime + << endl ; + } + sts = _comm_interface.Isend(buffer, count, datatype, target, MPItag, + *_intra_communicator , aSendRequest) ; + } + return sts ; + } + + // Receive (read) in asynchronous mode count values of type datatype in buffer from source + // returns RequestId identifier. + int MPIAccess::IRecv(void* buffer, int count, MPI_Datatype datatype, int source, int &RequestId) + { + int sts = MPI_SUCCESS ; + RequestId = -1 ; + if ( count ) + { + _MessageIdent aMethodIdent = methodId( datatype ) ; + int MPItag = newRecvTag( datatype, source , aMethodIdent , true , RequestId ) ; + MPI_Request *aRecvRequest = MPIRequest( RequestId ) ; + if ( _trace ) + { + cout << "MPIAccess::IRecv" << _my_rank << " IRecvRequestId " + << RequestId << " count " << count << " source " << source + << " MPItag " << MPItag << endl ; + if ( MPItag == 1 ) + cout << "MPIAccess::ISend" << _my_rank << " time " + << ((TimeMessage *)buffer)->time << " " << ((TimeMessage *)buffer)->deltatime + << endl ; + } + sts = _comm_interface.Irecv(buffer, count, datatype, source, MPItag, + *_intra_communicator , aRecvRequest) ; + } + return sts ; + } + + // Perform a Send and a Recv in synchronous mode + int MPIAccess::sendRecv(void* sendbuf, int sendcount, MPI_Datatype sendtype, + int dest, int &SendRequestId, + void* recvbuf, int recvcount, MPI_Datatype recvtype, + int source, int &RecvRequestId, int *OutCount) + { + int sts = MPI_SUCCESS ; + SendRequestId = -1 ; + RecvRequestId = -1 ; + if ( recvcount ) + sts = IRecv(recvbuf, recvcount, recvtype, source, RecvRequestId) ; + int outcount = -1 ; + if ( _trace ) + cout << "MPIAccess::SendRecv" << _my_rank << " IRecv RecvRequestId " + << RecvRequestId << endl ; + if ( sts == MPI_SUCCESS ) + { + if ( sendcount ) + sts = send(sendbuf, sendcount, sendtype, dest, SendRequestId) ; + if ( _trace ) + cout << "MPIAccess::SendRecv" << _my_rank << " Send SendRequestId " + << SendRequestId << endl ; + if ( sts == MPI_SUCCESS && recvcount ) + { + sts = wait( RecvRequestId ) ; + outcount = MPIOutCount( RecvRequestId ) ; + if ( _trace ) + cout << "MPIAccess::SendRecv" << _my_rank << " IRecv RecvRequestId " + << RecvRequestId << " outcount " << outcount << endl ; + } + } + if ( OutCount != NULL ) + { + *OutCount = outcount ; + if ( _trace ) + cout << "MPIAccess::SendRecv" << _my_rank << " *OutCount = " << *OutCount + << endl ; + } + deleteRequest( RecvRequestId ) ; + return sts ; + } + + // Perform a Send and a Recv in asynchronous mode + int MPIAccess::ISendRecv(void* sendbuf, int sendcount, MPI_Datatype sendtype, + int dest, int &SendRequestId, + void* recvbuf, int recvcount, MPI_Datatype recvtype, + int source, int &RecvRequestId) + { + int sts = MPI_SUCCESS ; + SendRequestId = -1 ; + RecvRequestId = -1 ; + if ( recvcount ) + sts = IRecv(recvbuf, recvcount, recvtype, source, RecvRequestId) ; + if ( sts == MPI_SUCCESS ) + if ( sendcount ) + sts = ISend(sendbuf, sendcount, sendtype, dest, SendRequestId) ; + return sts ; + } + + // Perform a wait of a Send or Recv asynchronous Request + // Do nothing for a synchronous Request + // Manage MPI_Request * and MPI_Status * structure + int MPIAccess::wait( int RequestId ) + { + int status = MPI_SUCCESS ; + if ( !MPICompleted( RequestId ) ) + { + if ( *MPIRequest( RequestId ) != MPI_REQUEST_NULL ) + { + if ( _trace ) + cout << "MPIAccess::Wait" << _my_rank << " -> wait( " << RequestId + << " ) MPIRequest " << MPIRequest( RequestId ) << " MPIStatus " + << MPIStatus( RequestId ) << " MPITag " << MPITag( RequestId ) + << " MPIIsRecv " << MPIIsRecv( RequestId ) << endl ; + status = _comm_interface.wait(MPIRequest( RequestId ), MPIStatus( RequestId )) ; + } + else + { + if ( _trace ) + cout << "MPIAccess::Wait" << _my_rank << " MPIRequest == MPI_REQUEST_NULL" + << endl ; + } + setMPICompleted( RequestId , true ) ; + if ( MPIIsRecv( RequestId ) && MPIStatus( RequestId ) ) + { + MPI_Datatype datatype = MPIDatatype( RequestId ) ; + int outcount ; + status = _comm_interface.getCount(MPIStatus( RequestId ), datatype, + &outcount ) ; + if ( status == MPI_SUCCESS ) + { + setMPIOutCount( RequestId , outcount ) ; + deleteStatus( RequestId ) ; + if ( _trace ) + cout << "MPIAccess::Wait" << _my_rank << " RequestId " << RequestId + << "MPIIsRecv " << MPIIsRecv( RequestId ) << " outcount " << outcount + << endl ; + } + else + { + if ( _trace ) + cout << "MPIAccess::Wait" << _my_rank << " MPIIsRecv " + << MPIIsRecv( RequestId ) << " outcount " << outcount << endl ; + } + } + else + { + if ( _trace ) + cout << "MPIAccess::Wait" << _my_rank << " MPIIsRecv " << MPIIsRecv( RequestId ) + << " MPIOutCount " << MPIOutCount( RequestId ) << endl ; + } + } + if ( _trace ) + cout << "MPIAccess::Wait" << _my_rank << " RequestId " << RequestId + << " Request " << MPIRequest( RequestId ) + << " Status " << MPIStatus( RequestId ) << " MPICompleted " + << MPICompleted( RequestId ) << " MPIOutCount " << MPIOutCount( RequestId ) + << endl ; + return status ; + } + + // Perform a "test" of a Send or Recv asynchronous Request + // If the request is done, returns true in the flag argument + // If the request is not finished, returns false in the flag argument + // Do nothing for a synchronous Request + // Manage MPI_request * and MPI_status * structure + int MPIAccess::test(int RequestId, int &flag) + { + int status = MPI_SUCCESS ; + flag = MPICompleted( RequestId ) ; + if ( _trace ) + cout << "MPIAccess::Test" << _my_rank << " flag " << flag ; + if ( MPIIsRecv( RequestId ) ) + { + if ( _trace ) + cout << " Recv" ; + } + else + { + if ( _trace ) + cout << " Send" ; + } + if( _trace ) + cout << "Request" << RequestId << " " << MPIRequest( RequestId ) + << " Status " << MPIStatus( RequestId ) << endl ; + if ( !flag ) + { + if ( *MPIRequest( RequestId ) != MPI_REQUEST_NULL ) + { + if ( _trace ) + cout << "MPIAccess::Test" << _my_rank << " -> test( " << RequestId + << " ) MPIRequest " << MPIRequest( RequestId ) + << " MPIStatus " << MPIStatus( RequestId ) + << " MPITag " << MPITag( RequestId ) + << " MPIIsRecv " << MPIIsRecv( RequestId ) << endl ; + status = _comm_interface.test(MPIRequest( RequestId ), &flag, + MPIStatus( RequestId )) ; + } + else + { + if ( _trace ) + cout << "MPIAccess::Test" << _my_rank << " MPIRequest == MPI_REQUEST_NULL" + << endl ; + } + if ( flag ) + { + setMPICompleted( RequestId , true ) ; + if ( MPIIsRecv( RequestId ) && MPIStatus( RequestId ) ) + { + int outcount ; + MPI_Datatype datatype = MPIDatatype( RequestId ) ; + status = _comm_interface.getCount( MPIStatus( RequestId ), datatype, + &outcount ) ; + if ( status == MPI_SUCCESS ) + { + setMPIOutCount( RequestId , outcount ) ; + deleteStatus( RequestId ) ; + if ( _trace ) + cout << "MPIAccess::Test" << _my_rank << " MPIIsRecv " + << MPIIsRecv( RequestId ) << " outcount " << outcount << endl ; + } + else + { + if ( _trace ) + cout << "MPIAccess::Test" << _my_rank << " MPIIsRecv " + << MPIIsRecv( RequestId ) << " outcount " << outcount << endl ; + } + } + else + { + if ( _trace ) + cout << "MPIAccess::Test" << _my_rank << " MPIIsRecv " + << MPIIsRecv( RequestId ) << " MPIOutCount " + << MPIOutCount( RequestId ) << endl ; + } + } + } + if ( _trace ) + cout << "MPIAccess::Test" << _my_rank << " RequestId " << RequestId + << " flag " << flag << " MPICompleted " << MPICompleted( RequestId ) + << " MPIOutCount " << MPIOutCount( RequestId ) << endl ; + return status ; + } + + int MPIAccess::waitAny(int count, int *array_of_RequestIds, int &RequestId) + { + int status = MPI_ERR_OTHER ; + RequestId = -1 ; + cout << "MPIAccess::WaitAny not yet implemented" << endl ; + return status ; + } + + int MPIAccess::testAny(int count, int *array_of_RequestIds, int &RequestId, int &flag) + { + int status = MPI_ERR_OTHER ; + RequestId = -1 ; + flag = 0 ; + cout << "MPIAccess::TestAny not yet implemented" << endl ; + return status ; + } + + // Perform a wait of each Send or Recv asynchronous Request of the array + // array_of_RequestIds of size "count". + // That array may be filled with a call to SendRequestIdsSize or RecvRequestIdsSize + // Do nothing for a synchronous Request + // Manage MPI_Request * and MPI_Status * structure + int MPIAccess::waitAll(int count, int *array_of_RequestIds) + { + if ( _trace ) + cout << "WaitAll" << _my_rank << " : count " << count << endl ; + int status ; + int retstatus = MPI_SUCCESS ; + int i ; + for ( i = 0 ; i < count ; i++ ) + { + if ( _trace ) + cout << "WaitAll" << _my_rank << " " << i << " -> Wait( " + << array_of_RequestIds[i] << " )" << endl ; + status = wait( array_of_RequestIds[i] ) ; + if ( status != MPI_SUCCESS ) + retstatus = status ; + } + if ( _trace ) + cout << "EndWaitAll" << _my_rank << endl ; + return retstatus ; + } + + // Perform a "test" of each Send or Recv asynchronous Request of the array + // array_of_RequestIds of size "count". + // That array may be filled with a call to SendRequestIdsSize or RecvRequestIdsSize + // If all requests are done, returns true in the flag argument + // If all requests are not finished, returns false in the flag argument + // Do nothing for a synchronous Request + // Manage MPI_Request * and MPI_Status * structure + int MPIAccess::testAll(int count, int *array_of_RequestIds, int &flag) + { + if ( _trace ) + cout << "TestAll" << _my_rank << " : count " << count << endl ; + int status ; + int retstatus = MPI_SUCCESS ; + bool retflag = true ; + int i ; + for ( i = 0 ; i < count ; i++ ) + { + status = test( array_of_RequestIds[i] , flag ) ; + retflag = retflag && (flag != 0) ; + if ( status != MPI_SUCCESS ) + retstatus = status ; + } + flag = retflag ; + if ( _trace ) + cout << "EndTestAll" << _my_rank << endl ; + return retstatus ; + } + + int MPIAccess::waitSome(int count, int *array_of_RequestIds, int outcount, + int *outarray_of_RequestIds) + { + int status = MPI_ERR_OTHER ; + cout << "MPIAccess::WaitSome not yet implemented" << endl ; + return status ; + } + + int MPIAccess::testSome(int count, int *array_of_RequestIds, int outcounts, + int *outarray_of_RequestIds) + { + int status = MPI_ERR_OTHER ; + cout << "MPIAccess::TestSome not yet implemented" << endl ; + return status ; + } + + // Probe checks if a message is available for read from FromSource rank. + // Returns the corresponding source, MPITag, datatype and outcount + // Probe is a blocking call which wait until a message is available + int MPIAccess::probe(int FromSource, int &source, int &MPITag, + MPI_Datatype &myDatatype, int &outcount) + { + MPI_Status aMPIStatus ; + int sts = _comm_interface.probe( FromSource, MPI_ANY_TAG, + *_intra_communicator , &aMPIStatus ) ; + if ( sts == MPI_SUCCESS ) + { + source = aMPIStatus.MPI_SOURCE ; + MPITag = aMPIStatus.MPI_TAG ; + int MethodId = (MPITag % MODULO_TAG) ; + myDatatype = datatype( (ParaMEDMEM::_MessageIdent) MethodId ) ; + _comm_interface.getCount(&aMPIStatus, myDatatype, &outcount ) ; + if ( _trace ) + cout << "MPIAccess::Probe" << _my_rank << " FromSource " << FromSource + << " source " << source << " MPITag " << MPITag << " MethodId " + << MethodId << " datatype " << myDatatype << " outcount " << outcount + << endl ; + } + else + { + source = -1 ; + MPITag = -1 ; + myDatatype = 0 ; + outcount = -1 ; + } + return sts ; + } + + // IProbe checks if a message is available for read from FromSource rank. + // If there is a message available, returns the corresponding source, + // MPITag, datatype and outcount with flag = true + // If not, returns flag = false + int MPIAccess::IProbe(int FromSource, int &source, int &MPITag, + MPI_Datatype &myDataType, int &outcount, int &flag) + { + MPI_Status aMPIStatus ; + int sts = _comm_interface.Iprobe( FromSource, MPI_ANY_TAG, + *_intra_communicator , &flag, + &aMPIStatus ) ; + if ( sts == MPI_SUCCESS && flag ) + { + source = aMPIStatus.MPI_SOURCE ; + MPITag = aMPIStatus.MPI_TAG ; + int MethodId = (MPITag % MODULO_TAG) ; + myDataType = datatype( (ParaMEDMEM::_MessageIdent) MethodId ) ; + _comm_interface.getCount(&aMPIStatus, myDataType, &outcount ) ; + if ( _trace ) + cout << "MPIAccess::IProbe" << _my_rank << " FromSource " << FromSource + << " source " << source << " MPITag " << MPITag << " MethodId " + << MethodId << " datatype " << myDataType << " outcount " << outcount + << " flag " << flag << endl ; + } + else + { + source = -1 ; + MPITag = -1 ; + myDataType = 0 ; + outcount = -1 ; + } + return sts ; + } + + // Cancel concerns a "posted" asynchronous IRecv + // Returns flag = true if the receiving request was successfully canceled + // Returns flag = false if the receiving request was finished but not canceled + // Use cancel, wait and test_cancelled of the MPI API + int MPIAccess::cancel( int RecvRequestId, int &flag ) + { + flag = 0 ; + int sts = _comm_interface.cancel( MPIRequest( RecvRequestId ) ) ; + if ( sts == MPI_SUCCESS ) + { + sts = _comm_interface.wait( MPIRequest( RecvRequestId ) , + MPIStatus( RecvRequestId ) ) ; + if ( sts == MPI_SUCCESS ) + sts = _comm_interface.testCancelled( MPIStatus( RecvRequestId ) , &flag ) ; + } + return sts ; + } + + // Cancel concerns a "pending" receiving message (without IRecv "posted") + // Returns flag = true if the message was successfully canceled + // Returns flag = false if the receiving request was finished but not canceled + // Use Irecv, cancel, wait and test_cancelled of the MPI API + int MPIAccess::cancel( int source, int theMPITag, MPI_Datatype datatype, int outcount, int &flag ) + { + int sts ; + MPI_Aint extent ; + flag = 0 ; + sts = MPI_Type_extent( datatype , &extent ) ; + if ( sts == MPI_SUCCESS ) + { + void * recvbuf = malloc( extent*outcount ) ; + MPI_Request aRecvRequest ; + if ( _trace ) + cout << "MPIAccess::Cancel" << _my_rank << " Irecv extent " << extent + << " datatype " << datatype << " source " << source << " theMPITag " + << theMPITag << endl ; + sts = _comm_interface.Irecv( recvbuf, outcount, datatype, source, theMPITag, + *_intra_communicator , &aRecvRequest ) ; + if ( sts == MPI_SUCCESS ) + { + sts = _comm_interface.cancel( &aRecvRequest ) ; + if ( _trace ) + cout << "MPIAccess::Cancel" << _my_rank << " theMPITag " << theMPITag + << " cancel done" << endl ; + if ( sts == MPI_SUCCESS ) + { + MPI_Status aStatus ; + if ( _trace ) + cout << "MPIAccess::Cancel" << _my_rank << " wait" << endl ; + sts = _comm_interface.wait( &aRecvRequest , &aStatus ) ; + if ( sts == MPI_SUCCESS ) + { + if ( _trace ) + cout << "MPIAccess::Cancel" << _my_rank << " test_cancelled" << endl ; + sts = _comm_interface.testCancelled( &aStatus , &flag ) ; + } + } + } + if ( _trace && datatype == timeType() ) + cout << "MPIAccess::Cancel" << _my_rank << " time " + << ((TimeMessage *) recvbuf)->time << " " + << ((TimeMessage *) recvbuf)->deltatime << endl ; + free( recvbuf ) ; + } + if ( _trace ) + cout << "MPIAccess::Cancel" << _my_rank << " flag " << flag << endl ; + return sts ; + } + + + // CancelAll concerns all "pending" receiving message (without IRecv "posted") + // CancelAll use IProbe and Cancel (see obove) + int MPIAccess::cancelAll() + { + int sts = MPI_SUCCESS ; + int target ; + int source ; + int MPITag ; + MPI_Datatype datatype ; + int outcount ; + int flag ; + for ( target = 0 ; target < _processor_group_size ; target++ ) + { + sts = IProbe(target, source, MPITag, datatype, outcount, flag) ; + if ( sts == MPI_SUCCESS && flag ) + { + sts = cancel(source, MPITag, datatype, outcount, flag) ; + if ( _trace ) + cout << "MPIAccess::CancelAll" << _my_rank << " source " << source + << " MPITag " << MPITag << " datatype " << datatype + << " outcount " << outcount << " Cancel flag " << flag << endl ; + if ( sts != MPI_SUCCESS ) + break ; + } + else if ( sts != MPI_SUCCESS ) + break ; + } + return sts ; + } + + // Same as barrier of MPI API + int MPIAccess::barrier() + { + int status = _comm_interface.barrier( *_intra_communicator ) ; + return status ; + } + + // Same as Error_string of MPI API + int MPIAccess::errorString(int errorcode, char *string, int *resultlen) const + { + return _comm_interface.errorString( errorcode, string, resultlen) ; + } + + // Returns source, tag, error and outcount corresponding to receiving RequestId + // By default the corresponding structure of RequestId is deleted + int MPIAccess::status(int RequestId, int &source, int &tag, int &error, + int &outcount, bool keepRequestStruct) + { + MPI_Status *myStatus = MPIStatus( RequestId ) ; + if ( _trace ) + cout << "MPIAccess::status" << _my_rank << " RequestId " << RequestId + << " status " << myStatus << endl ; + if ( myStatus != NULL && MPIAsynchronous( RequestId ) && + MPICompleted( RequestId ) ) + { + if ( MPIIsRecv( RequestId ) ) + { + source = myStatus->MPI_SOURCE ; + tag = myStatus->MPI_TAG ; + error = myStatus->MPI_ERROR ; + MPI_Datatype datatype = MPIDatatype( RequestId ) ; + _comm_interface.getCount(myStatus, datatype, &outcount ) ; + if ( _trace ) + cout << "MPIAccess::status" << _my_rank << " RequestId " << RequestId + << " status " << myStatus << " outcount " << outcount << endl ; + setMPIOutCount( RequestId , outcount ) ; + } + else + { + source = MPITarget( RequestId ) ; + tag = MPITag( RequestId ) ; + error = 0 ; + outcount = MPIOutCount( RequestId ) ; + } + if ( !keepRequestStruct ) + deleteRequest( RequestId ) ; + return MPI_SUCCESS ; + } + else + { + source = MPITarget( RequestId ) ; + tag = MPITag( RequestId ) ; + error = 0 ; + outcount = MPIOutCount( RequestId ) ; + } + return MPI_SUCCESS ; + } + + int MPIAccess::requestFree( MPI_Request *request ) + { + return _comm_interface.requestFree( request ) ; + } + + // Print all informations of all known requests for debugging purpose + void MPIAccess::check() const + { + int i = 0 ; + map< int , RequestStruct * >::const_iterator MapOfRequestStructiterator ; + cout << "MPIAccess::Check" << _my_rank << "_map_of_request_struct_size " + << _map_of_request_struct.size() << endl ; + for ( MapOfRequestStructiterator = _map_of_request_struct.begin() ; + MapOfRequestStructiterator != _map_of_request_struct.end() ; + MapOfRequestStructiterator++ ) + { + if ( MapOfRequestStructiterator->second != NULL ) + { + cout << " Check" << _my_rank << " " << i << ". Request" + << MapOfRequestStructiterator->first << "-->" ; + if ( (MapOfRequestStructiterator->second)->MPIAsynchronous ) + cout << "I" ; + if ( (MapOfRequestStructiterator->second)->MPIIsRecv ) + cout << "Recv from " ; + else + cout << "Send to " ; + cout << (MapOfRequestStructiterator->second)->MPITarget + << " MPITag " << (MapOfRequestStructiterator->second)->MPITag + << " DataType " << (MapOfRequestStructiterator->second)->MPIDatatype + << " Request " << (MapOfRequestStructiterator->second)->MPIRequest + << " Status " << (MapOfRequestStructiterator->second)->MPIStatus + << " Completed " << (MapOfRequestStructiterator->second)->MPICompleted + << endl ; + } + i++ ; + } + } + + // Returns the MPI size of a TimeMessage + MPI_Aint MPIAccess::timeExtent() const + { + MPI_Aint aextent ; + MPI_Type_extent( _MPI_TIME , &aextent ) ; + return aextent ; + } + + // Returns the MPI size of a MPI_INT + MPI_Aint MPIAccess::intExtent() const + { + MPI_Aint aextent ; + MPI_Type_extent( MPI_INT , &aextent ) ; + return aextent ; + } + + // Returns the MPI size of a MPI_DOUBLE + MPI_Aint MPIAccess::doubleExtent() const + { + MPI_Aint aextent ; + MPI_Type_extent( MPI_DOUBLE , &aextent ) ; + return aextent ; + } + + // Outputs fields of a TimeMessage structure + ostream & operator<< (ostream & f ,const TimeMessage & aTimeMsg ) + { + f << " time " << aTimeMsg.time << " deltatime " << aTimeMsg.deltatime + << " tag " << aTimeMsg.tag ; + return f; + } + + // Outputs the DataType coded in a Tag + ostream & operator<< (ostream & f ,const _MessageIdent & methodtype ) + { + switch (methodtype) + { + case _message_time : + f << " MethodTime "; + break; + case _message_int : + f << " MPI_INT "; + break; + case _message_double : + f << " MPI_DOUBLE "; + break; + default : + f << " UnknownMethodType "; + break; + } + return f; + } +} diff --git a/src/ParaMEDMEM/MPIAccess.hxx b/src/ParaMEDMEM/MPIAccess.hxx new file mode 100644 index 000000000..d438c8cec --- /dev/null +++ b/src/ParaMEDMEM/MPIAccess.hxx @@ -0,0 +1,471 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __MPIACCESS_HXX__ +#define __MPIACCESS_HXX__ + +#include "CommInterface.hxx" +#include "ProcessorGroup.hxx" +#include "MPIProcessorGroup.hxx" + +#include +#include +#include +#include + +namespace ParaMEDMEM +{ + typedef struct + { + double time ; + double deltatime ; + int tag ; + } TimeMessage; + + static MPI_Request mpirequestnull = MPI_REQUEST_NULL ; + enum _MessageIdent { _message_unknown, _message_time, _message_int, _message_double } ; + + class MPIAccess + { + private: + struct RequestStruct + { + int MPITarget ; + bool MPIIsRecv ; + int MPITag ; + bool MPIAsynchronous ; + bool MPICompleted ; + MPI_Datatype MPIDatatype ; + MPI_Request MPIRequest ; + MPI_Status *MPIStatus ; + int MPIOutCount ; + }; + public: + MPIAccess(MPIProcessorGroup * ProcessorGroup, int BaseTag=0, int MaxTag=0) ; + virtual ~MPIAccess() ; + + void trace( bool trace = true ) ; + + void deleteRequest( int RequestId ) ; + void deleteRequests(int size , int *ArrayOfSendRequests ) ; + + int sendMPITag(int destrank) ; + int recvMPITag(int sourcerank) ; + + int sendRequestIdsSize() ; + int sendRequestIds(int size, int *ArrayOfSendRequests) ; + int recvRequestIdsSize() ; + int recvRequestIds(int size, int *ArrayOfRecvRequests) ; + + int sendRequestIdsSize(int destrank) ; + int sendRequestIds(int destrank, int size, int *ArrayOfSendRequests) ; + int recvRequestIdsSize(int sourcerank) ; + int recvRequestIds(int sourcerank, int size, int *ArrayOfRecvRequests) ; + + int send(void* buffer, int count, MPI_Datatype datatype, int target, + int &RequestId) ; + int ISend(void* buffer, int count, MPI_Datatype datatype, int target, + int &RequestId) ; + int recv(void* buffer, int count, MPI_Datatype datatype, int source, + int &RequestId, int *OutCount=NULL) ; + int IRecv(void* buffer, int count, MPI_Datatype datatype, int source, + int &RequestId) ; + int sendRecv(void* sendbuf, int sendcount, MPI_Datatype sendtype, int dest, + int &SendRequestId, void* recvbuf, int recvcount, + MPI_Datatype recvtype, int source, + int &RecvRequestId, int *OutCount=NULL) ; + int ISendRecv(void* sendbuf, int sendcount, MPI_Datatype sendtype, int dest, + int &SendRequestId, void* recvbuf, int recvcount, + MPI_Datatype recvtype, int source, int &RecvRequestId) ; + + int wait(int RequestId) ; + int test(int RequestId, int &flag) ; + int waitAny(int count, int *array_of_RequestIds, int &RequestId) ; + int testAny(int count, int *array_of_RequestIds, int &RequestId, int &flag) ; + int waitAll(int count, int *array_of_RequestIds) ; + int testAll(int count, int *array_of_RequestIds, int &flag) ; + int waitSome(int count, int *array_of_RequestIds, int outcount, + int *outarray_of_RequestIds) ; + int testSome(int count, int *array_of_RequestIds, int outcounts, + int *outarray_of_RequestIds) ; + int probe(int FromSource, int &source, int &MPITag, MPI_Datatype &datatype, + int &outcount) ; + int IProbe(int FromSource, int &source, int &MPITag, MPI_Datatype &datatype, + int &outcount, int &flag) ; + int cancel( int RecvRequestId, int &flag ) ; + int cancel( int source, int MPITag, MPI_Datatype datatype, int outcount, + int &flag ) ; + int cancelAll() ; + int barrier() ; + int errorString(int errorcode, char *string, int *resultlen) const ; + int status(int RequestId, int &source, int &tag, int &error, int &outcount, + bool keepRequestStruct=false) ; + int requestFree( MPI_Request *request ) ; + + void check() const ; + + MPI_Datatype timeType() const ; + bool isTimeMessage( int MPITag ) const ; + MPI_Aint timeExtent() const ; + MPI_Aint intExtent() const ; + MPI_Aint doubleExtent() const ; + MPI_Aint extent( MPI_Datatype datatype ) const ; + + int MPITag( int RequestId ) ; + int MPITarget( int RequestId ) ; + bool MPIIsRecv( int RequestId ) ; + bool MPIAsynchronous( int RequestId ) ; + bool MPICompleted( int RequestId ) ; + MPI_Datatype MPIDatatype( int RequestId ) ; + int MPIOutCount( int RequestId ) ; + + private: + int newRequest( MPI_Datatype datatype, int tag , int destsourcerank , + bool fromsourcerank , bool asynchronous ) ; + int newSendTag( MPI_Datatype datatype, int destrank , int method , + bool asynchronous, int &RequestId ) ; + int newRecvTag( MPI_Datatype datatype, int sourcerank , int method , + bool asynchronous, int &RequestId ) ; + int incrTag( int prevtag ) ; + int valTag( int tag, int method ) ; + + void deleteSendRecvRequest( int RequestId ) ; + + void deleteStatus( int RequestId ) ; + + MPI_Request *MPIRequest( int RequestId ) ; + MPI_Status *MPIStatus( int RequestId ) ; + void setMPICompleted( int RequestId , bool completed ) ; + void setMPIOutCount( int RequestId , int outcount ) ; + void clearMPIStatus( int RequestId ) ; + + _MessageIdent methodId( MPI_Datatype datatype ) const ; + MPI_Datatype datatype( _MessageIdent aMethodIdent ) const ; + private: + const CommInterface &_comm_interface ; + const MPI_Comm* _intra_communicator ; + MPIProcessorGroup * _processor_group ; + int _processor_group_size ; + int _my_rank ; + bool _trace ; + int _base_request ; + int _max_request ; + int _request ; + int * _send_request ; + int * _recv_request ; + std::vector< std::list< int > > _send_requests ; + std::vector< std::list< int > > _recv_requests ; + int _base_MPI_tag ; + int _max_MPI_tag ; + int * _send_MPI_tag ; + int * _recv_MPI_Tag ; + MPI_Datatype _MPI_TIME ; + static const int MODULO_TAG=10; + std::map< int , RequestStruct * > _map_of_request_struct ; + + }; + + inline void MPIAccess::trace( bool atrace ) + { + _trace = atrace ; + } + + // Delete the structure Request corresponding to RequestId identifier after + // the deletion of the structures MPI_Request * and MPI_Status * + // remove it from _MapOfRequestStruct (erase) + inline void MPIAccess::deleteRequest( int RequestId ) + { + struct RequestStruct *aRequestStruct = _map_of_request_struct[ RequestId ] ; + if ( aRequestStruct ) + { + if ( _trace ) + std::cout << "MPIAccess::DeleteRequest" << _my_rank << "( " << RequestId << " ) " + << aRequestStruct << " MPIRequest " << aRequestStruct->MPIRequest + << " MPIIsRecv " << aRequestStruct->MPIIsRecv << std::endl ; + if ( _map_of_request_struct[RequestId]->MPIRequest != MPI_REQUEST_NULL ) + requestFree( &_map_of_request_struct[RequestId]->MPIRequest ) ; + deleteSendRecvRequest( RequestId ) ; + deleteStatus( RequestId ) ; + _map_of_request_struct.erase( RequestId ) ; + delete aRequestStruct ; + } + else + { + if ( _trace ) + std::cout << "MPIAccess::DeleteRequest" << _my_rank << "( " << RequestId + << " ) Request not found" << std::endl ; + } + } + + // Delete all requests of the array ArrayOfSendRequests + inline void MPIAccess::deleteRequests(int size , int *ArrayOfSendRequests ) + { + for (int i = 0 ; i < size ; i++ ) + deleteRequest( ArrayOfSendRequests[i] ) ; + } + + // Returns the last MPITag of the destination rank destrank + inline int MPIAccess::sendMPITag(int destrank) + { + return _send_MPI_tag[destrank] ; + } + + // Returns the last MPITag of the source rank sourcerank + inline int MPIAccess::recvMPITag(int sourcerank) + { + return _recv_MPI_Tag[sourcerank] ; + } + + // Returns the number of all SendRequestIds matching a destination rank. It may be + // used to allocate ArrayOfSendRequests for the call to SendRequestIds + inline int MPIAccess::sendRequestIdsSize(int destrank) + { + return _send_requests[destrank].size() ; + } + + // Returns the number of all RecvRequestIds matching a source rank. It may be + // used to allocate ArrayOfRecvRequests for the call to RecvRequestIds + inline int MPIAccess::recvRequestIdsSize(int sourcerank) + { + return _recv_requests[sourcerank].size() ; + } + + // Returns the MPI_Datatype (registered in MPI in the constructor with + // MPI_Type_struct and MPI_Type_commit) for TimeMessages + inline MPI_Datatype MPIAccess::timeType() const + { + return _MPI_TIME ; + } + + // Returns true if the tag MPITag corresponds to a TimeMessage + inline bool MPIAccess::isTimeMessage( int aMPITag ) const + { + return ((aMPITag%MODULO_TAG) == _message_time) ; + } + + // Returns the MPI size of the MPI_Datatype datatype + inline MPI_Aint MPIAccess::extent( MPI_Datatype adatatype ) const + { + if ( adatatype == _MPI_TIME ) + return timeExtent() ; + if ( adatatype == MPI_INT ) + return intExtent() ; + if ( adatatype == MPI_DOUBLE ) + return doubleExtent() ; + return 0 ; + } + + // Returns the MPITag of the request corresponding to RequestId identifier + inline int MPIAccess::MPITag( int RequestId ) + { + struct RequestStruct *aRequestStruct = _map_of_request_struct[ RequestId ] ; + if ( aRequestStruct ) + return aRequestStruct->MPITag ; + return -1 ; + } + + // Returns the MPITarget of the request corresponding to RequestId identifier + inline int MPIAccess::MPITarget( int RequestId ) + { + struct RequestStruct *aRequestStruct = _map_of_request_struct[ RequestId ] ; + if ( aRequestStruct ) + return aRequestStruct->MPITarget ; + return -1 ; + } + + // Returns true if the request corresponding to RequestId identifier was [I]Recv + inline bool MPIAccess::MPIIsRecv( int RequestId ) + { + struct RequestStruct *aRequestStruct = _map_of_request_struct[ RequestId ] ; + if ( aRequestStruct ) + return aRequestStruct->MPIIsRecv ; + return false ; + } + + // Returns true if the request corresponding to RequestId identifier was asynchronous + inline bool MPIAccess::MPIAsynchronous( int RequestId ) + { + struct RequestStruct *aRequestStruct = _map_of_request_struct[ RequestId ] ; + if ( aRequestStruct ) + return aRequestStruct->MPIAsynchronous ; + return false ; + } + + // Returns true if the request corresponding to RequestId identifier was completed + inline bool MPIAccess::MPICompleted( int RequestId ) + { + struct RequestStruct *aRequestStruct = _map_of_request_struct[ RequestId ] ; + if ( aRequestStruct ) + return aRequestStruct->MPICompleted; + return true ; + } + + // Returns the MPI_datatype of the request corresponding to RequestId identifier + inline MPI_Datatype MPIAccess::MPIDatatype( int RequestId ) + { + struct RequestStruct *aRequestStruct = _map_of_request_struct[ RequestId ] ; + if ( aRequestStruct ) + return aRequestStruct->MPIDatatype; + return MPI_DATATYPE_NULL; + } + + // Returns the size of the receiving message of the request corresponding to + // RequestId identifier + inline int MPIAccess::MPIOutCount( int RequestId ) + { + struct RequestStruct *aRequestStruct = _map_of_request_struct[ RequestId ] ; + if ( aRequestStruct ) + return aRequestStruct->MPIOutCount; + return 0 ; + } + + // Increments the previous tag value (cyclically) + // Look at MPIAccess::NewSendTag/NewRecvTag in MPIAccess.cxx + inline int MPIAccess::incrTag( int prevtag ) + { + int tag; + if ( (prevtag % MODULO_TAG) == _message_time ) + tag = ((prevtag/MODULO_TAG)*MODULO_TAG); + else + tag = ((prevtag/MODULO_TAG + 1)*MODULO_TAG); + if ( tag > _max_MPI_tag ) + tag = _base_MPI_tag ; + return tag ; + } + + // Returns the MPITag with the method-type field + // Look at MPIAccess::NewSendTag/NewRecvTag in MPIAccess.cxx + inline int MPIAccess::valTag( int tag, int method ) + { + return ((tag/MODULO_TAG)*MODULO_TAG) + method; + } + + // Remove a Request identifier from the list _RecvRequests/_SendRequests for + // the corresponding target. + inline void MPIAccess::deleteSendRecvRequest( int RequestId ) + { + if ( _trace ) + std::cout << "MPIAccess::DeleteSendRecvRequest" << _my_rank + << "( " << RequestId << " ) " << std::endl ; + if ( MPIIsRecv( RequestId ) ) + _recv_requests[ MPITarget( RequestId ) ].remove( RequestId ); + else + _send_requests[ MPITarget( RequestId ) ].remove( RequestId ); + } + + // Delete the MPI structure MPI_status * of a ReaquestId + inline void MPIAccess::deleteStatus( int RequestId ) + { + if ( _map_of_request_struct[RequestId]->MPIStatus != NULL ) + { + delete _map_of_request_struct[RequestId]->MPIStatus ; + clearMPIStatus( RequestId ) ; + } + } + + // Returns the MPI structure MPI_request * of a RequestId + inline MPI_Request * MPIAccess::MPIRequest( int RequestId ) + { + struct RequestStruct *aRequestStruct = _map_of_request_struct[ RequestId ] ; + if ( aRequestStruct ) + return &aRequestStruct->MPIRequest; + return &mpirequestnull ; + } + + // Returns the MPI structure MPI_status * of a RequestId + inline MPI_Status * MPIAccess::MPIStatus( int RequestId ) + { + struct RequestStruct *aRequestStruct = _map_of_request_struct[ RequestId ]; + if ( aRequestStruct ) + return aRequestStruct->MPIStatus; + return NULL ; + } + + // Set the MPICompleted field of the structure Request corresponding to RequestId + // identifier with the value completed + inline void MPIAccess::setMPICompleted( int RequestId , bool completed ) + { + struct RequestStruct *aRequestStruct = _map_of_request_struct[ RequestId ] ; + if ( aRequestStruct ) + aRequestStruct->MPICompleted = completed; + } + + // Set the MPIOutCount field of the structure Request corresponding to RequestId + // identifier with the value outcount + inline void MPIAccess::setMPIOutCount( int RequestId , int outcount ) + { + struct RequestStruct *aRequestStruct = _map_of_request_struct[ RequestId ] ; + if ( aRequestStruct ) + aRequestStruct->MPIOutCount = outcount; + } + + // Nullify the MPIStatusfield of the structure Request corresponding to RequestId + // identifier + inline void MPIAccess::clearMPIStatus( int RequestId ) + { + struct RequestStruct *aRequestStruct = _map_of_request_struct[ RequestId ] ; + if ( aRequestStruct ) + aRequestStruct->MPIStatus = NULL ; + } + + // Returns the _MessageIdent enum value corresponding to the MPI_Datatype datatype + // Look at MPIAccess::NewSendTag/NewRecvTag in MPIAccess.cxx + inline _MessageIdent MPIAccess::methodId( MPI_Datatype adatatype ) const + { + _MessageIdent aMethodIdent ; + if ( adatatype == _MPI_TIME ) + aMethodIdent = _message_time; + else if ( adatatype == MPI_INT ) + aMethodIdent = _message_int ; + else if ( adatatype == MPI_DOUBLE ) + aMethodIdent = _message_double ; + else + aMethodIdent = _message_unknown ; + return aMethodIdent ; + } + + // Returns the MPI_Datatype corresponding to the _MessageIdent enum aMethodIdent + inline MPI_Datatype MPIAccess::datatype( _MessageIdent aMethodIdent ) const + { + MPI_Datatype aDataType ; + switch( aMethodIdent ) + { + case _message_time : + aDataType = _MPI_TIME ; + break ; + case _message_int : + aDataType = MPI_INT ; + break ; + case _message_double : + aDataType = MPI_DOUBLE ; + break ; + default : + aDataType = (MPI_Datatype) -1 ; + break ; + } + return aDataType ; + } + + std::ostream & operator<< (std::ostream &,const _MessageIdent &); + + std::ostream & operator<< (std::ostream &,const TimeMessage &); + +} + +#endif diff --git a/src/ParaMEDMEM/MPIAccessDEC.cxx b/src/ParaMEDMEM/MPIAccessDEC.cxx new file mode 100644 index 000000000..942dc79d8 --- /dev/null +++ b/src/ParaMEDMEM/MPIAccessDEC.cxx @@ -0,0 +1,1054 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "MPIAccessDEC.hxx" + +#include + +using namespace std; + +namespace ParaMEDMEM +{ + + /*! + This constructor creates an MPIAccessDEC which has \a source_group as a working side + and \a target_group as an idle side. + The constructor must be called synchronously on all processors of both processor groups. + + \param source_group working side ProcessorGroup + \param target_group lazy side ProcessorGroup + \param Asynchronous Communication mode (default asynchronous) + \param nStepBefore Number of Time step needed for the interpolation before current time + \param nStepAfter Number of Time step needed for the interpolation after current time + + */ + + MPIAccessDEC::MPIAccessDEC( const ProcessorGroup& source_group, + const ProcessorGroup& target_group, + bool Asynchronous ) + { + + ProcessorGroup * union_group = source_group.fuse(target_group) ; + int i ; + std::set procs; + for ( i = 0 ; i < union_group->size() ; i++ ) + { + procs.insert(i) ; + } + MPIProcessorGroup *mpilg = static_cast(const_cast(&source_group)); + _MPI_union_group = new ParaMEDMEM::MPIProcessorGroup( union_group->getCommInterface(),procs,mpilg->getWorldComm()); + delete union_group ; + _my_rank = _MPI_union_group->myRank() ; + _group_size = _MPI_union_group->size() ; + _MPI_access = new MPIAccess( _MPI_union_group ) ; + _asynchronous = Asynchronous ; + _time_messages = new vector< vector< TimeMessage > > ; + _time_messages->resize( _group_size ) ; + _out_of_time = new vector< bool > ; + _out_of_time->resize( _group_size ) ; + _data_messages_recv_count = new vector< int > ; + _data_messages_recv_count->resize( _group_size ) ; + for ( i = 0 ; i < _group_size ; i++ ) + { + (*_out_of_time)[i] = false ; + (*_data_messages_recv_count)[i] = 0 ; + } + _data_messages_type = new vector< MPI_Datatype > ; + _data_messages_type->resize( _group_size ) ; + _data_messages = new vector< vector< void * > > ; + _data_messages->resize( _group_size ) ; + _time_interpolator = NULL ; + _map_of_send_buffers = new map< int , SendBuffStruct * > ; + } + + MPIAccessDEC::~MPIAccessDEC() + { + checkFinalSent() ; + checkFinalRecv() ; + delete _MPI_union_group ; + delete _MPI_access ; + if ( _time_interpolator ) + delete _time_interpolator ; + if ( _time_messages ) + delete _time_messages ; + if ( _out_of_time ) + delete _out_of_time ; + if ( _data_messages_recv_count ) + delete _data_messages_recv_count ; + if ( _data_messages_type ) + delete _data_messages_type ; + if ( _data_messages ) + delete _data_messages ; + if ( _map_of_send_buffers ) + delete _map_of_send_buffers ; + } + + void MPIAccessDEC::setTimeInterpolator( TimeInterpolationMethod aTimeInterp , + double InterpPrecision, int nStepBefore, + int nStepAfter ) + { + if ( _time_interpolator ) + delete _time_interpolator ; + switch ( aTimeInterp ) + { + case WithoutTimeInterp : + _time_interpolator = NULL ; + _n_step_before = 0 ; + _n_step_after = 0 ; + break ; + case LinearTimeInterp : + _time_interpolator = new LinearTimeInterpolator( InterpPrecision , nStepBefore , + nStepAfter ) ; + _n_step_before = nStepBefore ; + _n_step_after = nStepAfter ; + int i ; + for ( i = 0 ; i < _group_size ; i++ ) + { + (*_time_messages)[ i ].resize( _n_step_before + _n_step_after ) ; + (*_data_messages)[ i ].resize( _n_step_before + _n_step_after ) ; + int j ; + for ( j = 0 ; j < _n_step_before + _n_step_after ; j++ ) + { + (*_time_messages)[ i ][ j ].time = -1 ; + (*_time_messages)[ i ][ j ].deltatime = -1 ; + (*_data_messages)[ i ][ j ] = NULL ; + } + } + break ; + } + } + + /*! + Send sendcount datas from sendbuf[offset] with type sendtype to target of IntraCommunicator + (Internal Protected method) + + Returns the request identifier SendRequestId + + */ + int MPIAccessDEC::send( void* sendbuf, int sendcount , int offset , + MPI_Datatype sendtype , int target , int &SendRequestId ) + { + int sts ; + if ( _asynchronous ) + { + if ( sendtype == MPI_INT ) + { + sts = _MPI_access->ISend( &((int *) sendbuf)[offset] , sendcount , sendtype , + target , SendRequestId ) ; + } + else + { + sts = _MPI_access->ISend( &((double *) sendbuf)[offset] , sendcount , sendtype , + target , SendRequestId ) ; + } + } + else + { + if ( sendtype == MPI_INT ) + { + sts = _MPI_access->send( &((int *) sendbuf)[offset] , sendcount , sendtype , + target , SendRequestId ) ; + } + else + { + sts = _MPI_access->send( &((double *) sendbuf)[offset] , sendcount , sendtype , + target , SendRequestId ) ; + } + } + return sts ; + } + + /*! + Receive recvcount datas to recvbuf[offset] with type recvtype from target of IntraCommunicator + (Internal Protected method) + + Returns the request identifier RecvRequestId + + */ + int MPIAccessDEC::recv( void* recvbuf, int recvcount , int offset , + MPI_Datatype recvtype , int target , int &RecvRequestId ) + { + int sts ; + if ( _asynchronous ) + { + if ( recvtype == MPI_INT ) + { + sts = _MPI_access->IRecv( &((int *) recvbuf)[offset] , recvcount , recvtype , + target , RecvRequestId ) ; + } + else + { + sts = _MPI_access->IRecv( &((double *) recvbuf)[offset] , recvcount , recvtype , + target , RecvRequestId ) ; + } + } + else + { + if ( recvtype == MPI_INT ) + { + sts = _MPI_access->recv( &((int *) recvbuf)[offset] , recvcount , recvtype , + target , RecvRequestId ) ; + } + else + { + sts = _MPI_access->recv( &((double *) recvbuf)[offset] , recvcount , recvtype , + target , RecvRequestId ) ; + } + } + return sts ; + } + + /*! + Send sendcount datas from sendbuf[offset] with type sendtype to target of IntraCommunicator + Receive recvcount datas to recvbuf[offset] with type recvtype from target of IntraCommunicator + (Internal Protected method) + + Returns the request identifier SendRequestId + Returns the request identifier RecvRequestId + + */ + int MPIAccessDEC::sendRecv( void* sendbuf, int sendcount , int sendoffset , + MPI_Datatype sendtype , + void* recvbuf, int recvcount , int recvoffset , + MPI_Datatype recvtype , int target , + int &SendRequestId , int &RecvRequestId ) + { + int sts ; + if ( _asynchronous ) + { + if ( sendtype == MPI_INT ) + { + if ( recvtype == MPI_INT ) + { + sts = _MPI_access->ISendRecv( &((int *) sendbuf)[sendoffset] , sendcount , + sendtype , target , SendRequestId , + &((int *) recvbuf)[recvoffset] , recvcount , + recvtype , target , RecvRequestId ) ; + } + else + { + sts = _MPI_access->ISendRecv( &((int *) sendbuf)[sendoffset] , sendcount , + sendtype , target , SendRequestId , + &((double *) recvbuf)[recvoffset] , + recvcount , recvtype , target , RecvRequestId ) ; + } + } + else + { + if ( recvtype == MPI_INT ) + { + sts = _MPI_access->ISendRecv( &((double *) sendbuf)[sendoffset] , sendcount , + sendtype , target , SendRequestId , + &((int *) recvbuf)[recvoffset] , + recvcount , recvtype , target , RecvRequestId ) ; + } + else + { + sts = _MPI_access->ISendRecv( &((double *) sendbuf)[sendoffset] , sendcount , + sendtype , target , SendRequestId , + &((double *) recvbuf)[recvoffset] , + recvcount , recvtype , target , RecvRequestId ) ; + } + } + } + else + { + if ( sendtype == MPI_INT ) + { + if ( recvtype == MPI_INT ) + { + sts = _MPI_access->sendRecv( &((int *) sendbuf)[sendoffset] , sendcount , + sendtype , target , SendRequestId , + &((int *) recvbuf)[recvoffset] , recvcount , + recvtype , target , RecvRequestId ) ; + } + else + { + sts = _MPI_access->sendRecv( &((int *) sendbuf)[sendoffset] , sendcount , + sendtype , target , SendRequestId , + &((double *) recvbuf)[recvoffset] , + recvcount , recvtype , target , RecvRequestId ) ; + } + } + else + { + if ( recvtype == MPI_INT ) + { + sts = _MPI_access->sendRecv( &((double *) sendbuf)[sendoffset] , sendcount , + sendtype , target , SendRequestId , + &((int *) recvbuf)[recvoffset] , + recvcount , recvtype , target , RecvRequestId ) ; + } + else + { + sts = _MPI_access->sendRecv( &((double *) sendbuf)[sendoffset] , sendcount , + sendtype , target , SendRequestId , + &((double *) recvbuf)[recvoffset] , + recvcount , recvtype , target , RecvRequestId ) ; + } + } + } + return sts ; + } + + /*! + Send sendcount datas from sendbuf[offset] with type sendtype to all targets of IntraCommunicator + Receive recvcount datas to recvbuf[offset] with type recvtype from all targets of IntraCommunicator + + */ + int MPIAccessDEC::allToAll( void* sendbuf, int sendcount, MPI_Datatype sendtype , + void* recvbuf, int recvcount, MPI_Datatype recvtype ) + { + if ( _time_interpolator ) + { + return allToAllTime( sendbuf, sendcount, sendtype , recvbuf, recvcount, recvtype ) ; + } + int sts ; + int target ; + int sendoffset = 0 ; + int recvoffset = 0 ; + int SendRequestId ; + int RecvRequestId ; + + //Free of SendBuffers + if ( _asynchronous ) + checkSent() ; + + //DoSend + DoRecv : SendRecv + SendBuffStruct * aSendDataStruct = NULL ; + if ( _asynchronous && sendbuf ) + { + aSendDataStruct = new SendBuffStruct ; + aSendDataStruct->SendBuffer = sendbuf ; + aSendDataStruct->Counter = 0 ; + aSendDataStruct->DataType = sendtype ; + } + for ( target = 0 ; target < _group_size ; target++ ) + { + sts = sendRecv( sendbuf , sendcount , sendoffset , sendtype , + recvbuf , recvcount , recvoffset , recvtype , + target , SendRequestId , RecvRequestId ) ; + if ( _asynchronous && sendbuf && sendcount ) + { + aSendDataStruct->Counter += 1 ; + (*_map_of_send_buffers)[ SendRequestId ] = aSendDataStruct ; + } + sendoffset += sendcount ; + recvoffset += recvcount ; + } + if ( !_asynchronous && sendbuf ) + { + if ( sendtype == MPI_INT ) + { + delete [] (int *) sendbuf ; + } + else + { + delete [] (double *) sendbuf ; + } + } + return sts ; + } + + /*! + Send sendcounts[target] datas from sendbuf[sdispls[target]] with type sendtype to all targets of IntraCommunicator + Receive recvcounts[target] datas to recvbuf[rdispls[target]] with type recvtype from all targets of IntraCommunicator + + */ + int MPIAccessDEC::allToAllv( void* sendbuf, int* sendcounts, int* sdispls, + MPI_Datatype sendtype , + void* recvbuf, int* recvcounts, int* rdispls, + MPI_Datatype recvtype ) + { + if ( _time_interpolator ) + { + return allToAllvTime( sendbuf, sendcounts, sdispls, sendtype , + recvbuf, recvcounts, rdispls, recvtype ) ; + } + int sts ; + int target ; + int SendRequestId ; + int RecvRequestId ; + + //Free of SendBuffers + if ( _asynchronous ) + { + checkSent() ; + } + + //DoSend + DoRecv : SendRecv + SendBuffStruct * aSendDataStruct = NULL ; + if ( _asynchronous && sendbuf ) + { + aSendDataStruct = new SendBuffStruct ; + aSendDataStruct->SendBuffer = sendbuf ; + aSendDataStruct->Counter = 0 ; + aSendDataStruct->DataType = sendtype ; + } + for ( target = 0 ; target < _group_size ; target++ ) + { + if ( sendcounts[target] || recvcounts[target] ) + { + sts = sendRecv( sendbuf , sendcounts[target] , sdispls[target] , sendtype , + recvbuf , recvcounts[target] , rdispls[target] , recvtype , + target , SendRequestId , RecvRequestId ) ; + if ( _asynchronous && sendbuf && sendcounts[target]) + { + aSendDataStruct->Counter += 1 ; + (*_map_of_send_buffers)[ SendRequestId ] = aSendDataStruct ; + } + } + } + if ( !_asynchronous && sendbuf ) + { + if ( sendtype == MPI_INT ) + { + delete [] (int *) sendbuf ; + } + else + { + delete [] (double *) sendbuf ; + } + } + return sts ; + } + + /* + MPIAccessDEC and the management of SendBuffers : + ================================================= + + . In the collective communications collectives we send only parts of + the same buffer to each "target". So in asynchronous mode it is + necessary that all parts are free before to delete/free the + buffer. + + . We assume that buffers are allocated with a new double[]. so a + delete [] is done. + + . The structure SendBuffStruct permit to keep the adress of the buffer + and to manage a reference counter of that buffer. It contains + also MPI_Datatype for the delete [] (double *) ... when the counter + is null. + + . The map _MapOfSendBuffers etablish the correspondance between each + RequestId given by a MPI_Access->ISend(...) and a SendBuffStruct + for each "target" of a part of the buffer. + + . All that concerns only asynchronous Send. In synchronous mode, + we delete senbuf just after the Send. + */ + + /* + MPIAccessDEC and the management of RecvBuffers : + ================================================= + + If there is no interpolation, no special action is done. + + With interpolation for each target : + ------------------------------------ + . We have _time_messages[target] which is a vector of TimesMessages. + We have 2 TimesMessages in our case with a linear interpolation. + They contain the previous time(t0)/deltatime and the last + time(t1)/deltatime. + + . We have _data_messages[target] which is a vector of DatasMessages. + We have 2 DatasMessages in our case with a linear interpolation. + They contain the previous datas at time(t0)/deltatime and at last + time(t1)/deltatime. + + . At time _t(t*) of current processus we do the interpolation of + the values of the 2 DatasMessages which are returned in the part of + recvbuf corresponding to the target with t0 < t* <= t1. + + . Because of the difference of "deltatimes" between processes, we + may have t0 < t1 < t* and there is an extrapolation. + + . The vectors _out_of_time, _DataMessagesRecvCount and _DataMessagesType + contain for each target true if t* > last t1, recvcount and + MPI_Datatype for the finalize of messages at the end. + */ + + /*! + Send a TimeMessage to all targets of IntraCommunicator + Receive the TimeMessages from targets of IntraCommunicator if necessary. + + Send sendcount datas from sendbuf[offset] with type sendtype to all targets of IntraCommunicator + Returns recvcount datas to recvbuf[offset] with type recvtype after an interpolation + with datas received from all targets of IntraCommunicator. + + */ + int MPIAccessDEC::allToAllTime( void* sendbuf, int sendcount , MPI_Datatype sendtype , + void* recvbuf, int recvcount , MPI_Datatype recvtype ) + { + int sts ; + int target ; + int sendoffset = 0 ; + int SendTimeRequestId ; + int SendDataRequestId ; + + if ( _time_interpolator == NULL ) + { + return MPI_ERR_OTHER ; + } + + //Free of SendBuffers + if ( _asynchronous ) + { + checkSent() ; + } + + //DoSend : Time + SendBuff + SendBuffStruct * aSendTimeStruct = NULL ; + SendBuffStruct * aSendDataStruct = NULL ; + if ( sendbuf && sendcount ) + { + TimeMessage * aSendTimeMessage = new TimeMessage ; + if ( _asynchronous ) + { + aSendTimeStruct = new SendBuffStruct ; + aSendTimeStruct->SendBuffer = aSendTimeMessage ; + aSendTimeStruct->Counter = 0 ; + aSendTimeStruct->DataType = _MPI_access->timeType() ; + aSendDataStruct = new SendBuffStruct ; + aSendDataStruct->SendBuffer = sendbuf ; + aSendDataStruct->Counter = 0 ; + aSendDataStruct->DataType = sendtype ; + } + aSendTimeMessage->time = _t ; + aSendTimeMessage->deltatime = _dt ; + for ( target = 0 ; target < _group_size ; target++ ) + { + sts = send( aSendTimeMessage , 1 , 0 , _MPI_access->timeType() , target , + SendTimeRequestId ) ; + sts = send( sendbuf , sendcount , sendoffset , sendtype , target , SendDataRequestId ) ; + if ( _asynchronous ) + { + aSendTimeStruct->Counter += 1 ; + (*_map_of_send_buffers)[ SendTimeRequestId ] = aSendTimeStruct ; + aSendDataStruct->Counter += 1 ; + (*_map_of_send_buffers)[ SendDataRequestId ] = aSendDataStruct ; + } + sendoffset += sendcount ; + } + if ( !_asynchronous ) + { + delete aSendTimeMessage ; + if ( sendtype == MPI_INT ) + { + delete [] (int *) sendbuf ; + } + else + { + delete [] (double *) sendbuf ; + } + } + } + + //CheckTime + DoRecv + DoInterp + if ( recvbuf && recvcount ) + { + for ( target = 0 ; target < _group_size ; target++ ) + { + int recvsize = recvcount*_MPI_access->extent( recvtype ) ; + checkTime( recvcount , recvtype , target , false ) ; + //=========================================================================== + //TODO : it is assumed actually that we have only 1 timestep before nad after + //=========================================================================== + if ( _time_interpolator && (*_time_messages)[target][0].time != -1 ) + { + if ( (*_out_of_time)[target] ) + { + cout << " =====================================================" << endl + << "Recv" << _my_rank << " <-- target " << target << " t0 " + << (*_time_messages)[target][0].time << " < t1 " + << (*_time_messages)[target][1].time << " < t* " << _t << endl + << " =====================================================" << endl ; + } + if ( recvtype == MPI_INT ) + { + _time_interpolator->doInterp( (*_time_messages)[target][0].time, + (*_time_messages)[target][1].time, _t, recvcount , + _n_step_before, _n_step_after, + (int **) &(*_data_messages)[target][0], + (int **) &(*_data_messages)[target][1], + &((int *)recvbuf)[target*recvcount] ) ; + } + else + { + _time_interpolator->doInterp( (*_time_messages)[target][0].time, + (*_time_messages)[target][1].time, _t, recvcount , + _n_step_before, _n_step_after, + (double **) &(*_data_messages)[target][0], + (double **) &(*_data_messages)[target][1], + &((double *)recvbuf)[target*recvcount] ) ; + } + } + else + { + char * buffdest = (char *) recvbuf ; + char * buffsrc = (char *) (*_data_messages)[target][1] ; + memcpy( &buffdest[target*recvsize] , buffsrc , recvsize ) ; + } + } + } + + return sts ; + } + + int MPIAccessDEC::allToAllvTime( void* sendbuf, int* sendcounts, int* sdispls, + MPI_Datatype sendtype , + void* recvbuf, int* recvcounts, int* rdispls, + MPI_Datatype recvtype ) + { + int sts ; + int target ; + int SendTimeRequestId ; + int SendDataRequestId ; + + if ( _time_interpolator == NULL ) + { + return MPI_ERR_OTHER ; + } + + //Free of SendBuffers + if ( _asynchronous ) + { + checkSent() ; + } + + /* + . DoSend : + + We create a TimeMessage (look at that structure in MPI_Access). + + If we are in asynchronous mode, we create two structures SendBuffStruct + aSendTimeStruct and aSendDataStruct that we fill. + + We fill the structure aSendTimeMessage with time/deltatime of + the current process. "deltatime" must be nul if it is the last step of + Time. + + After that for each "target", we Send the TimeMessage and the part + of sendbuf corresponding to that target. + + If we are in asynchronous mode, we increment the counter and we add + aSendTimeStruct and aSendDataStruct to _MapOfSendBuffers with the + identifiers SendTimeRequestId and SendDataRequestId returned by + MPI_Access->Send(...). + + And if we are in synchronous mode we delete the SendMessages. + */ + //DoSend : Time + SendBuff + SendBuffStruct * aSendTimeStruct = NULL ; + SendBuffStruct * aSendDataStruct = NULL ; + if ( sendbuf ) + { + TimeMessage * aSendTimeMessage = new TimeMessage ; + if ( _asynchronous ) + { + aSendTimeStruct = new SendBuffStruct ; + aSendTimeStruct->SendBuffer = aSendTimeMessage ; + aSendTimeStruct->Counter = 0 ; + aSendTimeStruct->DataType = _MPI_access->timeType() ; + aSendDataStruct = new SendBuffStruct ; + aSendDataStruct->SendBuffer = sendbuf ; + aSendDataStruct->Counter = 0 ; + aSendDataStruct->DataType = sendtype ; + } + aSendTimeMessage->time = _t ; + aSendTimeMessage->deltatime = _dt ; + for ( target = 0 ; target < _group_size ; target++ ) + { + if ( sendcounts[target] ) + { + sts = send( aSendTimeMessage , 1 , 0 , _MPI_access->timeType() , target , + SendTimeRequestId ) ; + sts = send( sendbuf , sendcounts[target] , sdispls[target] , sendtype , target , + SendDataRequestId ) ; + if ( _asynchronous ) + { + aSendTimeStruct->Counter += 1 ; + (*_map_of_send_buffers)[ SendTimeRequestId ] = aSendTimeStruct ; + aSendDataStruct->Counter += 1 ; + (*_map_of_send_buffers)[ SendDataRequestId ] = aSendDataStruct ; + } + } + } + if ( !_asynchronous ) + { + delete aSendTimeMessage ; + if ( sendtype == MPI_INT ) + { + delete [] (int *) sendbuf ; + } + else + { + delete [] (double *) sendbuf ; + } + } + } + + /* + . CheckTime + DoRecv + DoInterp + + For each target we call CheckTime + + If there is a TimeInterpolator and if the TimeMessage of the target + is not the first, we call the interpolator which return its + results in the part of the recv buffer corresponding to the "target". + + If not, there is a copy of received datas for that first step of time + in the part of the recv buffer corresponding to the "target". + */ + //CheckTime + DoRecv + DoInterp + if ( recvbuf ) + { + for ( target = 0 ; target < _group_size ; target++ ) + { + if ( recvcounts[target] ) + { + int recvsize = recvcounts[target]*_MPI_access->extent( recvtype ) ; + checkTime( recvcounts[target] , recvtype , target , false ) ; + //=========================================================================== + //TODO : it is assumed actually that we have only 1 timestep before nad after + //=========================================================================== + if ( _time_interpolator && (*_time_messages)[target][0].time != -1 ) + { + if ( (*_out_of_time)[target] ) + { + cout << " =====================================================" << endl + << "Recv" << _my_rank << " <-- target " << target << " t0 " + << (*_time_messages)[target][0].time << " < t1 " + << (*_time_messages)[target][1].time << " < t* " << _t << endl + << " =====================================================" << endl ; + } + if ( recvtype == MPI_INT ) + { + _time_interpolator->doInterp( (*_time_messages)[target][0].time, + (*_time_messages)[target][1].time, _t, + recvcounts[target] , _n_step_before, _n_step_after, + (int **) &(*_data_messages)[target][0], + (int **) &(*_data_messages)[target][1], + &((int *)recvbuf)[rdispls[target]] ) ; + } + else + { + _time_interpolator->doInterp( (*_time_messages)[target][0].time, + (*_time_messages)[target][1].time, _t, + recvcounts[target] , _n_step_before, _n_step_after, + (double **) &(*_data_messages)[target][0], + (double **) &(*_data_messages)[target][1], + &((double *)recvbuf)[rdispls[target]] ) ; + } + } + else + { + char * buffdest = (char *) recvbuf ; + char * buffsrc = (char *) (*_data_messages)[target][1] ; + memcpy( &buffdest[rdispls[target]*_MPI_access->extent( recvtype )] , buffsrc , + recvsize ) ; + } + } + } + } + + return sts ; + } + + /* + . CheckTime(recvcount , recvtype , target , UntilEnd) + + At the beginning, we read the first TimeMessage in + &(*_TimeMessages)[target][1] and the first DataMessage + in the allocated buffer (*_DataMessages)[target][1]. + + deltatime of TimesMessages must be nul if it is the last one. + + While : _t(t*) is the current time of the processus. + "while _t(t*) is greater than the time of the "target" + (*_TimeMessages)[target][1].time and + (*_TimeMessages)[target][1].deltatime is not nul", + So at the end of the while we have : + _t(t*) <= (*_TimeMessages)[target][1].time with + _t(t*) > (*_TimeMessages)[target][0].time + or we have the last TimeMessage of the "target". + + If it is the finalization of the recv of TimeMessages and + DataMessages (UntilEnd value is true), we execute the while + until (*_TimeMessages)[target][1].deltatime is nul. + + In the while : + We copy the last TimeMessage in the previoud TimeMessage and + we read a new TimeMessage + We delete the previous DataMessage. + We copy the last DataMessage pointer in the previous one. + We allocate a new last DataMessage buffer + (*_DataMessages)[target][1] and we read the corresponding + datas in that buffe. + + If the current time of the current process is greater than the + last time (*_TimeMessages)[target][1].time du target, we give + a true value to (*_OutOfTime)[target]. + (*_TimeMessages)[target][1].deltatime is nul. + */ + int MPIAccessDEC::checkTime( int recvcount , MPI_Datatype recvtype , int target , + bool UntilEnd ) + { + int sts = MPI_SUCCESS ; + int RecvTimeRequestId ; + int RecvDataRequestId ; + //Pour l'instant on cherche _time_messages[target][0] < _t <= _time_messages[target][1] + //=========================================================================== + //TODO : it is assumed actually that we have only 1 timestep before and after + // instead of _n_step_before and _n_step_after ... + //=========================================================================== + (*_data_messages_recv_count)[target] = recvcount ; + (*_data_messages_type)[target] = recvtype ; + if ( (*_time_messages)[target][1].time == -1 ) + { + (*_time_messages)[target][0] = (*_time_messages)[target][1] ; + sts = recv( &(*_time_messages)[target][1] , 1 , _MPI_access->timeType() , + target , RecvTimeRequestId ) ; + (*_data_messages)[target][0] = (*_data_messages)[target][1] ; + if ( recvtype == MPI_INT ) + { + (*_data_messages)[target][1] = new int[recvcount] ; + } + else + { + (*_data_messages)[target][1] = new double[recvcount] ; + } + sts = recv( (*_data_messages)[target][1] , recvcount , recvtype , target , + RecvDataRequestId ) ; + } + else + { + while ( ( _t > (*_time_messages)[target][1].time || UntilEnd ) && + (*_time_messages)[target][1].deltatime != 0 ) + { + (*_time_messages)[target][0] = (*_time_messages)[target][1] ; + sts = recv( &(*_time_messages)[target][1] , 1 , _MPI_access->timeType() , + target , RecvTimeRequestId ) ; + if ( UntilEnd ) + { + cout << "CheckTime" << _my_rank << " TimeMessage target " << target + << " RecvTimeRequestId " << RecvTimeRequestId << " MPITag " + << _MPI_access->recvMPITag(target) << endl ; + } + if ( recvtype == MPI_INT ) + { + delete [] (int *) (*_data_messages)[target][0] ; + } + else + { + delete [] (double *) (*_data_messages)[target][0] ; + } + (*_data_messages)[target][0] = (*_data_messages)[target][1] ; + if ( recvtype == MPI_INT ) + { + (*_data_messages)[target][1] = new int[recvcount] ; + } + else + { + (*_data_messages)[target][1] = new double[recvcount] ; + } + sts = recv( (*_data_messages)[target][1] , recvcount , recvtype , target , + RecvDataRequestId ) ; + if ( UntilEnd ) + { + cout << "CheckTime" << _my_rank << " DataMessage target " << target + << " RecvDataRequestId " << RecvDataRequestId << " MPITag " + << _MPI_access->recvMPITag(target) << endl ; + } + } + + if ( _t > (*_time_messages)[target][0].time && + _t <= (*_time_messages)[target][1].time ) + { + } + else + { + (*_out_of_time)[target] = true ; + } + } + return sts ; + } + + /* + . CheckSent() : + + call SendRequestIds of MPI_Access in order to get all + RequestIds of SendMessages of all "targets". + + For each RequestId, CheckSent call "Test" of MPI_Access in order + to know if the buffer is "free" (flag = true). If it is the + FinalCheckSent (WithWait = true), we call Wait instead of Test. + + If the buffer is "free", the counter of the structure SendBuffStruct + (from _MapOfSendBuffers) is decremented. + + If that counter is nul we delete the TimeMessage or the + SendBuffer according to the DataType. + + And we delete the structure SendBuffStruct before the suppression + (erase) of that item of _MapOfSendBuffers + */ + int MPIAccessDEC::checkSent(bool WithWait) + { + int sts = MPI_SUCCESS ; + int flag = WithWait ; + int size = _MPI_access->sendRequestIdsSize() ; + int * ArrayOfSendRequests = new int[ size ] ; + int nSendRequest = _MPI_access->sendRequestIds( size , ArrayOfSendRequests ) ; + bool SendTrace = false ; + int i ; + for ( i = 0 ; i < nSendRequest ; i++ ) + { + if ( WithWait ) + { + cout << "CheckSent" << _my_rank << " " << i << "./" << nSendRequest + << " SendRequestId " << ArrayOfSendRequests[i] << " MPITarget " + << _MPI_access->MPITarget(ArrayOfSendRequests[i]) << " MPITag " + << _MPI_access->MPITag(ArrayOfSendRequests[i]) << " Wait :" << endl ; + sts = _MPI_access->wait( ArrayOfSendRequests[i] ) ; + } + else + { + sts = _MPI_access->test( ArrayOfSendRequests[i] , flag ) ; + } + if ( flag ) + { + _MPI_access->deleteRequest( ArrayOfSendRequests[i] ) ; + if ( SendTrace ) + { + cout << "CheckSent" << _my_rank << " " << i << "./" << nSendRequest + << " SendRequestId " << ArrayOfSendRequests[i] + << " flag " << flag + << " Counter " << (*_map_of_send_buffers)[ ArrayOfSendRequests[i] ]->Counter + << " DataType " << (*_map_of_send_buffers)[ ArrayOfSendRequests[i] ]->DataType + << endl ; + } + (*_map_of_send_buffers)[ ArrayOfSendRequests[i] ]->Counter -= 1 ; + if ( SendTrace ) + { + if ( (*_map_of_send_buffers)[ ArrayOfSendRequests[i] ]->DataType == + _MPI_access->timeType() ) + { + cout << "CheckTimeSent" << _my_rank << " Request " ; + } + else + { + cout << "CheckDataSent" << _my_rank << " Request " ; + } + cout << ArrayOfSendRequests[i] + << " _map_of_send_buffers->SendBuffer " + << (*_map_of_send_buffers)[ ArrayOfSendRequests[i] ]->SendBuffer + << " Counter " << (*_map_of_send_buffers)[ ArrayOfSendRequests[i] ]->Counter + << endl ; + } + if ( (*_map_of_send_buffers)[ ArrayOfSendRequests[i] ]->Counter == 0 ) + { + if ( SendTrace ) + { + cout << "CheckSent" << _my_rank << " SendRequestId " << ArrayOfSendRequests[i] + << " Counter " << (*_map_of_send_buffers)[ ArrayOfSendRequests[i] ]->Counter + << " flag " << flag << " SendBuffer " + << (*_map_of_send_buffers)[ ArrayOfSendRequests[i] ]->SendBuffer + << " deleted. Erase in _map_of_send_buffers :" << endl ; + } + if ( (*_map_of_send_buffers)[ ArrayOfSendRequests[i] ]->DataType == + _MPI_access->timeType() ) + { + delete (TimeMessage * ) (*_map_of_send_buffers)[ ArrayOfSendRequests[i] ]->SendBuffer ; + } + else + { + if ( (*_map_of_send_buffers)[ ArrayOfSendRequests[i] ]->DataType == MPI_INT ) + { + delete [] (int *) (*_map_of_send_buffers)[ ArrayOfSendRequests[i] ]->SendBuffer ; + } + else + { + delete [] (double *) (*_map_of_send_buffers)[ ArrayOfSendRequests[i] ]->SendBuffer ; + } + } + delete (*_map_of_send_buffers)[ ArrayOfSendRequests[i] ] ; + } + if ( SendTrace ) + { + cout << "CheckSent" << _my_rank << " Erase in _map_of_send_buffers SendRequestId " + << ArrayOfSendRequests[i] << endl ; + } + (*_map_of_send_buffers).erase( ArrayOfSendRequests[i] ) ; + } + else if ( SendTrace ) + { + cout << "CheckSent" << _my_rank << " " << i << "./" << nSendRequest + << " SendRequestId " << ArrayOfSendRequests[i] + << " flag " << flag + << " Counter " << (*_map_of_send_buffers)[ ArrayOfSendRequests[i] ]->Counter + << " DataType " << (*_map_of_send_buffers)[ ArrayOfSendRequests[i] ]->DataType + << endl ; + } + } + if ( SendTrace ) + { + _MPI_access->check() ; + } + delete [] ArrayOfSendRequests ; + return sts ; + } + + int MPIAccessDEC::checkFinalRecv() + { + int sts = MPI_SUCCESS ; + if ( _time_interpolator ) + { + int target ; + for ( target = 0 ; target < _group_size ; target++ ) + { + if ( (*_data_messages)[target][0] != NULL ) + { + sts = checkTime( (*_data_messages_recv_count)[target] , (*_data_messages_type)[target] , + target , true ) ; + if ( (*_data_messages_type)[target] == MPI_INT ) + { + delete [] (int *) (*_data_messages)[target][0] ; + } + else + { + delete [] (double *) (*_data_messages)[target][0] ; + } + (*_data_messages)[target][0] = NULL ; + if ( (*_data_messages)[target][1] != NULL ) + { + if ( (*_data_messages_type)[target] == MPI_INT ) + { + delete [] (int *) (*_data_messages)[target][1] ; + } + else + { + delete [] (double *) (*_data_messages)[target][1] ; + } + (*_data_messages)[target][1] = NULL ; + } + } + } + } + return sts ; + } + + ostream & operator<< (ostream & f ,const TimeInterpolationMethod & interpolationmethod ) + { + switch (interpolationmethod) + { + case WithoutTimeInterp : + f << " WithoutTimeInterpolation "; + break; + case LinearTimeInterp : + f << " LinearTimeInterpolation "; + break; + default : + f << " UnknownTimeInterpolation "; + break; + } + + return f; + } +} diff --git a/src/ParaMEDMEM/MPIAccessDEC.hxx b/src/ParaMEDMEM/MPIAccessDEC.hxx new file mode 100644 index 000000000..e381ff61a --- /dev/null +++ b/src/ParaMEDMEM/MPIAccessDEC.hxx @@ -0,0 +1,179 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __MPIACCESSDEC_HXX__ +#define __MPIACCESSDEC_HXX__ + +#include "MPIAccess.hxx" +#include "DEC.hxx" +#include "LinearTimeInterpolator.hxx" + +#include +#include + +namespace ParaMEDMEM +{ + class MPIAccessDEC + { + public: + MPIAccessDEC( const ProcessorGroup& local_group, const ProcessorGroup& distant_group, + bool Asynchronous = true ); + virtual ~MPIAccessDEC(); + MPIAccess * getMPIAccess() { return _MPI_access; } + const MPI_Comm* getComm() { return _MPI_union_group->getComm(); } + void asynchronous( bool Asynchronous = true ) { _asynchronous = Asynchronous; } + void setTimeInterpolator( TimeInterpolationMethod anInterp , double InterpPrecision=0 , + int n_step_before=1, int nStepAfter=1 ); + + void setTime( double t ) { _t = t; _dt = -1; } + void setTime( double t , double dt ) { _t = t; _dt = dt; } + bool outOfTime( int target ) { return (*_out_of_time)[target]; } + + int send( void* sendbuf, int sendcount , MPI_Datatype sendtype , int target ); + int recv( void* recvbuf, int recvcount , MPI_Datatype recvtype , int target ); + int recv( void* recvbuf, int recvcount , MPI_Datatype recvtype , int target , + int &RecvRequestId , bool Asynchronous=false ); + int sendRecv( void* sendbuf, int sendcount , MPI_Datatype sendtype , + void* recvbuf, int recvcount , MPI_Datatype recvtype , int target ); + + int allToAll( void* sendbuf, int sendcount, MPI_Datatype sendtype , + void* recvbuf, int recvcount, MPI_Datatype recvtype ); + int allToAllv( void* sendbuf, int* sendcounts, int* sdispls, MPI_Datatype sendtype , + void* recvbuf, int* recvcounts, int* rdispls, MPI_Datatype recvtype ); + + int allToAllTime( void* sendbuf, int sendcount , MPI_Datatype sendtype , + void* recvbuf, int recvcount , MPI_Datatype recvtype ); + int allToAllvTime( void* sendbuf, int* sendcounts, int* sdispls, + MPI_Datatype sendtype , + void* recvbuf, int* recvcounts, int* rdispls, + MPI_Datatype recvtype ); + int checkTime( int recvcount , MPI_Datatype recvtype , int target , bool UntilEnd ); + int checkSent(bool WithWait=false); + int checkFinalSent() { return checkSent( true ); } + int checkFinalRecv(); + protected: + int send( void* sendbuf, int sendcount , int sendoffset , MPI_Datatype sendtype , + int target, int &SendRequestId ); + int recv( void* recvbuf, int recvcount , int recvoffset , MPI_Datatype recvtype , + int target, int &RecvRequestId ); + int sendRecv( void* sendbuf, int sendcount , int sendoffset , + MPI_Datatype sendtype , + void* recvbuf, int recvcount , int recvoffset , + MPI_Datatype recvtype , int target , + int &SendRequestId ,int &RecvRequestId ); + private : + bool _asynchronous; + MPIProcessorGroup* _MPI_union_group; + + TimeInterpolator* _time_interpolator; + int _n_step_before; + int _n_step_after; + + int _my_rank; + int _group_size; + MPIAccess* _MPI_access; + + // Current time and deltatime of current process + double _t; + double _dt; + + // TimeMessages from each target _TimeMessages[target][Step] : TimeMessage + std::vector< std::vector< TimeMessage > > *_time_messages; + // Corresponding DataMessages from each target _DataMessages[target][~TimeStep] + std::vector< bool >* _out_of_time; + std::vector< int >* _data_messages_recv_count; + std::vector< MPI_Datatype >* _data_messages_type; + std::vector< std::vector< void * > >* _data_messages; + + typedef struct + { + void * SendBuffer; + int Counter; + MPI_Datatype DataType; } + SendBuffStruct; + std::map< int , SendBuffStruct * > *_map_of_send_buffers; + }; + + inline int MPIAccessDEC::send( void* sendbuf, int sendcount , MPI_Datatype sendtype , int target ) + { + int SendRequestId; + int sts; + if ( _asynchronous ) + { + sts = _MPI_access->ISend( sendbuf , sendcount , sendtype , target , + SendRequestId ); + } + else + { + sts = _MPI_access->send( sendbuf , sendcount , sendtype , target , + SendRequestId ); + if ( sts == MPI_SUCCESS ) + free( sendbuf ); + } + return sts; + } + + inline int MPIAccessDEC::recv( void* recvbuf, int recvcount , MPI_Datatype recvtype , int target ) + { + int RecvRequestId; + int sts; + if ( _asynchronous ) + sts = _MPI_access->IRecv( recvbuf , recvcount , recvtype , target , RecvRequestId ); + else + sts = _MPI_access->recv( recvbuf , recvcount , recvtype , target , RecvRequestId ); + return sts; + } + + inline int MPIAccessDEC::recv( void* recvbuf, int recvcount , MPI_Datatype recvtype , + int target , int &RecvRequestId , bool Asynchronous ) + { + int sts; + if ( Asynchronous ) + sts = _MPI_access->IRecv( recvbuf , recvcount , recvtype , target , + RecvRequestId ); + else + sts = _MPI_access->recv( recvbuf , recvcount , recvtype , target , + RecvRequestId ); + return sts; + } + + inline int MPIAccessDEC::sendRecv( void* sendbuf, int sendcount , MPI_Datatype sendtype , + void* recvbuf, int recvcount , MPI_Datatype recvtype , + int target ) + { + int SendRequestId; + int RecvRequestId; + int sts; + if ( _asynchronous ) + sts = _MPI_access->ISendRecv( sendbuf , sendcount , sendtype , target , + SendRequestId , + recvbuf , recvcount , recvtype , target , + RecvRequestId ); + else + sts = _MPI_access->sendRecv( sendbuf , sendcount , sendtype , target , + SendRequestId , + recvbuf , recvcount , recvtype , target , + RecvRequestId ); + return sts; + } + + std::ostream & operator<< (std::ostream &,const TimeInterpolationMethod &); +} + +#endif diff --git a/src/ParaMEDMEM/MPIProcessorGroup.cxx b/src/ParaMEDMEM/MPIProcessorGroup.cxx new file mode 100644 index 000000000..055cc5122 --- /dev/null +++ b/src/ParaMEDMEM/MPIProcessorGroup.cxx @@ -0,0 +1,266 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "ProcessorGroup.hxx" +#include "MPIProcessorGroup.hxx" +#include "CommInterface.hxx" +#include "InterpolationUtils.hxx" + +#include +#include +#include +#include "mpi.h" + +using namespace std; + +/*! \defgroup processor_group Processor Groups + * + * \section processor_group_overview Overview + * The MPIProcessorGroup class is used to set up processor groups that help to define + * the MPI topology of the couplings. They can be set up in various ways, the most common being + * the use of the \c MPIProcessorGroup(Comminterface, int pfirst, int plast) + * constructor. + * + * The following code excerpt creates two processor groups on respectively 3 and 2 processors. + \verbatim + int main() + { + MPI_Init(&argc,&argv); + CommInterface comm_interface; + MPIProcessorGroup codeA_group(comm_interface, 0, 2); + MPIProcessorGroup codeB_group(comm_interface, 3, 4); + + ... + } + \endverbatim +*/ + + +namespace ParaMEDMEM +{ + /*! + \addtogroup processor_group + @{ + */ + + /*! + * Creates a processor group that is based on all the + MPI_COMM_WORLD processor.This routine must be called by all processors in MPI_COMM_WORLD. + \param interface CommInterface object giving access to the MPI + communication layer + */ + MPIProcessorGroup::MPIProcessorGroup(const CommInterface& interface): + ProcessorGroup(interface),_world_comm(MPI_COMM_WORLD) + { + _comm=_world_comm; + _comm_interface.commGroup(_world_comm, &_group); + int size; + _comm_interface.commSize(_world_comm,&size); + for (int i=0; i proc_ids, const MPI_Comm& world_comm): + ProcessorGroup(interface, proc_ids),_world_comm(world_comm) + { + updateMPISpecificAttributes(); + } + + + void MPIProcessorGroup::updateMPISpecificAttributes() + { + //Creation of a communicator + MPI_Group group_world; + + int size_world; + _comm_interface.commSize(_world_comm,&size_world); + int rank_world; + _comm_interface.commRank(_world_comm,&rank_world); + _comm_interface.commGroup(_world_comm, &group_world); + + int* ranks=new int[_proc_ids.size()]; + + // copying proc_ids in ranks + copy::const_iterator,int*> (_proc_ids.begin(), _proc_ids.end(), ranks); + for (int i=0; i< (int)_proc_ids.size();i++) + if (ranks[i]>size_world-1) + { + delete[] ranks; + _comm_interface.groupFree(&group_world); // MPI_Group is a C structure and won't get de-allocated automatically? + throw INTERP_KERNEL::Exception("invalid rank in set argument of MPIProcessorGroup constructor"); + } + + _comm_interface.groupIncl(group_world, _proc_ids.size(), ranks, &_group); + + _comm_interface.commCreate(_world_comm, _group, &_comm); + + // clean-up + delete[] ranks; + _comm_interface.groupFree(&group_world); // MPI_Group is a C structure and won't get de-allocated automatically? + } + + /*! Creates a processor group that is based on the processors between \a pstart and \a pend. + This routine must be called by all processors in MPI_COMM_WORLD. + + \param comm_interface CommInterface object giving access to the MPI + communication layer + \param pstart id in MPI_COMM_WORLD of the first processor in the group + \param pend id in MPI_COMM_WORLD of the last processor in the group + */ + MPIProcessorGroup::MPIProcessorGroup (const CommInterface& comm_interface, int pstart, int pend, const MPI_Comm& world_comm): ProcessorGroup(comm_interface,pstart,pend),_world_comm(world_comm) + { + //Creation of a communicator + MPI_Group group_world; + + int size_world; + _comm_interface.commSize(_world_comm,&size_world); + int rank_world; + _comm_interface.commRank(_world_comm,&rank_world); + _comm_interface.commGroup(_world_comm, &group_world); + + if (pend>size_world-1 || pend proc_ids) : + ProcessorGroup(proc_group.getCommInterface()),_world_comm(MPI_COMM_WORLD) + { + cout << "MPIProcessorGroup (const ProcessorGroup& proc_group, set proc_ids)" <(group); + int local_rank; + MPI_Group_translate_ranks(targetgroup->_group, 1, &rank, _group, &local_rank); + return local_rank; + } + + /*!Creates a processor group that is the complement of the current group + inside MPI_COMM_WORLD + \return pointer to the new ProcessorGroup structure. + */ + ProcessorGroup* MPIProcessorGroup::createComplementProcGroup() const + { + set procs; + int world_size=_comm_interface.worldSize(); + for (int i=0; i::const_iterator iter=_proc_ids.begin(); iter!= _proc_ids.end(); iter++) + procs.erase(*iter); + + return new MPIProcessorGroup(_comm_interface, procs, _world_comm); + + } + + ProcessorGroup *MPIProcessorGroup::deepCpy() const + { + return new MPIProcessorGroup(*this); + } + + /*!Adding processors of group \a group to local group. + \param group group that is to be fused with current group + \return new group formed by the fusion of local group and \a group. + */ + ProcessorGroup* MPIProcessorGroup::fuse (const ProcessorGroup& group) const + { + set procs = _proc_ids; + const set& distant_proc_ids = group.getProcIDs(); + for (set::const_iterator iter=distant_proc_ids.begin(); iter!=distant_proc_ids.end(); iter++) + { + procs.insert(*iter); + } + return new MPIProcessorGroup(_comm_interface, procs, _world_comm); + } + + int MPIProcessorGroup::myRank() const + { + int rank; + MPI_Comm_rank(_comm,&rank); + return rank; + } + + /*! + @} + */ + ProcessorGroup* MPIProcessorGroup::createProcGroup() const + { + set procs; + for (set::const_iterator iter=_proc_ids.begin(); iter!= _proc_ids.end(); iter++) + procs.insert(*iter); + + return new MPIProcessorGroup(_comm_interface, procs, _world_comm); + + } +} diff --git a/src/ParaMEDMEM/MPIProcessorGroup.hxx b/src/ParaMEDMEM/MPIProcessorGroup.hxx new file mode 100644 index 000000000..d4f25eed4 --- /dev/null +++ b/src/ParaMEDMEM/MPIProcessorGroup.hxx @@ -0,0 +1,60 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __MPIPROCESSORGROUP_HXX__ +#define __MPIPROCESSORGROUP_HXX__ + +#include "ProcessorGroup.hxx" + +#include +#include + +namespace ParaMEDMEM +{ + class CommInterface; + + class MPIProcessorGroup : public ProcessorGroup + { + public: + MPIProcessorGroup(const CommInterface& interface); + MPIProcessorGroup(const CommInterface& interface, std::set proc_ids, const MPI_Comm& world_comm=MPI_COMM_WORLD); + MPIProcessorGroup (const ProcessorGroup& proc_group, std::set proc_ids); + MPIProcessorGroup(const CommInterface& interface,int pstart, int pend, const MPI_Comm& world_comm=MPI_COMM_WORLD); + MPIProcessorGroup(const MPIProcessorGroup& other); + virtual ~MPIProcessorGroup(); + virtual ProcessorGroup *deepCpy() const; + virtual ProcessorGroup* fuse (const ProcessorGroup&) const; + void intersect (ProcessorGroup&) { } + int myRank() const; + bool containsMyRank() const { int rank; MPI_Group_rank(_group, &rank); return (rank!=MPI_UNDEFINED); } + int translateRank(const ProcessorGroup* group, int rank) const; + const MPI_Comm* getComm() const { return &_comm; } + ProcessorGroup* createComplementProcGroup() const; + ProcessorGroup* createProcGroup() const; + MPI_Comm getWorldComm() { return _world_comm; } + private: + void updateMPISpecificAttributes(); + private: + const MPI_Comm _world_comm; + MPI_Group _group; + MPI_Comm _comm; + }; +} + +#endif diff --git a/src/ParaMEDMEM/MxN_Mapping.cxx b/src/ParaMEDMEM/MxN_Mapping.cxx new file mode 100644 index 000000000..05ca0990e --- /dev/null +++ b/src/ParaMEDMEM/MxN_Mapping.cxx @@ -0,0 +1,317 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "CommInterface.hxx" +#include "ProcessorGroup.hxx" +#include "MPIProcessorGroup.hxx" +#include "MPIAccessDEC.hxx" +#include "MxN_Mapping.hxx" + +using namespace std; + +namespace ParaMEDMEM +{ + MxN_Mapping::MxN_Mapping() + { + } + + + MxN_Mapping::MxN_Mapping(const ProcessorGroup& source_group, const ProcessorGroup& target_group,const DECOptions& dec_options) + : DECOptions(dec_options),_union_group(source_group.fuse(target_group)) + { + _access_DEC = new MPIAccessDEC(source_group,target_group,getAsynchronous()); + _access_DEC->setTimeInterpolator(getTimeInterpolationMethod()); + _send_proc_offsets.resize(_union_group->size()+1,0); + _recv_proc_offsets.resize(_union_group->size()+1,0); + + } + + MxN_Mapping::~MxN_Mapping() + { + delete _union_group; + delete _access_DEC; + } + + + /*! + Method registering a new element for correspondence with a distant element + \param distant_proc proc rank of the distant processor (in terms of the union group) + \param distant_element id of the element on the distant processor + */ + void MxN_Mapping::addElementFromSource(int distant_proc, int distant_element) + { + _sending_ids.push_back(make_pair(distant_proc,distant_element)); + for (int i=distant_proc; i<_union_group->size(); i++) + _send_proc_offsets[i+1]++; + } + + void MxN_Mapping::initialize() + { + _sending_ids.clear(); + std::fill(_send_proc_offsets.begin(),_send_proc_offsets.end(),0); + } + + void MxN_Mapping::prepareSendRecv() + { + CommInterface comm_interface=_union_group->getCommInterface(); + // sending count pattern + int* nbsend=new int[_union_group->size()]; + int* nbrecv=new int[_union_group->size()]; + for (int i=0; i<_union_group->size(); i++) + { + nbsend[i]=_send_proc_offsets[i+1]-_send_proc_offsets[i]; + } + + MPIProcessorGroup* group = static_cast(_union_group); + const MPI_Comm* comm=group->getComm(); + comm_interface.allToAll(nbsend, 1, MPI_INT, + nbrecv, 1, MPI_INT, + *comm); + + for (int i=0; i<_union_group->size(); i++) + { + for (int j=i+1;j<_union_group->size()+1; j++) + _recv_proc_offsets[j]+=nbrecv[i]; + + } + + delete[] nbsend; + delete[] nbrecv; + + _recv_ids.resize(_recv_proc_offsets[_union_group->size()]); + int* isendbuf=0; + int* irecvbuf=0; + if (_sending_ids.size()>0) + isendbuf = new int[_sending_ids.size()]; + if (_recv_ids.size()>0) + irecvbuf = new int[_recv_ids.size()]; + int* sendcounts = new int[_union_group->size()]; + int* senddispls=new int[_union_group->size()]; + int* recvcounts=new int[_union_group->size()]; + int* recvdispls=new int[_union_group->size()]; + for (int i=0; i< _union_group->size(); i++) + { + sendcounts[i]=_send_proc_offsets[i+1]-_send_proc_offsets[i]; + senddispls[i]=_send_proc_offsets[i]; + recvcounts[i]=_recv_proc_offsets[i+1]-_recv_proc_offsets[i]; + recvdispls[i]=_recv_proc_offsets[i]; + } + vector offsets = _send_proc_offsets; + for (int i=0; i<(int)_sending_ids.size();i++) + { + int iproc = _sending_ids[i].first; + isendbuf[offsets[iproc]]=_sending_ids[i].second; + offsets[iproc]++; + } + comm_interface.allToAllV(isendbuf, sendcounts, senddispls, MPI_INT, + irecvbuf, recvcounts, recvdispls, MPI_INT, + *comm); + + for (int i=0; i< _recv_proc_offsets[_union_group->size()]; i++) + _recv_ids[i]=irecvbuf[i]; + + if (_sending_ids.size()>0) + delete[] isendbuf; + if (_recv_ids.size()>0) + delete[] irecvbuf; + delete[] sendcounts; + delete[]recvcounts; + delete[]senddispls; + delete[] recvdispls; + } + + /*! Exchanging field data between two groups of processes + * + * \param field MEDCoupling field containing the values to be sent + * + * The ids that were defined by addElementFromSource method + * are sent. + */ + void MxN_Mapping::sendRecv(double* sendfield, MEDCouplingFieldDouble& field) const + { + CommInterface comm_interface=_union_group->getCommInterface(); + const MPIProcessorGroup* group = static_cast(_union_group); + + int nbcomp=field.getArray()->getNumberOfComponents(); + double* sendbuf=0; + double* recvbuf=0; + if (_sending_ids.size() >0) + sendbuf = new double[_sending_ids.size()*nbcomp]; + if (_recv_ids.size()>0) + recvbuf = new double[_recv_ids.size()*nbcomp]; + + int* sendcounts = new int[_union_group->size()]; + int* senddispls=new int[_union_group->size()]; + int* recvcounts=new int[_union_group->size()]; + int* recvdispls=new int[_union_group->size()]; + + for (int i=0; i< _union_group->size(); i++) + { + sendcounts[i]=nbcomp*(_send_proc_offsets[i+1]-_send_proc_offsets[i]); + senddispls[i]=nbcomp*(_send_proc_offsets[i]); + recvcounts[i]=nbcomp*(_recv_proc_offsets[i+1]-_recv_proc_offsets[i]); + recvdispls[i]=nbcomp*(_recv_proc_offsets[i]); + } + //building the buffer of the elements to be sent + vector offsets = _send_proc_offsets; + + for (int i=0; i<(int)_sending_ids.size();i++) + { + int iproc = _sending_ids[i].first; + for (int icomp=0; icompgetComm(); + comm_interface.allToAllV(sendbuf, sendcounts, senddispls, MPI_DOUBLE, + recvbuf, recvcounts, recvdispls, MPI_DOUBLE, + *comm); + } + break; + case PointToPoint: + _access_DEC->allToAllv(sendbuf, sendcounts, senddispls, MPI_DOUBLE, + recvbuf, recvcounts, recvdispls, MPI_DOUBLE); + break; + } + + //setting the received values in the field + DataArrayDouble *fieldArr=field.getArray(); + double* recvptr=recvbuf; + for (int i=0; i< _recv_proc_offsets[_union_group->size()]; i++) + { + for (int icomp=0; icompgetIJ(_recv_ids[i],icomp); + fieldArr->setIJ(_recv_ids[i],icomp,temp+*recvptr); + recvptr++; + } + } + if (sendbuf!=0 && getAllToAllMethod()== Native) + delete[] sendbuf; + if (recvbuf !=0) + delete[] recvbuf; + delete[] sendcounts; + delete[] recvcounts; + delete[] senddispls; + delete[] recvdispls; + + } + + /*! Exchanging field data between two groups of processes + * + * \param field MEDCoupling field containing the values to be sent + * + * The ids that were defined by addElementFromSource method + * are sent. + */ + void MxN_Mapping::reverseSendRecv(double* recvfield, MEDCouplingFieldDouble& field) const + { + CommInterface comm_interface=_union_group->getCommInterface(); + const MPIProcessorGroup* group = static_cast(_union_group); + + int nbcomp=field.getArray()->getNumberOfComponents(); + double* sendbuf=0; + double* recvbuf=0; + if (_recv_ids.size() >0) + sendbuf = new double[_recv_ids.size()*nbcomp]; + if (_sending_ids.size()>0) + recvbuf = new double[_sending_ids.size()*nbcomp]; + + int* sendcounts = new int[_union_group->size()]; + int* senddispls=new int[_union_group->size()]; + int* recvcounts=new int[_union_group->size()]; + int* recvdispls=new int[_union_group->size()]; + + for (int i=0; i< _union_group->size(); i++) + { + sendcounts[i]=nbcomp*(_recv_proc_offsets[i+1]-_recv_proc_offsets[i]); + senddispls[i]=nbcomp*(_recv_proc_offsets[i]); + recvcounts[i]=nbcomp*(_send_proc_offsets[i+1]-_send_proc_offsets[i]); + recvdispls[i]=nbcomp*(_send_proc_offsets[i]); + } + //building the buffer of the elements to be sent + vector offsets = _recv_proc_offsets; + DataArrayDouble *fieldArr=field.getArray(); + for (int iproc=0; iproc<_union_group->size();iproc++) + for (int i=_recv_proc_offsets[iproc]; i<_recv_proc_offsets[iproc+1]; i++) + { + for (int icomp=0; icompgetIJ(_recv_ids[i],icomp); + } + + //communication phase + switch (getAllToAllMethod()) + { + case Native: + { + const MPI_Comm* comm = group->getComm(); + comm_interface.allToAllV(sendbuf, sendcounts, senddispls, MPI_DOUBLE, + recvbuf, recvcounts, recvdispls, MPI_DOUBLE, + *comm); + } + break; + case PointToPoint: + _access_DEC->allToAllv(sendbuf, sendcounts, senddispls, MPI_DOUBLE, + recvbuf, recvcounts, recvdispls, MPI_DOUBLE); + break; + } + + //setting the received values in the field + double* recvptr=recvbuf; + for (int i=0; i< _send_proc_offsets[_union_group->size()]; i++) + { + for (int icomp=0; icomp + +namespace ParaMEDMEM +{ + + class ProcessorGroup; + + class MxN_Mapping : public DECOptions + { + public: + MxN_Mapping(); + MxN_Mapping(const ProcessorGroup& source_group, const ProcessorGroup& target_group, const DECOptions& dec_options); + virtual ~MxN_Mapping(); + void addElementFromSource(int distant_proc, int distant_elem); + void prepareSendRecv(); + void sendRecv(MEDCouplingFieldDouble& field); + void sendRecv(double* sendfield, MEDCouplingFieldDouble& field) const ; + void reverseSendRecv(double* recvfield, MEDCouplingFieldDouble& field) const ; + + // + const std::vector >& getSendingIds() const { return _sending_ids; } + const std::vector& getSendProcsOffsets() const { return _send_proc_offsets; } + void initialize(); + + MPIAccessDEC* getAccessDEC(){ return _access_DEC; } + private : + ProcessorGroup* _union_group; + MPIAccessDEC * _access_DEC; + int _nb_comps; + std::vector > _sending_ids; + std::vector _recv_ids; + std::vector _send_proc_offsets; + std::vector _recv_proc_offsets; + }; + + std::ostream & operator<< (std::ostream &,const AllToAllMethod &); + +} + +#endif diff --git a/src/ParaMEDMEM/NonCoincidentDEC.cxx b/src/ParaMEDMEM/NonCoincidentDEC.cxx new file mode 100644 index 000000000..830d3d11c --- /dev/null +++ b/src/ParaMEDMEM/NonCoincidentDEC.cxx @@ -0,0 +1,398 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include "CommInterface.hxx" +#include "Topology.hxx" +#include "BlockTopology.hxx" +#include "ComponentTopology.hxx" +#include "ParaFIELD.hxx" +#include "MPIProcessorGroup.hxx" +#include "DEC.hxx" +#include "NonCoincidentDEC.hxx" + +extern "C" { +#include +#include +#include +#include +} + +namespace ParaMEDMEM +{ + + /*! + \defgroup noncoincidentdec NonCoincidentDEC + + \section overview Overview + + \c NonCoincidentDEC enables nonconservative remapping of fields + between two parallel codes. + The computation is possible for 3D meshes and 2D meshes. + It is not available for 3D surfaces. The computation enables fast parallel localization, and is based on a point in element search, followed + by a field evaluation at the point location. Thus, it is typically + faster than the \ref interpkerneldec which gives a \ref conservativeremapping. + It is particularly true for the initialisation phase (synchronize) + which is very computationnaly intensive in \ref interpkerneldec. + + In the present version, only fields lying on elements are considered. + The value is estimated by locating the barycenter of the target + side cell in a source cell and sending the value of this source cell + as the value of the target cell. + + \image html NonCoincident_small.png "Example showing the transfer from a field based on a quadrangular mesh to a triangular mesh. The triangle barycenters are computed and located in the quadrangles. In a P0-P0 interpolation, the value on the quadrangle is then applied to the triangles whose barycenter lies within." + + \image latex NonCoincident_small.eps "Example showing the transfer from a field based on a quadrangular mesh to a triangular mesh. The triangle barycenters are computed and located in the quadrangles. In a P0-P0 interpolation, the value on the quadrangle is then applied to the triangles whose barycenter lies within." + + A typical use of NonCoincidentDEC encompasses two distinct phases : + - A setup phase during which the intersection volumes are computed and the communication structures are setup. This corresponds to calling the NonCoincidentDEC::synchronize() method. + - A use phase during which the remappings are actually performed. This corresponds to the calls to sendData() and recvData() which actually trigger the data exchange. The data exchange are synchronous in the current version of the library so that recvData() and sendData() calls must be synchronized on code A and code B processor groups. + + The following code excerpt illutrates a typical use of the NonCoincidentDEC class. + + \code + ... + NonCoincidentDEC dec(groupA, groupB); + dec.attachLocalField(field); + dec.synchronize(); + if (groupA.containsMyRank()) + dec.recvData(); + else if (groupB.containsMyRank()) + dec.sendData(); + ... + \endcode + + Computing the field on the receiving side can be expressed in terms + of a matrix-vector product : \f$ \phi_t=W.\phi_s\f$, with \f$ \phi_t + \f$ the field on the target side and \f$ \phi_s \f$ the field on + the source side. + In the P0-P0 case, this matrix is a plain rectangular matrix with one + non-zero element per row (with value 1). For instance, in the above figure, the matrix is : + \f[ + + \begin{tabular}{|cccc|} + 1 & 0 & 0 & 0\\ + 0 & 0 & 1 & 0\\ + 1 & 0 & 0 & 0\\ + 0 & 0 & 1 & 0\\ + \end{tabular} + \f] + */ + + fvm_nodal_t* medmemMeshToFVMMesh(const MEDMEM::MESH* mesh) + { + // create an FVM structure from the paramesh structure + std::string meshName(mesh->getName());//this line avoid that mesh->getName() object killed before fvm_nodal_create read the const char *. + fvm_nodal_t * fvm_nodal = fvm_nodal_create(meshName.c_str(),mesh->getMeshDimension()); + + //loop on cell types + int nbtypes = mesh->getNumberOfTypes(MED_EN::MED_CELL); + const MED_EN::medGeometryElement* types = mesh->getTypes(MED_EN::MED_CELL); + for (int itype=0; itypegetNumberOfElements(MED_EN::MED_CELL, types[itype]); + fvm_lnum_t* conn = new fvm_lnum_t[nbelems*(types[itype]%100)]; + const int* mesh_conn =mesh->getConnectivity(MED_EN::MED_FULL_INTERLACE,MED_EN::MED_NODAL, MED_EN::MED_CELL, types[itype]); + for (int i=0; igetNumberOfNodes(); + int spacedim=mesh->getSpaceDimension(); + fvm_coord_t* coords = new fvm_coord_t[nbnodes*spacedim]; + const double* mesh_coords=mesh->getCoordinates(MED_EN::MED_FULL_INTERLACE); + for (int i=0; igetName());//this line avoid that support->getName() object killed before fvm_nodal_create read the const char *. + fvm_nodal_t * fvm_nodal = fvm_nodal_create(supportName.c_str(),1); + + const MEDMEM::MESH* mesh= support->getMesh(); + + //loop on cell types + MED_EN::medEntityMesh entity = support->getEntity(); + + int nbtypes = support->getNumberOfTypes(); + const MED_EN::medGeometryElement* types = support->getTypes(); + int ioffset=0; + const int* type_offset = support->getNumberIndex(); + + //browsing through all types + for (int itype=0; itypegetNumberOfElements(types[itype]); + + //for a partial support, defining the element numbers that are taken into + //account in the support + fvm_lnum_t* elem_numbers=0; + if (!support->isOnAllElements()) + { + elem_numbers = const_cast (support->getNumber(types[itype])); + + //creating work arrays to store list of elems for partial suports + if (itype>0) + { + fvm_lnum_t* temp = new int[nbelems]; + for (int i=0; i< nbelems; i++) + temp[i] = elem_numbers [i]-ioffset; + ioffset+=type_offset[itype]; + elem_numbers = temp; + } + } + //retrieving original mesh connectivity + fvm_lnum_t* conn = const_cast (mesh->getConnectivity(MED_EN::MED_FULL_INTERLACE,MED_EN::MED_NODAL,entity, types[itype])); + + // adding the elements to the FVM structure + fvm_nodal_append_by_transfer(fvm_nodal, nbelems, fvm_type,0,0,0,conn,elem_numbers); + + //cleaning work arrays (for partial supports) + if (!support->isOnAllElements() && itype>0) + delete[] elem_numbers; + + } + return fvm_nodal; + } + + NonCoincidentDEC::NonCoincidentDEC() + { + } + + /*! + \addtogroup noncoincidentdec + @{ + */ + + /*! Constructor of a non coincident \ref dec with + * a source group on which lies a field lying on a mesh and a + * target group on which lies a mesh. + * + * \param source_group ProcessorGroup on the source side + * \param target_group ProcessorGroup on the target side + */ + + NonCoincidentDEC::NonCoincidentDEC(ProcessorGroup& source_group, + ProcessorGroup& target_group) + :DEC(source_group, target_group) + {} + + NonCoincidentDEC::~NonCoincidentDEC() + { + } + + /*! Synchronization process. Calling this method + * synchronizes the topologies so that the target side + * gets the information which enable it to fetch the field value + * from the source side. + * A typical call is : + \verbatim + NonCoincidentDEC dec(source_group,target_group); + dec.attachLocalField(field); + dec.synchronize(); + \endverbatim + */ + void NonCoincidentDEC::synchronize() + { + + //initializing FVM parallel environment + const MPI_Comm* comm=dynamic_cast (_union_group)->getComm(); + fvm_parall_set_mpi_comm(*const_cast (comm)); + + + //setting up the communication DEC on both sides + + if (_source_group->containsMyRank()) + { + MEDMEM::MESH* mesh = _local_field->getField()->getSupport()->getMesh(); + fvm_nodal_t* source_nodal = ParaMEDMEM::medmemMeshToFVMMesh(mesh); + + int target_size = _target_group->size() ; + int start_rank= _source_group->size(); + const MPI_Comm* comm = (dynamic_cast (_union_group))->getComm(); + + _locator = fvm_locator_create(1e-6, + *comm, + target_size, + start_rank); + + fvm_locator_set_nodal(_locator, + source_nodal, + mesh->getSpaceDimension(), + 0, + NULL, + 0); + + + _nb_distant_points = fvm_locator_get_n_dist_points(_locator); + _distant_coords = fvm_locator_get_dist_coords(_locator); + _distant_locations = fvm_locator_get_dist_locations(_locator); + + } + if (_target_group->containsMyRank()) + { + MEDMEM::MESH* mesh = _local_field->getField()->getSupport()->getMesh(); + + fvm_nodal_t* target_nodal = ParaMEDMEM::medmemMeshToFVMMesh(mesh); + int source_size = _source_group->size(); + int start_rank= 0 ; + const MPI_Comm* comm = (dynamic_cast (_union_group))->getComm(); + + _locator = fvm_locator_create(1e-6, + *comm, + source_size, + start_rank); + int nbcells = mesh->getNumberOfElements(MED_EN::MED_CELL,MED_EN::MED_ALL_ELEMENTS); + const MEDMEM::SUPPORT* support=_local_field->getField()->getSupport(); + MEDMEM::FIELD* barycenter_coords = mesh->getBarycenter(support); + const double* coords = barycenter_coords->getValue(); + fvm_locator_set_nodal(_locator, + target_nodal, + mesh->getSpaceDimension(), + nbcells, + NULL, + coords); + delete barycenter_coords; + } + } + + + /*! This method is called on the target group in order to + * trigger the retrieveal of field data. It must + * be called synchronously with a sendData() call on + * the source group. + */ + void NonCoincidentDEC::recvData() + { + int nbelems = _local_field->getField()->getSupport()->getMesh()->getNumberOfElements(MED_EN::MED_CELL, MED_EN::MED_ALL_ELEMENTS); + int nbcomp = _local_field->getField()->getNumberOfComponents(); + double* values = new double [nbelems*nbcomp]; + fvm_locator_exchange_point_var(_locator, + 0, + values, + 0, + sizeof(double), + nbcomp, + 0); + _local_field->getField()->setValue(values); + if (_forced_renormalization_flag) + renormalizeTargetField(); + delete[]values; + } + + /*! This method is called on the source group in order to + * send field data. It must be called synchronously with + * a recvData() call on + * the target group. + */ + void NonCoincidentDEC::sendData() + { + const double* values=_local_field->getField()->getValue(); + int nbcomp = _local_field->getField()->getNumberOfComponents(); + double* distant_values = new double [_nb_distant_points*nbcomp]; + + //cheap interpolation : the value of the cell is transfered to the point + for (int i=0; i<_nb_distant_points; i++) + for (int j=0; j \c >. + + For a proc#k, it is necessary to fetch info of all matrices built in \ref ParaMEDMEMOverlapDECAlgoStep4 "Step4" where the first element in pair (i,j) + is equal to k. + + After this step, the matrix repartition is the following after a call to ParaMEDMEM::OverlapMapping::prepare : + + - proc#0 : (0,0),(1,0),(2,0) + - proc#1 : (0,1),(2,1) + - proc#2 : (1,2),(2,2) + + Tuple (2,1) computed on proc 2 is stored in proc 1 after execution of the function "prepare". This is an example of item 0 in \ref ParaMEDMEMOverlapDECAlgoStep2 "Step2". + Tuple (0,1) computed on proc 1 is stored in proc 1 too. This is an example of item 1 in \ref ParaMEDMEMOverlapDECAlgoStep2 "Step2". + + In the end ParaMEDMEM::OverlapMapping::_proc_ids_to_send_vector_st will contain : + + - Proc#0 : 0,1 + - Proc#1 : 0,2 + - Proc#2 : 0,1,2 + + In the end ParaMEDMEM::OverlapMapping::_proc_ids_to_recv_vector_st will contain : + + - Proc#0 : 0,1,2 + - Proc#1 : 0,2 + - Proc#2 : 1,2 + + The method in charge to perform this is : ParaMEDMEM::OverlapMapping::prepare. +*/ +namespace ParaMEDMEM +{ + OverlapDEC::OverlapDEC(const std::set& procIds, const MPI_Comm& world_comm):_own_group(true),_interpolation_matrix(0), + _source_field(0),_own_source_field(false), + _target_field(0),_own_target_field(false) + { + ParaMEDMEM::CommInterface comm; + int *ranks_world=new int[procIds.size()]; // ranks of sources and targets in world_comm + std::copy(procIds.begin(),procIds.end(),ranks_world); + MPI_Group group,world_group; + comm.commGroup(world_comm,&world_group); + comm.groupIncl(world_group,procIds.size(),ranks_world,&group); + delete [] ranks_world; + MPI_Comm theComm; + comm.commCreate(world_comm,group,&theComm); + comm.groupFree(&group); + if(theComm==MPI_COMM_NULL) + { + _group=0; + return ; + } + std::set idsUnion; + for(std::size_t i=0;imultiply(); + } + + void OverlapDEC::recvData() + { + throw INTERP_KERNEL::Exception("Not implemented yet !!!!"); + //_interpolation_matrix->transposeMultiply(); + } + + void OverlapDEC::synchronize() + { + if(!isInGroup()) + return ; + delete _interpolation_matrix; + _interpolation_matrix=new OverlapInterpolationMatrix(_source_field,_target_field,*_group,*this,*this); + OverlapElementLocator locator(_source_field,_target_field,*_group); + locator.copyOptions(*this); + locator.exchangeMeshes(*_interpolation_matrix); + std::vector< std::pair > jobs=locator.getToDoList(); + std::string srcMeth=locator.getSourceMethod(); + std::string trgMeth=locator.getTargetMethod(); + for(std::vector< std::pair >::const_iterator it=jobs.begin();it!=jobs.end();it++) + { + const MEDCouplingPointSet *src=locator.getSourceMesh((*it).first); + const DataArrayInt *srcIds=locator.getSourceIds((*it).first); + const MEDCouplingPointSet *trg=locator.getTargetMesh((*it).second); + const DataArrayInt *trgIds=locator.getTargetIds((*it).second); + _interpolation_matrix->addContribution(src,srcIds,srcMeth,(*it).first,trg,trgIds,trgMeth,(*it).second); + } + _interpolation_matrix->prepare(locator.getProcsInInteraction()); + _interpolation_matrix->computeDeno(); + } + + void OverlapDEC::attachSourceLocalField(ParaFIELD *field, bool ownPt) + { + if(!isInGroup()) + return ; + if(_own_source_field) + delete _source_field; + _source_field=field; + _own_source_field=ownPt; + } + + void OverlapDEC::attachTargetLocalField(ParaFIELD *field, bool ownPt) + { + if(!isInGroup()) + return ; + if(_own_target_field) + delete _target_field; + _target_field=field; + _own_target_field=ownPt; + } + + bool OverlapDEC::isInGroup() const + { + if(!_group) + return false; + return _group->containsMyRank(); + } +} diff --git a/src/ParaMEDMEM/OverlapDEC.hxx b/src/ParaMEDMEM/OverlapDEC.hxx new file mode 100644 index 000000000..f89e6a7a4 --- /dev/null +++ b/src/ParaMEDMEM/OverlapDEC.hxx @@ -0,0 +1,60 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// Author : Anthony Geay (CEA/DEN) + +#ifndef __OVERLAPDEC_HXX__ +#define __OVERLAPDEC_HXX__ + +#include "DEC.hxx" +#include "InterpolationOptions.hxx" + +#include + +namespace ParaMEDMEM +{ + class OverlapInterpolationMatrix; + class ProcessorGroup; + class ParaFIELD; + + class OverlapDEC : public DEC, public INTERP_KERNEL::InterpolationOptions + { + public: + OverlapDEC(const std::set& procIds,const MPI_Comm& world_comm=MPI_COMM_WORLD); + virtual ~OverlapDEC(); + void sendRecvData(bool way=true); + void sendData(); + void recvData(); + void synchronize(); + void attachSourceLocalField(ParaFIELD *field, bool ownPt=false); + void attachTargetLocalField(ParaFIELD *field, bool ownPt=false); + ProcessorGroup *getGrp() { return _group; } + bool isInGroup() const; + private: + bool _own_group; + OverlapInterpolationMatrix* _interpolation_matrix; + ProcessorGroup *_group; + private: + ParaFIELD *_source_field; + bool _own_source_field; + ParaFIELD *_target_field; + bool _own_target_field; + }; +} + +#endif diff --git a/src/ParaMEDMEM/OverlapElementLocator.cxx b/src/ParaMEDMEM/OverlapElementLocator.cxx new file mode 100644 index 000000000..51560e145 --- /dev/null +++ b/src/ParaMEDMEM/OverlapElementLocator.cxx @@ -0,0 +1,369 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// Author : Anthony Geay (CEA/DEN) + +#include "OverlapElementLocator.hxx" + +#include "CommInterface.hxx" +#include "Topology.hxx" +#include "BlockTopology.hxx" +#include "ParaFIELD.hxx" +#include "ParaMESH.hxx" +#include "ProcessorGroup.hxx" +#include "MPIProcessorGroup.hxx" +#include "OverlapInterpolationMatrix.hxx" +#include "MEDCouplingFieldDouble.hxx" +#include "MEDCouplingFieldDiscretization.hxx" +#include "DirectedBoundingBox.hxx" +#include "InterpKernelAutoPtr.hxx" + +#include + +using namespace std; + +namespace ParaMEDMEM +{ + OverlapElementLocator::OverlapElementLocator(const ParaFIELD *sourceField, const ParaFIELD *targetField, const ProcessorGroup& group) + : _local_source_field(sourceField), + _local_target_field(targetField), + _local_source_mesh(0), + _local_target_mesh(0), + _domain_bounding_boxes(0), + _group(group) + { + if(_local_source_field) + _local_source_mesh=_local_source_field->getSupport()->getCellMesh(); + if(_local_target_field) + _local_target_mesh=_local_target_field->getSupport()->getCellMesh(); + _comm=getCommunicator(); + computeBoundingBoxes(); + } + + OverlapElementLocator::~OverlapElementLocator() + { + delete [] _domain_bounding_boxes; + } + + const MPI_Comm *OverlapElementLocator::getCommunicator() const + { + const MPIProcessorGroup* group=static_cast(&_group); + return group->getComm(); + } + + void OverlapElementLocator::computeBoundingBoxes() + { + CommInterface comm_interface=_group.getCommInterface(); + const MPIProcessorGroup* group=static_cast (&_group); + _local_space_dim=0; + if(_local_source_mesh) + _local_space_dim=_local_source_mesh->getSpaceDimension(); + else + _local_space_dim=_local_target_mesh->getSpaceDimension(); + // + const MPI_Comm* comm = group->getComm(); + int bbSize=2*2*_local_space_dim;//2 (for source/target) 2 (min/max) + _domain_bounding_boxes=new double[bbSize*_group.size()]; + INTERP_KERNEL::AutoPtr minmax=new double[bbSize]; + //Format minmax : Xmin_src,Xmax_src,Ymin_src,Ymax_src,Zmin_src,Zmax_src,Xmin_trg,Xmax_trg,Ymin_trg,Ymax_trg,Zmin_trg,Zmax_trg + if(_local_source_mesh) + _local_source_mesh->getBoundingBox(minmax); + else + { + for(int i=0;i<_local_space_dim;i++) + { + minmax[i*2]=std::numeric_limits::max(); + minmax[i*2+1]=-std::numeric_limits::max(); + } + } + if(_local_target_mesh) + _local_target_mesh->getBoundingBox(minmax+2*_local_space_dim); + else + { + for(int i=0;i<_local_space_dim;i++) + { + minmax[i*2+2*_local_space_dim]=std::numeric_limits::max(); + minmax[i*2+1+2*_local_space_dim]=-std::numeric_limits::max(); + } + } + comm_interface.allGather(minmax, bbSize, MPI_DOUBLE, + _domain_bounding_boxes,bbSize, MPI_DOUBLE, + *comm); + + // Computation of all pairs needing an interpolation pairs are duplicated now ! + + _proc_pairs.clear();//first is source second is target + _proc_pairs.resize(_group.size()); + for(int i=0;i<_group.size();i++) + for(int j=0;j<_group.size();j++) + { + if(intersectsBoundingBox(i,j)) + _proc_pairs[i].push_back(j); + } + + // OK now let's assigning as balanced as possible, job to each proc of group + std::vector< std::vector< std::pair > > pairsToBeDonePerProc(_group.size()); + int i=0; + for(std::vector< std::vector< int > >::const_iterator it1=_proc_pairs.begin();it1!=_proc_pairs.end();it1++,i++) + for(std::vector< int >::const_iterator it2=(*it1).begin();it2!=(*it1).end();it2++) + { + if(pairsToBeDonePerProc[i].size()<=pairsToBeDonePerProc[*it2].size())//it includes the fact that i==*it2 + pairsToBeDonePerProc[i].push_back(std::pair(i,*it2)); + else + pairsToBeDonePerProc[*it2].push_back(std::pair(i,*it2)); + } + //Keeping todo list of current proc. _to_do_list contains a set of pair where at least _group.myRank() appears once. + //This proc will be in charge to perform interpolation of any of element of '_to_do_list' + //If _group.myRank()==myPair.first, current proc should fetch target mesh of myPair.second (if different from _group.myRank()). + //If _group.myRank()==myPair.second, current proc should fetch source mesh of myPair.second. + + int myProcId=_group.myRank(); + _to_do_list=pairsToBeDonePerProc[myProcId]; + + //Feeding now '_procs_to_send'. A same id can appears twice. The second parameter in pair means what to send true=source, false=target + _procs_to_send.clear(); + for(int i=_group.size()-1;i>=0;i--) + if(i!=myProcId) + { + const std::vector< std::pair >& anRemoteProcToDoList=pairsToBeDonePerProc[i]; + for(std::vector< std::pair >::const_iterator it=anRemoteProcToDoList.begin();it!=anRemoteProcToDoList.end();it++) + { + if((*it).first==myProcId) + _procs_to_send.push_back(std::pair(i,true)); + if((*it).second==myProcId) + _procs_to_send.push_back(std::pair(i,false)); + } + } + } + + /*! + * The aim of this method is to perform the communication to get data corresponding to '_to_do_list' attribute. + * The principle is the following : if proc n1 and n2 need to perform a cross sending with n1 > toDoListForFetchRemaining; + for(std::vector< std::pair >::const_iterator it=_to_do_list.begin();it!=_to_do_list.end();it++) + { + if((*it).first!=(*it).second) + { + if((*it).first==myProcId) + { + if((*it).second((*it).first,(*it).second)); + } + else + {//(*it).second==myProcId + if((*it).first((*it).first,(*it).second)); + } + } + } + //sending source or target mesh to remote procs + for(std::vector< std::pair >::const_iterator it2=_procs_to_send.begin();it2!=_procs_to_send.end();it2++) + sendLocalMeshTo((*it2).first,(*it2).second,matrix); + //fetching remaining meshes + for(std::vector< std::pair >::const_iterator it=toDoListForFetchRemaining.begin();it!=toDoListForFetchRemaining.end();it++) + { + if((*it).first!=(*it).second) + { + if((*it).first==myProcId) + receiveRemoteMesh((*it).second,false); + else//(*it).second==myProcId + receiveRemoteMesh((*it).first,true); + } + } + } + + std::string OverlapElementLocator::getSourceMethod() const + { + return _local_source_field->getField()->getDiscretization()->getStringRepr(); + } + + std::string OverlapElementLocator::getTargetMethod() const + { + return _local_target_field->getField()->getDiscretization()->getStringRepr(); + } + + const MEDCouplingPointSet *OverlapElementLocator::getSourceMesh(int procId) const + { + int myProcId=_group.myRank(); + if(myProcId==procId) + return _local_source_mesh; + std::pair p(procId,true); + std::map, MEDCouplingAutoRefCountObjectPtr< MEDCouplingPointSet > >::const_iterator it=_remote_meshes.find(p); + return (*it).second; + } + + const DataArrayInt *OverlapElementLocator::getSourceIds(int procId) const + { + int myProcId=_group.myRank(); + if(myProcId==procId) + return 0; + std::pair p(procId,true); + std::map, MEDCouplingAutoRefCountObjectPtr< DataArrayInt > >::const_iterator it=_remote_elems.find(p); + return (*it).second; + } + + const MEDCouplingPointSet *OverlapElementLocator::getTargetMesh(int procId) const + { + int myProcId=_group.myRank(); + if(myProcId==procId) + return _local_target_mesh; + std::pair p(procId,false); + std::map, MEDCouplingAutoRefCountObjectPtr< MEDCouplingPointSet > >::const_iterator it=_remote_meshes.find(p); + return (*it).second; + } + + const DataArrayInt *OverlapElementLocator::getTargetIds(int procId) const + { + int myProcId=_group.myRank(); + if(myProcId==procId) + return 0; + std::pair p(procId,false); + std::map, MEDCouplingAutoRefCountObjectPtr< DataArrayInt > >::const_iterator it=_remote_elems.find(p); + return (*it).second; + } + + bool OverlapElementLocator::intersectsBoundingBox(int isource, int itarget) const + { + const double *source_bb=_domain_bounding_boxes+isource*2*2*_local_space_dim; + const double *target_bb=_domain_bounding_boxes+itarget*2*2*_local_space_dim+2*_local_space_dim; + + for (int idim=0; idim < _local_space_dim; idim++) + { + const double eps = -1e-12;//tony to change + bool intersects = (target_bb[idim*2] elems=local_mesh->getCellsInBoundingBox(distant_bb,getBoundingBoxAdjustment()); + DataArrayInt *idsToSend; + MEDCouplingPointSet *send_mesh=static_cast(field->getField()->buildSubMeshData(elems->begin(),elems->end(),idsToSend)); + if(sourceOrTarget) + matrix.keepTracksOfSourceIds(procId,idsToSend);//Case#1 in Step2 of main algorithm. + else + matrix.keepTracksOfTargetIds(procId,idsToSend);//Case#0 in Step2 of main algorithm. + sendMesh(procId,send_mesh,idsToSend); + send_mesh->decrRef(); + idsToSend->decrRef(); + } + + /*! + * This method recieves source remote mesh on proc 'procId' if sourceOrTarget==True + * This method recieves target remote mesh on proc 'procId' if sourceOrTarget==False + */ + void OverlapElementLocator::receiveRemoteMesh(int procId, bool sourceOrTarget) + { + DataArrayInt *da=0; + MEDCouplingPointSet *m=0; + receiveMesh(procId,m,da); + std::pair p(procId,sourceOrTarget); + _remote_meshes[p]=m; + _remote_elems[p]=da; + } + + void OverlapElementLocator::sendMesh(int procId, const MEDCouplingPointSet *mesh, const DataArrayInt *idsToSend) const + { + CommInterface comInterface=_group.getCommInterface(); + // First stage : exchanging sizes + vector tinyInfoLocalD;//tinyInfoLocalD not used for the moment + vector tinyInfoLocal; + vector tinyInfoLocalS; + mesh->getTinySerializationInformation(tinyInfoLocalD,tinyInfoLocal,tinyInfoLocalS); + const MPI_Comm *comm=getCommunicator(); + // + int lgth[2]; + lgth[0]=tinyInfoLocal.size(); + lgth[1]=idsToSend->getNbOfElems(); + comInterface.send(&lgth,2,MPI_INT,procId,1140,*_comm); + comInterface.send(&tinyInfoLocal[0],tinyInfoLocal.size(),MPI_INT,procId,1141,*comm); + // + DataArrayInt *v1Local=0; + DataArrayDouble *v2Local=0; + mesh->serialize(v1Local,v2Local); + comInterface.send(v1Local->getPointer(),v1Local->getNbOfElems(),MPI_INT,procId,1142,*comm); + comInterface.send(v2Local->getPointer(),v2Local->getNbOfElems(),MPI_DOUBLE,procId,1143,*comm); + //finished for mesh, ids now + comInterface.send(const_cast(idsToSend->getConstPointer()),lgth[1],MPI_INT,procId,1144,*comm); + // + v1Local->decrRef(); + v2Local->decrRef(); + } + + void OverlapElementLocator::receiveMesh(int procId, MEDCouplingPointSet* &mesh, DataArrayInt *&ids) const + { + int lgth[2]; + MPI_Status status; + const MPI_Comm *comm=getCommunicator(); + CommInterface comInterface=_group.getCommInterface(); + comInterface.recv(lgth,2,MPI_INT,procId,1140,*_comm,&status); + std::vector tinyInfoDistant(lgth[0]); + ids=DataArrayInt::New(); + ids->alloc(lgth[1],1); + comInterface.recv(&tinyInfoDistant[0],lgth[0],MPI_INT,procId,1141,*comm,&status); + mesh=MEDCouplingPointSet::BuildInstanceFromMeshType((MEDCouplingMeshType)tinyInfoDistant[0]); + std::vector unusedTinyDistantSts; + vector tinyInfoDistantD(1);//tinyInfoDistantD not used for the moment + DataArrayInt *v1Distant=DataArrayInt::New(); + DataArrayDouble *v2Distant=DataArrayDouble::New(); + mesh->resizeForUnserialization(tinyInfoDistant,v1Distant,v2Distant,unusedTinyDistantSts); + comInterface.recv(v1Distant->getPointer(),v1Distant->getNbOfElems(),MPI_INT,procId,1142,*comm,&status); + comInterface.recv(v2Distant->getPointer(),v2Distant->getNbOfElems(),MPI_DOUBLE,procId,1143,*comm,&status); + mesh->unserialization(tinyInfoDistantD,tinyInfoDistant,v1Distant,v2Distant,unusedTinyDistantSts); + //finished for mesh, ids now + comInterface.recv(ids->getPointer(),lgth[1],MPI_INT,procId,1144,*comm,&status); + // + v1Distant->decrRef(); + v2Distant->decrRef(); + } +} diff --git a/src/ParaMEDMEM/OverlapElementLocator.hxx b/src/ParaMEDMEM/OverlapElementLocator.hxx new file mode 100644 index 000000000..13a94c821 --- /dev/null +++ b/src/ParaMEDMEM/OverlapElementLocator.hxx @@ -0,0 +1,92 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// Author : Anthony Geay (CEA/DEN) + +#ifndef __OVERLAPELEMENTLOCATOR_HXX__ +#define __OVERLAPELEMENTLOCATOR_HXX__ + +#include "InterpolationOptions.hxx" +#include "MEDCouplingNatureOfField.hxx" +#include "MEDCouplingPointSet.hxx" +#include "MEDCouplingMemArray.hxx" +#include "MEDCouplingAutoRefCountObjectPtr.hxx" + +#include +#include +#include +#include + +namespace ParaMEDMEM +{ + class ParaFIELD; + class ProcessorGroup; + class ParaSUPPORT; + class OverlapInterpolationMatrix; + + class OverlapElementLocator : public INTERP_KERNEL::InterpolationOptions + { + public: + OverlapElementLocator(const ParaFIELD *sourceField, const ParaFIELD *targetField, const ProcessorGroup& group); + virtual ~OverlapElementLocator(); + const MPI_Comm *getCommunicator() const; + void exchangeMeshes(OverlapInterpolationMatrix& matrix); + std::vector< std::pair > getToDoList() const { return _to_do_list; } + std::vector< std::vector< int > > getProcsInInteraction() const { return _proc_pairs; } + std::string getSourceMethod() const; + std::string getTargetMethod() const; + const MEDCouplingPointSet *getSourceMesh(int procId) const; + const DataArrayInt *getSourceIds(int procId) const; + const MEDCouplingPointSet *getTargetMesh(int procId) const; + const DataArrayInt *getTargetIds(int procId) const; + private: + void computeBoundingBoxes(); + bool intersectsBoundingBox(int i, int j) const; + void sendLocalMeshTo(int procId, bool sourceOrTarget, OverlapInterpolationMatrix& matrix) const; + void receiveRemoteMesh(int procId, bool sourceOrTarget); + void sendMesh(int procId, const MEDCouplingPointSet *mesh, const DataArrayInt *idsToSend) const; + void receiveMesh(int procId, MEDCouplingPointSet* &mesh, DataArrayInt *&ids) const; + private: + const ParaFIELD *_local_source_field; + const ParaFIELD *_local_target_field; + int _local_space_dim; + MEDCouplingPointSet *_local_source_mesh; + MEDCouplingPointSet *_local_target_mesh; + std::vector _distant_cell_meshes; + std::vector _distant_face_meshes; + //! of size _group.size(). Contains for each source proc i, the ids of proc j the targets interact with. This vector is common for all procs in _group. + std::vector< std::vector< int > > _proc_pairs; + //! list of interpolations couple to be done + std::vector< std::pair > _to_do_list; + std::vector< std::pair > _procs_to_send; + std::map, MEDCouplingAutoRefCountObjectPtr< MEDCouplingPointSet > > _remote_meshes; + std::map, MEDCouplingAutoRefCountObjectPtr< DataArrayInt > > _remote_elems; + double* _domain_bounding_boxes; + const ProcessorGroup& _group; + std::vector _distant_proc_ids; + const MPI_Comm *_comm; + //Attributes only used by lazy side + //std::vector _values_added; + //std::vector< std::vector > _ids_per_working_proc; + //std::vector< std::vector > _ids_per_working_proc3; + //std::vector< std::vector > _values_per_working_proc; + }; + +} + +#endif diff --git a/src/ParaMEDMEM/OverlapInterpolationMatrix.cxx b/src/ParaMEDMEM/OverlapInterpolationMatrix.cxx new file mode 100644 index 000000000..b57541bb8 --- /dev/null +++ b/src/ParaMEDMEM/OverlapInterpolationMatrix.cxx @@ -0,0 +1,315 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// Author : Anthony Geay (CEA/DEN) + +#include "OverlapInterpolationMatrix.hxx" +#include "ParaMESH.hxx" +#include "ParaFIELD.hxx" +#include "ProcessorGroup.hxx" +#include "TranslationRotationMatrix.hxx" +#include "Interpolation.hxx" +#include "Interpolation1D.txx" +#include "Interpolation2DCurve.hxx" +#include "Interpolation2D.txx" +#include "Interpolation3DSurf.hxx" +#include "Interpolation3D.txx" +#include "Interpolation3D2D.txx" +#include "Interpolation2D1D.txx" +#include "MEDCouplingUMesh.hxx" +#include "MEDCouplingNormalizedUnstructuredMesh.txx" +#include "InterpolationOptions.hxx" +#include "NormalizedUnstructuredMesh.hxx" +#include "ElementLocator.hxx" +#include "InterpKernelAutoPtr.hxx" + +#include + +using namespace std; + +namespace ParaMEDMEM +{ + OverlapInterpolationMatrix::OverlapInterpolationMatrix(ParaFIELD *source_field, + ParaFIELD *target_field, + const ProcessorGroup& group, + const DECOptions& dec_options, + const INTERP_KERNEL::InterpolationOptions& i_opt): + INTERP_KERNEL::InterpolationOptions(i_opt), + DECOptions(dec_options), + _source_field(source_field), + _target_field(target_field), + _source_support(source_field->getSupport()->getCellMesh()), + _target_support(target_field->getSupport()->getCellMesh()), + _mapping(group), + _group(group) + { + int nbelems = source_field->getField()->getNumberOfTuples(); + _row_offsets.resize(nbelems+1); + _coeffs.resize(nbelems); + _target_volume.resize(nbelems); + } + + void OverlapInterpolationMatrix::keepTracksOfSourceIds(int procId, DataArrayInt *ids) + { + _mapping.keepTracksOfSourceIds(procId,ids); + } + + void OverlapInterpolationMatrix::keepTracksOfTargetIds(int procId, DataArrayInt *ids) + { + _mapping.keepTracksOfTargetIds(procId,ids); + } + + OverlapInterpolationMatrix::~OverlapInterpolationMatrix() + { + } + + void OverlapInterpolationMatrix::addContribution(const MEDCouplingPointSet *src, const DataArrayInt *srcIds, const std::string& srcMeth, int srcProcId, + const MEDCouplingPointSet *trg, const DataArrayInt *trgIds, const std::string& trgMeth, int trgProcId) + { + std::string interpMethod(srcMeth); + interpMethod+=trgMeth; + //creating the interpolator structure + vector > surfaces; + int colSize=0; + //computation of the intersection volumes between source and target elements + const MEDCouplingUMesh *trgC=dynamic_cast(trg); + const MEDCouplingUMesh *srcC=dynamic_cast(src); + if ( src->getMeshDimension() == -1 ) + { + if(trgC->getMeshDimension()==2 && trgC->getSpaceDimension()==2) + { + MEDCouplingNormalizedUnstructuredMesh<2,2> target_mesh_wrapper(trgC); + INTERP_KERNEL::Interpolation2D interpolation(*this); + colSize=interpolation.fromIntegralUniform(target_mesh_wrapper,surfaces,trgMeth); + } + else if(trgC->getMeshDimension()==3 && trgC->getSpaceDimension()==3) + { + MEDCouplingNormalizedUnstructuredMesh<3,3> target_mesh_wrapper(trgC); + INTERP_KERNEL::Interpolation3D interpolation(*this); + colSize=interpolation.fromIntegralUniform(target_mesh_wrapper,surfaces,trgMeth); + } + else if(trgC->getMeshDimension()==2 && trgC->getSpaceDimension()==3) + { + MEDCouplingNormalizedUnstructuredMesh<3,2> target_mesh_wrapper(trgC); + INTERP_KERNEL::Interpolation3DSurf interpolation(*this); + colSize=interpolation.fromIntegralUniform(target_mesh_wrapper,surfaces,trgMeth); + } + else + throw INTERP_KERNEL::Exception("No para interpolation available for the given mesh and space dimension of source mesh to -1D targetMesh"); + } + else if ( trg->getMeshDimension() == -1 ) + { + if(srcC->getMeshDimension()==2 && srcC->getSpaceDimension()==2) + { + MEDCouplingNormalizedUnstructuredMesh<2,2> local_mesh_wrapper(srcC); + INTERP_KERNEL::Interpolation2D interpolation(*this); + colSize=interpolation.toIntegralUniform(local_mesh_wrapper,surfaces,srcMeth); + } + else if(srcC->getMeshDimension()==3 && srcC->getSpaceDimension()==3) + { + MEDCouplingNormalizedUnstructuredMesh<3,3> local_mesh_wrapper(srcC); + INTERP_KERNEL::Interpolation3D interpolation(*this); + colSize=interpolation.toIntegralUniform(local_mesh_wrapper,surfaces,srcMeth); + } + else if(srcC->getMeshDimension()==2 && srcC->getSpaceDimension()==3) + { + MEDCouplingNormalizedUnstructuredMesh<3,2> local_mesh_wrapper(srcC); + INTERP_KERNEL::Interpolation3DSurf interpolation(*this); + colSize=interpolation.toIntegralUniform(local_mesh_wrapper,surfaces,srcMeth); + } + else + throw INTERP_KERNEL::Exception("No para interpolation available for the given mesh and space dimension of distant mesh to -1D sourceMesh"); + } + else if ( src->getMeshDimension() == 2 && trg->getMeshDimension() == 3 + && trg->getSpaceDimension() == 3 && src->getSpaceDimension() == 3 ) + { + MEDCouplingNormalizedUnstructuredMesh<3,3> target_wrapper(trgC); + MEDCouplingNormalizedUnstructuredMesh<3,3> source_wrapper(srcC); + + INTERP_KERNEL::Interpolation3D2D interpolator (*this); + colSize=interpolator.interpolateMeshes(source_wrapper,target_wrapper,surfaces,interpMethod); + target_wrapper.releaseTempArrays(); + source_wrapper.releaseTempArrays(); + } + else if ( src->getMeshDimension() == 3 && trg->getMeshDimension() == 2 + && trg->getSpaceDimension() == 3 && src->getSpaceDimension() == 3 ) + { + MEDCouplingNormalizedUnstructuredMesh<3,3> target_wrapper(trgC); + MEDCouplingNormalizedUnstructuredMesh<3,3> source_wrapper(srcC); + + INTERP_KERNEL::Interpolation3D2D interpolator (*this); + vector > surfacesTranspose; + colSize=interpolator.interpolateMeshes(target_wrapper,source_wrapper,surfaces,interpMethod);//not a bug target in source. + TransposeMatrix(surfacesTranspose,colSize,surfaces); + colSize=surfacesTranspose.size(); + target_wrapper.releaseTempArrays(); + source_wrapper.releaseTempArrays(); + } + else if ( src->getMeshDimension() == 1 && trg->getMeshDimension() == 2 + && trg->getSpaceDimension() == 2 && src->getSpaceDimension() == 2 ) + { + MEDCouplingNormalizedUnstructuredMesh<2,2> target_wrapper(trgC); + MEDCouplingNormalizedUnstructuredMesh<2,2> source_wrapper(srcC); + + INTERP_KERNEL::Interpolation2D1D interpolator (*this); + colSize=interpolator.interpolateMeshes(source_wrapper,target_wrapper,surfaces,interpMethod); + target_wrapper.releaseTempArrays(); + source_wrapper.releaseTempArrays(); + } + else if ( src->getMeshDimension() == 2 && trg->getMeshDimension() == 1 + && trg->getSpaceDimension() == 2 && src->getSpaceDimension() == 2 ) + { + MEDCouplingNormalizedUnstructuredMesh<2,2> target_wrapper(trgC); + MEDCouplingNormalizedUnstructuredMesh<2,2> source_wrapper(srcC); + + INTERP_KERNEL::Interpolation2D1D interpolator (*this); + vector > surfacesTranspose; + colSize=interpolator.interpolateMeshes(target_wrapper,source_wrapper,surfacesTranspose,interpMethod);//not a bug target in source. + TransposeMatrix(surfacesTranspose,colSize,surfaces); + colSize=surfacesTranspose.size(); + target_wrapper.releaseTempArrays(); + source_wrapper.releaseTempArrays(); + } + else if (trg->getMeshDimension() != _source_support->getMeshDimension()) + { + throw INTERP_KERNEL::Exception("local and distant meshes do not have the same space and mesh dimensions"); + } + else if( src->getMeshDimension() == 1 + && src->getSpaceDimension() == 1 ) + { + MEDCouplingNormalizedUnstructuredMesh<1,1> target_wrapper(trgC); + MEDCouplingNormalizedUnstructuredMesh<1,1> source_wrapper(srcC); + + INTERP_KERNEL::Interpolation1D interpolation(*this); + colSize=interpolation.interpolateMeshes(source_wrapper,target_wrapper,surfaces,interpMethod); + target_wrapper.releaseTempArrays(); + source_wrapper.releaseTempArrays(); + } + else if( trg->getMeshDimension() == 1 + && trg->getSpaceDimension() == 2 ) + { + MEDCouplingNormalizedUnstructuredMesh<2,1> target_wrapper(trgC); + MEDCouplingNormalizedUnstructuredMesh<2,1> source_wrapper(srcC); + + INTERP_KERNEL::Interpolation2DCurve interpolation(*this); + colSize=interpolation.interpolateMeshes(source_wrapper,target_wrapper,surfaces,interpMethod); + target_wrapper.releaseTempArrays(); + source_wrapper.releaseTempArrays(); + } + else if ( trg->getMeshDimension() == 2 + && trg->getSpaceDimension() == 3 ) + { + MEDCouplingNormalizedUnstructuredMesh<3,2> target_wrapper(trgC); + MEDCouplingNormalizedUnstructuredMesh<3,2> source_wrapper(srcC); + + INTERP_KERNEL::Interpolation3DSurf interpolator (*this); + colSize=interpolator.interpolateMeshes(source_wrapper,target_wrapper,surfaces,interpMethod); + target_wrapper.releaseTempArrays(); + source_wrapper.releaseTempArrays(); + } + else if ( trg->getMeshDimension() == 2 + && trg->getSpaceDimension() == 2) + { + MEDCouplingNormalizedUnstructuredMesh<2,2> target_wrapper(trgC); + MEDCouplingNormalizedUnstructuredMesh<2,2> source_wrapper(srcC); + + INTERP_KERNEL::Interpolation2D interpolator (*this); + colSize=interpolator.interpolateMeshes(source_wrapper,target_wrapper,surfaces,interpMethod); + target_wrapper.releaseTempArrays(); + source_wrapper.releaseTempArrays(); + } + else if ( trg->getMeshDimension() == 3 + && trg->getSpaceDimension() == 3 ) + { + MEDCouplingNormalizedUnstructuredMesh<3,3> target_wrapper(trgC); + MEDCouplingNormalizedUnstructuredMesh<3,3> source_wrapper(srcC); + + INTERP_KERNEL::Interpolation3D interpolator (*this); + colSize=interpolator.interpolateMeshes(source_wrapper,target_wrapper,surfaces,interpMethod); + target_wrapper.releaseTempArrays(); + source_wrapper.releaseTempArrays(); + } + else + { + throw INTERP_KERNEL::Exception("no interpolator exists for these mesh and space dimensions "); + } + bool needSourceSurf=isSurfaceComputationNeeded(srcMeth); + MEDCouplingFieldDouble *source_triangle_surf=0; + if(needSourceSurf) + source_triangle_surf=src->getMeasureField(getMeasureAbsStatus()); + // + fillDistributedMatrix(surfaces,srcIds,srcProcId,trgIds,trgProcId); + // + if(needSourceSurf) + source_triangle_surf->decrRef(); + } + + /*! + * \b res rows refers to target and column (first param of map) to source. + */ + void OverlapInterpolationMatrix::fillDistributedMatrix(const std::vector< std::map >& res, + const DataArrayInt *srcIds, int srcProc, + const DataArrayInt *trgIds, int trgProc) + { + _mapping.addContributionST(res,srcIds,srcProc,trgIds,trgProc); + } + + /*! + * 'procsInInteraction' gives the global view of interaction between procs. + * In 'procsInInteraction' for a proc with id i, is in interaction with procs listed in procsInInteraction[i] + */ + void OverlapInterpolationMatrix::prepare(const std::vector< std::vector >& procsInInteraction) + { + if(_source_support) + _mapping.prepare(procsInInteraction,_target_field->getField()->getNumberOfTuplesExpected()); + else + _mapping.prepare(procsInInteraction,0); + } + + void OverlapInterpolationMatrix::computeDeno() + { + if(_target_field->getField()->getNature()==ConservativeVolumic) + _mapping.computeDenoConservativeVolumic(_target_field->getField()->getNumberOfTuplesExpected()); + else + throw INTERP_KERNEL::Exception("Policy Not implemented yet : only ConservativeVolumic defined !"); + } + + void OverlapInterpolationMatrix::multiply() + { + _mapping.multiply(_source_field->getField(),_target_field->getField()); + } + + void OverlapInterpolationMatrix::transposeMultiply() + { + _mapping.transposeMultiply(_target_field->getField(),_source_field->getField()); + } + + bool OverlapInterpolationMatrix::isSurfaceComputationNeeded(const std::string& method) const + { + return method=="P0"; + } + + void OverlapInterpolationMatrix::TransposeMatrix(const std::vector >& matIn, int nbColsMatIn, std::vector >& matOut) + { + matOut.resize(nbColsMatIn); + int id=0; + for(std::vector >::const_iterator iter1=matIn.begin();iter1!=matIn.end();iter1++,id++) + for(std::map::const_iterator iter2=(*iter1).begin();iter2!=(*iter1).end();iter2++) + matOut[(*iter2).first][id]=(*iter2).second; + } +} diff --git a/src/ParaMEDMEM/OverlapInterpolationMatrix.hxx b/src/ParaMEDMEM/OverlapInterpolationMatrix.hxx new file mode 100644 index 000000000..514deb8de --- /dev/null +++ b/src/ParaMEDMEM/OverlapInterpolationMatrix.hxx @@ -0,0 +1,126 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// Author : Anthony Geay (CEA/DEN) + +#ifndef __OVERLAPINTERPOLATIONMATRIX_HXX__ +#define __OVERLAPINTERPOLATIONMATRIX_HXX__ + +#include "MPIAccessDEC.hxx" +#include "OverlapMapping.hxx" +#include "InterpolationOptions.hxx" +#include "DECOptions.hxx" + +namespace ParaMEDMEM +{ + class ParaFIELD; + class MEDCouplingPointSet; + + class OverlapInterpolationMatrix : public INTERP_KERNEL::InterpolationOptions, + public DECOptions + { + public: + + OverlapInterpolationMatrix(ParaFIELD *source_field, + ParaFIELD *target_field, + const ProcessorGroup& group, + const DECOptions& dec_opt, + const InterpolationOptions& i_opt); + + void keepTracksOfSourceIds(int procId, DataArrayInt *ids); + + void keepTracksOfTargetIds(int procId, DataArrayInt *ids); + + void addContribution(const MEDCouplingPointSet *src, const DataArrayInt *srcIds, const std::string& srcMeth, int srcProcId, + const MEDCouplingPointSet *trg, const DataArrayInt *trgIds, const std::string& trgMeth, int trgProcId); + + void prepare(const std::vector< std::vector >& procsInInteraction); + + void computeDeno(); + + void multiply(); + + void transposeMultiply(); + + virtual ~OverlapInterpolationMatrix(); +#if 0 + void addContribution(MEDCouplingPointSet& distant_support, int iproc_distant, + const int* distant_elems, const std::string& srcMeth, const std::string& targetMeth); + void finishContributionW(ElementLocator& elementLocator); + void finishContributionL(ElementLocator& elementLocator); + void multiply(MEDCouplingFieldDouble& field) const; + void transposeMultiply(MEDCouplingFieldDouble& field)const; + void prepare(); + int getNbRows() const { return _row_offsets.size(); } + MPIAccessDEC* getAccessDEC() { return _mapping.getAccessDEC(); } + private: + void computeConservVolDenoW(ElementLocator& elementLocator); + void computeIntegralDenoW(ElementLocator& elementLocator); + void computeRevIntegralDenoW(ElementLocator& elementLocator); + void computeGlobConstraintDenoW(ElementLocator& elementLocator); + void computeConservVolDenoL(ElementLocator& elementLocator); + void computeIntegralDenoL(ElementLocator& elementLocator); + void computeRevIntegralDenoL(ElementLocator& elementLocator); + + void computeLocalColSum(std::vector& res) const; + void computeLocalRowSum(const std::vector& distantProcs, std::vector >& resPerProcI, + std::vector >& resPerProcD) const; + void computeGlobalRowSum(ElementLocator& elementLocator, std::vector >& denoStrorage, std::vector >& denoStrorageInv); + void computeGlobalColSum(std::vector >& denoStrorage); + void resizeGlobalColSum(std::vector >& denoStrorage); + void fillDSFromVM(int iproc_distant, const int* distant_elems, const std::vector< std::map >& values, MEDCouplingFieldDouble *surf); + void serializeMe(std::vector< std::vector< std::map > >& data1, std::vector& data2) const; + void initialize(); + void findAdditionnalElements(ElementLocator& elementLocator, std::vector >& elementsToAdd, + const std::vector >& resPerProcI, const std::vector >& globalIdsPartial); + void addGhostElements(const std::vector& distantProcs, const std::vector >& elementsToAdd); + int mergePolicies(const std::vector& policyPartial); + void mergeRowSum(const std::vector< std::vector >& rowsPartialSumD, const std::vector< std::vector >& globalIdsPartial, + std::vector& globalIdsLazySideInteraction, std::vector& sumCorresponding); + void mergeRowSum2(const std::vector< std::vector >& globalIdsPartial, std::vector< std::vector >& rowsPartialSumD, + const std::vector& globalIdsLazySideInteraction, const std::vector& sumCorresponding); + void mergeRowSum3(const std::vector< std::vector >& globalIdsPartial, std::vector< std::vector >& rowsPartialSumD); + void mergeCoeffs(const std::vector& procsInInteraction, const std::vector< std::vector >& rowsPartialSumI, + const std::vector >& globalIdsPartial, std::vector >& denoStrorageInv); + void divideByGlobalRowSum(const std::vector& distantProcs, const std::vector >& resPerProcI, + const std::vector >& resPerProcD, std::vector >& deno); +#endif + private: + bool isSurfaceComputationNeeded(const std::string& method) const; + void fillDistributedMatrix(const std::vector< std::map >& res, + const DataArrayInt *srcIds, int srcProc, + const DataArrayInt *trgIds, int trgProc); + static void TransposeMatrix(const std::vector >& matIn, int nbColsMatIn, std::vector >& matOut); + private: + ParaMEDMEM::ParaFIELD *_source_field; + ParaMEDMEM::ParaFIELD *_target_field; + std::vector _row_offsets; + std::map, int > _col_offsets; + MEDCouplingPointSet *_source_support; + MEDCouplingPointSet *_target_support; + OverlapMapping _mapping; + + const ProcessorGroup& _group; + std::vector< std::vector > _target_volume; + std::vector > > _coeffs; + std::vector > _deno_multiply; + std::vector > _deno_reverse_multiply; + }; +} + +#endif diff --git a/src/ParaMEDMEM/OverlapMapping.cxx b/src/ParaMEDMEM/OverlapMapping.cxx new file mode 100644 index 000000000..abb7a1d1b --- /dev/null +++ b/src/ParaMEDMEM/OverlapMapping.cxx @@ -0,0 +1,673 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// Author : Anthony Geay (CEA/DEN) + +#include "OverlapMapping.hxx" +#include "MPIProcessorGroup.hxx" + +#include "MEDCouplingFieldDouble.hxx" +#include "MEDCouplingAutoRefCountObjectPtr.hxx" + +#include "InterpKernelAutoPtr.hxx" + +#include +#include + +using namespace ParaMEDMEM; + +OverlapMapping::OverlapMapping(const ProcessorGroup& group):_group(group) +{ +} + +/*! + * This method keeps tracks of source ids to know in step 6 of main algorithm, which tuple ids to send away. + * This method incarnates item#1 of step2 algorithm. + */ +void OverlapMapping::keepTracksOfSourceIds(int procId, DataArrayInt *ids) +{ + ids->incrRef(); + _src_ids_st2.push_back(ids); + _src_proc_st2.push_back(procId); +} + +/*! + * This method keeps tracks of target ids to know in step 6 of main algorithm. + * This method incarnates item#0 of step2 algorithm. + */ +void OverlapMapping::keepTracksOfTargetIds(int procId, DataArrayInt *ids) +{ + ids->incrRef(); + _trg_ids_st2.push_back(ids); + _trg_proc_st2.push_back(procId); +} + +/*! + * This method stores from a matrix in format Target(rows)/Source(cols) for a source procId 'srcProcId' and for a target procId 'trgProcId'. + * All ids (source and target) are in format of local ids. + */ +void OverlapMapping::addContributionST(const std::vector< std::map >& matrixST, const DataArrayInt *srcIds, int srcProcId, const DataArrayInt *trgIds, int trgProcId) +{ + _matrixes_st.push_back(matrixST); + _source_proc_id_st.push_back(srcProcId); + _target_proc_id_st.push_back(trgProcId); + if(srcIds) + {//item#1 of step2 algorithm in proc m. Only to know in advanced nb of recv ids [ (0,1) computed on proc1 and Matrix-Vector on proc1 ] + _nb_of_src_ids_proc_st2.push_back(srcIds->getNumberOfTuples()); + _src_ids_proc_st2.push_back(srcProcId); + } + else + {//item#0 of step2 algorithm in proc k + std::set s; + for(std::vector< std::map >::const_iterator it1=matrixST.begin();it1!=matrixST.end();it1++) + for(std::map::const_iterator it2=(*it1).begin();it2!=(*it1).end();it2++) + s.insert((*it2).first); + _src_ids_zip_st2.resize(_src_ids_zip_st2.size()+1); + _src_ids_zip_st2.back().insert(_src_ids_zip_st2.back().end(),s.begin(),s.end()); + _src_ids_zip_proc_st2.push_back(trgProcId); + } +} + +/*! + * 'procsInInteraction' gives the global view of interaction between procs. + * In 'procsInInteraction' for a proc with id i, is in interaction with procs listed in procsInInteraction[i]. + * + * This method is in charge to send matrixes in AlltoAll mode. + * After the call of this method 'this' contains the matrixST for all source elements of the current proc + */ +void OverlapMapping::prepare(const std::vector< std::vector >& procsInInteraction, int nbOfTrgElems) +{ + CommInterface commInterface=_group.getCommInterface(); + const MPIProcessorGroup *group=static_cast(&_group); + const MPI_Comm *comm=group->getComm(); + int grpSize=_group.size(); + INTERP_KERNEL::AutoPtr nbsend=new int[grpSize]; + INTERP_KERNEL::AutoPtr nbsend2=new int[grpSize]; + INTERP_KERNEL::AutoPtr nbsend3=new int[grpSize]; + std::fill(nbsend,nbsend+grpSize,0); + int myProcId=_group.myRank(); + _proc_ids_to_recv_vector_st.clear(); + int curProc=0; + for(std::vector< std::vector >::const_iterator it1=procsInInteraction.begin();it1!=procsInInteraction.end();it1++,curProc++) + if(std::find((*it1).begin(),(*it1).end(),myProcId)!=(*it1).end()) + _proc_ids_to_recv_vector_st.push_back(curProc); + _proc_ids_to_send_vector_st=procsInInteraction[myProcId]; + for(std::size_t i=0;i<_matrixes_st.size();i++) + if(_source_proc_id_st[i]==myProcId) + nbsend[_target_proc_id_st[i]]=_matrixes_st[i].size(); + INTERP_KERNEL::AutoPtr nbrecv=new int[grpSize]; + commInterface.allToAll(nbsend,1,MPI_INT,nbrecv,1,MPI_INT,*comm); + //exchanging matrix + //first exchanging offsets+ids_source + INTERP_KERNEL::AutoPtr nbrecv1=new int[grpSize]; + INTERP_KERNEL::AutoPtr nbrecv2=new int[grpSize]; + // + int *tmp=0; + serializeMatrixStep0ST(nbrecv, + tmp,nbsend2,nbsend3, + nbrecv1,nbrecv2); + INTERP_KERNEL::AutoPtr bigArr=tmp; + INTERP_KERNEL::AutoPtr bigArrRecv=new int[nbrecv2[grpSize-1]+nbrecv1[grpSize-1]]; + commInterface.allToAllV(bigArr,nbsend2,nbsend3,MPI_INT, + bigArrRecv,nbrecv1,nbrecv2,MPI_INT, + *comm);// sending ids of sparse matrix (n+1 elems) + //second phase echange target ids + std::fill(nbsend2,nbsend2+grpSize,0); + INTERP_KERNEL::AutoPtr nbrecv3=new int[grpSize]; + INTERP_KERNEL::AutoPtr nbrecv4=new int[grpSize]; + double *tmp2=0; + int lgthOfArr=serializeMatrixStep1ST(nbrecv,bigArrRecv,nbrecv1,nbrecv2, + tmp,tmp2, + nbsend2,nbsend3,nbrecv3,nbrecv4); + INTERP_KERNEL::AutoPtr bigArr2=tmp; + INTERP_KERNEL::AutoPtr bigArrD2=tmp2; + INTERP_KERNEL::AutoPtr bigArrRecv2=new int[lgthOfArr]; + INTERP_KERNEL::AutoPtr bigArrDRecv2=new double[lgthOfArr]; + commInterface.allToAllV(bigArr2,nbsend2,nbsend3,MPI_INT, + bigArrRecv2,nbrecv3,nbrecv4,MPI_INT, + *comm); + commInterface.allToAllV(bigArrD2,nbsend2,nbsend3,MPI_DOUBLE, + bigArrDRecv2,nbrecv3,nbrecv4,MPI_DOUBLE, + *comm); + //finishing + unserializationST(nbOfTrgElems,nbrecv,bigArrRecv,nbrecv1,nbrecv2, + bigArrRecv2,bigArrDRecv2,nbrecv3,nbrecv4); + //updating _src_ids_zip_st2 and _src_ids_zip_st2 with received matrix. + updateZipSourceIdsForFuture(); + //finish to fill _the_matrix_st with already in place matrix in _matrixes_st + finishToFillFinalMatrixST(); + //printTheMatrix(); +} + +/*! + * Compute denominators. + */ +void OverlapMapping::computeDenoGlobConstraint() +{ + _the_deno_st.clear(); + std::size_t sz1=_the_matrix_st.size(); + _the_deno_st.resize(sz1); + for(std::size_t i=0;i& mToFill=_the_deno_st[i][j]; + const std::map& m=_the_matrix_st[i][j]; + for(std::map::const_iterator it=m.begin();it!=m.end();it++) + sum+=(*it).second; + for(std::map::const_iterator it=m.begin();it!=m.end();it++) + mToFill[(*it).first]=sum; + } + } +} + +/*! + * Compute denominators. + */ +void OverlapMapping::computeDenoConservativeVolumic(int nbOfTuplesTrg) +{ + CommInterface commInterface=_group.getCommInterface(); + int myProcId=_group.myRank(); + // + _the_deno_st.clear(); + std::size_t sz1=_the_matrix_st.size(); + _the_deno_st.resize(sz1); + std::vector deno(nbOfTuplesTrg); + for(std::size_t i=0;i >& mat=_the_matrix_st[i]; + int curSrcId=_the_matrix_st_source_proc_id[i]; + std::vector::iterator isItem1=std::find(_trg_proc_st2.begin(),_trg_proc_st2.end(),curSrcId); + int rowId=0; + if(isItem1==_trg_proc_st2.end() || curSrcId==myProcId)//item1 of step2 main algo. Simple, because rowId of mat are directly target ids. + { + for(std::vector< std::map >::const_iterator it1=mat.begin();it1!=mat.end();it1++,rowId++) + for(std::map::const_iterator it2=(*it1).begin();it2!=(*it1).end();it2++) + deno[rowId]+=(*it2).second; + } + else + {//item0 of step2 main algo. More complicated. + std::vector::iterator fnd=isItem1;//std::find(_trg_proc_st2.begin(),_trg_proc_st2.end(),curSrcId); + int locId=std::distance(_trg_proc_st2.begin(),fnd); + const DataArrayInt *trgIds=_trg_ids_st2[locId]; + const int *trgIds2=trgIds->getConstPointer(); + for(std::vector< std::map >::const_iterator it1=mat.begin();it1!=mat.end();it1++,rowId++) + for(std::map::const_iterator it2=(*it1).begin();it2!=(*it1).end();it2++) + deno[trgIds2[rowId]]+=(*it2).second; + } + } + // + for(std::size_t i=0;i >& mat=_the_matrix_st[i]; + int curSrcId=_the_matrix_st_source_proc_id[i]; + std::vector::iterator isItem1=std::find(_trg_proc_st2.begin(),_trg_proc_st2.end(),curSrcId); + std::vector< std::map >& denoM=_the_deno_st[i]; + denoM.resize(mat.size()); + if(isItem1==_trg_proc_st2.end() || curSrcId==myProcId)//item1 of step2 main algo. Simple, because rowId of mat are directly target ids. + { + int rowId=0; + for(std::vector< std::map >::const_iterator it1=mat.begin();it1!=mat.end();it1++,rowId++) + for(std::map::const_iterator it2=(*it1).begin();it2!=(*it1).end();it2++) + denoM[rowId][(*it2).first]=deno[rowId]; + } + else + { + std::vector::iterator fnd=isItem1; + int locId=std::distance(_trg_proc_st2.begin(),fnd); + const DataArrayInt *trgIds=_trg_ids_st2[locId]; + const int *trgIds2=trgIds->getConstPointer(); + for(std::vector< std::map >::const_iterator it1=mat.begin();it1!=mat.end();it1++,rowId++) + for(std::map::const_iterator it2=(*it1).begin();it2!=(*it1).end();it2++) + denoM[rowId][(*it2).first]=deno[trgIds2[rowId]]; + } + } +} + +/*! + * This method performs step #0/3 in serialization process. + * \param count tells specifies nb of elems to send to corresponding proc id. size equal to _group.size(). + * \param offsets tells for a proc i where to start serialize#0 matrix. size equal to _group.size(). + * \param nbOfElemsSrc of size _group.size(). Comes from previous all2all call. tells how many srcIds per proc contains matrix for current proc. + */ +void OverlapMapping::serializeMatrixStep0ST(const int *nbOfElemsSrc, int *&bigArr, int *count, int *offsets, + int *countForRecv, int *offsetsForRecv) const +{ + int grpSize=_group.size(); + std::fill(count,count+grpSize,0); + int szz=0; + int myProcId=_group.myRank(); + for(std::size_t i=0;i<_matrixes_st.size();i++) + { + if(_source_proc_id_st[i]==myProcId)// && _target_proc_id_st[i]!=myProcId + { + count[_target_proc_id_st[i]]=_matrixes_st[i].size()+1; + szz+=_matrixes_st[i].size()+1; + } + } + bigArr=new int[szz]; + offsets[0]=0; + for(int i=1;i >& mat=_matrixes_st[i]; + for(std::vector< std::map >::const_iterator it=mat.begin();it!=mat.end();it++,work++) + work[1]=work[0]+(*it).size(); + } + } + // + offsetsForRecv[0]=0; + for(int i=0;i0) + countForRecv[i]=nbOfElemsSrc[i]+1; + else + countForRecv[i]=0; + if(i>0) + offsetsForRecv[i]=offsetsForRecv[i-1]+countForRecv[i-1]; + } +} + +/*! + * This method performs step#1 and step#2/3. It returns the size of expected array to get allToAllV. + */ +int OverlapMapping::serializeMatrixStep1ST(const int *nbOfElemsSrc, const int *recvStep0, const int *countStep0, const int *offsStep0, + int *&bigArrI, double *&bigArrD, int *count, int *offsets, + int *countForRecv, int *offsForRecv) const +{ + int grpSize=_group.size(); + int myProcId=_group.myRank(); + offsForRecv[0]=0; + int szz=0; + for(int i=0;i0) + offsForRecv[i]=offsForRecv[i-1]+countForRecv[i-1]; + } + // + std::fill(count,count+grpSize,0); + offsets[0]=0; + int fullLgth=0; + for(std::size_t i=0;i<_matrixes_st.size();i++) + { + if(_source_proc_id_st[i]==myProcId) + { + const std::vector< std::map >& mat=_matrixes_st[i]; + int lgthToSend=0; + for(std::vector< std::map >::const_iterator it=mat.begin();it!=mat.end();it++) + lgthToSend+=(*it).size(); + count[_target_proc_id_st[i]]=lgthToSend; + fullLgth+=lgthToSend; + } + } + for(int i=1;i >& mat=_matrixes_st[i]; + for(std::vector< std::map >::const_iterator it1=mat.begin();it1!=mat.end();it1++) + { + int j=0; + for(std::map::const_iterator it2=(*it1).begin();it2!=(*it1).end();it2++,j++) + { + bigArrI[fullLgth+j]=(*it2).first; + bigArrD[fullLgth+j]=(*it2).second; + } + fullLgth+=(*it1).size(); + } + } + } + return szz; +} + +/*! + * This is the last step after all2Alls for matrix exchange. + * _the_matrix_st is the final matrix : + * - The first entry is srcId in current proc. + * - The second is the pseudo id of source proc (correspondance with true id is in attribute _the_matrix_st_source_proc_id and _the_matrix_st_source_ids) + * - the third is the srcId in the pseudo source proc + */ +void OverlapMapping::unserializationST(int nbOfTrgElems, + const int *nbOfElemsSrcPerProc,//first all2all + const int *bigArrRecv, const int *bigArrRecvCounts, const int *bigArrRecvOffs,//2nd all2all + const int *bigArrRecv2, const double *bigArrDRecv2, const int *bigArrRecv2Count, const int *bigArrRecv2Offs)//3rd and 4th all2alls +{ + _the_matrix_st.clear(); + _the_matrix_st_source_proc_id.clear(); + // + int grpSize=_group.size(); + for(int i=0;i_the_matrix_st' and 'this->_the_matrix_st_target_proc_id' + * and 'this->_the_matrix_st_target_ids'. + * This method finish the job of filling 'this->_the_matrix_st' and 'this->_the_matrix_st_target_proc_id' by putting candidates in 'this->_matrixes_st' into them. + */ +void OverlapMapping::finishToFillFinalMatrixST() +{ + int myProcId=_group.myRank(); + int sz=_matrixes_st.size(); + int nbOfEntryToAdd=0; + for(int i=0;i >& mat=_matrixes_st[i]; + _the_matrix_st[j]=mat; + _the_matrix_st_source_proc_id.push_back(_source_proc_id_st[i]); + j++; + } + _matrixes_st.clear(); +} + +/*! + * This method performs the operation of target ids broadcasting. + */ +void OverlapMapping::prepareIdsToSendST() +{ + CommInterface commInterface=_group.getCommInterface(); + const MPIProcessorGroup *group=static_cast(&_group); + const MPI_Comm *comm=group->getComm(); + int grpSize=_group.size(); + _source_ids_to_send_st.clear(); + _source_ids_to_send_st.resize(grpSize); + INTERP_KERNEL::AutoPtr nbsend=new int[grpSize]; + std::fill(nbsend,nbsend+grpSize,0); + for(std::size_t i=0;i<_the_matrix_st_source_proc_id.size();i++) + nbsend[_the_matrix_st_source_proc_id[i]]=_the_matrix_st_source_ids[i].size(); + INTERP_KERNEL::AutoPtr nbrecv=new int[grpSize]; + commInterface.allToAll(nbsend,1,MPI_INT,nbrecv,1,MPI_INT,*comm); + // + INTERP_KERNEL::AutoPtr nbsend2=new int[grpSize]; + std::copy((int *)nbsend,((int *)nbsend)+grpSize,(int *)nbsend2); + INTERP_KERNEL::AutoPtr nbsend3=new int[grpSize]; + nbsend3[0]=0; + for(int i=1;i bigDataSend=new int[sendSz]; + for(std::size_t i=0;i<_the_matrix_st_source_proc_id.size();i++) + { + int offset=nbsend3[_the_matrix_st_source_proc_id[i]]; + std::copy(_the_matrix_st_source_ids[i].begin(),_the_matrix_st_source_ids[i].end(),((int *)nbsend3)+offset); + } + INTERP_KERNEL::AutoPtr nbrecv2=new int[grpSize]; + INTERP_KERNEL::AutoPtr nbrecv3=new int[grpSize]; + std::copy((int *)nbrecv,((int *)nbrecv)+grpSize,(int *)nbrecv2); + nbrecv3[0]=0; + for(int i=1;i bigDataRecv=new int[recvSz]; + // + commInterface.allToAllV(bigDataSend,nbsend2,nbsend3,MPI_INT, + bigDataRecv,nbrecv2,nbrecv3,MPI_INT, + *comm); + for(int i=0;i0) + { + _source_ids_to_send_st[i].insert(_source_ids_to_send_st[i].end(),((int *)bigDataRecv)+nbrecv3[i],((int *)bigDataRecv)+nbrecv3[i]+nbrecv2[i]); + } + } +} + +/*! + * This method performs a transpose multiply of 'fieldInput' and put the result into 'fieldOutput'. + * 'fieldInput' is expected to be the sourcefield and 'fieldOutput' the targetfield. + */ +void OverlapMapping::multiply(const MEDCouplingFieldDouble *fieldInput, MEDCouplingFieldDouble *fieldOutput) const +{ + int nbOfCompo=fieldInput->getNumberOfComponents();//to improve same number of components to test + CommInterface commInterface=_group.getCommInterface(); + const MPIProcessorGroup *group=static_cast(&_group); + const MPI_Comm *comm=group->getComm(); + int grpSize=_group.size(); + int myProcId=_group.myRank(); + // + INTERP_KERNEL::AutoPtr nbsend=new int[grpSize]; + INTERP_KERNEL::AutoPtr nbsend2=new int[grpSize]; + INTERP_KERNEL::AutoPtr nbrecv=new int[grpSize]; + INTERP_KERNEL::AutoPtr nbrecv2=new int[grpSize]; + std::fill(nbsend,nbsend+grpSize,0); + std::fill(nbrecv,nbrecv+grpSize,0); + nbsend2[0]=0; + nbrecv2[0]=0; + std::vector valsToSend; + for(int i=0;i::const_iterator isItem1=std::find(_src_proc_st2.begin(),_src_proc_st2.end(),i); + MEDCouplingAutoRefCountObjectPtr vals; + if(isItem1!=_src_proc_st2.end())//item1 of step2 main algo + { + int id=std::distance(_src_proc_st2.begin(),isItem1); + vals=fieldInput->getArray()->selectByTupleId(_src_ids_st2[id]->getConstPointer(),_src_ids_st2[id]->getConstPointer()+_src_ids_st2[id]->getNumberOfTuples()); + } + else + {//item0 of step2 main algo + int id=std::distance(_src_ids_zip_proc_st2.begin(),std::find(_src_ids_zip_proc_st2.begin(),_src_ids_zip_proc_st2.end(),i)); + vals=fieldInput->getArray()->selectByTupleId(&(_src_ids_zip_st2[id])[0],&(_src_ids_zip_st2[id])[0]+_src_ids_zip_st2[id].size()); + } + nbsend[i]=vals->getNbOfElems(); + valsToSend.insert(valsToSend.end(),vals->getConstPointer(),vals->getConstPointer()+nbsend[i]); + } + if(std::find(_proc_ids_to_recv_vector_st.begin(),_proc_ids_to_recv_vector_st.end(),i)!=_proc_ids_to_recv_vector_st.end()) + { + std::vector::const_iterator isItem0=std::find(_trg_proc_st2.begin(),_trg_proc_st2.end(),i); + if(isItem0==_trg_proc_st2.end())//item1 of step2 main algo [ (0,1) computed on proc1 and Matrix-Vector on proc1 ] + { + std::vector::const_iterator it1=std::find(_src_ids_proc_st2.begin(),_src_ids_proc_st2.end(),i); + if(it1!=_src_ids_proc_st2.end()) + { + int id=std::distance(_src_ids_proc_st2.begin(),it1); + nbrecv[i]=_nb_of_src_ids_proc_st2[id]*nbOfCompo; + } + else if(i==myProcId) + { + nbrecv[i]=fieldInput->getNumberOfTuplesExpected()*nbOfCompo; + } + else + throw INTERP_KERNEL::Exception("Plouff ! send email to anthony.geay@cea.fr ! "); + } + else + {//item0 of step2 main algo [ (2,1) computed on proc2 but Matrix-Vector on proc1 ] [(1,0) computed on proc1 but Matrix-Vector on proc0] + int id=std::distance(_src_ids_zip_proc_st2.begin(),std::find(_src_ids_zip_proc_st2.begin(),_src_ids_zip_proc_st2.end(),i)); + nbrecv[i]=_src_ids_zip_st2[id].size()*nbOfCompo; + } + } + } + for(int i=1;i bigArr=new double[nbrecv2[grpSize-1]+nbrecv[grpSize-1]]; + commInterface.allToAllV(&valsToSend[0],nbsend,nbsend2,MPI_DOUBLE, + bigArr,nbrecv,nbrecv2,MPI_DOUBLE,*comm); + fieldOutput->getArray()->fillWithZero(); + INTERP_KERNEL::AutoPtr tmp=new double[nbOfCompo]; + for(int i=0;i0) + { + double *pt=fieldOutput->getArray()->getPointer(); + std::vector::const_iterator it=std::find(_the_matrix_st_source_proc_id.begin(),_the_matrix_st_source_proc_id.end(),i); + if(it==_the_matrix_st_source_proc_id.end()) + throw INTERP_KERNEL::Exception("Big problem !"); + int id=std::distance(_the_matrix_st_source_proc_id.begin(),it); + const std::vector< std::map >& mat=_the_matrix_st[id]; + const std::vector< std::map >& deno=_the_deno_st[id]; + std::vector::const_iterator isItem0=std::find(_trg_proc_st2.begin(),_trg_proc_st2.end(),i); + if(isItem0==_trg_proc_st2.end())//item1 of step2 main algo [ (0,1) computed on proc1 and Matrix-Vector on proc1 ] + { + int nbOfTrgTuples=mat.size(); + for(int j=0;j& mat1=mat[j]; + const std::map& deno1=deno[j]; + std::map::const_iterator it4=deno1.begin(); + for(std::map::const_iterator it3=mat1.begin();it3!=mat1.end();it3++,it4++) + { + std::transform(bigArr+nbrecv2[i]+((*it3).first)*nbOfCompo,bigArr+nbrecv2[i]+((*it3).first+1)*(nbOfCompo),(double *)tmp,std::bind2nd(std::multiplies(),(*it3).second/(*it4).second)); + std::transform((double *)tmp,(double *)tmp+nbOfCompo,pt,pt,std::plus()); + } + } + } + else + {//item0 of step2 main algo [ (2,1) computed on proc2 but Matrix-Vector on proc1 ] + double *pt=fieldOutput->getArray()->getPointer(); + std::map zipCor; + int id=std::distance(_src_ids_zip_proc_st2.begin(),std::find(_src_ids_zip_proc_st2.begin(),_src_ids_zip_proc_st2.end(),i)); + const std::vector zipIds=_src_ids_zip_st2[id]; + int newId=0; + for(std::vector::const_iterator it=zipIds.begin();it!=zipIds.end();it++,newId++) + zipCor[*it]=newId; + int id2=std::distance(_trg_proc_st2.begin(),std::find(_trg_proc_st2.begin(),_trg_proc_st2.end(),i)); + const DataArrayInt *tgrIds=_trg_ids_st2[id2]; + const int *tgrIds2=tgrIds->getConstPointer(); + int nbOfTrgTuples=mat.size(); + for(int j=0;j& mat1=mat[j]; + const std::map& deno1=deno[j]; + std::map::const_iterator it5=deno1.begin(); + for(std::map::const_iterator it3=mat1.begin();it3!=mat1.end();it3++,it5++) + { + std::map::const_iterator it4=zipCor.find((*it3).first); + if(it4==zipCor.end()) + throw INTERP_KERNEL::Exception("Hmmmmm send e mail to anthony.geay@cea.fr !"); + std::transform(bigArr+nbrecv2[i]+((*it4).second)*nbOfCompo,bigArr+nbrecv2[i]+((*it4).second+1)*(nbOfCompo),(double *)tmp,std::bind2nd(std::multiplies(),(*it3).second/(*it5).second)); + std::transform((double *)tmp,(double *)tmp+nbOfCompo,pt+tgrIds2[j]*nbOfCompo,pt+tgrIds2[j]*nbOfCompo,std::plus()); + } + } + } + } + } +} + +/*! + * This method performs a transpose multiply of 'fieldInput' and put the result into 'fieldOutput'. + * 'fieldInput' is expected to be the targetfield and 'fieldOutput' the sourcefield. + */ +void OverlapMapping::transposeMultiply(const MEDCouplingFieldDouble *fieldInput, MEDCouplingFieldDouble *fieldOutput) +{ +} + +/*! + * This method should be called immediately after _the_matrix_st has been filled with remote computed matrix put in this proc for Matrix-Vector. + * This method computes for these matrix the minimal set of source ids corresponding to the source proc id. + */ +void OverlapMapping::updateZipSourceIdsForFuture() +{ + CommInterface commInterface=_group.getCommInterface(); + int myProcId=_group.myRank(); + int nbOfMatrixRecveived=_the_matrix_st_source_proc_id.size(); + for(int i=0;i >& mat=_the_matrix_st[i]; + _src_ids_zip_proc_st2.push_back(curSrcProcId); + _src_ids_zip_st2.resize(_src_ids_zip_st2.size()+1); + std::set s; + for(std::vector< std::map >::const_iterator it1=mat.begin();it1!=mat.end();it1++) + for(std::map::const_iterator it2=(*it1).begin();it2!=(*it1).end();it2++) + s.insert((*it2).first); + _src_ids_zip_st2.back().insert(_src_ids_zip_st2.back().end(),s.begin(),s.end()); + } + } +} + +// #include + +// void OverlapMapping::printTheMatrix() const +// { +// CommInterface commInterface=_group.getCommInterface(); +// const MPIProcessorGroup *group=static_cast(&_group); +// const MPI_Comm *comm=group->getComm(); +// int grpSize=_group.size(); +// int myProcId=_group.myRank(); +// std::cerr << "I am proc #" << myProcId << std::endl; +// int nbOfMat=_the_matrix_st.size(); +// std::cerr << "I do manage " << nbOfMat << "matrix : "<< std::endl; +// for(int i=0;i >& locMat=_the_matrix_st[i]; +// for(std::vector< std::map >::const_iterator it1=locMat.begin();it1!=locMat.end();it1++) +// { +// for(std::map::const_iterator it2=(*it1).begin();it2!=(*it1).end();it2++) +// std::cerr << "(" << (*it2).first << "," << (*it2).second << "), "; +// std::cerr << std::endl; +// } +// } +// std::cerr << "*********" << std::endl; +// } diff --git a/src/ParaMEDMEM/OverlapMapping.hxx b/src/ParaMEDMEM/OverlapMapping.hxx new file mode 100644 index 000000000..952524715 --- /dev/null +++ b/src/ParaMEDMEM/OverlapMapping.hxx @@ -0,0 +1,90 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// Author : Anthony Geay (CEA/DEN) + +#ifndef __OVERLAPMAPPING_HXX__ +#define __OVERLAPMAPPING_HXX__ + +#include "MEDCouplingAutoRefCountObjectPtr.hxx" + +#include +#include + +namespace ParaMEDMEM +{ + class ProcessorGroup; + class DataArrayInt; + class MEDCouplingFieldDouble; + + class OverlapMapping + { + public: + OverlapMapping(const ProcessorGroup& group); + void keepTracksOfSourceIds(int procId, DataArrayInt *ids); + void keepTracksOfTargetIds(int procId, DataArrayInt *ids); + void addContributionST(const std::vector< std::map >& matrixST, const DataArrayInt *srcIds, int srcProcId, const DataArrayInt *trgIds, int trgProcId); + void prepare(const std::vector< std::vector >& procsInInteraction, int nbOfTrgElems); + void computeDenoConservativeVolumic(int nbOfTuplesTrg); + void computeDenoGlobConstraint(); + // + void multiply(const MEDCouplingFieldDouble *fieldInput, MEDCouplingFieldDouble *fieldOutput) const; + void transposeMultiply(const MEDCouplingFieldDouble *fieldInput, MEDCouplingFieldDouble *fieldOutput); + private: + void serializeMatrixStep0ST(const int *nbOfElemsSrc, int *&bigArr, int *count, int *offsets, + int *countForRecv, int *offsetsForRecv) const; + int serializeMatrixStep1ST(const int *nbOfElemsSrc, const int *recvStep0, const int *countStep0, const int *offsStep0, + int *&bigArrI, double *&bigArrD, int *count, int *offsets, + int *countForRecv, int *offsForRecv) const; + void unserializationST(int nbOfTrgElems, const int *nbOfElemsSrcPerProc, const int *bigArrRecv, const int *bigArrRecvCounts, const int *bigArrRecvOffs, + const int *bigArrRecv2, const double *bigArrDRecv2, const int *bigArrRecv2Count, const int *bigArrRecv2Offs); + void finishToFillFinalMatrixST(); + void prepareIdsToSendST(); + void updateZipSourceIdsForFuture(); + //void printTheMatrix() const; + private: + const ProcessorGroup &_group; + //! vector of ids + std::vector< MEDCouplingAutoRefCountObjectPtr > _src_ids_st2;//item #1 + std::vector< int > _src_proc_st2;//item #1 + std::vector< MEDCouplingAutoRefCountObjectPtr > _trg_ids_st2;//item #0 + std::vector< int > _trg_proc_st2;//item #0 + std::vector< int > _nb_of_src_ids_proc_st2;//item #1 + std::vector< int > _src_ids_proc_st2;//item #1 + std::vector< std::vector > _src_ids_zip_st2;//same size as _src_ids_zip_proc_st2. Sorted. specifies for each id the corresponding ids to send. This is for item0 of Step2 of main algorithm + std::vector< int > _src_ids_zip_proc_st2; + //! vector of matrixes the first entry correspond to source proc id in _source_ids_st + std::vector< std::vector< std::map > > _matrixes_st; + std::vector< std::vector > _source_ids_st; + std::vector< int > _source_proc_id_st; + std::vector< std::vector > _target_ids_st; + std::vector< int > _target_proc_id_st; + //! the matrix for matrix-vector product. The first dimension the set of target procs that interacts with local source mesh. The second dimension correspond to nb of local source ids. + std::vector< std::vector< std::map > > _the_matrix_st; + std::vector< int > _the_matrix_st_source_proc_id; + std::vector< std::vector > _the_matrix_st_source_ids; + std::vector< std::vector< std::map > > _the_deno_st; + //! this attribute stores the proc ids that wait for data from this proc ids for matrix-vector computation + std::vector< int > _proc_ids_to_send_vector_st; + std::vector< int > _proc_ids_to_recv_vector_st; + //! this attribute is of size _group.size(); for each procId in _group _source_ids_to_send_st[procId] contains tupleId to send abroad + std::vector< std::vector > _source_ids_to_send_st; + }; +} + +#endif diff --git a/src/ParaMEDMEM/ParaFIELD.cxx b/src/ParaMEDMEM/ParaFIELD.cxx new file mode 100644 index 000000000..f33acf919 --- /dev/null +++ b/src/ParaMEDMEM/ParaFIELD.cxx @@ -0,0 +1,223 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "Topology.hxx" +#include "BlockTopology.hxx" +#include "ComponentTopology.hxx" +#include "ExplicitCoincidentDEC.hxx" +#include "StructuredCoincidentDEC.hxx" +#include "CommInterface.hxx" +#include "ProcessorGroup.hxx" +#include "MPIProcessorGroup.hxx" +#include "ParaFIELD.hxx" +#include "ParaMESH.hxx" +#include "InterpKernelUtilities.hxx" +#include "InterpolationMatrix.hxx" + +#include + +namespace ParaMEDMEM +{ + /*! + \defgroup parafield ParaFIELD + This class encapsulates parallel fields. It basically encapsulates + a MEDCouplingField with extra information related to parallel + topology. + It is most conveniently created by giving a pointer to a MEDCouplingField + object and a \c ProcessorGroup. + By default, a ParaFIELD object will be constructed with all field components + located on the same processors. In some specific cases, it might be necessary to scatter components over several processors. In this case, the constructor + using a ComponentTopology is required. + + @{ */ + + /*! + + \brief Constructing a \c ParaFIELD from a \c ParaSUPPORT and a \c ComponentTopology. + + This constructor creates an empty field based on the ParaSUPPORT description + and the partitioning of components described in \a component_topology. + It takes ownership over the \c _field object that it creates. + + Here come the three ComponentTopology constructors : + \verbatim + ComponentTopology c; // one component in the field + ComponentTopology c(6); //six components, all of them on the same processor + ComponentTopology c(6, proc_group); // six components, evenly distributed over the processors of procgroup + \endverbatim + + */ + ParaFIELD::ParaFIELD(TypeOfField type, TypeOfTimeDiscretization td, ParaMESH* para_support, const ComponentTopology& component_topology) + :_field(0), + _component_topology(component_topology),_topology(0),_own_support(false), + _support(para_support) + { + if (para_support->isStructured() || (para_support->getTopology()->getProcGroup()->size()==1 && component_topology.nbBlocks()!=1)) + { + const BlockTopology* source_topo = dynamic_cast(para_support->getTopology()); + _topology=new BlockTopology(*source_topo,component_topology); + } + else + { + if (component_topology.nbBlocks()!=1 && para_support->getTopology()->getProcGroup()->size()!=1) + throw INTERP_KERNEL::Exception(LOCALIZED("ParaFIELD constructor : Unstructured Support not taken into account with component topology yet")); + else + { + const BlockTopology* source_topo=dynamic_cast (para_support->getTopology()); + int nb_local_comp=component_topology.nbLocalComponents(); + _topology=new BlockTopology(*source_topo,nb_local_comp); + } + } + int nb_components = component_topology.nbLocalComponents(); + if (nb_components!=0) + { + _field=MEDCouplingFieldDouble::New(type,td); + _field->setMesh(_support->getCellMesh()); + DataArrayDouble *array=DataArrayDouble::New(); + array->alloc(_field->getNumberOfTuples(),nb_components); + _field->setArray(array); + array->decrRef(); + } + else return; + + _field->setName("Default ParaFIELD name"); + _field->setDescription("Default ParaFIELD description"); + } + + /*! \brief Constructor creating the ParaFIELD + from a given FIELD and a processor group. + + This constructor supposes that support underlying \a subdomain_field has no ParaSUPPORT + attached and it therefore recreates one. It therefore takes ownership over _support. The component topology associated with the field is a basic one (all components on the same processor). + */ + ParaFIELD::ParaFIELD(MEDCouplingFieldDouble* subdomain_field, ParaMESH *sup, const ProcessorGroup& proc_group): + _field(subdomain_field), + _component_topology(ComponentTopology(_field->getNumberOfComponents())),_topology(0),_own_support(false), + _support(sup) + { + if(_field) + _field->incrRef(); + const BlockTopology* source_topo=dynamic_cast (_support->getTopology()); + _topology=new BlockTopology(*source_topo,_component_topology.nbLocalComponents()); + } + + ParaFIELD::~ParaFIELD() + { + if(_field) + _field->decrRef(); + if(_own_support) + delete _support; + delete _topology; + } + + void ParaFIELD::synchronizeTarget(ParaFIELD* source_field) + { + DisjointDEC* data_channel; + if (dynamic_cast(_topology)!=0) + { + data_channel=new StructuredCoincidentDEC; + } + else + { + data_channel=new ExplicitCoincidentDEC; + } + data_channel->attachLocalField(this); + data_channel->synchronize(); + data_channel->prepareTargetDE(); + data_channel->recvData(); + + delete data_channel; + } + + void ParaFIELD::synchronizeSource(ParaFIELD* target_field) + { + DisjointDEC* data_channel; + if (dynamic_cast(_topology)!=0) + { + data_channel=new StructuredCoincidentDEC; + } + else + { + data_channel=new ExplicitCoincidentDEC; + } + data_channel->attachLocalField(this); + data_channel->synchronize(); + data_channel->prepareSourceDE(); + data_channel->sendData(); + + delete data_channel; + } + + /*! + * This method returns, if it exists, an array with only one component and as many as tuples as _field has. + * This array gives for every element on which this->_field lies, its global number, if this->_field is nodal. + * For example if _field is a nodal field : returned array will be the nodal global numbers. + * The content of this method is used to inform Working side to accumulate data recieved by lazy side. + */ + DataArrayInt* ParaFIELD::returnCumulativeGlobalNumbering() const + { + if(!_field) + return 0; + TypeOfField type=_field->getTypeOfField(); + switch(type) + { + case ON_CELLS: + return 0; + case ON_NODES: + return _support->getGlobalNumberingNodeDA(); + default: + return 0; + } + } + + DataArrayInt* ParaFIELD::returnGlobalNumbering() const + { + if(!_field) + return 0; + TypeOfField type=_field->getTypeOfField(); + switch(type) + { + case ON_CELLS: + return _support->getGlobalNumberingCellDA(); + case ON_NODES: + return _support->getGlobalNumberingNodeDA(); + default: + return 0; + } + } + + int ParaFIELD::nbComponents() const + { + return _component_topology.nbComponents(); + } + + + /*! This method retrieves the integral of component \a icomp + over the all domain. */ + double ParaFIELD::getVolumeIntegral(int icomp, bool isWAbs) const + { + CommInterface comm_interface = _topology->getProcGroup()->getCommInterface(); + double integral=_field->integral(icomp,isWAbs); + double total=0.; + const MPI_Comm* comm = (dynamic_cast(_topology->getProcGroup()))->getComm(); + comm_interface.allReduce(&integral, &total, 1, MPI_DOUBLE, MPI_SUM, *comm); + + return total; + } +} diff --git a/src/ParaMEDMEM/ParaFIELD.hxx b/src/ParaMEDMEM/ParaFIELD.hxx new file mode 100644 index 000000000..2f5f89367 --- /dev/null +++ b/src/ParaMEDMEM/ParaFIELD.hxx @@ -0,0 +1,66 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __PARAFIELD_HXX__ +#define __PARAFIELD_HXX__ + +#include "MEDCouplingRefCountObject.hxx" +#include "ComponentTopology.hxx" + +namespace ParaMEDMEM +{ + class DataArrayInt; + class ParaMESH; + class ProcessorGroup; + class MEDCouplingFieldDouble; + class ComponentTopology; + class Topology; + + class ParaFIELD + { + public: + + ParaFIELD(TypeOfField type, TypeOfTimeDiscretization td, ParaMESH* mesh, const ComponentTopology& component_topology); + + + ParaFIELD(MEDCouplingFieldDouble* field, ParaMESH *sup, const ProcessorGroup& group); + + virtual ~ParaFIELD(); + void synchronizeTarget( ParaMEDMEM::ParaFIELD* source_field); + void synchronizeSource( ParaMEDMEM::ParaFIELD* target_field); + MEDCouplingFieldDouble* getField() const { return _field; } + void setOwnSupport(bool v) const { _own_support=v; } + DataArrayInt* returnCumulativeGlobalNumbering() const; + DataArrayInt* returnGlobalNumbering() const; + Topology* getTopology() const { return _topology; } + ParaMESH* getSupport() const { return _support; } + int nbComponents() const; + double getVolumeIntegral(int icomp, bool isWAbs) const; + double getL2Norm()const { return -1; } + private: + MEDCouplingFieldDouble* _field; + ParaMEDMEM::ComponentTopology _component_topology; + Topology* _topology; + mutable bool _own_support; + ParaMESH* _support; + }; + +} + +#endif diff --git a/src/ParaMEDMEM/ParaGRID.cxx b/src/ParaMEDMEM/ParaGRID.cxx new file mode 100644 index 000000000..f45c1e7ac --- /dev/null +++ b/src/ParaMEDMEM/ParaGRID.cxx @@ -0,0 +1,74 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "ParaGRID.hxx" +#include "Topology.hxx" +#include "BlockTopology.hxx" +#include "MEDCouplingMemArray.hxx" +#include "MEDCouplingCMesh.hxx" +#include "InterpKernelUtilities.hxx" + +#include + +using namespace std; + +namespace ParaMEDMEM +{ + + ParaGRID::ParaGRID(MEDCouplingCMesh* global_grid, Topology* topology) throw(INTERP_KERNEL::Exception) + { + + _block_topology = dynamic_cast(topology); + if(_block_topology==0) + throw INTERP_KERNEL::Exception(LOCALIZED("ParaGRID::ParaGRID topology must be block topology")); + + if (!_block_topology->getProcGroup()->containsMyRank()) + return; + + int dimension=_block_topology->getDimension() ; + if (dimension != global_grid->getSpaceDimension()) + throw INTERP_KERNEL::Exception(LOCALIZED("ParaGrid::ParaGrid incompatible topology")); + _grid=global_grid; + _grid->incrRef(); + /*vector > xyz_array(dimension); + vector > local_indices = _block_topology->getLocalArrayMinMax(); + vector coordinates_names; + vector coordinates_units; + for (int idim=0; idimgetCoordsAt(idim); + double *arrayC=array->getPointer(); + cout << " Indices "<< local_indices[idim].first <<" "<getName()); + coordinates_units.push_back(array->getInfoOnComponentAt(0)); + } + _grid=MEDCouplingCMesh::New(); + _grid->set(xyz_array, coordinates_names,coordinates_units); + _grid->setName(global_grid->getName()); + _grid->setDescription(global_grid->getDescription());*/ + } + + ParaGRID::~ParaGRID() + { + if(_grid) + _grid->decrRef(); + } +} diff --git a/src/ParaMEDMEM/ParaGRID.hxx b/src/ParaMEDMEM/ParaGRID.hxx new file mode 100644 index 000000000..2335b9d6c --- /dev/null +++ b/src/ParaMEDMEM/ParaGRID.hxx @@ -0,0 +1,51 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __PARAGRID_HXX__ +#define __PARAGRID_HXX__ + +#include "InterpolationUtils.hxx" + +#include + +namespace ParaMEDMEM +{ + class Topology; + class BlockTopology; + class MEDCouplingCMesh; + + class ParaGRID + { + public: + ParaGRID(MEDCouplingCMesh* global_grid, Topology* topology) throw(INTERP_KERNEL::Exception); + BlockTopology * getBlockTopology() const { return _block_topology; } + virtual ~ParaGRID(); + MEDCouplingCMesh* getGrid() const { return _grid; } + private: + MEDCouplingCMesh* _grid; + // structured grid topology + ParaMEDMEM::BlockTopology* _block_topology; + // stores the x,y,z axes on the global grid + std::vector > _global_axis; + //id of the local grid + int _my_domain_id; + }; +} + +#endif diff --git a/src/ParaMEDMEM/ParaMESH.cxx b/src/ParaMEDMEM/ParaMESH.cxx new file mode 100644 index 000000000..a6482a554 --- /dev/null +++ b/src/ParaMEDMEM/ParaMESH.cxx @@ -0,0 +1,122 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "ParaMESH.hxx" +#include "ProcessorGroup.hxx" +#include "MPIProcessorGroup.hxx" +#include "Topology.hxx" +#include "BlockTopology.hxx" +#include "MEDCouplingMemArray.hxx" + +#include +#include + +//inclusion for the namespaces +using namespace std; + +namespace ParaMEDMEM +{ + ParaMESH::ParaMESH( MEDCouplingPointSet *subdomain_mesh, MEDCouplingPointSet *subdomain_face, + DataArrayInt *CorrespElt_local2global, DataArrayInt *CorrespFace_local2global, + DataArrayInt *CorrespNod_local2global, const ProcessorGroup& proc_group ): + _cell_mesh(subdomain_mesh), + _face_mesh(subdomain_face), + _my_domain_id(proc_group.myRank()), + _block_topology (new BlockTopology(proc_group, subdomain_mesh->getNumberOfCells())), + _explicit_topology(0), + _node_global(CorrespNod_local2global), + _face_global(CorrespFace_local2global), + _cell_global(CorrespElt_local2global) + { + if(_cell_mesh) + _cell_mesh->incrRef(); + if(_face_mesh) + _face_mesh->incrRef(); + if(CorrespElt_local2global) + CorrespElt_local2global->incrRef(); + if(CorrespFace_local2global) + CorrespFace_local2global->incrRef(); + if(CorrespNod_local2global) + CorrespNod_local2global->incrRef(); + } + + ParaMESH::ParaMESH( MEDCouplingPointSet *mesh, const ProcessorGroup& proc_group, const std::string& name): + _cell_mesh(mesh), + _face_mesh(0), + _my_domain_id(proc_group.myRank()), + _block_topology (new BlockTopology(proc_group, mesh->getNumberOfCells())), + _node_global(0), + _face_global(0) + { + if(_cell_mesh) + _cell_mesh->incrRef(); + int nb_elem=mesh->getNumberOfCells(); + _explicit_topology=new BlockTopology(proc_group,nb_elem); + int nbOfCells=mesh->getNumberOfCells(); + _cell_global = DataArrayInt::New(); + _cell_global->alloc(nbOfCells,1); + int *cellglobal=_cell_global->getPointer(); + int offset = _block_topology->localToGlobal(make_pair(_my_domain_id,0)); + for (int i=0; idecrRef(); + _node_global=nodeGlobal; + if(_node_global) + _node_global->incrRef(); + } + } + + void ParaMESH::setCellGlobal(DataArrayInt *cellGlobal) + { + if(cellGlobal!=_cell_global) + { + if(_cell_global) + _cell_global->decrRef(); + _cell_global=cellGlobal; + if(_cell_global) + _cell_global->incrRef(); + } + } + + ParaMESH::~ParaMESH() + { + if(_cell_mesh) + _cell_mesh->decrRef(); + if(_face_mesh) + _face_mesh->decrRef(); + delete _block_topology; + if(_node_global) + _node_global->decrRef(); + if(_cell_global) + _cell_global->decrRef(); + if(_face_global) + _face_global->decrRef(); + delete _explicit_topology; + } + +} diff --git a/src/ParaMEDMEM/ParaMESH.hxx b/src/ParaMEDMEM/ParaMESH.hxx new file mode 100644 index 000000000..391bff5dd --- /dev/null +++ b/src/ParaMEDMEM/ParaMESH.hxx @@ -0,0 +1,82 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __PARAMESH_HXX__ +#define __PARAMESH_HXX__ + +#include "MEDCouplingPointSet.hxx" +#include "ProcessorGroup.hxx" +#include "MEDCouplingMemArray.hxx" + +#include +#include + +namespace ParaMEDMEM +{ + class Topology; + class BlockTopology; + class DataArrayInt; + + class ParaMESH + { + public: + ParaMESH( MEDCouplingPointSet *subdomain_mesh, + MEDCouplingPointSet *subdomain_face, + DataArrayInt *CorrespElt_local2global, + DataArrayInt *CorrespFace_local2global, + DataArrayInt *CorrespNod_local2global, + const ProcessorGroup& proc_group ) ; + ParaMESH( MEDCouplingPointSet *mesh, + const ProcessorGroup& proc_group, const std::string& name); + + virtual ~ParaMESH(); + void setNodeGlobal(DataArrayInt *nodeGlobal); + void setCellGlobal(DataArrayInt *cellGlobal); + Topology* getTopology() const { return _explicit_topology; } + bool isStructured() const { return _cell_mesh->isStructured(); } + MEDCouplingPointSet *getCellMesh() const { return _cell_mesh; } + MEDCouplingPointSet *getFaceMesh() const { return _face_mesh; } + BlockTopology* getBlockTopology() const { return _block_topology; } + + DataArrayInt* getGlobalNumberingNodeDA() const { if(_node_global) _node_global->incrRef(); return _node_global; } + DataArrayInt* getGlobalNumberingFaceDA() const { if(_face_global) _face_global->incrRef(); return _face_global; } + DataArrayInt* getGlobalNumberingCellDA() const { if(_cell_global) _cell_global->incrRef(); return _cell_global; } + const int* getGlobalNumberingNode() const { if(_node_global) return _node_global->getConstPointer(); return 0; } + const int* getGlobalNumberingFace() const { if(_face_global) return _face_global->getConstPointer(); return 0; } + const int* getGlobalNumberingCell() const { if(_cell_global) return _cell_global->getConstPointer(); return 0; } + + private: + //mesh object underlying the ParaMESH object + MEDCouplingPointSet *_cell_mesh ; + MEDCouplingPointSet *_face_mesh ; + + //id of the local grid + int _my_domain_id; + + //global topology of the cells + ParaMEDMEM::BlockTopology* _block_topology; + Topology* _explicit_topology; + // pointers to global numberings + DataArrayInt* _node_global; + DataArrayInt* _face_global; + DataArrayInt* _cell_global; + }; +} + +#endif diff --git a/src/ParaMEDMEM/ProcessorGroup.cxx b/src/ParaMEDMEM/ProcessorGroup.cxx new file mode 100644 index 000000000..011695016 --- /dev/null +++ b/src/ParaMEDMEM/ProcessorGroup.cxx @@ -0,0 +1,32 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "ProcessorGroup.hxx" +#include "InterpolationUtils.hxx" + +namespace ParaMEDMEM +{ + ProcessorGroup::ProcessorGroup (const CommInterface& interface, int start, int end):_comm_interface(interface) + { + if (start>end) + throw INTERP_KERNEL::Exception("wrong call to Processor group constructor"); + for (int i=start; i<=end;i++) + _proc_ids.insert(i); + } +} diff --git a/src/ParaMEDMEM/ProcessorGroup.hxx b/src/ParaMEDMEM/ProcessorGroup.hxx new file mode 100644 index 000000000..344704a9f --- /dev/null +++ b/src/ParaMEDMEM/ProcessorGroup.hxx @@ -0,0 +1,60 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __PROCESSORGROUP_HXX__ +#define __PROCESSORGROUP_HXX__ + +#include "CommInterface.hxx" + +#include + +namespace ParaMEDMEM +{ + class ProcessorGroup + { + public: + + ProcessorGroup(const CommInterface& interface):_comm_interface(interface) { } + ProcessorGroup(const CommInterface& interface, std::set proc_ids): + _comm_interface(interface),_proc_ids(proc_ids) { } + ProcessorGroup (const ProcessorGroup& proc_group, std::set proc_ids): + _comm_interface(proc_group.getCommInterface()),_proc_ids(proc_ids) { } + ProcessorGroup (const ProcessorGroup& other): + _comm_interface(other.getCommInterface()),_proc_ids(other._proc_ids) { } + ProcessorGroup (const CommInterface& interface, int start, int end); + virtual ~ProcessorGroup() { } + virtual ProcessorGroup *deepCpy() const = 0; + virtual ProcessorGroup* fuse (const ProcessorGroup&) const = 0; + virtual void intersect (ProcessorGroup&) = 0; + bool contains(int rank) const { return _proc_ids.find(rank)!=_proc_ids.end(); } + virtual bool containsMyRank() const = 0; + int size() const { return _proc_ids.size(); } + const CommInterface& getCommInterface()const { return _comm_interface; } + virtual int myRank() const = 0; + virtual int translateRank(const ProcessorGroup*, int) const = 0; + virtual ProcessorGroup* createComplementProcGroup() const = 0; + virtual ProcessorGroup* createProcGroup() const = 0; + virtual const std::set& getProcIDs()const { return _proc_ids; } + protected: + const CommInterface _comm_interface; + std::set _proc_ids; + }; +} + +#endif diff --git a/src/ParaMEDMEM/README_JR b/src/ParaMEDMEM/README_JR new file mode 100644 index 000000000..762dc9e47 --- /dev/null +++ b/src/ParaMEDMEM/README_JR @@ -0,0 +1,446 @@ + +CVS : +===== + +Branche : BR_MEDPARA : MED_SRC +setenv CVSROOT :pserver:rahuel@cvs.opencascade.com:/home/server/cvs/MED +cvs login +... + +Repertoires : +============= + +Sources : /home/rahuel/MEDPARAsynch +Construction sur awa : /data/tmpawa/rahuel/MEDPARAsynch/MED_Build +Intallation sur awa : /data/tmpawa/rahuel/MEDPARAsynch/MED_Install + + +Environnement : +=============== + +source /home/rahuel/MEDPARAsynch/env_products.csh + +On utilise : +/data/tmpawa/vb144235/valgrind-3.2.1/valgrind_install/bin +/data/tmpawa/adam/Salome3/V3_2_7_AWA_OCC/Python-2.4.1 +/data/tmpawa/vb144235/med_231_install +/data/tmpawa2/adam/omniORB/omniORB-4.0.7 +/data/tmpawa/vb144235/lam_install +/data/tmpawa/vb144235/cppunit_install +/data/tmpawa/vb144235/fvm_install_lam +/data/tmpawa/vb144235/bft_install +/home/rahuel/MEDPARAsynch/ICoCo +/data/tmpawa2/adam/Salome3/V3_2_0_maintainance/KERNEL/KERNEL_INSTALL + + +Build_Configure et Configure : +============================== + +MEDMEM est en "stand-alone" sans KERNEL ni IHM. + +cd $MED_BUILD_DIR +${MED_SRC_DIR}/build_configure --without-kernel --without-ihm +rm ${MED_SRC_DIR}/adm_local_without_kernel/adm_local_without_kernel +rm -fR $MED_BUILD_DIR/adm_local_without_kernel/adm_local_without_kernel + +cd $MED_BUILD_DIR +${MED_SRC_DIR}/configure --without-kernel --without-ihm --with-lam=/data/tmpawa/vb144235/lam_install --prefix=${MED_ROOT_DIR} --with-med2=/data/tmpawa/vb144235/med_231_install --with-python=/data/tmpawa/adam/Salome3/V3_2_7_AWA_OCC/Python-2.4.1 --with-cppunit=/data/tmpawa/vb144235/cppunit_install --with-cppunit_inc=/data/tmpawa/vb144235/cppunit_install/include --with-fvm=/data/tmpawa/vb144235/fvm_install_lam +rm ${MED_SRC_DIR}/adm_local_without_kernel/adm_local_without_kernel +rm -fR $MED_BUILD_DIR/adm_local_without_kernel/adm_local_without_kernel + + +Construction : +============== + +cd $MED_BUILD_DIR +make +make install + +Problemes de construction : +=========================== + +Liste des fichiers modifies et differents de la base CVS pour pouvoir +effectuer la construction et l'installation : + +M MED_SRC/configure.in.base : +----------------------------- +CHECK_MPICH +CHECK_LAM +CHECK_OPENMPI mis en commentaire (redefinit le resultat de CHECK_LAM) +CHECK_CPPUNIT a ete ajoute + +M MED_SRC/adm_local_without_kernel/unix/config_files/check_lam.m4 : +------------------------------------------------------------------- +Debugs pour trouver la bonne configuration de LAM + +M MED_SRC/src/INTERP_KERNEL/Makefile.in : +----------------------------------------- +Problemes de construction des tests + +M MED_SRC/src/ParaMEDMEM/Makefile.in : +-------------------------------------- +. Construction de libParaMEDMEM.a pour gcov (link statique) +. Ajout d'options de compilations : -fprofile-arcs -ftest-coverage -pg (gcov) ==> + instrumentation du code + +C MED_SRC/src/ParaMEDMEM/Test/Makefile.in : +------------------------------------------- +. Construction de libParaMEDMEMTest.a pour gcov (link statique) +. Ajout d'options de compilations : -fprofile-arcs -ftest-coverage -pg (gcov) ==> + instrumentation du code +. Prise en compte de $(MED_WITH_KERNEL) avec : + ifeq ($(MED_WITH_KERNEL),yes) + LDFLAGSFORBIN += $(LDFLAGS) -lm $(MED3_LIBS) $(HDF5_LIBS) $(MPI_LIBS) \ + -L$(CMAKE_BINARY_DIR)/lib@LIB_LOCATION_SUFFIX@/salome -lmed_V2_1 -lparamed -lmedmem \ + ${KERNEL_LDFLAGS} -lSALOMELocalTrace -lSALOMEBasics \ + $(CPPUNIT_LIBS) \ + -lParaMEDMEMTest + endif + ifeq ($(MED_WITH_KERNEL),no) + LDFLAGSFORBIN += $(LDFLAGS) -lm $(MED3_LIBS) $(HDF5_LIBS) $(MPI_LIBS) \ + -L$(CMAKE_BINARY_DIR)/lib@LIB_LOCATION_SUFFIX@/salome -lmed_V2_1 -lparamed -linterpkernel -lmedmem \ + ${KERNEL_LDFLAGS} ${FVM_LIBS} ${CPPUNIT_LIBS} -L/data/tmpawa/vb144235/bft_install/lib -lbft\ + -lParaMEDMEMTest + endif + +M MED_SRC/src/ParaMEDMEM/Test/ParaMEDMEMTest.hxx : +-------------------------------------------------- +Mise en commentaire du test manquant : +CPPUNIT_TEST(testNonCoincidentDEC_3D); + +U MED_SRC/src/ParaMEDMEM/Test/ParaMEDMEMTest_NonCoincidentDEC.cxx : +------------------------------------------------------------------- +Manque dans CVS + +Pour forcer la reconstruction des tests : +========================================= + +cd $MED_BUILD_DIR +rm src/ParaMEDMEM/*o +rm src/ParaMEDMEM/*.la +rm src/ParaMEDMEM/test_* +rm src/ParaMEDMEM/.libs/* +rm src/ParaMEDMEM/Test/*o +rm src/ParaMEDMEM/Test/*.la +rm src/ParaMEDMEM/Test/.libs/* +rm core.* +rm vgcore.* +cd $MED_BUILD_DIR/src/ParaMEDMEM/Test +make +make install +cd $MED_BUILD_DIR + + +Probleme avec lam : +=================== + +jr[1175]> mpirun -np 5 -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} TestParaMEDMEM +21508 TestParaMEDMEM running on n0 (o) +21509 TestParaMEDMEM running on n0 (o) +21510 TestParaMEDMEM running on n0 (o) +21511 TestParaMEDMEM running on n0 (o) +21512 TestParaMEDMEM running on n0 (o) +- Trace /home/rahuel/MEDPARAsynch/MED_SRC/src/MEDMEM/MEDMEM_Init.cxx [54] : Med Memory Initialization with $SALOME_trace = local +- Trace /home/rahuel/MEDPARAsynch/MED_SRC/src/MEDMEM/MEDMEM_Init.cxx [54] : Med Memory Initialization with $SALOME_trace = local +- Trace /home/rahuel/MEDPARAsynch/MED_SRC/src/MEDMEM/MEDMEM_Init.cxx [54] : Med Memory Initialization with $SALOME_trace = local +- Trace /home/rahuel/MEDPARAsynch/MED_SRC/src/MEDMEM/MEDMEM_Init.cxx [54] : Med Memory Initialization with $SALOME_trace = local +- Trace /home/rahuel/MEDPARAsynch/MED_SRC/src/MEDMEM/MEDMEM_Init.cxx [54] : Med Memory Initialization with $SALOME_trace = local +----------------------------------------------------------------------------- +The selected RPI failed to initialize during MPI_INIT. This is a +fatal error; I must abort. + +This occurred on host awa (n0). +The PID of failed process was 21508 (MPI_COMM_WORLD rank: 0) +----------------------------------------------------------------------------- +----------------------------------------------------------------------------- +One of the processes started by mpirun has exited with a nonzero exit +code. This typically indicates that the process finished in error. +If your process did not finish in error, be sure to include a "return +0" or "exit(0)" in your C code before exiting the application. + +PID 21510 failed on node n0 (127.0.0.1) with exit status 1. +----------------------------------------------------------------------------- +jr[1176]> + + +Contournement du probleme lam : +=============================== + +mpirun -np 5 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} TestParaMEDMEM + + +Valgrind : +========== +. Les tests avec valgrind indiquent des erreurs dans MPI_Init et + MPI_Finalize ainsi que dans des programmes appeles "below main". +. De plus on obtient un "Segmentation Violation" accompagne d'un + fichier "vgcore.*" (plantage de valgrind) +. Mais on a " All heap blocks were freed -- no leaks are possible." + et on n'a aucune erreur de malloc/free new/delete dans ParaMEDMEM et + dans les tests. + +. Cependant si on execute les tests sans valgrind, il n'y a pas + d'erreur ni de fichier "core.*". + + +Tests avec CPPUNIT de $MED_BUILD_DIR/src/ParaMEDMEM/Test : +========================================================== + +L'appel a MPI_Init n'est fait qu'une seule fois. +Il est suivi par l'execution de toute la suite des tests regroupes +dans les trois executables TestParaMEDMEM, TestMPIAccessDEC et +TestMPIAccess +On a enfin un seul appel a MPI_Finalize. + +Si un des tests d'une suite de tests comporte une anomalie cela +peut avoir des implications sur l'execution des tests suivants. + +Lors de la mise au point de la suite de tests de TestMPIAccessDEC +cela etait le cas : il restait des messages postes dans lam mais +non lus. Le test suivant s'executait de plus en plus lentement +sans donner d'erreur (probleme difficile a identifier). + + +Lancement des tests de TestParaMEDMEM avec CPPUNIT et TotalView (option -tv) : +============================================================================== + +mpirun -np 5 -ssi rpi tcp C -tv -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} TestParaMEDMEM + +Il arrive qu'on ne puisse pas utiliser totalview par manque de +license. + + + +Lancement des tests de TestParaMEDMEM avec CPPUNIT et Valgrind avec "memory leaks" : +==================================================================================== + +mpirun -np 5 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full TestParaMEDMEM + + +Lancement des tests fonctionnels de MPI_AccessDEC avec CPPUNIT : +================================================================ + +mpirun -np 11 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full TestMPIAccessDEC + + +Lancement des tests unitaires de MPI_Access avec CPPUNIT : +========================================================== + +mpirun -np 3 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full TestMPIAccess + + +TestMPIAccess/TestMPIAccessDEC/TestParaMEDMEM et gcov : +======================================================= + +Les resultats sont dans les repertoires suivants de $MED_BUILD_DIR/src/ParaMEDMEM/Test : +------------- + + TestParaMEDMEM-gcov/ + TestMPIAccessDEC-gcov/ + TestMPIAccess-gcov/ + +Je n'y ai pas trouve d'anomalies. + +compilation : -fprofile-arcs -ftest-coverage +------------- + +$MED_BUILD_DIR/src/ParaMEDMEM/makefile.in : LIB=libparamedar.a \ +------------------------------------------- libparamed.la + +$MED_BUILD_DIR/src/ParaMEDMEM/Test/makefile.in : LIB = libParaMEDMEMTestar.a \ +------------------------------------------------ libParaMEDMEMTest.la + +links statiques manuels : +------------------------- + +g++ -g -D_DEBUG_ -Wno-deprecated -Wparentheses -Wreturn-type -Wunused -DPCLINUX -I/data/tmpawa/vb144235/cppunit_install/include -I/data/tmpawa/vb144235/lam_install/include -ftemplate-depth-42 -I/home/rahuel/MEDPARAsynch/MED_SRC/src/ParaMEDMEM -fprofile-arcs -ftest-coverage -o TestMPIAccess TestMPIAccess.lo -L../../../lib64/salome -lstdc++ -L../../../lib64/salome -lstdc++ -lm -L/data/tmpawa/vb144235/med_231_install/lib -lmed -lhdf5 -lhdf5 -L/data/tmpawa/vb144235/lam_install/lib -llam -lmpi -L../../../lib64/salome -lmed_V2_1 --whole-archive -linterpkernel -lmedmem -L/data/tmpawa/vb144235/fvm_install_lam/lib -lfvm -L/data/tmpawa/vb144235/cppunit_install/lib -lcppunit -L/data/tmpawa/vb144235/bft_install/lib -lbft -lutil -lm -lrt -ldl -Bstatic -L./ -lParaMEDMEMTestar -L../ -lparamedar -L./ -lParaMEDMEMTestar + +g++ -g -D_DEBUG_ -Wno-deprecated -Wparentheses -Wreturn-type -Wunused -DPCLINUX -I/data/tmpawa/vb144235/cppunit_install/include -I/data/tmpawa/vb144235/lam_install/include -ftemplate-depth-42 -I/home/rahuel/MEDPARAsynch/MED_SRC/src/ParaMEDMEM -fprofile-arcs -ftest-coverage -o TestMPIAccessDEC TestMPIAccessDEC.lo -L../../../lib64/salome -lstdc++ -L../../../lib64/salome -lstdc++ -lm -L/data/tmpawa/vb144235/med_231_install/lib -lmed -lhdf5 -lhdf5 -L/data/tmpawa/vb144235/lam_install/lib -llam -lmpi -L../../../lib64/salome -lmed_V2_1 --whole-archive -linterpkernel -lmedmem -L/data/tmpawa/vb144235/fvm_install_lam/lib -lfvm -L/data/tmpawa/vb144235/cppunit_install/lib -lcppunit -L/data/tmpawa/vb144235/bft_install/lib -lbft -lutil -lm -lrt -ldl -Bstatic -L./ -lParaMEDMEMTestar -L../ -lparamedar -L./ -lParaMEDMEMTestar + +g++ -g -D_DEBUG_ -Wno-deprecated -Wparentheses -Wreturn-type -Wunused -DPCLINUX -I/data/tmpawa/vb144235/cppunit_install/include -I/data/tmpawa/vb144235/lam_install/include -ftemplate-depth-42 -I/home/rahuel/MEDPARAsynch/MED_SRC/src/ParaMEDMEM -fprofile-arcs -ftest-coverage -o TestParaMEDMEM TestParaMEDMEM.lo -L../../../lib64/salome -lstdc++ -L../../../lib64/salome -lstdc++ -lm -L/data/tmpawa/vb144235/med_231_install/lib -lmed -lhdf5 -lhdf5 -L/data/tmpawa/vb144235/lam_install/lib -llam -lmpi -L../../../lib64/salome -lmed_V2_1 --whole-archive -linterpkernel -lmedmem -L/data/tmpawa/vb144235/fvm_install_lam/lib -lfvm -L/data/tmpawa/vb144235/cppunit_install/lib -lcppunit -L/data/tmpawa/vb144235/bft_install/lib -lbft -lutil -lm -lrt -ldl -Bstatic -L./ -lParaMEDMEMTestar -L../ -lparamedar -L./ -lParaMEDMEMTestar + +Ne pas oublier le make install apres ... + +execution et gcov : +------------------- + +Pour pouvoir traiter les .cxx de ${MED_BUILD_DIR}/src/ParaMEDMEM et de +${MED_BUILD_DIR}/src/ParaMEDMEM/Test, on execute deux fois gcov. + +cd ${MED_BUILD_DIR}/src/ParaMEDMEM/Test + +mpirun -np 3 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} TestMPIAccess + +gcov TestMPIAccess.cxx test_MPI_Access_Send_Recv.cxx \ + test_MPI_Access_Cyclic_Send_Recv.cxx \ + test_MPI_Access_SendRecv.cxx \ + test_MPI_Access_ISend_IRecv.cxx \ + test_MPI_Access_Cyclic_ISend_IRecv.cxx \ + test_MPI_Access_ISendRecv.cxx \ + test_MPI_Access_Probe.cxx \ + test_MPI_Access_IProbe.cxx \ + test_MPI_Access_Cancel.cxx \ + test_MPI_Access_Send_Recv_Length.cxx \ + test_MPI_Access_ISend_IRecv_Length.cxx \ + test_MPI_Access_ISend_IRecv_Length_1.cxx \ + test_MPI_Access_Time.cxx \ + test_MPI_Access_Time_0.cxx \ + test_MPI_Access_ISend_IRecv_BottleNeck.cxx \ + ../MPI_Access.cxx +gcov -o ../ TestMPIAccess.cxx test_MPI_Access_Send_Recv.cxx \ + test_MPI_Access_Cyclic_Send_Recv.cxx \ + test_MPI_Access_SendRecv.cxx \ + test_MPI_Access_ISend_IRecv.cxx \ + test_MPI_Access_Cyclic_ISend_IRecv.cxx \ + test_MPI_Access_ISendRecv.cxx \ + test_MPI_Access_Probe.cxx \ + test_MPI_Access_IProbe.cxx \ + test_MPI_Access_Cancel.cxx \ + test_MPI_Access_Send_Recv_Length.cxx \ + test_MPI_Access_ISend_IRecv_Length.cxx \ + test_MPI_Access_ISend_IRecv_Length_1.cxx \ + test_MPI_Access_Time.cxx \ + test_MPI_Access_Time_0.cxx \ + test_MPI_Access_ISend_IRecv_BottleNeck.cxx \ + ../MPI_Access.cxx + + +cd ${MED_BUILD_DIR}/src/ParaMEDMEM/Test +mpirun -np 11 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} TestMPIAccessDEC + +gcov TestMPIAccessDEC.cxx test_AllToAllDEC.cxx \ + test_AllToAllvDEC.cxx \ + test_AllToAllTimeDEC.cxx \ + test_AllToAllvTimeDEC.cxx \ + test_AllToAllvTimeDoubleDEC.cxx \ + ../TimeInterpolator.cxx \ + ../LinearTimeInterpolator.cxx \ + ../MPI_Access.cxx \ + ../MPI_AccessDEC.cxx +gcov -o ../ TestMPIAccessDEC.cxx test_AllToAllDEC.cxx \ + test_AllToAllvDEC.cxx \ + test_AllToAllTimeDEC.cxx \ + test_AllToAllvTimeDEC.cxx \ + test_AllToAllvTimeDoubleDEC.cxx \ + ../TimeInterpolator.cxx \ + ../LinearTimeInterpolator.cxx \ + ../MPI_Access.cxx \ + ../MPI_AccessDEC.cxx + +cd ${MED_BUILD_DIR}/src/ParaMEDMEM/Test +mpirun -np 5 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} TestParaMEDMEM + +gcov TestParaMEDMEM.cxx ParaMEDMEMTest.cxx \ + ParaMEDMEMTest_MPIProcessorGroup.cxx \ + ParaMEDMEMTest_BlockTopology.cxx \ + ParaMEDMEMTest_InterpKernelDEC.cxx \ + ../BlockTopology.cxx \ + ../ComponentTopology.cxx \ + ../DEC.cxx \ + ../ElementLocator.cxx \ + ../InterpolationMatrix.cxx \ + ../InterpKernelDEC.cxx \ + ../MPIProcessorGroup.cxx \ + ../MxN_Mapping.cxx \ + ../ParaFIELD.cxx \ + ../ParaMESH.cxx \ + ../ParaSUPPORT.cxx \ + ../ProcessorGroup.cxx \ + ../TimeInterpolator.cxx \ + ../LinearTimeInterpolator.cxx \ + ../MPI_Access.cxx \ + ../MPI_AccessDEC.cxx + +gcov -o ../ TestParaMEDMEM.cxx ParaMEDMEMTest.cxx \ + ParaMEDMEMTest_MPIProcessorGroup.cxx \ + ParaMEDMEMTest_BlockTopology.cxx \ + ParaMEDMEMTest_InterpKernelDEC.cxx \ + ../BlockTopology.cxx \ + ../ComponentTopology.cxx \ + ../DEC.cxx \ + ../ElementLocator.cxx \ + ../InterpolationMatrix.cxx \ + ../InterpKernelDEC.cxx \ + ../MPIProcessorGroup.cxx \ + ../MxN_Mapping.cxx \ + ../ParaFIELD.cxx \ + ../ParaMESH.cxx \ + ../ParaSUPPORT.cxx \ + ../ProcessorGroup.cxx \ + ../TimeInterpolator.cxx \ + ../LinearTimeInterpolator.cxx \ + ../MPI_Access.cxx \ + ../MPI_AccessDEC.cxx + + + + + +Lancement des tests unitaires sans CPPUNIT : +============================================ + +mpirun -np 2 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full test_MPI_Access_Send_Recv + +mpirun -np 3 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full test_MPI_Access_Cyclic_Send_Recv + +mpirun -np 2 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full test_MPI_Access_SendRecv + +mpirun -np 2 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full test_MPI_Access_ISend_IRecv + +mpirun -np 3 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full test_MPI_Access_Cyclic_ISend_IRecv + +mpirun -np 2 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full test_MPI_Access_ISendRecv + +mpirun -np 2 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full test_MPI_Access_Probe + +mpirun -np 2 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full test_MPI_Access_IProbe + +mpirun -np 2 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full test_MPI_Access_Cancel + +mpirun -np 2 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full test_MPI_Access_Send_Recv_Length + +mpirun -np 2 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full test_MPI_Access_ISend_IRecv_Length + +mpirun -np 2 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full test_MPI_Access_ISend_IRecv_Length_1 + +mpirun -np 2 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full test_MPI_Access_Time + +mpirun -np 2 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full test_MPI_Access_Time_0 2 1 + + +#AllToAllDEC +mpirun -np 4 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full test_AllToAllDEC 0 + +mpirun -np 4 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full test_AllToAllDEC 1 + + +#AllToAllvDEC +mpirun -np 4 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full test_AllToAllvDEC 0 + +mpirun -np 4 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full test_AllToAllvDEC 1 + + +#AllToAllTimeDEC +mpirun -np 4 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full test_AllToAllTimeDEC 0 + +mpirun -np 4 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full test_AllToAllTimeDEC 1 + + +#AllToAllvTimeDEC +mpirun -np 11 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full test_AllToAllvTimeDEC 0 1 + +mpirun -np 11 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full test_AllToAllvTimeDEC 0 + +mpirun -np 11 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full test_AllToAllvTimeDEC 1 + + + +#AllToAllvTimeDoubleDEC +mpirun -np 11 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full test_AllToAllvTimeDoubleDEC 0 + +mpirun -np 11 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full test_AllToAllvTimeDoubleDEC 1 + + + +mpirun -np 2 -ssi rpi tcp C -v -x PATH=${PATH},LD_LIBRARY_PATH=${LD_LIBRARY_PATH} valgrind --leak-check=full test_MPI_Access_ISend_IRecv_BottleNeck + diff --git a/src/ParaMEDMEM/StructuredCoincidentDEC.cxx b/src/ParaMEDMEM/StructuredCoincidentDEC.cxx new file mode 100644 index 000000000..af0f9fe84 --- /dev/null +++ b/src/ParaMEDMEM/StructuredCoincidentDEC.cxx @@ -0,0 +1,416 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include "CommInterface.hxx" +#include "Topology.hxx" +#include "BlockTopology.hxx" +#include "ComponentTopology.hxx" +#include "ParaFIELD.hxx" +#include "MPIProcessorGroup.hxx" +#include "StructuredCoincidentDEC.hxx" +#include "InterpKernelUtilities.hxx" + +#include + +using namespace std; + +namespace ParaMEDMEM +{ + + /*! \defgroup structuredcoincidentdec StructuredCoincidentDEC + + This class is meant for remapping fields that have identical + supports with different parallel topologies. It can be used to couple + together multiphysics codes that operate on the same domain + with different partitionings, which can be useful if one of + the computation is much faster than the other. It can also be used + to couple together codes that share an interface that was generated + in the same manner (with identical global ids). + Also, this \ref dec can be used for fields that have component topologies, + i.e., components that are scattered over several processors. + + The remapping between the two supports is based on identity of global + ids, instead of geometrical considerations as it is the case for + \ref NonCoincidentDEC and \ref InterpKernelDEC. Therefore, this \ref dec must not be used + for coincident meshes that do not have the same numbering. + + As all the other DECs, its use is made of two phases : + - a setup phase during which the topologies are exchanged so that + the target side knows from which processors it should expect + the data. + - a send/recv phase during which the field data is actually transferred. + + This example illustrates the sending of a field with + the \c StructuredCoincidentDEC : + \code + ... + StructuredCoincidentDEC dec(groupA, groupB); + dec.attachLocalField(field); + dec.synchronize(); + if (groupA.containsMyRank()) + dec.recvData(); + else if (groupB.containsMyRank()) + dec.sendData(); + ... + \endcode + + Creating a ParaFIELD to be attached to the DEC is exactly the same as for + other DECs in the case when the remapping concerns similar meshes + that only have different partitionings. In the case when the + fields have also different component topologies, creating the ParaFIELD + requires some more effort. See \ref parafield section for more details. + */ + + + StructuredCoincidentDEC::StructuredCoincidentDEC():_topo_source(0),_topo_target(0), + _send_counts(0),_recv_counts(0), + _send_displs(0),_recv_displs(0), + _recv_buffer(0),_send_buffer(0) + { + } + + + StructuredCoincidentDEC::~StructuredCoincidentDEC() + { + delete [] _send_buffer; + delete [] _recv_buffer; + delete []_send_displs; + delete [] _recv_displs; + delete [] _send_counts; + delete [] _recv_counts; + if (! _source_group->containsMyRank()) + delete _topo_source; + if(!_target_group->containsMyRank()) + delete _topo_target; + } + + /*! + \addtogroup structuredcoincidentdec + @{ + */ + StructuredCoincidentDEC::StructuredCoincidentDEC(ProcessorGroup& local_group, ProcessorGroup& distant_group):DisjointDEC(local_group,distant_group), + _topo_source(0),_topo_target(0), + _send_counts(0),_recv_counts(0), + _send_displs(0),_recv_displs(0), + _recv_buffer(0),_send_buffer(0) + { + } + + /*! Synchronization process for exchanging topologies + */ + void StructuredCoincidentDEC::synchronizeTopology() + { + if (_source_group->containsMyRank()) + _topo_source = dynamic_cast(_local_field->getTopology()); + if (_target_group->containsMyRank()) + _topo_target = dynamic_cast(_local_field->getTopology()); + + // Transmitting source topology to target code + broadcastTopology(_topo_source,1000); + // Transmitting target topology to source code + broadcastTopology(_topo_target,2000); + if (_topo_source->getNbElements() != _topo_target->getNbElements()) + throw INTERP_KERNEL::Exception("Incompatible dimensions for target and source topologies"); + + } + + /*! Creates the arrays necessary for the data transfer + * and fills the send array with the values of the + * source field + * */ + void StructuredCoincidentDEC::prepareSourceDE() + { + //////////////////////////////////// + //Step 1 : _buffer array creation + + if (!_topo_source->getProcGroup()->containsMyRank()) + return; + MPIProcessorGroup* group=new MPIProcessorGroup(_topo_source->getProcGroup()->getCommInterface()); + + int myranksource = _topo_source->getProcGroup()->myRank(); + + vector * target_arrays=new vector[_topo_target->getProcGroup()->size()]; + + //cout<<" topotarget size"<< _topo_target->getProcGroup()->size()< getNbLocalElements(); + for (int ielem=0; ielem< nb_local ; ielem++) + { + // cout <<"source local :"<localToGlobal(make_pair(myranksource, ielem)); + // cout << "global "< target_local =_topo_target->globalToLocal(global); + // cout << "target local : "<size(); + + _send_counts=new int[union_size]; + _send_displs=new int[union_size]; + _recv_counts=new int[union_size]; + _recv_displs=new int[union_size]; + + for (int i=0; i< union_size; i++) + { + _send_counts[i]=0; + _recv_counts[i]=0; + _recv_displs[i]=0; + } + _send_displs[0]=0; + + for (int iproc=0; iproc < _topo_target->getProcGroup()->size(); iproc++) + { + //converts the rank in target to the rank in union communicator + int unionrank=group->translateRank(_topo_target->getProcGroup(),iproc); + _send_counts[unionrank]=target_arrays[iproc].size(); + } + + for (int iproc=1; iprocsize();iproc++) + _send_displs[iproc]=_send_displs[iproc-1]+_send_counts[iproc-1]; + + _send_buffer = new double [nb_local ]; + + ///////////////////////////////////////////////////////////// + //Step 2 : filling the _buffers with the source field values + + int* counter=new int [_topo_target->getProcGroup()->size()]; + counter[0]=0; + for (int i=1; i<_topo_target->getProcGroup()->size(); i++) + counter[i]=counter[i-1]+target_arrays[i-1].size(); + + + const double* value = _local_field->getField()->getArray()->getPointer(); + //cout << "Nb local " << nb_local<localToGlobal(make_pair(myranksource, ielem)); + pair target_local =_topo_target->globalToLocal(global); + //cout <<"global : "<< global<<" local :"<getProcGroup()->containsMyRank()) + return; + MPIProcessorGroup* group=new MPIProcessorGroup(_topo_source->getProcGroup()->getCommInterface()); + + int myranktarget = _topo_target->getProcGroup()->myRank(); + + vector < vector > source_arrays(_topo_source->getProcGroup()->size()); + int nb_local = _topo_target-> getNbLocalElements(); + for (int ielem=0; ielem< nb_local ; ielem++) + { + // cout <<"TS target local :"<localToGlobal(make_pair(myranktarget, ielem)); + //cout << "TS global "< source_local =_topo_source->globalToLocal(global); + // cout << "TS source local : "<size(); + _recv_counts=new int[union_size]; + _recv_displs=new int[union_size]; + _send_counts=new int[union_size]; + _send_displs=new int[union_size]; + + for (int i=0; i< union_size; i++) + { + _send_counts[i]=0; + _recv_counts[i]=0; + _recv_displs[i]=0; + } + for (int iproc=0; iproc < _topo_source->getProcGroup()->size(); iproc++) + { + //converts the rank in target to the rank in union communicator + int unionrank=group->translateRank(_topo_source->getProcGroup(),iproc); + _recv_counts[unionrank]=source_arrays[iproc].size(); + } + for (int i=1; igetProcGroup()->myRank()==0) + { + MESSAGE ("Master rank"); + topo->serialize(serializer, size); + rank_master = group->translateRank(topo->getProcGroup(),0); + MESSAGE("Master rank world number is "<size()); + for (int i=0; i< group->size(); i++) + { + if (i!= rank_master) + _comm_interface->send(&rank_master,1,MPI_INT, i,tag+i,*(group->getComm())); + } + } + else + { + MESSAGE(" rank "<myRank()<< " waiting ..."); + _comm_interface->recv(&rank_master, 1,MPI_INT, MPI_ANY_SOURCE, tag+group->myRank(), *(group->getComm()),&status); + MESSAGE(" rank "<myRank()<< "received master rank"<broadcast(&size, 1,MPI_INT,rank_master,*(group->getComm())); + + int* buffer=new int[size]; + if (topo!=0 && topo->getProcGroup()->myRank()==0) + copy(serializer, serializer+size, buffer); + _comm_interface->broadcast(buffer,size,MPI_INT,rank_master,*(group->getComm())); + + // Processors which did not possess the source topology + // unserialize it + + BlockTopology* topotemp=new BlockTopology(); + topotemp->unserialize(buffer, *_comm_interface); + + if (topo==0) + topo=topotemp; + else + delete topotemp; + + // Memory cleaning + delete[] buffer; + if (serializer!=0) + delete[] serializer; + MESSAGE (" rank "<myRank()<< " unserialize is over"); + delete group; + } + + + + void StructuredCoincidentDEC::recvData() + { + //MPI_COMM_WORLD is used instead of group because there is no + //mechanism for creating the union group yet + MESSAGE("recvData"); + for (int i=0; i< 4; i++) + cout << _recv_counts[i]<<" "; + cout <(_union_group)->getComm()); + _comm_interface->allToAllV(_send_buffer, _send_counts, _send_displs, MPI_DOUBLE, + _recv_buffer, _recv_counts, _recv_displs, MPI_DOUBLE,comm); + cout<<"end AllToAll"<getNbLocalElements(); + //double* value=new double[nb_local]; + double* value=const_cast(_local_field->getField()->getArray()->getPointer()); + + int myranktarget=_topo_target->getProcGroup()->myRank(); + vector counters(_topo_source->getProcGroup()->size()); + counters[0]=0; + for (int i=0; i<_topo_source->getProcGroup()->size()-1; i++) + { + MPIProcessorGroup* group=new MPIProcessorGroup(*_comm_interface); + int worldrank=group->translateRank(_topo_source->getProcGroup(),i); + counters[i+1]=counters[i]+_recv_counts[worldrank]; + delete group; + } + + for (int ielem=0; ielemlocalToGlobal(make_pair(myranktarget, ielem)); + pair source_local =_topo_source->globalToLocal(global); + value[ielem]=_recv_buffer[counters[source_local.first]++]; + } + + + //_local_field->getField()->setValue(value); + } + + void StructuredCoincidentDEC::sendData() + { + MESSAGE ("sendData"); + for (int i=0; i< 4; i++) + cout << _send_counts[i]<<" "; + cout <(_union_group)->getComm()); + _comm_interface->allToAllV(_send_buffer, _send_counts, _send_displs, MPI_DOUBLE, + _recv_buffer, _recv_counts, _recv_displs, MPI_DOUBLE,comm); + cout<<"end AllToAll"<containsMyRank()) + { + synchronizeTopology(); + prepareSourceDE(); + } + else if (_target_group->containsMyRank()) + { + synchronizeTopology(); + prepareTargetDE(); + } + } + /*! + @} + */ +} + diff --git a/src/ParaMEDMEM/StructuredCoincidentDEC.hxx b/src/ParaMEDMEM/StructuredCoincidentDEC.hxx new file mode 100644 index 000000000..75f63b4f0 --- /dev/null +++ b/src/ParaMEDMEM/StructuredCoincidentDEC.hxx @@ -0,0 +1,58 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __STRUCTUREDCOINCIDENTDEC_HXX__ +#define __STRUCTUREDCOINCIDENTDEC_HXX__ + +#include "DisjointDEC.hxx" +#include "BlockTopology.hxx" + + +namespace ParaMEDMEM +{ + class DEC; + class BlockTopology; + class StructuredCoincidentDEC : public DisjointDEC + { + public: + StructuredCoincidentDEC(); + StructuredCoincidentDEC( ProcessorGroup& source, ProcessorGroup& target); + virtual ~StructuredCoincidentDEC(); + void synchronize(); + void recvData(); + void sendData(); + void prepareSourceDE(); + void prepareTargetDE(); + + private : + void synchronizeTopology(); + void broadcastTopology(BlockTopology*&, int tag); + + BlockTopology* _topo_source; + BlockTopology* _topo_target; + int* _send_counts; + int* _recv_counts; + int* _send_displs; + int* _recv_displs; + double* _recv_buffer; + double* _send_buffer; + }; +} + +#endif diff --git a/src/ParaMEDMEM/TODO_JR b/src/ParaMEDMEM/TODO_JR new file mode 100644 index 000000000..de2318d54 --- /dev/null +++ b/src/ParaMEDMEM/TODO_JR @@ -0,0 +1,50 @@ + +MPI_Access : +============ + +. Creer des methodes [I]SendRecv en point a point avec un "target" + pour le Send et un "target" pour le Recv comme le SendRecv MPI. + +. Ne pas creer de structure RequestStruct en mode synchrone. + + +MPI_AccessDEC : +=============== + +. AllToAll, AllToAllv, AllToAllTime et AllToAllvTime comportent + des sequences de code semblables qui pourraient etre regroupees + sans que cela nuise a la lisibilite du code. + +. En mode asynchrone, il n'y a pas de controle d'engorgement des + messages envoyes dans CheckSent(). Il est vrai qu'en pratique + une synchronisation des temps est faite dans AllToAllTime et + AllToAllvTime. Mais ce probleme pourrait se produire avec + AllToAll et AllToAllv. Il serait possible de fixer un nombre + maximum de messages envoyes et "en cours" et de le comparer avec + le nombre de requetes rendu par MPI_Access. En cas de depassement + de ?n?*UnionGroupSize par exemple, CheckSent pourrait fonctionner + en mode "WithWait". Ce qui ferait qu'on apellerait Wait au lieu de Test. + +. Meme si le prototype d'interpolateur comporte des parametres + int nStepBefore et int nStepAfter, le codage actuel considere + qu'on n'a que nStepBefore=1 et nStepAfter=1. + Ainsi on a (*_TimeMessages)[target][0] et (*_TimeMessages)[target][1] + ainsi que &(*_DataMessages)[target][0] et &(*_DataMessages)[target][1]. + +. Les champs nStepBefore et nStepAfter correspondent a un maximum + requis. On devrait avoir les champs correspondants qui valent les + nombres disponibles a un moment donne. + +. Il existe un champs OutOfTime qui n'est pas utilise actuellement. + Il faudrait definir son usage et le transmettre sans doute à + l'interpolateur. Actuellement, L'interpolateur lineaire effectue une + extrapolation si OutOfTime vaut true. + +. Dans CheckTime, on alloue et detruit les (*_DataMessages)[target][] + alors qu'on pourrait considerer que pour un "target" donne, les + recvcount sont constants pendant toute la boucle de temps. Ainsi + on n'allouerait les buffers qu'une fois au depart et ils ne seraient + liberes qu'a la fin. + + + diff --git a/src/ParaMEDMEM/TimeInterpolator.cxx b/src/ParaMEDMEM/TimeInterpolator.cxx new file mode 100644 index 000000000..86c3bfb74 --- /dev/null +++ b/src/ParaMEDMEM/TimeInterpolator.cxx @@ -0,0 +1,34 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "TimeInterpolator.hxx" + +namespace ParaMEDMEM +{ + TimeInterpolator::TimeInterpolator( double InterpPrecision, int nStepBefore, int nStepAfter ) + { + _interp_precision=InterpPrecision; + _n_step_before=nStepBefore; + _n_step_after=nStepAfter; + } + + TimeInterpolator::~TimeInterpolator() + { + } +} diff --git a/src/ParaMEDMEM/TimeInterpolator.hxx b/src/ParaMEDMEM/TimeInterpolator.hxx new file mode 100644 index 000000000..30df1c5e6 --- /dev/null +++ b/src/ParaMEDMEM/TimeInterpolator.hxx @@ -0,0 +1,51 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __TIMEINTERPOLATOR_HXX__ +#define __TIMEINTERPOLATOR_HXX__ + +#include "ProcessorGroup.hxx" + +#include +#include + +namespace ParaMEDMEM +{ + class TimeInterpolator + { + public: + TimeInterpolator( double InterpPrecision, int nStepBefore=1, int nStepAfter=1 ); + virtual ~TimeInterpolator(); + + void setInterpParams( double InterpPrecision, int nStepBefore=1, int nStepAfter=1 ) { _interp_precision=InterpPrecision; _n_step_before=nStepBefore; _n_step_after=nStepAfter; } + void steps( int &nStepBefore, int &nStepAfter ) { nStepBefore=_n_step_before; nStepAfter=_n_step_after ; } + virtual void doInterp( double time0, double time1, double time, int recvcount , + int nbuff0, int nbuff1, + int **recvbuff0, int **recvbuff1, int *result ) = 0; + virtual void doInterp( double time0, double time1, double time, int recvcount , + int nbuff0, int nbuff1, + double **recvbuff0, double **recvbuff1, double *result ) = 0; + protected : + double _interp_precision; + int _n_step_before; + int _n_step_after; + }; +} + +#endif diff --git a/src/ParaMEDMEM/Topology.cxx b/src/ParaMEDMEM/Topology.cxx new file mode 100644 index 000000000..49a7fc20d --- /dev/null +++ b/src/ParaMEDMEM/Topology.cxx @@ -0,0 +1,31 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "Topology.hxx" + +namespace ParaMEDMEM +{ + Topology::Topology() + { + } + + Topology::~Topology() + { + } +} diff --git a/src/ParaMEDMEM/Topology.hxx b/src/ParaMEDMEM/Topology.hxx new file mode 100644 index 000000000..4b10f8b43 --- /dev/null +++ b/src/ParaMEDMEM/Topology.hxx @@ -0,0 +1,40 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __TOPOLOGY_HXX__ +#define __TOPOLOGY_HXX__ + +#include + +namespace ParaMEDMEM +{ + class ProcessorGroup; + + class Topology + { + public: + Topology() { } + virtual ~Topology() { } + virtual int getNbElements() const = 0; + virtual int getNbLocalElements() const = 0; + virtual const ProcessorGroup* getProcGroup()const = 0; + }; +} + +#endif diff --git a/src/ParaMEDMEMTest/CMakeLists.txt b/src/ParaMEDMEMTest/CMakeLists.txt new file mode 100644 index 000000000..c1ac42773 --- /dev/null +++ b/src/ParaMEDMEMTest/CMakeLists.txt @@ -0,0 +1,122 @@ +# Copyright (C) 2012-2015 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +ADD_DEFINITIONS(${MPI_DEFINITIONS} ${CPPUNIT_DEFINITIONS}) + +INCLUDE_DIRECTORIES( + ${MPI_INCLUDE_DIRS} + ${CPPUNIT_INCLUDE_DIRS} + ${CMAKE_CURRENT_SOURCE_DIR}/../ParaMEDLoader + ${CMAKE_CURRENT_SOURCE_DIR}/../ParaMEDMEM + ${CMAKE_CURRENT_SOURCE_DIR}/../MEDLoader + ${CMAKE_CURRENT_SOURCE_DIR}/../MEDCoupling + ${CMAKE_CURRENT_SOURCE_DIR}/../INTERP_KERNEL + ${CMAKE_CURRENT_SOURCE_DIR}/../INTERP_KERNEL/Bases + ) + +SET(ParaMEDMEMTest_SOURCES + ParaMEDMEMTest.cxx + ParaMEDMEMTest_MPIProcessorGroup.cxx + ParaMEDMEMTest_BlockTopology.cxx + ParaMEDMEMTest_InterpKernelDEC.cxx + ParaMEDMEMTest_StructuredCoincidentDEC.cxx + ParaMEDMEMTest_MEDLoader.cxx + ParaMEDMEMTest_ICoco.cxx + ParaMEDMEMTest_Gauthier1.cxx + ParaMEDMEMTest_FabienAPI.cxx + ParaMEDMEMTest_NonCoincidentDEC.cxx + ParaMEDMEMTest_OverlapDEC.cxx + MPIAccessDECTest.cxx + test_AllToAllDEC.cxx + test_AllToAllvDEC.cxx + test_AllToAllTimeDEC.cxx + test_AllToAllvTimeDEC.cxx + test_AllToAllvTimeDoubleDEC.cxx + MPIAccessTest.cxx + test_MPI_Access_Send_Recv.cxx + test_MPI_Access_Cyclic_Send_Recv.cxx + test_MPI_Access_SendRecv.cxx + test_MPI_Access_ISend_IRecv.cxx + test_MPI_Access_Cyclic_ISend_IRecv.cxx + test_MPI_Access_ISendRecv.cxx + test_MPI_Access_Probe.cxx + test_MPI_Access_IProbe.cxx + test_MPI_Access_Cancel.cxx + test_MPI_Access_Send_Recv_Length.cxx + test_MPI_Access_ISend_IRecv_Length.cxx + test_MPI_Access_ISend_IRecv_Length_1.cxx + test_MPI_Access_Time.cxx + test_MPI_Access_Time_0.cxx + test_MPI_Access_ISend_IRecv_BottleNeck.cxx + ) + +ADD_LIBRARY(ParaMEDMEMTest SHARED ${ParaMEDMEMTest_SOURCES}) +SET_TARGET_PROPERTIES(ParaMEDMEMTest PROPERTIES COMPILE_FLAGS "") +TARGET_LINK_LIBRARIES(ParaMEDMEMTest paramedmem paramedloader ${CPPUNIT_LIBRARIES}) +INSTALL(TARGETS ParaMEDMEMTest DESTINATION ${MEDTOOL_INSTALL_LIBS}) + +SET(TESTSParaMEDMEM) +SET(TestParaMEDMEM_SOURCES + TestParaMEDMEM.cxx + ) +SET(TESTSParaMEDMEM ${TESTSParaMEDMEM} TestParaMEDMEM) + +SET(TestMPIAccessDEC_SOURCES + TestMPIAccessDEC.cxx + ) +SET(TESTSParaMEDMEM ${TESTSParaMEDMEM} TestMPIAccessDEC) + +SET(TestMPIAccess_SOURCES + TestMPIAccess.cxx + ) +SET(TESTSParaMEDMEM ${TESTSParaMEDMEM} TestMPIAccess) + +SET(test_perf_SOURCES + test_perf.cxx + ) +SET(TESTSParaMEDMEM ${TESTSParaMEDMEM} test_perf) + +IF(MPI2_IS_OK) + SET(ParaMEDMEMTestMPI2_1_SOURCES + MPI2Connector.cxx + ParaMEDMEMTestMPI2_1.cxx + ) + SET(TESTSParaMEDMEM ${TESTSParaMEDMEM} ParaMEDMEMTestMPI2_1) + + SET(ParaMEDMEMTestMPI2_2_SOURCES + MPI2Connector.cxx + ParaMEDMEMTestMPI2_2.cxx + ) + SET(TESTSParaMEDMEM ${TESTSParaMEDMEM} ParaMEDMEMTestMPI2_2) +ENDIF(MPI2_IS_OK) + +FOREACH(bintestparamem ${TESTSParaMEDMEM}) + ADD_EXECUTABLE(${bintestparamem} ${${bintestparamem}_SOURCES}) + TARGET_LINK_LIBRARIES(${bintestparamem} ParaMEDMEMTest) +ENDFOREACH(bintestparamem ${TESTSParaMEDMEM}) + +INSTALL(TARGETS ${TESTSParaMEDMEM} DESTINATION ${MEDTOOL_INSTALL_BINS}) +SET(COMMON_HEADERS_HXX + MPIMainTest.hxx + MPIAccessDECTest.hxx + MPIAccessTest.hxx + ParaMEDMEMTest.hxx + MPI2Connector.hxx +) +INSTALL(FILES ${COMMON_HEADERS_HXX} DESTINATION ${MEDTOOL_INSTALL_HEADERS}) diff --git a/src/ParaMEDMEMTest/MPI2Connector.cxx b/src/ParaMEDMEMTest/MPI2Connector.cxx new file mode 100644 index 000000000..616ac138f --- /dev/null +++ b/src/ParaMEDMEMTest/MPI2Connector.cxx @@ -0,0 +1,153 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "MPI2Connector.hxx" + +#include +#include + +#ifndef WIN32 +#include +#endif + +MPI2Connector::MPI2Connector() +{ + MPI_Comm_size( MPI_COMM_WORLD, &_nb_proc ); + MPI_Comm_rank( MPI_COMM_WORLD, &_num_proc ); +} + +MPI2Connector::~MPI2Connector() +{ +} + +MPI_Comm MPI2Connector::remoteMPI2Connect(const std::string& service) +{ + int i; + char port_name[MPI_MAX_PORT_NAME]; + char port_name_clt[MPI_MAX_PORT_NAME]; + std::ostringstream msg; + MPI_Comm icom; + + if( service.size() == 0 ) + { + msg << "[" << _num_proc << "] You have to give a service name !"; + std::cerr << msg.str().c_str() << std::endl; + throw std::exception(); + } + + _srv = false; + + MPI_Barrier(MPI_COMM_WORLD); + + MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_RETURN); + if( _num_proc == 0 ) + { + /* rank 0 try to be a server. If service is already published, try to be a cient */ + MPI_Open_port(MPI_INFO_NULL, port_name); + if ( MPI_Lookup_name((char*)service.c_str(), MPI_INFO_NULL, port_name_clt) == MPI_SUCCESS ) + { + std::cerr << "[" << _num_proc << "] I get the connection with " << service << " at " << port_name_clt << std::endl; + MPI_Close_port( port_name ); + } + else if ( MPI_Publish_name((char*)service.c_str(), MPI_INFO_NULL, port_name) == MPI_SUCCESS ) + { + _srv = true; + _port_name = port_name; + std::cerr << "[" << _num_proc << "] service " << service << " available at " << port_name << std::endl; + } + else if ( MPI_Lookup_name((char*)service.c_str(), MPI_INFO_NULL, port_name_clt) == MPI_SUCCESS ) + { + std::cerr << "[" << _num_proc << "] I get the connection with " << service << " at " << port_name_clt << std::endl; + MPI_Close_port( port_name ); + } + else + { + msg << "[" << _num_proc << "] Error on connection with " << service << " at " << port_name_clt; + std::cerr << msg.str().c_str() << std::endl; + throw std::exception(); + } + } + else + { + i=0; + /* Waiting rank 0 publish name and try to be a client */ + while ( i != TIMEOUT ) + { + sleep(1); + if ( MPI_Lookup_name((char*)service.c_str(), MPI_INFO_NULL, port_name_clt) == MPI_SUCCESS ) + { + std::cerr << "[" << _num_proc << "] I get the connection with " << service << " at " << port_name_clt << std::endl; + break; + } + i++; + } + if(i==TIMEOUT) + { + msg << "[" << _num_proc << "] Error on connection with " << service << " at " << port_name_clt; + std::cerr << msg.str().c_str() << std::endl; + throw std::exception(); + } + } + MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_ARE_FATAL); + + /* If rank 0 is server, all processes call MPI_Comm_accept */ + /* If rank 0 is not server, all processes call MPI_Comm_connect */ + int srv = (int)_srv; + MPI_Bcast(&srv,1,MPI_INT,0,MPI_COMM_WORLD); + _srv = (bool)srv; + if ( _srv ) + MPI_Comm_accept( port_name, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &icom ); + else + MPI_Comm_connect(port_name_clt, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &icom ); + + /* create global communicator: servers have low index in global communicator*/ + MPI_Intercomm_merge(icom,!_srv,&_gcom); + + /* only rank 0 can be server for unpublish name */ + if(_num_proc != 0) _srv = false; + + return _gcom; + +} + +void MPI2Connector::remoteMPI2Disconnect(const std::string& service) +{ + std::ostringstream msg; + + if( service.size() == 0 ) + { + msg << "[" << _num_proc << "] You have to give a service name !"; + std::cerr << msg.str().c_str() << std::endl; + throw std::exception(); + } + + MPI_Comm_disconnect( &_gcom ); + if ( _srv ) + { + + char port_name[MPI_MAX_PORT_NAME]; + strcpy(port_name,_port_name.c_str()); + + MPI_Unpublish_name((char*)service.c_str(), MPI_INFO_NULL, port_name); + std::cerr << "[" << _num_proc << "] " << service << ": close port " << _port_name << std::endl; + MPI_Close_port( port_name ); + } + +} + diff --git a/src/ParaMEDMEMTest/MPI2Connector.hxx b/src/ParaMEDMEMTest/MPI2Connector.hxx new file mode 100644 index 000000000..57680b2c3 --- /dev/null +++ b/src/ParaMEDMEMTest/MPI2Connector.hxx @@ -0,0 +1,48 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __MPI2CONNECTOR_HXX__ +#define __MPI2CONNECTOR_HXX__ + +#include +#include +#include + +class MPI2Connector +{ +public: + MPI2Connector(); + ~MPI2Connector(); + // MPI2 connection + MPI_Comm remoteMPI2Connect(const std::string& service); + // MPI2 disconnection + void remoteMPI2Disconnect(const std::string& service); +private: + // Processus id + int _num_proc; + // Processus size + int _nb_proc; + MPI_Comm _gcom; + bool _srv; + std::string _port_name; +private: + static const int TIMEOUT=5; +}; + +#endif diff --git a/src/ParaMEDMEMTest/MPIAccessDECTest.cxx b/src/ParaMEDMEMTest/MPIAccessDECTest.cxx new file mode 100644 index 000000000..c757e6e4f --- /dev/null +++ b/src/ParaMEDMEMTest/MPIAccessDECTest.cxx @@ -0,0 +1,52 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "MPIAccessDECTest.hxx" +#include + +#include +#include + +#ifndef WIN32 +#include +#endif + +using namespace std; + + + +/*! + * Tool to remove temporary files. + * Allows automatique removal of temporary files in case of test failure. + */ +MPIAccessDECTest_TmpFilesRemover::~MPIAccessDECTest_TmpFilesRemover() +{ + set::iterator it = myTmpFiles.begin(); + for (; it != myTmpFiles.end(); it++) { + if (access((*it).data(), F_OK) == 0) + remove((*it).data()); + } + myTmpFiles.clear(); + //cout << "~MPIAccessTest_TmpFilesRemover()" << endl; +} + +bool MPIAccessDECTest_TmpFilesRemover::Register(const string theTmpFile) +{ + return (myTmpFiles.insert(theTmpFile)).second; +} diff --git a/src/ParaMEDMEMTest/MPIAccessDECTest.hxx b/src/ParaMEDMEMTest/MPIAccessDECTest.hxx new file mode 100644 index 000000000..80655b565 --- /dev/null +++ b/src/ParaMEDMEMTest/MPIAccessDECTest.hxx @@ -0,0 +1,102 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef _MPIACCESSDECTEST_HXX_ +#define _MPIACCESSDECTEST_HXX_ + +#include + +#include +#include +#include +#include "mpi.h" + + +class MPIAccessDECTest : public CppUnit::TestFixture +{ + CPPUNIT_TEST_SUITE( MPIAccessDECTest ); + // CPPUNIT_TEST( test_AllToAllDECSynchronousPointToPoint ) ; + CPPUNIT_TEST( test_AllToAllDECAsynchronousPointToPoint ) ; + //CPPUNIT_TEST( test_AllToAllvDECSynchronousPointToPoint ) ; + CPPUNIT_TEST( test_AllToAllvDECAsynchronousPointToPoint ) ; + //CPPUNIT_TEST( test_AllToAllTimeDECSynchronousPointToPoint ) ; + CPPUNIT_TEST( test_AllToAllTimeDECAsynchronousPointToPoint ) ; + CPPUNIT_TEST( test_AllToAllvTimeDECSynchronousNative ) ; + //CPPUNIT_TEST( test_AllToAllvTimeDECSynchronousPointToPoint ) ; + CPPUNIT_TEST( test_AllToAllvTimeDECAsynchronousPointToPoint ) ; + //CPPUNIT_TEST( test_AllToAllvTimeDoubleDECSynchronousPointToPoint ) ; + CPPUNIT_TEST( test_AllToAllvTimeDoubleDECAsynchronousPointToPoint ) ; + CPPUNIT_TEST_SUITE_END(); + + +public: + + MPIAccessDECTest():CppUnit::TestFixture(){} + ~MPIAccessDECTest(){} + void setUp(){} + void tearDown(){} + void test_AllToAllDECSynchronousPointToPoint() ; + void test_AllToAllDECAsynchronousPointToPoint() ; + void test_AllToAllvDECSynchronousPointToPoint() ; + void test_AllToAllvDECAsynchronousPointToPoint() ; + void test_AllToAllTimeDECSynchronousPointToPoint() ; + void test_AllToAllTimeDECAsynchronousPointToPoint() ; + void test_AllToAllvTimeDECSynchronousNative() ; + void test_AllToAllvTimeDECSynchronousPointToPoint() ; + void test_AllToAllvTimeDECAsynchronousPointToPoint() ; + void test_AllToAllvTimeDoubleDECSynchronousPointToPoint() ; + void test_AllToAllvTimeDoubleDECAsynchronousPointToPoint() ; + +private: + void test_AllToAllDEC( bool Asynchronous ) ; + void test_AllToAllvDEC( bool Asynchronous ) ; + void test_AllToAllTimeDEC( bool Asynchronous ) ; + void test_AllToAllvTimeDEC( bool Asynchronous , bool UseMPINative ) ; + void test_AllToAllvTimeDoubleDEC( bool Asynchronous ) ; + }; + +// to automatically remove temporary files from disk +class MPIAccessDECTest_TmpFilesRemover +{ +public: + MPIAccessDECTest_TmpFilesRemover() {} + ~MPIAccessDECTest_TmpFilesRemover(); + bool Register(const std::string theTmpFile); + +private: + std::set myTmpFiles; +}; + +/*! + * Tool to print array to stream. + */ +template +void MPIAccessDECTest_DumpArray (std::ostream & stream, const T* array, const int length, const std::string text) +{ + stream << text << ": {"; + if (length > 0) { + stream << array[0]; + for (int i = 1; i < length; i++) { + stream << ", " << array[i]; + } + } + stream << "}" << std::endl; +}; + +#endif diff --git a/src/ParaMEDMEMTest/MPIAccessTest.cxx b/src/ParaMEDMEMTest/MPIAccessTest.cxx new file mode 100644 index 000000000..a9714f841 --- /dev/null +++ b/src/ParaMEDMEMTest/MPIAccessTest.cxx @@ -0,0 +1,52 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "MPIAccessTest.hxx" +#include + +#include +#include + +#ifndef WIN32 +#include +#endif + +using namespace std; + + + +/*! + * Tool to remove temporary files. + * Allows automatique removal of temporary files in case of test failure. + */ +MPIAccessTest_TmpFilesRemover::~MPIAccessTest_TmpFilesRemover() +{ + set::iterator it = myTmpFiles.begin(); + for (; it != myTmpFiles.end(); it++) { + if (access((*it).data(), F_OK) == 0) + remove((*it).data()); + } + myTmpFiles.clear(); + //cout << "~MPIAccessTest_TmpFilesRemover()" << endl; +} + +bool MPIAccessTest_TmpFilesRemover::Register(const string theTmpFile) +{ + return (myTmpFiles.insert(theTmpFile)).second; +} diff --git a/src/ParaMEDMEMTest/MPIAccessTest.hxx b/src/ParaMEDMEMTest/MPIAccessTest.hxx new file mode 100644 index 000000000..07d704819 --- /dev/null +++ b/src/ParaMEDMEMTest/MPIAccessTest.hxx @@ -0,0 +1,105 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef _MPIACCESSTEST_HXX_ +#define _MPIACCESSTEST_HXX_ + +#include + +#include +#include +#include +#include "mpi.h" + + +class MPIAccessTest : public CppUnit::TestFixture +{ + CPPUNIT_TEST_SUITE( MPIAccessTest ); + CPPUNIT_TEST( test_MPI_Access_Send_Recv ) ; + CPPUNIT_TEST( test_MPI_Access_Cyclic_Send_Recv ) ; + CPPUNIT_TEST( test_MPI_Access_SendRecv ) ; + CPPUNIT_TEST( test_MPI_Access_ISend_IRecv ) ; + CPPUNIT_TEST( test_MPI_Access_Cyclic_ISend_IRecv ) ; + CPPUNIT_TEST( test_MPI_Access_ISendRecv ) ; + CPPUNIT_TEST( test_MPI_Access_Probe ) ; + CPPUNIT_TEST( test_MPI_Access_IProbe ) ; + CPPUNIT_TEST( test_MPI_Access_Cancel ) ; + CPPUNIT_TEST( test_MPI_Access_Send_Recv_Length ) ; + CPPUNIT_TEST( test_MPI_Access_ISend_IRecv_Length ) ; + CPPUNIT_TEST( test_MPI_Access_ISend_IRecv_Length_1 ) ; + CPPUNIT_TEST( test_MPI_Access_Time ) ; + CPPUNIT_TEST( test_MPI_Access_Time_0 ) ; + CPPUNIT_TEST( test_MPI_Access_ISend_IRecv_BottleNeck ) ; + CPPUNIT_TEST_SUITE_END(); + + +public: + + MPIAccessTest():CppUnit::TestFixture(){} + ~MPIAccessTest(){} + void setUp(){} + void tearDown(){} + void test_MPI_Access_Send_Recv() ; + void test_MPI_Access_Cyclic_Send_Recv() ; + void test_MPI_Access_SendRecv() ; + void test_MPI_Access_ISend_IRecv() ; + void test_MPI_Access_Cyclic_ISend_IRecv() ; + void test_MPI_Access_ISendRecv() ; + void test_MPI_Access_Probe() ; + void test_MPI_Access_IProbe() ; + void test_MPI_Access_Cancel() ; + void test_MPI_Access_Send_Recv_Length() ; + void test_MPI_Access_ISend_IRecv_Length() ; + void test_MPI_Access_ISend_IRecv_Length_1() ; + void test_MPI_Access_Time() ; + void test_MPI_Access_Time_0() ; + void test_MPI_Access_ISend_IRecv_BottleNeck() ; + +private: + }; + +// to automatically remove temporary files from disk +class MPIAccessTest_TmpFilesRemover +{ +public: + MPIAccessTest_TmpFilesRemover() {} + ~MPIAccessTest_TmpFilesRemover(); + bool Register(const std::string theTmpFile); + +private: + std::set myTmpFiles; +}; + +/*! + * Tool to print array to stream. + */ +template +void MPIAccessTest_DumpArray (std::ostream & stream, const T* array, const int length, const std::string text) +{ + stream << text << ": {"; + if (length > 0) { + stream << array[0]; + for (int i = 1; i < length; i++) { + stream << ", " << array[i]; + } + } + stream << "}" << std::endl; +} + +#endif diff --git a/src/ParaMEDMEMTest/MPIMainTest.hxx b/src/ParaMEDMEMTest/MPIMainTest.hxx new file mode 100644 index 000000000..eec6e5a6f --- /dev/null +++ b/src/ParaMEDMEMTest/MPIMainTest.hxx @@ -0,0 +1,105 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef _MPIMAINTEST_HXX_ +#define _MPIMAINTEST_HXX_ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#ifndef WIN32 +#include +#endif + +// ============================================================================ +/*! + * Main program source for Unit Tests with cppunit package does not depend + * on actual tests, so we use the same for all partial unit tests. + */ +// ============================================================================ + +int main(int argc, char* argv[]) +{ +#ifndef WIN32 + fpu_control_t cw = _FPU_DEFAULT & ~(_FPU_MASK_IM | _FPU_MASK_ZM | _FPU_MASK_OM); + _FPU_SETCW(cw); +#endif + MPI_Init(&argc,&argv); + int rank; + MPI_Comm_rank(MPI_COMM_WORLD,&rank); + + // --- Create the event manager and test controller + CPPUNIT_NS::TestResult controller; + + // --- Add a listener that colllects test result + CPPUNIT_NS::TestResultCollector result; + controller.addListener( &result ); + + // --- Add a listener that print dots as test run. +#ifdef WIN32 + CPPUNIT_NS::TextTestProgressListener progress; +#else + CPPUNIT_NS::BriefTestProgressListener progress; +#endif + controller.addListener( &progress ); + + // --- Get the top level suite from the registry + + CPPUNIT_NS::Test *suite = + CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest(); + + // --- Adds the test to the list of test to run + + CPPUNIT_NS::TestRunner runner; + runner.addTest( suite ); + runner.run( controller); + + // --- Print test in a compiler compatible format. + + std::ostringstream testFileName; + testFileName<<"UnitTestsResult"< + +#include +#include +#include +#include +#include + +#ifndef WIN32 +#include +#endif + +//================================================================================ +/*! + * \brief Get path to the resources file. + * + * When running 'make test' source file is taken from MED_SRC/resources folder. + * Otherwise, file is searched in ${MED_ROOT_DIR}/share/salome/resources/med folder. + * + * \param filename name of the resource file (should not include a path) + * \return full path to the resource file + */ +//================================================================================ + +std::string ParaMEDMEMTest::getResourceFile( const std::string& filename ) +{ + std::string resourceFile = ""; + + if ( getenv("top_srcdir") ) { + // we are in 'make test' step + resourceFile = getenv("top_srcdir"); + resourceFile += "/resources/"; + } + else if ( getenv("MED_ROOT_DIR") ) { + // use MED_ROOT_DIR env.var + resourceFile = getenv("MED_ROOT_DIR"); + resourceFile += "/share/salome/resources/med/"; + } + resourceFile += filename; + return resourceFile; +} + + +//================================================================================ +/*! + * \brief Returns writable temporary directory + * \return full path to the temporary directory + */ +//================================================================================ + +std::string ParaMEDMEMTest::getTmpDirectory() +{ + std::string path; + + std::list dirs; + if ( getenv("TMP") ) dirs.push_back( getenv("TMP" )); + if ( getenv("TMPDIR") ) dirs.push_back( getenv("TMPDIR" )); + dirs.push_back( "/tmp" ); + + std::string tmpd = ""; + for ( std::list::iterator dir = dirs.begin(); dir != dirs.end() && tmpd == "" ; ++dir ) { + if ( access( dir->data(), W_OK ) == 0 ) { + tmpd = dir->data(); + } + } + + if ( tmpd == "" ) + throw std::runtime_error("Can't find writable temporary directory. Set TMP environment variable"); + + return tmpd; +} + +//================================================================================ +/*! + * \brief Creates a copy of source file (if source file is specified) + * in the temporary directory and returns a path to the tmp file + * + * \param tmpfile name of the temporary file (without path) + * \param srcfile source file + * \return path to the temporary file + */ +//================================================================================ +std::string ParaMEDMEMTest::makeTmpFile( const std::string& tmpfile, const std::string& srcfile ) +{ + std::string tmpf = getTmpDirectory() + "/" + tmpfile; + if ( srcfile != "" ) { + std::string cmd = "cp " + srcfile + " " + tmpf + " ; chmod +w " + tmpf; + system( cmd.c_str() ); + } + return tmpf; +} + + +/*! + * Tool to remove temporary files. + * Allows automatique removal of temporary files in case of test failure. + */ +ParaMEDMEMTest_TmpFilesRemover::~ParaMEDMEMTest_TmpFilesRemover() +{ + std::set::iterator it = myTmpFiles.begin(); + for (; it != myTmpFiles.end(); it++) { + if (access((*it).data(), F_OK) == 0) + remove((*it).data()); + } + myTmpFiles.clear(); + //cout << "~ParaMEDMEMTest_TmpFilesRemover()" << endl; +} + +bool ParaMEDMEMTest_TmpFilesRemover::Register(const std::string theTmpFile) +{ + return (myTmpFiles.insert(theTmpFile)).second; +} diff --git a/src/ParaMEDMEMTest/ParaMEDMEMTest.hxx b/src/ParaMEDMEMTest/ParaMEDMEMTest.hxx new file mode 100644 index 000000000..a8bf2b474 --- /dev/null +++ b/src/ParaMEDMEMTest/ParaMEDMEMTest.hxx @@ -0,0 +1,188 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef _ParaMEDMEMTEST_HXX_ +#define _ParaMEDMEMTEST_HXX_ + +#include + +#include +#include +#include +#include "mpi.h" + + +class ParaMEDMEMTest : public CppUnit::TestFixture +{ + CPPUNIT_TEST_SUITE( ParaMEDMEMTest ); + CPPUNIT_TEST(testMPIProcessorGroup_constructor); + CPPUNIT_TEST(testMPIProcessorGroup_boolean); + CPPUNIT_TEST(testMPIProcessorGroup_rank); + CPPUNIT_TEST(testBlockTopology_constructor); + CPPUNIT_TEST(testBlockTopology_serialize); + CPPUNIT_TEST(testInterpKernelDEC_1D); + CPPUNIT_TEST(testInterpKernelDEC_2DCurve); + CPPUNIT_TEST(testInterpKernelDEC_2D); + CPPUNIT_TEST(testInterpKernelDEC2_2D); + CPPUNIT_TEST(testInterpKernelDEC_2DP0P1); + CPPUNIT_TEST(testInterpKernelDEC_3D); + CPPUNIT_TEST(testInterpKernelDECNonOverlapp_2D_P0P0); + CPPUNIT_TEST(testInterpKernelDECNonOverlapp_2D_P0P1P1P0); + CPPUNIT_TEST(testInterpKernelDEC2DM1D_P0P0); + CPPUNIT_TEST(testInterpKernelDECPartialProcs); + CPPUNIT_TEST(testInterpKernelDEC3DSurfEmptyBBox); + CPPUNIT_TEST(testOverlapDEC1); + + CPPUNIT_TEST(testSynchronousEqualInterpKernelWithoutInterpNativeDEC_2D); + CPPUNIT_TEST(testSynchronousEqualInterpKernelWithoutInterpDEC_2D); + CPPUNIT_TEST(testSynchronousEqualInterpKernelDEC_2D); + CPPUNIT_TEST(testSynchronousFasterSourceInterpKernelDEC_2D); + CPPUNIT_TEST(testSynchronousSlowerSourceInterpKernelDEC_2D); + CPPUNIT_TEST(testSynchronousSlowSourceInterpKernelDEC_2D); + CPPUNIT_TEST(testSynchronousFastSourceInterpKernelDEC_2D); + CPPUNIT_TEST(testAsynchronousEqualInterpKernelDEC_2D); + CPPUNIT_TEST(testAsynchronousFasterSourceInterpKernelDEC_2D); + CPPUNIT_TEST(testAsynchronousSlowerSourceInterpKernelDEC_2D); + CPPUNIT_TEST(testAsynchronousSlowSourceInterpKernelDEC_2D); + CPPUNIT_TEST(testAsynchronousFastSourceInterpKernelDEC_2D); +#ifdef MED_ENABLE_FVM + //can be added again after FVM correction for 2D + // CPPUNIT_TEST(testNonCoincidentDEC_2D); + CPPUNIT_TEST(testNonCoincidentDEC_3D); +#endif + CPPUNIT_TEST(testStructuredCoincidentDEC); + CPPUNIT_TEST(testStructuredCoincidentDEC); + CPPUNIT_TEST(testICoco1); + CPPUNIT_TEST(testGauthier1); + CPPUNIT_TEST(testGauthier2); + CPPUNIT_TEST(testGauthier3); + CPPUNIT_TEST(testGauthier4); + CPPUNIT_TEST(testFabienAPI1); + CPPUNIT_TEST(testFabienAPI2); + CPPUNIT_TEST(testMEDLoaderRead1); + CPPUNIT_TEST(testMEDLoaderPolygonRead); + CPPUNIT_TEST(testMEDLoaderPolyhedronRead); + CPPUNIT_TEST_SUITE_END(); + + +public: + + ParaMEDMEMTest():CppUnit::TestFixture(){} + ~ParaMEDMEMTest(){} + void setUp(){} + void tearDown(){} + void testMPIProcessorGroup_constructor(); + void testMPIProcessorGroup_boolean(); + void testMPIProcessorGroup_rank(); + void testBlockTopology_constructor(); + void testBlockTopology_serialize(); + void testInterpKernelDEC_1D(); + void testInterpKernelDEC_2DCurve(); + void testInterpKernelDEC_2D(); + void testInterpKernelDEC2_2D(); + void testInterpKernelDEC_2DP0P1(); + void testInterpKernelDEC_3D(); + void testInterpKernelDECNonOverlapp_2D_P0P0(); + void testInterpKernelDECNonOverlapp_2D_P0P1P1P0(); + void testInterpKernelDEC2DM1D_P0P0(); + void testInterpKernelDECPartialProcs(); + void testInterpKernelDEC3DSurfEmptyBBox(); + void testOverlapDEC1(); +#ifdef MED_ENABLE_FVM + void testNonCoincidentDEC_2D(); + void testNonCoincidentDEC_3D(); +#endif + void testStructuredCoincidentDEC(); + void testSynchronousEqualInterpKernelWithoutInterpNativeDEC_2D(); + void testSynchronousEqualInterpKernelWithoutInterpDEC_2D(); + void testSynchronousEqualInterpKernelDEC_2D(); + void testSynchronousFasterSourceInterpKernelDEC_2D(); + void testSynchronousSlowerSourceInterpKernelDEC_2D(); + void testSynchronousSlowSourceInterpKernelDEC_2D(); + void testSynchronousFastSourceInterpKernelDEC_2D(); + + void testAsynchronousEqualInterpKernelDEC_2D(); + void testAsynchronousFasterSourceInterpKernelDEC_2D(); + void testAsynchronousSlowerSourceInterpKernelDEC_2D(); + void testAsynchronousSlowSourceInterpKernelDEC_2D(); + void testAsynchronousFastSourceInterpKernelDEC_2D(); + // + void testICoco1(); + void testGauthier1(); + void testGauthier2(); + void testGauthier3(); + void testGauthier4(); + void testFabienAPI1(); + void testFabienAPI2(); + // + void testMEDLoaderRead1(); + void testMEDLoaderPolygonRead(); + void testMEDLoaderPolyhedronRead(); + void testMEDLoaderWrite1(); + void testMEDLoaderPolygonWrite(); + + std::string getResourceFile( const std::string& ); + std::string getTmpDirectory(); + std::string makeTmpFile( const std::string&, const std::string& = "" ); + +private: +#ifdef MED_ENABLE_FVM + void testNonCoincidentDEC(const std::string& filename1, + const std::string& meshname1, + const std::string& filename2, + const std::string& meshname2, + int nbprocsource, double epsilon); +#endif + void testAsynchronousInterpKernelDEC_2D(double dtA, double tmaxA, + double dtB, double tmaxB, + bool WithPointToPoint, bool Asynchronous, bool WithInterp, const char *srcMeth, const char *targetMeth); + void testInterpKernelDEC_2D_(const char *srcMeth, const char *targetMeth); + void testInterpKernelDEC2_2D_(const char *srcMeth, const char *targetMeth); + void testInterpKernelDEC_3D_(const char *srcMeth, const char *targetMeth); +}; + +// to automatically remove temporary files from disk +class ParaMEDMEMTest_TmpFilesRemover +{ +public: + ParaMEDMEMTest_TmpFilesRemover() {} + ~ParaMEDMEMTest_TmpFilesRemover(); + bool Register(const std::string theTmpFile); + +private: + std::set myTmpFiles; +}; + +/*! + * Tool to print array to stream. + */ +template +void ParaMEDMEMTest_DumpArray (std::ostream & stream, const T* array, const int length, const std::string text) +{ + stream << text << ": {"; + if (length > 0) { + stream << array[0]; + for (int i = 1; i < length; i++) { + stream << ", " << array[i]; + } + } + stream << "}" << std::endl; +} + +#endif diff --git a/src/ParaMEDMEMTest/ParaMEDMEMTestMPI2_1.cxx b/src/ParaMEDMEMTest/ParaMEDMEMTestMPI2_1.cxx new file mode 100644 index 000000000..e56972116 --- /dev/null +++ b/src/ParaMEDMEMTest/ParaMEDMEMTestMPI2_1.cxx @@ -0,0 +1,125 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include + +#include "MPI2Connector.hxx" +#include "ParaMESH.hxx" +#include "ParaFIELD.hxx" +#include "MEDCouplingUMesh.hxx" +#include "MEDCouplingFieldDouble.hxx" +#include "InterpKernelDEC.hxx" +#include "MPIProcessorGroup.hxx" +#include "CommInterface.hxx" + +#include +#include +#include + +class MPI2ParaMEDMEMTest : public CppUnit::TestFixture +{ + CPPUNIT_TEST_SUITE( MPI2ParaMEDMEMTest ); + CPPUNIT_TEST( testBasicMPI2_1 ); + CPPUNIT_TEST_SUITE_END(); +public: + void testBasicMPI2_1(); +}; + +using namespace ParaMEDMEM; + +void MPI2ParaMEDMEMTest::testBasicMPI2_1() +{ + int lsize, lrank, gsize, grank; + MPI_Comm gcom; + std::string service = "SERVICE"; + std::ostringstream meshfilename, meshname; + ParaMEDMEM::ParaMESH *paramesh=0; + ParaMEDMEM::MEDCouplingUMesh *mesh; + ParaMEDMEM::ParaFIELD *parafield=0; + ParaMEDMEM::CommInterface *interface; + ParaMEDMEM::MPIProcessorGroup *source, *target; + + MPI_Comm_size( MPI_COMM_WORLD, &lsize ); + MPI_Comm_rank( MPI_COMM_WORLD, &lrank ); + if(lsize!=2) + { + CPPUNIT_ASSERT(false); + return; + } + + /* Connection to remote programm */ + MPI2Connector *mpio = new MPI2Connector; + gcom = mpio->remoteMPI2Connect(service); + MPI_Comm_size( gcom, &gsize ); + MPI_Comm_rank( gcom, &grank ); + if(gsize!=5) + { + CPPUNIT_ASSERT(false); + return; + } + interface = new ParaMEDMEM::CommInterface; + source = new ParaMEDMEM::MPIProcessorGroup(*interface,0,lsize-1,gcom); + target = new ParaMEDMEM::MPIProcessorGroup(*interface,lsize,gsize-1,gcom); + + const double sourceCoordsAll[2][8]={{0.4,0.5,0.4,1.5,1.6,1.5,1.6,0.5}, + {0.3,-0.5,1.6,-0.5,1.6,-1.5,0.3,-1.5}}; + + int conn4All[8]={0,1,2,3,4,5,6,7}; + + std::ostringstream stream; stream << "sourcemesh2D proc " << grank; + mesh=MEDCouplingUMesh::New(stream.str().c_str(),2); + mesh->allocateCells(2); + mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,conn4All); + mesh->finishInsertingCells(); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(4,2); + const double *sourceCoords=sourceCoordsAll[grank]; + std::copy(sourceCoords,sourceCoords+8,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + paramesh=new ParaMESH(mesh,*source,"source mesh"); + ParaMEDMEM::ComponentTopology comptopo; + parafield = new ParaFIELD(ON_CELLS,NO_TIME,paramesh, comptopo); + double *value=parafield->getField()->getArray()->getPointer(); + value[0]=34+13*((double)grank); + + ParaMEDMEM::InterpKernelDEC dec(*source,*target); + parafield->getField()->setNature(ConservativeVolumic); + + + dec.setMethod("P0"); + dec.attachLocalField(parafield); + dec.synchronize(); + dec.setForcedRenormalization(false); + dec.sendData(); + /* Deconnection of remote programm */ + mpio->remoteMPI2Disconnect(service); + /* clean-up */ + delete mpio; + delete parafield; + mesh->decrRef(); + delete paramesh; + delete source; + delete target; + delete interface; +} + +CPPUNIT_TEST_SUITE_REGISTRATION( MPI2ParaMEDMEMTest ); + +#include "MPIMainTest.hxx" diff --git a/src/ParaMEDMEMTest/ParaMEDMEMTestMPI2_2.cxx b/src/ParaMEDMEMTest/ParaMEDMEMTestMPI2_2.cxx new file mode 100644 index 000000000..102443ef0 --- /dev/null +++ b/src/ParaMEDMEMTest/ParaMEDMEMTestMPI2_2.cxx @@ -0,0 +1,130 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include + +#include "MPI2Connector.hxx" +#include "ParaMESH.hxx" +#include "ParaFIELD.hxx" +#include "MEDCouplingUMesh.hxx" +#include "MEDCouplingFieldDouble.hxx" +#include "InterpKernelDEC.hxx" +#include "MPIProcessorGroup.hxx" +#include "CommInterface.hxx" + +#include +#include +#include + +class MPI2ParaMEDMEMTest : public CppUnit::TestFixture +{ + CPPUNIT_TEST_SUITE( MPI2ParaMEDMEMTest ); + CPPUNIT_TEST( testBasicMPI2_1 ); + CPPUNIT_TEST_SUITE_END(); +public: + void testBasicMPI2_1(); +}; + +using namespace ParaMEDMEM; + +void MPI2ParaMEDMEMTest::testBasicMPI2_1() +{ + int lsize, lrank, gsize, grank; + MPI_Comm gcom; + std::string service = "SERVICE"; + std::ostringstream meshfilename, meshname; + ParaMEDMEM::ParaMESH *paramesh=0; + ParaMEDMEM::MEDCouplingUMesh* mesh; + ParaMEDMEM::ParaFIELD *parafield=0; + ParaMEDMEM::CommInterface* interface; + ParaMEDMEM::MPIProcessorGroup* source, *target; + + MPI_Comm_size( MPI_COMM_WORLD, &lsize ); + MPI_Comm_rank( MPI_COMM_WORLD, &lrank ); + if(lsize!=3) + { + CPPUNIT_ASSERT(false); + return; + } + + /* Connection to remote programm */ + MPI2Connector *mpio = new MPI2Connector; + gcom = mpio->remoteMPI2Connect(service); + + MPI_Comm_size( gcom, &gsize ); + MPI_Comm_rank( gcom, &grank ); + if(gsize!=5) + { + CPPUNIT_ASSERT(false); + return; + } + + interface = new ParaMEDMEM::CommInterface; + source = new ParaMEDMEM::MPIProcessorGroup(*interface,0,gsize-lsize-1,gcom); + target = new ParaMEDMEM::MPIProcessorGroup(*interface,gsize-lsize,gsize-1,gcom); + + const double targetCoordsAll[3][16]={{0.7,1.45,0.7,1.65,0.9,1.65,0.9,1.45, 1.1,1.4,1.1,1.6,1.3,1.6,1.3,1.4}, + {0.7,-0.6,0.7,0.7,0.9,0.7,0.9,-0.6, 1.1,-0.7,1.1,0.6,1.3,0.6,1.3,-0.7}, + {0.7,-1.55,0.7,-1.35,0.9,-1.35,0.9,-1.55, 1.1,-1.65,1.1,-1.45,1.3,-1.45,1.3,-1.65}}; + int conn4All[8]={0,1,2,3,4,5,6,7}; + double targetResults[3][2]={{34.,34.},{38.333333333333336,42.666666666666664},{47.,47.}}; + + std::ostringstream stream; stream << "targetmesh2D proc " << grank-(gsize-lsize); + mesh=MEDCouplingUMesh::New(stream.str().c_str(),2); + mesh->allocateCells(2); + mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,conn4All); + mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,conn4All+4); + mesh->finishInsertingCells(); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(8,2); + const double *targetCoords=targetCoordsAll[grank-(gsize-lsize)]; + std::copy(targetCoords,targetCoords+16,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + paramesh=new ParaMESH (mesh,*target,"target mesh"); + ParaMEDMEM::ComponentTopology comptopo; + parafield = new ParaFIELD(ON_CELLS,NO_TIME,paramesh, comptopo); + + ParaMEDMEM::InterpKernelDEC dec(*source,*target); + parafield->getField()->setNature(ConservativeVolumic); + + dec.setMethod("P0"); + dec.attachLocalField(parafield); + dec.synchronize(); + dec.setForcedRenormalization(false); + dec.recvData(); + const double *res=parafield->getField()->getArray()->getConstPointer(); + const double *expected=targetResults[grank-(gsize-lsize)]; + CPPUNIT_ASSERT_DOUBLES_EQUAL(expected[0],res[0],1e-13); + CPPUNIT_ASSERT_DOUBLES_EQUAL(expected[1],res[1],1e-13); + /* Deconnection of remote programm */ + mpio->remoteMPI2Disconnect(service); + /* clean-up */ + delete mpio; + delete parafield; + mesh->decrRef(); + delete paramesh; + delete source; + delete target; + delete interface; +} + +CPPUNIT_TEST_SUITE_REGISTRATION( MPI2ParaMEDMEMTest ); + +#include "MPIMainTest.hxx" diff --git a/src/ParaMEDMEMTest/ParaMEDMEMTest_BlockTopology.cxx b/src/ParaMEDMEMTest/ParaMEDMEMTest_BlockTopology.cxx new file mode 100644 index 000000000..dc129ccf1 --- /dev/null +++ b/src/ParaMEDMEMTest/ParaMEDMEMTest_BlockTopology.cxx @@ -0,0 +1,123 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "ParaMEDMEMTest.hxx" +#include + +#include "InterpolationUtils.hxx" +#include "CommInterface.hxx" +#include "ProcessorGroup.hxx" +#include "MPIProcessorGroup.hxx" +#include "Topology.hxx" +#include "BlockTopology.hxx" + +#include + +// use this define to enable lines, execution of which leads to Segmentation Fault +#define ENABLE_FAULTS + +// use this define to enable CPPUNIT asserts and fails, showing bugs +#define ENABLE_FORCED_FAILURES + + +using namespace std; +using namespace ParaMEDMEM; + +/* + * Check methods defined in BlockTopology.hxx + * + BlockTopology(){}; + BlockTopology(const ProcessorGroup& group, const MEDMEM::GRID& grid); + BlockTopology(const BlockTopology& geom_topo, const ComponentTopology& comp_topo); + (+) BlockTopology(const ProcessorGroup& group, int nb_elem); + virtual ~BlockTopology(); + (+) inline int getNbElements()const; + (+) inline int getNbLocalElements() const; + const ProcessorGroup* getProcGroup()const {return _proc_group;}; + (+) inline std::pair globalToLocal (const int) const ; + (+) inline int localToGlobal (const std::pair) const; + (+) std::vector > getLocalArrayMinMax() const ; + (+) int getDimension() const {return _dimension;}; + (+) void serialize(int* & serializer, int& size) const ; + (+) void unserialize(const int* serializer, const CommInterface& comm_interface); + + */ + +void ParaMEDMEMTest::testBlockTopology_constructor() +{ + //test constructor + int size; + MPI_Comm_size(MPI_COMM_WORLD,&size); + int rank; + MPI_Comm_rank(MPI_COMM_WORLD,&rank); + CommInterface interface; + MPIProcessorGroup group(interface); + BlockTopology blocktopo(group,1); + CPPUNIT_ASSERT_EQUAL(1,blocktopo.getNbLocalElements()); + CPPUNIT_ASSERT_EQUAL(size,blocktopo.getNbElements()); + CPPUNIT_ASSERT_EQUAL(1,blocktopo.getDimension()); + + //checking access methods + BlockTopology blocktopo2(group,2); + std::pair local= blocktopo2.globalToLocal(0); + CPPUNIT_ASSERT_EQUAL(local.first,0); + CPPUNIT_ASSERT_EQUAL(local.second,0); + int global=blocktopo2.localToGlobal(local); + CPPUNIT_ASSERT_EQUAL(global,0); + + local = blocktopo2.globalToLocal(1); + CPPUNIT_ASSERT_EQUAL(local.first,0); + CPPUNIT_ASSERT_EQUAL(local.second,1); + global=blocktopo2.localToGlobal(local); + CPPUNIT_ASSERT_EQUAL(global,1); + + local = blocktopo2.globalToLocal(2*size-1); + CPPUNIT_ASSERT_EQUAL(local.first,size-1); + CPPUNIT_ASSERT_EQUAL(local.second,1); + global=blocktopo2.localToGlobal(local); + CPPUNIT_ASSERT_EQUAL(global,2*size-1); + + std::vector > bounds = blocktopo2.getLocalArrayMinMax(); + int vecsize = bounds.size(); + CPPUNIT_ASSERT_EQUAL(1,vecsize); + CPPUNIT_ASSERT_EQUAL(2*rank, (bounds[0]).first); + CPPUNIT_ASSERT_EQUAL(2*rank+2, (bounds[0]).second); + } + +void ParaMEDMEMTest::testBlockTopology_serialize() +{ + + int size; + MPI_Comm_size(MPI_COMM_WORLD,&size); + int rank; + MPI_Comm_rank(MPI_COMM_WORLD,&rank); + CommInterface interface; + MPIProcessorGroup group(interface); + BlockTopology blocktopo(group,3); + +//testing the serialization process that is used to transfer a +//block topology via a MPI_Send/Recv comm + BlockTopology blocktopo_recv; + int* serializer; + int sersize; + blocktopo.serialize(serializer,sersize); + blocktopo_recv.unserialize(serializer,interface); + CPPUNIT_ASSERT_EQUAL(blocktopo.getNbElements(),blocktopo_recv.getNbElements()); + delete [] serializer; +} diff --git a/src/ParaMEDMEMTest/ParaMEDMEMTest_FabienAPI.cxx b/src/ParaMEDMEMTest/ParaMEDMEMTest_FabienAPI.cxx new file mode 100644 index 000000000..341ed7c4e --- /dev/null +++ b/src/ParaMEDMEMTest/ParaMEDMEMTest_FabienAPI.cxx @@ -0,0 +1,199 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "ParaMEDMEMTest.hxx" +#include "CommInterface.hxx" +#include "ProcessorGroup.hxx" +#include "MPIProcessorGroup.hxx" +#include "InterpKernelDEC.hxx" +#include "MEDCouplingUMesh.hxx" +#include "ParaMESH.hxx" +#include "ParaFIELD.hxx" +#include "ComponentTopology.hxx" + +#include + +using namespace ParaMEDMEM; + +void ParaMEDMEMTest::testFabienAPI1() +{ + int size; + int rank; + MPI_Comm_size(MPI_COMM_WORLD,&size); + MPI_Comm_rank(MPI_COMM_WORLD,&rank); + // + if(size!=3) + return ; + int procs_source_c[1]={0}; + std::set procs_source(procs_source_c,procs_source_c+1); + int procs_target_c[1]={1}; + std::set procs_target(procs_target_c,procs_target_c+1); + // + ParaMEDMEM::MEDCouplingUMesh *mesh=0; + ParaMEDMEM::ParaMESH *paramesh=0; + ParaMEDMEM::ParaFIELD *parafield=0; + // + ParaMEDMEM::CommInterface interface; + // + MPI_Barrier(MPI_COMM_WORLD); + double targetCoords[8]={ 0.,0., 1., 0., 0., 1., 1., 1. }; + CommInterface comm; + // + ParaMEDMEM::InterpKernelDEC *dec=new ParaMEDMEM::InterpKernelDEC(procs_source,procs_target); + if(dec->isInSourceSide()) + { + mesh=MEDCouplingUMesh::New(); + mesh->setMeshDimension(2); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(4,2); + std::copy(targetCoords,targetCoords+8,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + int targetConn[4]={0,2,3,1}; + mesh->allocateCells(1); + mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,targetConn); + mesh->finishInsertingCells(); + ParaMEDMEM::ComponentTopology comptopo; + paramesh=new ParaMESH(mesh,*dec->getSourceGrp(),"source mesh"); + parafield=new ParaFIELD(ON_CELLS,NO_TIME,paramesh, comptopo); + parafield->getField()->setNature(ConservativeVolumic); + double *vals=parafield->getField()->getArray()->getPointer(); + vals[0]=7.; + } + if(dec->isInTargetSide()) + { + mesh=MEDCouplingUMesh::New(); + mesh->setMeshDimension(2); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(4,2); + std::copy(targetCoords,targetCoords+8,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + int targetConn[6]={0,2,1,2,3,1}; + mesh->allocateCells(2); + mesh->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,targetConn); + mesh->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,targetConn+3); + mesh->finishInsertingCells(); + ParaMEDMEM::ComponentTopology comptopo; + paramesh=new ParaMESH(mesh,*dec->getTargetGrp(),"target mesh"); + parafield=new ParaFIELD(ON_CELLS,NO_TIME,paramesh, comptopo); + parafield->getField()->setNature(ConservativeVolumic); + } + dec->attachLocalField(parafield); + dec->synchronize(); + dec->sendRecvData(); + if(dec->isInTargetSide()) + { + const double *valsToTest=parafield->getField()->getArray()->getConstPointer(); + CPPUNIT_ASSERT_DOUBLES_EQUAL(valsToTest[0],7.,1e-14); + CPPUNIT_ASSERT_DOUBLES_EQUAL(valsToTest[1],7.,1e-14); + } + // + delete parafield; + delete paramesh; + if(mesh) + mesh->decrRef(); + delete dec; + MPI_Barrier(MPI_COMM_WORLD); +} + +/*! + * Idem testFabienAPI1 except that procs are shuffled. Test of the good management of group translation in newly created communicator. + */ +void ParaMEDMEMTest::testFabienAPI2() +{ + int size; + int rank; + MPI_Comm_size(MPI_COMM_WORLD,&size); + MPI_Comm_rank(MPI_COMM_WORLD,&rank); + // + if(size!=3) + return ; + int procs_source_c[1]={2};//difference with testFabienAPI1 + std::set procs_source(procs_source_c,procs_source_c+1); + int procs_target_c[1]={1}; + std::set procs_target(procs_target_c,procs_target_c+1); + // + ParaMEDMEM::MEDCouplingUMesh *mesh=0; + ParaMEDMEM::ParaMESH *paramesh=0; + ParaMEDMEM::ParaFIELD *parafield=0; + // + ParaMEDMEM::CommInterface interface; + // + MPI_Barrier(MPI_COMM_WORLD); + double targetCoords[8]={ 0.,0., 1., 0., 0., 1., 1., 1. }; + CommInterface comm; + // + ParaMEDMEM::InterpKernelDEC *dec=new ParaMEDMEM::InterpKernelDEC(procs_source,procs_target); + if(dec->isInSourceSide()) + { + mesh=MEDCouplingUMesh::New(); + mesh->setMeshDimension(2); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(4,2); + std::copy(targetCoords,targetCoords+8,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + int targetConn[4]={0,2,3,1}; + mesh->allocateCells(1); + mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,targetConn); + mesh->finishInsertingCells(); + ParaMEDMEM::ComponentTopology comptopo; + paramesh=new ParaMESH(mesh,*dec->getSourceGrp(),"source mesh"); + parafield=new ParaFIELD(ON_CELLS,NO_TIME,paramesh, comptopo); + parafield->getField()->setNature(ConservativeVolumic); + double *vals=parafield->getField()->getArray()->getPointer(); + vals[0]=7.; + } + if(dec->isInTargetSide()) + { + mesh=MEDCouplingUMesh::New(); + mesh->setMeshDimension(2); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(4,2); + std::copy(targetCoords,targetCoords+8,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + int targetConn[6]={0,2,1,2,3,1}; + mesh->allocateCells(2); + mesh->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,targetConn); + mesh->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,targetConn+3); + mesh->finishInsertingCells(); + ParaMEDMEM::ComponentTopology comptopo; + paramesh=new ParaMESH(mesh,*dec->getTargetGrp(),"target mesh"); + parafield=new ParaFIELD(ON_CELLS,NO_TIME,paramesh, comptopo); + parafield->getField()->setNature(ConservativeVolumic); + } + dec->attachLocalField(parafield); + dec->synchronize(); + dec->sendRecvData(); + if(dec->isInTargetSide()) + { + const double *valsToTest=parafield->getField()->getArray()->getConstPointer(); + CPPUNIT_ASSERT_DOUBLES_EQUAL(valsToTest[0],7.,1e-14); + CPPUNIT_ASSERT_DOUBLES_EQUAL(valsToTest[1],7.,1e-14); + } + // + delete parafield; + delete paramesh; + if(mesh) + mesh->decrRef(); + delete dec; + MPI_Barrier(MPI_COMM_WORLD); +} diff --git a/src/ParaMEDMEMTest/ParaMEDMEMTest_Gauthier1.cxx b/src/ParaMEDMEMTest/ParaMEDMEMTest_Gauthier1.cxx new file mode 100644 index 000000000..cc97ede18 --- /dev/null +++ b/src/ParaMEDMEMTest/ParaMEDMEMTest_Gauthier1.cxx @@ -0,0 +1,665 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "ParaMEDMEMTest.hxx" +#include + +#include "CommInterface.hxx" +#include "ProcessorGroup.hxx" +#include "MPIProcessorGroup.hxx" +#include "DEC.hxx" +#include "InterpKernelDEC.hxx" +#include "MEDCouplingUMesh.hxx" +#include "MEDCouplingFieldDouble.hxx" +#include "ParaMESH.hxx" +#include "ParaFIELD.hxx" +#include "ComponentTopology.hxx" +#include "BlockTopology.hxx" + +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace ParaMEDMEM; +using namespace ICoCo; + +void afficheGauthier1(const ParaFIELD& field, const double *vals, int lgth) +{ + const DataArrayDouble *valsOfField(field.getField()->getArray()); + CPPUNIT_ASSERT_EQUAL(lgth,valsOfField->getNumberOfTuples()); + for (int ele=0;elegetNumberOfTuples();ele++) + CPPUNIT_ASSERT_DOUBLES_EQUAL(vals[ele],valsOfField->getIJ(ele,0),1e-12); +} + +MEDCouplingUMesh *init_quadGauthier1(int is_master) +{ + MEDCouplingAutoRefCountObjectPtr m(MEDCouplingUMesh::New("champ_quad",2)); + MEDCouplingAutoRefCountObjectPtr coo(DataArrayDouble::New()); + if(is_master) + { + const double dataCoo[24]={0,0,0,1,0,0,0,0,1,1,0,1,0,1,0,1,1,0,0,1,1,1,1,1}; + coo->alloc(8,3); + std::copy(dataCoo,dataCoo+24,coo->getPointer()); + const int conn[8]={0,1,3,2,4,5,7,6}; + m->allocateCells(2); + m->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,conn); + m->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,conn+4); + } + else + { + coo->alloc(0,3); + m->allocateCells(0); + } + m->setCoords(coo); + return m.retn(); +} + +MEDCouplingUMesh *init_triangleGauthier1(int is_master) +{ + MEDCouplingAutoRefCountObjectPtr m(MEDCouplingUMesh::New("champ_triangle",2)); + MEDCouplingAutoRefCountObjectPtr coo(DataArrayDouble::New()); + if(is_master) + { + const double dataCoo[24]={0,0,0,1,0,0,0,0,1,1,0,1,0,1,0,1,1,0,0,1,1,1,1,1}; + coo->alloc(8,3); + std::copy(dataCoo,dataCoo+24,coo->getPointer()); + const int conn[12]={0,1,2,1,2,3,4,5,7,4,6,7}; + m->allocateCells(2); + for(int i=0;i<4;i++) + m->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,conn+3*i); + } + else + { + coo->alloc(0,3); + m->allocateCells(0); + } + m->setCoords(coo); + return m.retn(); +} + + +void ParaMEDMEMTest::testGauthier1() +{ + int num_cas=0; + int rank, size; + MPI_Comm_rank(MPI_COMM_WORLD,&rank); + MPI_Comm_size(MPI_COMM_WORLD,&size); + + int is_master=0; + + CommInterface comm; + set emetteur_ids; + set recepteur_ids; + emetteur_ids.insert(0); + if(size!=4) + return; + recepteur_ids.insert(1); + if (size >2) + recepteur_ids.insert(2); + if (size >2) + emetteur_ids.insert(3); + if ((rank==0)||(rank==1)) + is_master=1; + + MPIProcessorGroup recepteur_group(comm,recepteur_ids); + MPIProcessorGroup emetteur_group(comm,emetteur_ids); + + string cas; + if (recepteur_group.containsMyRank()) + { + cas="recepteur"; + //freopen("recpeteur.out","w",stdout); + //freopen("recepteur.err","w",stderr); + } + else + { + cas="emetteur"; + // freopen("emetteur.out","w",stdout); + //freopen("emetteur.err","w",stderr); + } + double expected[8][4]={ + {1.,1.,1.,1.}, + {40., 40., 1., 1.}, + {1.,1.,1e200,1e200}, + {40.,1.,1e200,1e200}, + {1.,1.,1.,1.}, + {40.,1.,1.,1.}, + {1.,1.,1e200,1e200}, + {20.5,1.,1e200,1e200} + }; + int expectedLgth[8]={4,4,2,2,4,4,2,2}; + + for (int send=0;send<2;send++) + for (int rec=0;rec<2;rec++) + { + InterpKernelDEC dec_emetteur(emetteur_group, recepteur_group); + ParaMEDMEM::ParaFIELD *champ_emetteur(0),*champ_recepteur(0); + ParaMEDMEM::ParaMESH *paramesh(0); + MEDCouplingAutoRefCountObjectPtr mesh; + dec_emetteur.setOrientation(2); + if (send==0) + { + mesh=init_quadGauthier1(is_master); + } + else + { + mesh=init_triangleGauthier1(is_master); + } + paramesh=new ParaMEDMEM::ParaMESH(mesh,recepteur_group.containsMyRank()?recepteur_group:emetteur_group,"emetteur mesh"); + ParaMEDMEM::ComponentTopology comptopo; + champ_emetteur=new ParaMEDMEM::ParaFIELD(ON_CELLS,ONE_TIME,paramesh,comptopo); + champ_emetteur->getField()->setNature(ConservativeVolumic); + champ_emetteur->setOwnSupport(true); + if (rec==0) + { + mesh=init_triangleGauthier1(is_master); + } + else + { + mesh=init_quadGauthier1(is_master); + } + paramesh=new ParaMEDMEM::ParaMESH(mesh,recepteur_group.containsMyRank()?recepteur_group:emetteur_group,"recepteur mesh"); + champ_recepteur=new ParaMEDMEM::ParaFIELD(ON_CELLS,ONE_TIME,paramesh,comptopo); + champ_recepteur->getField()->setNature(ConservativeVolumic); + champ_recepteur->setOwnSupport(true); + if (cas=="emetteur") + { + champ_emetteur->getField()->getArray()->fillWithValue(1.); + } + + + MPI_Barrier(MPI_COMM_WORLD); + + //clock_t clock0= clock (); + int compti=0; + + bool init=true; // first time step ?? + bool stop=false; + //boucle sur les pas de quads + while (!stop) { + + compti++; + //clock_t clocki= clock (); + //cout << compti << " CLOCK " << (clocki-clock0)*1.e-6 << endl; + for (int non_unif=0;non_unif<2;non_unif++) + { + if (cas=="emetteur") + { + if (non_unif) + if(rank!=3) + champ_emetteur->getField()->getArray()->setIJ(0,0,40); + } + //bool ok=false; // Is the time interval successfully solved ? + + // Loop on the time interval tries + if(1) { + + + if (cas=="emetteur") + dec_emetteur.attachLocalField(champ_emetteur); + else + dec_emetteur.attachLocalField(champ_recepteur); + + + if(init) dec_emetteur.synchronize(); + init=false; + + if (cas=="emetteur") { + // affiche(champ_emetteur); + dec_emetteur.sendData(); + } + else if (cas=="recepteur") + { + dec_emetteur.recvData(); + if (is_master) + afficheGauthier1(*champ_recepteur,expected[num_cas],expectedLgth[num_cas]); + } + else + throw 0; + MPI_Barrier(MPI_COMM_WORLD); + } + stop=true; + num_cas++; + } + } + delete champ_emetteur; + delete champ_recepteur; + } +} + +void ParaMEDMEMTest::testGauthier2() +{ + double valuesExpected1[2]={0.,0.}; + double valuesExpected2[2]={0.95,0.970625}; + + double valuesExpected30[]={0., 0., 0.05, 0., 0., 0.15, 0., 0., 0.25, 0., 0., 0.35, 0., 0., 0.45, 0., 0., 0.55, 0., 0., 0.65, 0., 0., 0.75, 0., 0., 0.85, 0., 0., 0.95}; + double valuesExpected31[]={0., 0., 0.029375, 0., 0., 0.029375, 0., 0., 0.1, 0., 0., 0.1, 0., 0., 0.2, 0., 0., 0.2, 0., 0., 0.3, 0., 0., 0.3, 0., 0., 0.4, 0., 0., 0.4, 0., 0., 0.5, 0., 0., 0.5, 0., 0., 0.6, 0., 0., 0.6, 0., 0., 0.7, 0., 0., 0.7, 0., 0., 0.8, 0., 0., 0.8, 0., 0., 0.9, 0., 0., 0.9, 0., 0., 0.970625, 0., 0., 0.970625 }; + + double *valuesExpected3[2]={valuesExpected30,valuesExpected31}; + + int rank, size; + MPI_Comm_rank(MPI_COMM_WORLD,&rank); + MPI_Comm_size(MPI_COMM_WORLD,&size); + if (size <2) + return ; + CommInterface comm; + set Genepi_ids; + set entree_chaude_ids; + Genepi_ids.insert(0); + for (int i=1;i mesh(MEDCouplingUMesh::New("mesh",2)); + MEDCouplingAutoRefCountObjectPtr arr(DataArrayDouble::New()); arr->alloc(63,3); + const double cooData[189]={0.,0.,0.,0.5,0.,0.,0.5,0.05,0.,0.,0.1,0.,0.5,0.1,0.,0.5,0.15,0.,0.,0.2,0.,0.5,0.2,0.,0.5,0.25,0.,0.,0.3,0.,0.5,0.3,0.,0.5,0.35,0.,0.,0.4,0.,0.5,0.4,0.,0.5,0.45,0.,0.,0.5,0.,0.5,0.5,0.,0.5,0.55,0.,0.,0.6,0.,0.5,0.6,0.,0.5,0.65,0.,0.,0.7,0.,0.5,0.7,0.,0.5,0.75,0.,0.,0.8,0.,0.5,0.8,0.,0.5,0.85,0.,0.,0.9,0.,0.5,0.9,0.,0.5,0.95,0.,1.,0.,0.,1.,0.1,0.,1.,0.2,0.,1.,0.3,0.,1.,0.4,0.,1.,0.5,0.,1.,0.6,0.,1.,0.7,0.,1.,0.8,0.,1.,0.9,0.,1.,0.05,0.,1.,0.15,0.,1.,0.25,0.,1.,0.35,0.,1.,0.45,0.,1.,0.55,0.,1.,0.65,0.,1.,0.75,0.,1.,0.85,0.,1.,0.95,0.,1.,1.,0.,0.,1.,0.,0.5,1.,0.,0.,0.05,0.,0.,0.15,0.,0.,0.25,0.,0.,0.35,0.,0.,0.45,0.,0.,0.55,0.,0.,0.65,0.,0.,0.75,0.,0.,0.85,0.,0.,0.95,0.}; + std::copy(cooData,cooData+189,arr->getPointer()); + mesh->setCoords(arr); + mesh->allocateCells(80); + const int conn[240]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,2,1,31,5,4,32,8,7,33,11,10,34,14,13,35,17,16,36,20,19,37,23,22,38,26,25,39,29,28,30,40,2,31,41,5,32,42,8,33,43,11,34,44,14,35,45,17,36,46,20,37,47,23,38,48,26,39,49,29,31,2,40,32,5,41,33,8,42,34,11,43,35,14,44,36,17,45,37,20,46,38,23,47,39,26,48,50,29,49,3,2,4,6,5,7,9,8,10,12,11,13,15,14,16,18,17,19,21,20,22,24,23,25,27,26,28,51,29,52,31,4,2,32,7,5,33,10,8,34,13,11,35,16,14,36,19,17,37,22,20,38,25,23,39,28,26,50,52,29,0,2,53,3,5,54,6,8,55,9,11,56,12,14,57,15,17,58,18,20,59,21,23,60,24,26,61,27,29,62,3,53,2,6,54,5,9,55,8,12,56,11,15,57,14,18,58,17,21,59,20,24,60,23,27,61,26,51,62,29}; + for(int i=0;i<80;i++) + mesh->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,conn+3*i); + MEDCouplingAutoRefCountObjectPtr f(MEDCouplingFieldDouble::New(ON_NODES,ONE_TIME)); + const double valsOfField[189]={0.,0.,0.,0.,0.,0.,0.,0.,0.05,0.,0.,0.1,0.,0.,0.1,0.,0.,0.15,0.,0.,0.2,0.,0.,0.2,0.,0.,0.25,0.,0.,0.3,0.,0.,0.3,0.,0.,0.35,0.,0.,0.4,0.,0.,0.4,0.,0.,0.45,0.,0.,0.5,0.,0.,0.5,0.,0.,0.55,0.,0.,0.6,0.,0.,0.6,0.,0.,0.65,0.,0.,0.7,0.,0.,0.7,0.,0.,0.75,0.,0.,0.8,0.,0.,0.8,0.,0.,0.85,0.,0.,0.9,0.,0.,0.9,0.,0.,0.95,0.,0.,0.,0.,0.,0.1,0.,0.,0.2,0.,0.,0.3,0.,0.,0.4,0.,0.,0.5,0.,0.,0.6,0.,0.,0.7,0.,0.,0.8,0.,0.,0.9,0.,0.,0.05,0.,0.,0.15,0.,0.,0.25,0.,0.,0.35,0.,0.,0.45,0.,0.,0.55,0.,0.,0.65,0.,0.,0.75,0.,0.,0.85,0.,0.,0.95,0.,0.,1.,0.,0.,1.,0.,0.,1.,0.,0.,0.05,0.,0.,0.15,0.,0.,0.25,0.,0.,0.35,0.,0.,0.45,0.,0.,0.55,0.,0.,0.65,0.,0.,0.75,0.,0.,0.85,0.,0.,0.95}; + f->setMesh(mesh); f->setName("VITESSE_P1_OUT"); + arr=DataArrayDouble::New(); arr->alloc(63,3); + std::copy(valsOfField,valsOfField+189,arr->getPointer()); + f->setArray(arr); f->setNature(ConservativeVolumic); + ParaMEDMEM::ParaMESH *paramesh(new ParaMEDMEM::ParaMESH(mesh,entree_chaude_group,"emetteur mesh")); + vitesse=new ParaMEDMEM::ParaFIELD(f,paramesh,entree_chaude_group); + vitesse->setOwnSupport(true); + dec_vit_in_chaude.setMethod("P1"); + } + else + { + MEDCouplingAutoRefCountObjectPtr mesh(MEDCouplingUMesh::New("mesh",2)); + MEDCouplingAutoRefCountObjectPtr arr(DataArrayDouble::New()); arr->alloc(22,3); + const double cooData[66]={0,0,0,1,0,0,0,0.1,0,1,0.1,0,0,0.2,0,1,0.2,0,0,0.3,0,1,0.3,0,0,0.4,0,1,0.4,0,0,0.5,0,1,0.5,0,0,0.6,0,1,0.6,0,0,0.7,0,1,0.7,0,0,0.8,0,1,0.8,0,0,0.9,0,1,0.9,0,0,1,0,1,1,0}; + std::copy(cooData,cooData+66,arr->getPointer()); + mesh->setCoords(arr); + mesh->allocateCells(10); + const int conn[40]={0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,8,9,11,10,10,11,13,12,12,13,15,14,14,15,17,16,16,17,19,18,18,19,21,20}; + for(int i=0;i<10;i++) + mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,conn+4*i); + MEDCouplingAutoRefCountObjectPtr f(MEDCouplingFieldDouble::New(type==0?ON_CELLS:ON_NODES,ONE_TIME)); + f->setMesh(mesh); f->setName("vitesse_in_chaude"); + arr=DataArrayDouble::New(); arr->alloc(f->getNumberOfTuplesExpected()*3); arr->fillWithZero(); arr->rearrange(3); + f->setArray(arr); f->setNature(ConservativeVolumic); + ParaMEDMEM::ParaMESH *paramesh(new ParaMEDMEM::ParaMESH(mesh,Genepi_group,"recepteur mesh")); + vitesse=new ParaMEDMEM::ParaFIELD(f,paramesh,Genepi_group); + vitesse->setOwnSupport(true); + dec_vit_in_chaude.setMethod(f->getDiscretization()->getRepr()); + } + + dec_vit_in_chaude.attachLocalField(vitesse); + + dec_vit_in_chaude.synchronize(); + + + // Envois - receptions + if (entree_chaude_group.containsMyRank()) + { + dec_vit_in_chaude.sendData(); + } + else + { + dec_vit_in_chaude.recvData(); + } + if ( !entree_chaude_group.containsMyRank() ) + { + double pmin=1e38, pmax=-1e38; + const double *p(vitesse->getField()->getArray()->begin()); + for(std::size_t i=0;igetField()->getArray()->getNbOfElems();i++,p++) + { + if (*ppmax) pmax=*p; + } + CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected1[type],pmin,1e-12); + CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected2[type],pmax,1e-12); + + int nbCompo(vitesse->getField()->getNumberOfComponents()); + p=vitesse->getField()->getArray()->begin(); + for(int i=0;igetField()->getNumberOfTuples();i++) + for(int c=0;c emetteur_ids; + set recepteur_ids; + emetteur_ids.insert(0); + if(size!=4) + return; + recepteur_ids.insert(1); + if (size >2) + recepteur_ids.insert(2); + if (size >2) + emetteur_ids.insert(3); + if ((rank==0)||(rank==1)) + is_master=1; + + MPIProcessorGroup recepteur_group(comm,recepteur_ids); + MPIProcessorGroup emetteur_group(comm,emetteur_ids); + + string cas; + if (recepteur_group.containsMyRank()) + { + cas="recepteur"; + //freopen("recpeteur.out","w",stdout); + //freopen("recepteur.err","w",stderr); + } + else + { + cas="emetteur"; + // freopen("emetteur.out","w",stdout); + //freopen("emetteur.err","w",stderr); + } + double expected[8][4]={ + {1.,1.,1.,1.}, + {40., 40., 1., 1.}, + {1.,1.,1e200,1e200}, + {40.,1.,1e200,1e200}, + {1.,1.,1.,1.}, + {40.,1.,1.,1.}, + {1.,1.,1e200,1e200}, + {20.5,1.,1e200,1e200} + }; + int expectedLgth[8]={4,4,2,2,4,4,2,2}; + + for (int send=0;send<2;send++) + for (int rec=0;rec<2;rec++) + { + std::vector decu(1); + decu[0]=InterpKernelDEC(emetteur_group,recepteur_group); + InterpKernelDEC& dec_emetteur=decu[0]; + ParaMEDMEM::ParaFIELD *champ_emetteur(0),*champ_recepteur(0); + ParaMEDMEM::ParaMESH *paramesh(0); + MEDCouplingAutoRefCountObjectPtr mesh; + dec_emetteur.setOrientation(2); + if (send==0) + { + mesh=init_quadGauthier1(is_master); + } + else + { + mesh=init_triangleGauthier1(is_master); + } + paramesh=new ParaMEDMEM::ParaMESH(mesh,recepteur_group.containsMyRank()?recepteur_group:emetteur_group,"emetteur mesh"); + ParaMEDMEM::ComponentTopology comptopo; + champ_emetteur=new ParaMEDMEM::ParaFIELD(ON_CELLS,ONE_TIME,paramesh,comptopo); + champ_emetteur->getField()->setNature(ConservativeVolumic); + champ_emetteur->setOwnSupport(true); + if (rec==0) + { + mesh=init_triangleGauthier1(is_master); + } + else + { + mesh=init_quadGauthier1(is_master); + } + paramesh=new ParaMEDMEM::ParaMESH(mesh,recepteur_group.containsMyRank()?recepteur_group:emetteur_group,"recepteur mesh"); + champ_recepteur=new ParaMEDMEM::ParaFIELD(ON_CELLS,ONE_TIME,paramesh,comptopo); + champ_recepteur->getField()->setNature(ConservativeVolumic); + champ_recepteur->setOwnSupport(true); + if (cas=="emetteur") + { + champ_emetteur->getField()->getArray()->fillWithValue(1.); + } + + + MPI_Barrier(MPI_COMM_WORLD); + + //clock_t clock0= clock (); + int compti=0; + + bool init=true; // first time step ?? + bool stop=false; + //boucle sur les pas de quads + while (!stop) { + + compti++; + //clock_t clocki= clock (); + //cout << compti << " CLOCK " << (clocki-clock0)*1.e-6 << endl; + for (int non_unif=0;non_unif<2;non_unif++) + { + if (cas=="emetteur") + { + if (non_unif) + if(rank!=3) + champ_emetteur->getField()->getArray()->setIJ(0,0,40); + } + //bool ok=false; // Is the time interval successfully solved ? + + // Loop on the time interval tries + if(1) { + + + if (cas=="emetteur") + dec_emetteur.attachLocalField(champ_emetteur); + else + dec_emetteur.attachLocalField(champ_recepteur); + + + if(init) dec_emetteur.synchronize(); + init=false; + + if (cas=="emetteur") { + // affiche(champ_emetteur); + dec_emetteur.sendData(); + } + else if (cas=="recepteur") + { + dec_emetteur.recvData(); + if (is_master) + afficheGauthier1(*champ_recepteur,expected[num_cas],expectedLgth[num_cas]); + } + else + throw 0; + MPI_Barrier(MPI_COMM_WORLD); + } + stop=true; + num_cas++; + } + } + delete champ_emetteur; + delete champ_recepteur; + } +} + +/*! + * This test is the parallel version of MEDCouplingBasicsTest.test3D1DOnP1P0_1 test. + */ +void ParaMEDMEMTest::testGauthier4() +{ + // + const double sourceCoords[19*3]={0.5,0.5,0.1,0.5,0.5,1.2,0.5,0.5,1.6,0.5,0.5,1.8,0.5,0.5,2.43,0.5,0.5,2.55,0.5,0.5,4.1,0.5,0.5,4.4,0.5,0.5,4.9,0.5,0.5,5.1,0.5,0.5,7.6,0.5,0.5,7.7,0.5,0.5,8.2,0.5,0.5,8.4,0.5,0.5,8.6,0.5,0.5,8.8,0.5,0.5,9.2,0.5,0.5,9.6,0.5,0.5,11.5}; + const int sourceConn[18*2]={0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18}; + const double sourceVals[19]={0.49,2.8899999999999997,7.29,13.69,22.09,32.49,44.89,59.29,75.69,94.09, 114.49,136.89,161.29,187.69,216.09,246.49,278.89,313.29,349.69}; + const double targetCoords0[20*3]={0.,0.,0.,1.,0.,0.,0.,1.,0.,1.,1.,0.,0.,0.,1.,1.,0.,1.,0.,1.,1.,1.,1.,1.,0.,0.,2.,1.,0.,2.,0.,1.,2.,1.,1.,2.,0.,0.,3.,1.,0.,3.,0.,1.,3.,1.,1.,3.,0.,0.,4.,1.,0.,4.,0.,1.,4.,1.,1.,4.}; + const int targetConn0[8*4]={1,0,2,3,5,4,6,7,5,4,6,7,9,8,10,11,9,8,10,11,13,12,14,15,13,12,14,15,17,16,18,19}; + const double targetCoords1[28*3]={0.,0.,4.,1.,0.,4.,0.,1.,4.,1.,1.,4.,0.,0.,5.,1.,0.,5.,0.,1.,5.,1.,1.,5.,0.,0.,6.,1.,0.,6.,0.,1.,6.,1.,1.,6.,0.,0.,7.,1.,0.,7.,0.,1.,7.,1.,1.,7.,0.,0.,8.,1.,0.,8.,0.,1.,8.,1.,1.,8.,0.,0.,9.,1.,0.,9.,0.,1.,9.,1.,1.,9.,0.,0.,10.,1.,0.,10.,0.,1.,10.,1.,1.,10.}; + const int targetConn1[8*6]={1,0,2,3,5,4,6,7,5,4,6,7,9,8,10,11,9,8,10,11,13,12,14,15,13,12,14,15,17,16,18,19,17,16,18,19,21,20,22,23,21,20,22,23,25,24,26,27}; + // + int size; + int rank; + MPI_Comm_size(MPI_COMM_WORLD,&size); + MPI_Comm_rank(MPI_COMM_WORLD,&rank); + // + if(size!=3) + return ; + int nproc_source = 1; + set self_procs; + set procs_source; + set procs_target; + + for (int i=0; icontainsMyRank()) + { + std::ostringstream stream; stream << "sourcemesh2D proc " << rank; + mesh=MEDCouplingUMesh::New(stream.str().c_str(),1); + mesh->allocateCells(); + for(int i=0;i<18;i++) + mesh->insertNextCell(INTERP_KERNEL::NORM_SEG2,2,sourceConn+2*i); + mesh->finishInsertingCells(); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(19,3); + std::copy(sourceCoords,sourceCoords+19*3,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + paramesh=new ParaMESH(mesh,*source_group,"source mesh"); + ParaMEDMEM::ComponentTopology comptopo; + parafield = new ParaFIELD(ON_NODES,NO_TIME,paramesh,comptopo); + double *value=parafield->getField()->getArray()->getPointer(); + std::copy(sourceVals,sourceVals+19,value); + } + else + { + if(rank==1) + { + std::ostringstream stream; stream << "targetmesh2D proc " << rank-nproc_source; + mesh=MEDCouplingUMesh::New(stream.str().c_str(),3); + mesh->allocateCells(); + for(int i=0;i<4;i++) + mesh->insertNextCell(INTERP_KERNEL::NORM_HEXA8,8,targetConn0+8*i); + mesh->finishInsertingCells(); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(20,3); + std::copy(targetCoords0,targetCoords0+20*3,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + paramesh=new ParaMESH (mesh,*target_group,"target mesh"); + ParaMEDMEM::ComponentTopology comptopo; + parafield = new ParaFIELD(ON_CELLS,NO_TIME,paramesh, comptopo); + } + else if(rank==2) + { + std::ostringstream stream; stream << "targetmesh2D proc " << rank-nproc_source; + mesh=MEDCouplingUMesh::New(stream.str().c_str(),3); + mesh->allocateCells(); + for(int i=0;i<6;i++) + mesh->insertNextCell(INTERP_KERNEL::NORM_HEXA8,8,targetConn1+8*i); + mesh->finishInsertingCells(); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(28,3); + std::copy(targetCoords1,targetCoords1+28*3,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + paramesh=new ParaMESH (mesh,*target_group,"target mesh"); + ParaMEDMEM::ComponentTopology comptopo; + parafield = new ParaFIELD(ON_CELLS,NO_TIME,paramesh, comptopo); + } + } + //test 1 - primaire -> secondaire + ParaMEDMEM::InterpKernelDEC dec(*source_group,*target_group); + dec.setIntersectionType(INTERP_KERNEL::PointLocator); + parafield->getField()->setNature(ConservativeVolumic);//very important + if (source_group->containsMyRank()) + { + dec.setMethod("P1"); + dec.attachLocalField(parafield); + dec.synchronize(); + dec.setForcedRenormalization(false); + dec.sendData(); + } + else + { + dec.setMethod("P0"); + dec.attachLocalField(parafield); + dec.synchronize(); + dec.setForcedRenormalization(false); + dec.recvData(); + const double *res(parafield->getField()->getArray()->getConstPointer()); + if(rank==1) + { + const double expected0[4]={0.49,7.956666666666667,27.29,0.}; + for(int i=0;i<4;i++) + CPPUNIT_ASSERT_DOUBLES_EQUAL(expected0[i],res[i],1e-13); + } + else + { + const double expected1[6]={59.95666666666667,94.09,0.,125.69,202.89,296.09}; + for(int i=0;i<6;i++) + CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],res[i],1e-13); + } + } + MPI_Barrier(MPI_COMM_WORLD); + if (source_group->containsMyRank()) + { + dec.recvData(); + const double expected2[19]={0.49,7.956666666666667,7.956666666666667,7.956666666666667,27.29,27.29,59.95666666666667,59.95666666666667,59.95666666666667,94.09,125.69,125.69,202.89,202.89,202.89,202.89,296.09,296.09,0.}; + const double *res(parafield->getField()->getArray()->getConstPointer()); + for(int i=0;i<19;i++) + CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[i],res[i],1e-13); + } + else + { + dec.sendData(); + } + delete parafield; + mesh->decrRef(); + delete paramesh; + delete self_group; + delete target_group; + delete source_group; + // + MPI_Barrier(MPI_COMM_WORLD); +} diff --git a/src/ParaMEDMEMTest/ParaMEDMEMTest_ICoco.cxx b/src/ParaMEDMEMTest/ParaMEDMEMTest_ICoco.cxx new file mode 100644 index 000000000..a4624005d --- /dev/null +++ b/src/ParaMEDMEMTest/ParaMEDMEMTest_ICoco.cxx @@ -0,0 +1,194 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "ParaMEDMEMTest.hxx" +#include "CommInterface.hxx" +#include "ProcessorGroup.hxx" +#include "MPIProcessorGroup.hxx" +#include "ComponentTopology.hxx" +#include "ParaMESH.hxx" +#include "ParaFIELD.hxx" +#include "InterpKernelDEC.hxx" + +#include "MEDCouplingUMesh.hxx" + +#include +#include +#include +#include +#include + +using namespace std; +using namespace ParaMEDMEM; +using namespace ICoCo; + +typedef enum {sync_and,sync_or} synctype; +void synchronize_bool(bool& stop, synctype s) +{ + int my_stop; + int my_stop_temp = stop?1:0; + if (s==sync_and) + MPI_Allreduce(&my_stop_temp,&my_stop,1,MPI_INTEGER,MPI_MIN,MPI_COMM_WORLD); + else if (s==sync_or) + MPI_Allreduce(&my_stop_temp,&my_stop,1,MPI_INTEGER,MPI_MAX,MPI_COMM_WORLD); + stop =(my_stop==1); +} + +void synchronize_dt(double& dt) +{ + double dttemp=dt; + MPI_Allreduce(&dttemp,&dt,1,MPI_DOUBLE,MPI_MIN,MPI_COMM_WORLD); +} + + +void affiche(const ParaFIELD& field) +{ + cout <getName()<getArray()->begin()); + for(int ele=0;elegetNumberOfTuples();ele++) + cout << ele <<": "<< vals[ele] << endl; +} + +MEDCouplingUMesh *init_quad() +{ + MEDCouplingAutoRefCountObjectPtr m(MEDCouplingUMesh::New("champ_quad",2)); + MEDCouplingAutoRefCountObjectPtr coo(DataArrayDouble::New()); + const double dataCoo[24]={0.,0.,0.,1.,0.,0.,0.,0.,1.,1.,0.,1.,0.,1e-05,0.,1.,1e-05,0.,0.,1e-05,1.,1.,1e-05,1.}; + coo->alloc(8,3); + std::copy(dataCoo,dataCoo+24,coo->getPointer()); + const int conn[8]={0,1,3,2,4,5,7,6}; + m->allocateCells(2); + m->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,conn); + m->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,conn+4); + m->setCoords(coo); + return m.retn(); +} + +MEDCouplingUMesh *init_triangle() +{ + MEDCouplingAutoRefCountObjectPtr m(MEDCouplingUMesh::New("champ_triangle",2)); + MEDCouplingAutoRefCountObjectPtr coo(DataArrayDouble::New()); + const double dataCoo[24]={0.,0.,0.,1.,0.,0.,0.,0.,1.,1.,0.,1.,0.,1e-05,0.,1.,1e-05,0.,0.,1e-05,1.,1.,1e-05,1.}; + coo->alloc(8,3); + std::copy(dataCoo,dataCoo+24,coo->getPointer()); + const int conn[12]={0,1,2,1,2,3,4,5,7,4,6,7}; + m->allocateCells(4); + for(int i=0;i<4;i++) + m->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,conn+3*i); + m->setCoords(coo); + return m.retn(); +} + +void ParaMEDMEMTest::testICoco1() +{ + int size; + int rank; + MPI_Comm_size(MPI_COMM_WORLD,&size); + MPI_Comm_rank(MPI_COMM_WORLD,&rank); + + //the test is meant to run on five processors + if (size !=2) return ; + + CommInterface comm; + set emetteur_ids; + set recepteur_ids; + emetteur_ids.insert(0); + recepteur_ids.insert(1); + + MPIProcessorGroup recepteur_group(comm,recepteur_ids); + MPIProcessorGroup emetteur_group(comm,emetteur_ids); + + string cas; + if (recepteur_group.containsMyRank()) + cas="recepteur"; + else + cas="emetteur"; + + InterpKernelDEC dec_emetteur(emetteur_group,recepteur_group); + dec_emetteur.setOrientation(2); + ParaMEDMEM::ParaFIELD *champ_emetteur(0),*champ_recepteur(0); + ParaMEDMEM::ParaMESH *paramesh(0); + if (cas=="emetteur") + { + MEDCouplingAutoRefCountObjectPtr mesh_emetteur(init_triangle()); + paramesh=new ParaMEDMEM::ParaMESH(mesh_emetteur,emetteur_group,"emetteur mesh"); + ParaMEDMEM::ComponentTopology comptopo; + champ_emetteur=new ParaMEDMEM::ParaFIELD(ON_CELLS,ONE_TIME,paramesh,comptopo); + champ_emetteur->getField()->setNature(ConservativeVolumic); + champ_emetteur->setOwnSupport(true); + champ_emetteur->getField()->getArray()->fillWithValue(1.); + } + else + { + MEDCouplingAutoRefCountObjectPtr mesh_recepteur(init_quad()); + paramesh=new ParaMEDMEM::ParaMESH(mesh_recepteur,recepteur_group,"recepteur mesh"); + ParaMEDMEM::ComponentTopology comptopo; + champ_recepteur=new ParaMEDMEM::ParaFIELD(ON_CELLS,ONE_TIME,paramesh,comptopo); + champ_recepteur->getField()->setNature(ConservativeVolumic); + champ_recepteur->setOwnSupport(true); + } + + + MPI_Barrier(MPI_COMM_WORLD); + + clock_t clock0(clock()); + int compti=0; + + bool init(true),stop(false); + //boucle sur les pas de quads + while(!stop) + { + compti++; + clock_t clocki= clock (); + cout << compti << " CLOCK " << (clocki-clock0)*1.e-6 << endl; + for (int non_unif=0;non_unif<2;non_unif++) + { + if (cas=="emetteur") + if (non_unif) + champ_emetteur->getField()->getArray()->setIJ(0,0,40.); + //bool ok=false; // Is the time interval successfully solved ? + + // Loop on the time interval tries + if (cas=="emetteur") + dec_emetteur.attachLocalField(champ_emetteur); + else + dec_emetteur.attachLocalField(champ_recepteur); + + if(init) + dec_emetteur.synchronize(); + init=false; + + if (cas=="emetteur") + { + dec_emetteur.sendData(); + affiche(*champ_emetteur); + } + else if (cas=="recepteur") + { + dec_emetteur.recvData(); + affiche(*champ_recepteur); + } + else + throw 0; + } + stop=true; + } + delete champ_recepteur; + delete champ_emetteur; +} diff --git a/src/ParaMEDMEMTest/ParaMEDMEMTest_InterpKernelDEC.cxx b/src/ParaMEDMEMTest/ParaMEDMEMTest_InterpKernelDEC.cxx new file mode 100644 index 000000000..20343e9e7 --- /dev/null +++ b/src/ParaMEDMEMTest/ParaMEDMEMTest_InterpKernelDEC.cxx @@ -0,0 +1,2283 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "ParaMEDMEMTest.hxx" +#include + +#include "CommInterface.hxx" +#include "ProcessorGroup.hxx" +#include "MPIProcessorGroup.hxx" +#include "Topology.hxx" +#include "DEC.hxx" +#include "MxN_Mapping.hxx" +#include "InterpKernelDEC.hxx" +#include "ParaMESH.hxx" +#include "ParaFIELD.hxx" +#include "ComponentTopology.hxx" +#include "ICoCoMEDField.hxx" +#include "ParaMEDLoader.hxx" +#include "MEDLoader.hxx" + + +#include +#include + +// use this define to enable lines, execution of which leads to Segmentation Fault +#define ENABLE_FAULTS + +// use this define to enable CPPUNIT asserts and fails, showing bugs +#define ENABLE_FORCED_FAILURES + + +using namespace std; +using namespace ParaMEDMEM; + +void ParaMEDMEMTest::testInterpKernelDEC_2D() +{ + testInterpKernelDEC_2D_("P0","P0"); +} + +void ParaMEDMEMTest::testInterpKernelDEC2_2D() +{ + testInterpKernelDEC2_2D_("P0","P0"); +} + +void ParaMEDMEMTest::testInterpKernelDEC_3D() +{ + testInterpKernelDEC_3D_("P0","P0"); +} + +void ParaMEDMEMTest::testInterpKernelDEC_2DP0P1() +{ + //testInterpKernelDEC_2D_("P0","P1"); +} + +void ParaMEDMEMTest::testInterpKernelDEC_1D() +{ + int size; + int rank; + MPI_Comm_size(MPI_COMM_WORLD,&size); + MPI_Comm_rank(MPI_COMM_WORLD,&rank); + // + if(size!=5) + return ; + int nproc_source = 3; + set self_procs; + set procs_source; + set procs_target; + + for (int i=0; icontainsMyRank()) + { + if(rank==0) + { + double coords[4]={0.3,0.7, 0.9,1.0}; + int conn[4]={0,1,2,3}; + mesh=MEDCouplingUMesh::New("Source mesh Proc0",1); + mesh->allocateCells(2); + mesh->insertNextCell(INTERP_KERNEL::NORM_SEG2,2,conn); + mesh->insertNextCell(INTERP_KERNEL::NORM_SEG2,2,conn+2); + mesh->finishInsertingCells(); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(4,1); + std::copy(coords,coords+4,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + } + if(rank==1) + { + double coords[2]={0.7,0.9}; + int conn[2]={0,1}; + mesh=MEDCouplingUMesh::New("Source mesh Proc1",1); + mesh->allocateCells(1); + mesh->insertNextCell(INTERP_KERNEL::NORM_SEG2,2,conn); + mesh->finishInsertingCells(); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(2,1); + std::copy(coords,coords+2,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + } + if(rank==2) + { + double coords[2]={1.,1.12}; + int conn[2]={0,1}; + mesh=MEDCouplingUMesh::New("Source mesh Proc2",1); + mesh->allocateCells(1); + mesh->insertNextCell(INTERP_KERNEL::NORM_SEG2,2,conn); + mesh->finishInsertingCells(); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(2,1); + std::copy(coords,coords+2,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + } + paramesh=new ParaMESH(mesh,*source_group,"source mesh"); + ParaMEDMEM::ComponentTopology comptopo; + parafieldP0 = new ParaFIELD(ON_CELLS,NO_TIME,paramesh, comptopo); + double *valueP0=parafieldP0->getField()->getArray()->getPointer(); + parafieldP0->getField()->setNature(ConservativeVolumic); + if(rank==0) + { + valueP0[0]=7.; valueP0[1]=8.; + } + if(rank==1) + { + valueP0[0]=9.; + } + if(rank==2) + { + valueP0[0]=10.; + } + } + else + { + const char targetMeshName[]="target mesh"; + if(rank==3) + { + double coords[2]={0.5,0.75}; + int conn[2]={0,1}; + mesh=MEDCouplingUMesh::New("Target mesh Proc3",1); + mesh->allocateCells(1); + mesh->insertNextCell(INTERP_KERNEL::NORM_SEG2,2,conn); + mesh->finishInsertingCells(); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(2,1); + std::copy(coords,coords+2,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + paramesh=new ParaMESH(mesh,*target_group,targetMeshName); + } + if(rank==4) + { + double coords[2]={0.75,1.2}; + int conn[2]={0,1}; + mesh=MEDCouplingUMesh::New("Target mesh Proc4",1); + mesh->allocateCells(1); + mesh->insertNextCell(INTERP_KERNEL::NORM_SEG2,2,conn); + mesh->finishInsertingCells(); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(2,1); + std::copy(coords,coords+2,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + paramesh=new ParaMESH(mesh,*target_group,targetMeshName); + } + ParaMEDMEM::ComponentTopology comptopo; + parafieldP0 = new ParaFIELD(ON_CELLS,NO_TIME,paramesh, comptopo); + parafieldP0->getField()->setNature(ConservativeVolumic); + } + // test 1 + ParaMEDMEM::InterpKernelDEC dec(*source_group,*target_group); + if (source_group->containsMyRank()) + { + dec.setMethod("P0"); + dec.attachLocalField(parafieldP0); + dec.synchronize(); + dec.setForcedRenormalization(false); + dec.sendData(); + dec.recvData(); + const double *valueP0=parafieldP0->getField()->getArray()->getPointer(); + if(rank==0) + { + CPPUNIT_ASSERT_DOUBLES_EQUAL(7.4,valueP0[0],1e-7); + CPPUNIT_ASSERT_DOUBLES_EQUAL(9.0540540540540544,valueP0[1],1e-7); + } + if(rank==1) + { + CPPUNIT_ASSERT_DOUBLES_EQUAL(8.64054054054054,valueP0[0],1e-7); + } + if(rank==2) + { + CPPUNIT_ASSERT_DOUBLES_EQUAL(9.0540540540540544,valueP0[0],1e-7); + } + } + else + { + dec.setMethod("P0"); + dec.attachLocalField(parafieldP0); + dec.synchronize(); + dec.setForcedRenormalization(false); + dec.recvData(); + const double *res=parafieldP0->getField()->getArray()->getConstPointer(); + if(rank==3) + { + CPPUNIT_ASSERT_EQUAL(1,parafieldP0->getField()->getNumberOfTuples()); + CPPUNIT_ASSERT_EQUAL(1,parafieldP0->getField()->getNumberOfComponents()); + CPPUNIT_ASSERT_DOUBLES_EQUAL(7.4,res[0],1e-12); + } + if(rank==4) + { + CPPUNIT_ASSERT_EQUAL(1,parafieldP0->getField()->getNumberOfTuples()); + CPPUNIT_ASSERT_EQUAL(1,parafieldP0->getField()->getNumberOfComponents()); + CPPUNIT_ASSERT_DOUBLES_EQUAL(9.0540540540540526,res[0],1e-12); + } + dec.sendData(); + } + // + delete parafieldP0; + mesh->decrRef(); + delete paramesh; + delete self_group; + delete target_group; + delete source_group; + // + MPI_Barrier(MPI_COMM_WORLD); +} + +void ParaMEDMEMTest::testInterpKernelDEC_2DCurve() +{ + int size; + int rank; + MPI_Comm_size(MPI_COMM_WORLD,&size); + MPI_Comm_rank(MPI_COMM_WORLD,&rank); + // + if(size!=5) + return ; + int nproc_source = 3; + set self_procs; + set procs_source; + set procs_target; + + for (int i=0; icontainsMyRank()) + { + if(rank==0) + { + double coords[8]={0.3,0.3,0.7,0.7, 0.9,0.9,1.0,1.0}; + int conn[4]={0,1,2,3}; + mesh=MEDCouplingUMesh::New("Source mesh Proc0",1); + mesh->allocateCells(2); + mesh->insertNextCell(INTERP_KERNEL::NORM_SEG2,2,conn); + mesh->insertNextCell(INTERP_KERNEL::NORM_SEG2,2,conn+2); + mesh->finishInsertingCells(); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(4,2); + std::copy(coords,coords+8,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + } + if(rank==1) + { + double coords[4]={0.7,0.7,0.9,0.9}; + int conn[2]={0,1}; + mesh=MEDCouplingUMesh::New("Source mesh Proc1",1); + mesh->allocateCells(1); + mesh->insertNextCell(INTERP_KERNEL::NORM_SEG2,2,conn); + mesh->finishInsertingCells(); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(2,2); + std::copy(coords,coords+4,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + } + if(rank==2) + { + double coords[4]={1.,1.,1.12,1.12}; + int conn[2]={0,1}; + mesh=MEDCouplingUMesh::New("Source mesh Proc2",1); + mesh->allocateCells(1); + mesh->insertNextCell(INTERP_KERNEL::NORM_SEG2,2,conn); + mesh->finishInsertingCells(); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(2,2); + std::copy(coords,coords+4,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + } + paramesh=new ParaMESH(mesh,*source_group,"source mesh"); + ParaMEDMEM::ComponentTopology comptopo; + parafieldP0 = new ParaFIELD(ON_CELLS,NO_TIME,paramesh, comptopo); + double *valueP0=parafieldP0->getField()->getArray()->getPointer(); + parafieldP0->getField()->setNature(ConservativeVolumic); + if(rank==0) + { + valueP0[0]=7.; valueP0[1]=8.; + } + if(rank==1) + { + valueP0[0]=9.; + } + if(rank==2) + { + valueP0[0]=10.; + } + } + else + { + const char targetMeshName[]="target mesh"; + if(rank==3) + { + double coords[4]={0.5,0.5,0.75,0.75}; + int conn[2]={0,1}; + mesh=MEDCouplingUMesh::New("Target mesh Proc3",1); + mesh->allocateCells(1); + mesh->insertNextCell(INTERP_KERNEL::NORM_SEG2,2,conn); + mesh->finishInsertingCells(); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(2,2); + std::copy(coords,coords+4,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + paramesh=new ParaMESH(mesh,*target_group,targetMeshName); + } + if(rank==4) + { + double coords[4]={0.75,0.75,1.2,1.2}; + int conn[2]={0,1}; + mesh=MEDCouplingUMesh::New("Target mesh Proc4",1); + mesh->allocateCells(1); + mesh->insertNextCell(INTERP_KERNEL::NORM_SEG2,2,conn); + mesh->finishInsertingCells(); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(2,2); + std::copy(coords,coords+4,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + paramesh=new ParaMESH(mesh,*target_group,targetMeshName); + } + ParaMEDMEM::ComponentTopology comptopo; + parafieldP0 = new ParaFIELD(ON_CELLS,NO_TIME,paramesh, comptopo); + parafieldP0->getField()->setNature(ConservativeVolumic); + } + // test 1 + ParaMEDMEM::InterpKernelDEC dec(*source_group,*target_group); + if (source_group->containsMyRank()) + { + dec.setMethod("P0"); + dec.attachLocalField(parafieldP0); + dec.synchronize(); + dec.setForcedRenormalization(false); + dec.sendData(); + dec.recvData(); + const double *valueP0=parafieldP0->getField()->getArray()->getPointer(); + if(rank==0) + { + CPPUNIT_ASSERT_DOUBLES_EQUAL(7.4,valueP0[0],1e-7); + CPPUNIT_ASSERT_DOUBLES_EQUAL(9.0540540540540544,valueP0[1],1e-7); + } + if(rank==1) + { + CPPUNIT_ASSERT_DOUBLES_EQUAL(8.64054054054054,valueP0[0],1e-7); + } + if(rank==2) + { + CPPUNIT_ASSERT_DOUBLES_EQUAL(9.0540540540540544,valueP0[0],1e-7); + } + } + else + { + dec.setMethod("P0"); + dec.attachLocalField(parafieldP0); + dec.synchronize(); + dec.setForcedRenormalization(false); + dec.recvData(); + const double *res=parafieldP0->getField()->getArray()->getConstPointer(); + if(rank==3) + { + CPPUNIT_ASSERT_EQUAL(1,parafieldP0->getField()->getNumberOfTuples()); + CPPUNIT_ASSERT_EQUAL(1,parafieldP0->getField()->getNumberOfComponents()); + CPPUNIT_ASSERT_DOUBLES_EQUAL(7.4,res[0],1e-12); + } + if(rank==4) + { + CPPUNIT_ASSERT_EQUAL(1,parafieldP0->getField()->getNumberOfTuples()); + CPPUNIT_ASSERT_EQUAL(1,parafieldP0->getField()->getNumberOfComponents()); + CPPUNIT_ASSERT_DOUBLES_EQUAL(9.0540540540540526,res[0],1e-12); + } + dec.sendData(); + } + // + delete parafieldP0; + mesh->decrRef(); + delete paramesh; + delete self_group; + delete target_group; + delete source_group; + // + MPI_Barrier(MPI_COMM_WORLD); +} + + +/* + * Check methods defined in InterpKernelDEC.hxx + * + InterpKernelDEC(); + InterpKernelDEC(ProcessorGroup& local_group, ProcessorGroup& distant_group); + virtual ~InterpKernelDEC(); + void synchronize(); + void recvData(); + void sendData(); +*/ + +void ParaMEDMEMTest::testInterpKernelDEC_2D_(const char *srcMeth, const char *targetMeth) +{ + std::string srcM(srcMeth); + std::string targetM(targetMeth); + int size; + int rank; + MPI_Comm_size(MPI_COMM_WORLD,&size); + MPI_Comm_rank(MPI_COMM_WORLD,&rank); + + //the test is meant to run on five processors + if (size !=5) return ; + + int nproc_source = 3; + set self_procs; + set procs_source; + set procs_target; + + for (int i=0; icontainsMyRank()) + { + string master = filename_xml1; + + ostringstream strstream; + strstream <getField()->setNature(ConservativeVolumic); + } + else + parafield = new ParaFIELD(ON_NODES,NO_TIME,paramesh, comptopo); + int nb_local; + if(srcM=="P0") + nb_local=mesh->getNumberOfCells(); + else + nb_local=mesh->getNumberOfNodes(); + // double * value= new double[nb_local]; + double *value=parafield->getField()->getArray()->getPointer(); + for(int ielem=0; ielemgetField()); + dec.setMethod(srcMeth); + dec.attachLocalField(icocofield); + } + + //loading the geometry for the target group + if (target_group->containsMyRank()) + { + string master= filename_xml2; + ostringstream strstream; + strstream << master<<(rank-nproc_source+1)<<".med"; + ostringstream meshname ; + meshname<< "Mesh_3_"<getField()->setNature(ConservativeVolumic); + } + else + parafield = new ParaFIELD(ON_NODES,NO_TIME,paramesh, comptopo); + int nb_local; + if(targetM=="P0") + nb_local=mesh->getNumberOfCells(); + else + nb_local=mesh->getNumberOfNodes(); + // double * value= new double[nb_local]; + double *value=parafield->getField()->getArray()->getPointer(); + for(int ielem=0; ielemgetField()); + dec.setMethod(targetMeth); + dec.attachLocalField(icocofield); + } + + + //attaching a DEC to the source group + double field_before_int; + double field_after_int; + + if (source_group->containsMyRank()) + { + field_before_int = parafield->getVolumeIntegral(0,true); + dec.synchronize(); + cout<<"DEC usage"<myRank()==0) + aRemover.Register("./sourcesquareb"); + ostringstream filename; + filename<<"./sourcesquareb_"<myRank()+1; + aRemover.Register(filename.str().c_str()); + //MEDLoader::WriteField("./sourcesquareb",parafield->getField()); + + dec.recvData(); + cout <<"writing"<myRank()==0) + aRemover.Register("./sourcesquare"); + //MEDLoader::WriteField("./sourcesquare",parafield->getField()); + + + filename<<"./sourcesquare_"<myRank()+1; + aRemover.Register(filename.str().c_str()); + field_after_int = parafield->getVolumeIntegral(0,true); + + + // MPI_Bcast(&field_before_int,1,MPI_DOUBLE,0,MPI_COMM_WORLD); + // MPI_Bcast(&field_after_int,1,MPI_DOUBLE,0,MPI_COMM_WORLD); + + CPPUNIT_ASSERT_DOUBLES_EQUAL(field_before_int, field_after_int, 1e-6); + + } + + //attaching a DEC to the target group + if (target_group->containsMyRank()) + { + dec.synchronize(); + dec.setForcedRenormalization(false); + + dec.recvData(); + ParaMEDLoader::WriteParaMesh("./targetsquareb",paramesh); + //MEDLoader::WriteField("./targetsquareb",parafield->getField()); + if (target_group->myRank()==0) + aRemover.Register("./targetsquareb"); + ostringstream filename; + filename<<"./targetsquareb_"<myRank()+1; + aRemover.Register(filename.str().c_str()); + dec.sendData(); + ParaMEDLoader::WriteParaMesh("./targetsquare",paramesh); + //MEDLoader::WriteField("./targetsquare",parafield->getField()); + + if (target_group->myRank()==0) + aRemover.Register("./targetsquareb"); + + filename<<"./targetsquareb_"<myRank()+1; + aRemover.Register(filename.str().c_str()); + // double field_before_int, field_after_int; + // MPI_Bcast(&field_before_int,1,MPI_DOUBLE,0,MPI_COMM_WORLD); + // MPI_Bcast(&field_after_int,1,MPI_DOUBLE,0,MPI_COMM_WORLD); + + // CPPUNIT_ASSERT_DOUBLES_EQUAL(field_before_int, field_after_int, 1e-6); + + } + + delete source_group; + delete target_group; + delete self_group; + delete parafield; + delete paramesh; + mesh->decrRef(); + + delete icocofield; + + MPI_Barrier(MPI_COMM_WORLD); + cout << "end of InterpKernelDEC_2D test"< self_procs; + set procs_source; + set procs_target; + + for (int i=0; icontainsMyRank()) + { + string master = filename_xml1; + + ostringstream strstream; + strstream <setMesh(mesh); + DataArrayDouble *array=DataArrayDouble::New(); + array->alloc(mcfield->getNumberOfTuples(),1); + mcfield->setArray(array); + array->decrRef(); + mcfield->setNature(ConservativeVolumic); + } + else + { + mcfield = MEDCouplingFieldDouble::New(ON_CELLS,NO_TIME); + mcfield->setMesh(mesh); + DataArrayDouble *array=DataArrayDouble::New(); + array->alloc(mcfield->getNumberOfTuples(),1); + mcfield->setArray(array); + array->decrRef(); + } + int nb_local; + if(srcM=="P0") + nb_local=mesh->getNumberOfCells(); + else + nb_local=mesh->getNumberOfNodes(); + double *value=mcfield->getArray()->getPointer(); + for(int ielem=0; ielemcontainsMyRank()) + { + string master= filename_xml2; + ostringstream strstream; + strstream << master<<(rank-nproc_source+1)<<".med"; + ostringstream meshname ; + meshname<< "Mesh_3_"<setMesh(mesh); + DataArrayDouble *array=DataArrayDouble::New(); + array->alloc(mcfield->getNumberOfTuples(),1); + mcfield->setArray(array); + array->decrRef(); + mcfield->setNature(ConservativeVolumic); + } + else + { + mcfield = MEDCouplingFieldDouble::New(ON_NODES,NO_TIME); + mcfield->setMesh(mesh); + DataArrayDouble *array=DataArrayDouble::New(); + array->alloc(mcfield->getNumberOfTuples(),1); + mcfield->setArray(array); + array->decrRef(); + } + int nb_local; + if(targetM=="P0") + nb_local=mesh->getNumberOfCells(); + else + nb_local=mesh->getNumberOfNodes(); + double *value=mcfield->getArray()->getPointer(); + for(int ielem=0; ielemcontainsMyRank()) + { + dec.synchronize(); + dec.setForcedRenormalization(false); + dec.sendData(); + dec.recvData(); + } + + //attaching a DEC to the target group + if (target_group->containsMyRank()) + { + dec.synchronize(); + dec.setForcedRenormalization(false); + dec.recvData(); + dec.sendData(); + } + delete source_group; + delete target_group; + delete self_group; + mcfield->decrRef(); + mesh->decrRef(); + + MPI_Barrier(MPI_COMM_WORLD); + cout << "end of InterpKernelDEC2_2D test"< self_procs; + set procs_source; + set procs_target; + + for (int i=0; icontainsMyRank()) + { + string master = filename_xml1; + + ostringstream strstream; + strstream <getField()->setNature(ConservativeVolumic); + } + else + parafield = new ParaFIELD(ON_NODES,NO_TIME,paramesh, comptopo); + int nb_local; + if(srcM=="P0") + nb_local=mesh->getNumberOfCells(); + else + nb_local=mesh->getNumberOfNodes(); + // double * value= new double[nb_local]; + double *value=parafield->getField()->getArray()->getPointer(); + for(int ielem=0; ielemgetField()); + dec.setMethod(srcMeth); + dec.attachLocalField(icocofield); + } + + //loading the geometry for the target group + if (target_group->containsMyRank()) + { + string master= filename_xml2; + ostringstream strstream; + strstream << master << ".med"; + ostringstream meshname ; + meshname<< "Mesh_6"; + mesh = MEDLoader::ReadUMeshFromFile(strstream.str().c_str(),meshname.str().c_str(),0); + + paramesh=new ParaMESH (mesh,*target_group,"target mesh"); + // ParaMEDMEM::ParaSUPPORT* parasupport=new UnstructuredParaSUPPORT(support,*target_group); + ParaMEDMEM::ComponentTopology comptopo; + if(targetM=="P0") + { + parafield = new ParaFIELD(ON_CELLS,NO_TIME,paramesh, comptopo); + parafield->getField()->setNature(ConservativeVolumic); + } + else + parafield = new ParaFIELD(ON_NODES,NO_TIME,paramesh, comptopo); + int nb_local; + if(targetM=="P0") + nb_local=mesh->getNumberOfCells(); + else + nb_local=mesh->getNumberOfNodes(); + // double * value= new double[nb_local]; + double *value=parafield->getField()->getArray()->getPointer(); + for(int ielem=0; ielemgetField()); + dec.setMethod(targetMeth); + dec.attachLocalField(icocofield); + } + //attaching a DEC to the source group + double field_before_int; + double field_after_int; + + if (source_group->containsMyRank()) + { + field_before_int = parafield->getVolumeIntegral(0,true); + dec.synchronize(); + cout<<"DEC usage"<myRank()==0) + aRemover.Register("./sourcesquareb"); + ostringstream filename; + filename<<"./sourcesquareb_"<myRank()+1; + aRemover.Register(filename.str().c_str()); + //MEDLoader::WriteField("./sourcesquareb",parafield->getField()); + + dec.recvData(); + cout <<"writing"<myRank()==0) + aRemover.Register("./sourcesquare"); + //MEDLoader::WriteField("./sourcesquare",parafield->getField()); + + + filename<<"./sourcesquare_"<myRank()+1; + aRemover.Register(filename.str().c_str()); + field_after_int = parafield->getVolumeIntegral(0,true); + + CPPUNIT_ASSERT_DOUBLES_EQUAL(field_before_int, field_after_int, 1e-6); + + } + + //attaching a DEC to the target group + if (target_group->containsMyRank()) + { + dec.synchronize(); + dec.setForcedRenormalization(false); + + dec.recvData(); + ParaMEDLoader::WriteParaMesh("./targetsquareb",paramesh); + //MEDLoader::WriteField("./targetsquareb",parafield->getField()); + if (target_group->myRank()==0) + aRemover.Register("./targetsquareb"); + ostringstream filename; + filename<<"./targetsquareb_"<myRank()+1; + aRemover.Register(filename.str().c_str()); + dec.sendData(); + ParaMEDLoader::WriteParaMesh("./targetsquare",paramesh); + //MEDLoader::WriteField("./targetsquare",parafield->getField()); + + if (target_group->myRank()==0) + aRemover.Register("./targetsquareb"); + + filename<<"./targetsquareb_"<myRank()+1; + aRemover.Register(filename.str().c_str()); + } + delete source_group; + delete target_group; + delete self_group; + delete parafield; + delete paramesh; + mesh->decrRef(); + + delete icocofield; + + MPI_Barrier(MPI_COMM_WORLD); + cout << "end of InterpKernelDEC_3D test"< self_procs; + set procs_source; + set procs_target; + + for (int i=0; icontainsMyRank()) + { + std::ostringstream stream; stream << "sourcemesh2D proc " << rank; + mesh=MEDCouplingUMesh::New(stream.str().c_str(),2); + mesh->allocateCells(2); + mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,conn4All); + mesh->finishInsertingCells(); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(4,2); + const double *sourceCoords=sourceCoordsAll[rank]; + std::copy(sourceCoords,sourceCoords+8,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + paramesh=new ParaMESH(mesh,*source_group,"source mesh"); + ParaMEDMEM::ComponentTopology comptopo; + parafield = new ParaFIELD(ON_CELLS,NO_TIME,paramesh, comptopo); + double *value=parafield->getField()->getArray()->getPointer(); + value[0]=34+13*((double)rank); + } + else + { + std::ostringstream stream; stream << "targetmesh2D proc " << rank-nproc_source; + mesh=MEDCouplingUMesh::New(stream.str().c_str(),2); + mesh->allocateCells(2); + mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,conn4All); + mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,conn4All+4); + mesh->finishInsertingCells(); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(8,2); + const double *targetCoords=targetCoordsAll[rank-nproc_source]; + std::copy(targetCoords,targetCoords+16,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + paramesh=new ParaMESH (mesh,*target_group,"target mesh"); + ParaMEDMEM::ComponentTopology comptopo; + parafield = new ParaFIELD(ON_CELLS,NO_TIME,paramesh, comptopo); + } + //test 1 - Conservative volumic + ParaMEDMEM::InterpKernelDEC dec(*source_group,*target_group); + parafield->getField()->setNature(ConservativeVolumic); + if (source_group->containsMyRank()) + { + dec.setMethod("P0"); + dec.attachLocalField(parafield); + dec.synchronize(); + dec.setForcedRenormalization(false); + dec.sendData(); + } + else + { + dec.setMethod("P0"); + dec.attachLocalField(parafield); + dec.synchronize(); + dec.setForcedRenormalization(false); + dec.recvData(); + const double *res=parafield->getField()->getArray()->getConstPointer(); + const double *expected=targetResults[rank-nproc_source]; + CPPUNIT_ASSERT_DOUBLES_EQUAL(expected[0],res[0],1e-13); + CPPUNIT_ASSERT_DOUBLES_EQUAL(expected[1],res[1],1e-13); + } + //test 2 - Integral + ParaMEDMEM::InterpKernelDEC dec2(*source_group,*target_group); + parafield->getField()->setNature(Integral); + if (source_group->containsMyRank()) + { + dec2.setMethod("P0"); + dec2.attachLocalField(parafield); + dec2.synchronize(); + dec2.setForcedRenormalization(false); + dec2.sendData(); + } + else + { + dec2.setMethod("P0"); + dec2.attachLocalField(parafield); + dec2.synchronize(); + dec2.setForcedRenormalization(false); + dec2.recvData(); + const double *res=parafield->getField()->getArray()->getConstPointer(); + const double *expected=targetResults2[rank-nproc_source]; + CPPUNIT_ASSERT_DOUBLES_EQUAL(expected[0],res[0],1e-13); + CPPUNIT_ASSERT_DOUBLES_EQUAL(expected[1],res[1],1e-13); + } + //test 3 - Integral with global constraint + ParaMEDMEM::InterpKernelDEC dec3(*source_group,*target_group); + parafield->getField()->setNature(IntegralGlobConstraint); + if (source_group->containsMyRank()) + { + dec3.setMethod("P0"); + dec3.attachLocalField(parafield); + dec3.synchronize(); + dec3.setForcedRenormalization(false); + dec3.sendData(); + } + else + { + dec3.setMethod("P0"); + dec3.attachLocalField(parafield); + dec3.synchronize(); + dec3.setForcedRenormalization(false); + dec3.recvData(); + const double *res=parafield->getField()->getArray()->getConstPointer(); + const double *expected=targetResults3[rank-nproc_source]; + CPPUNIT_ASSERT_DOUBLES_EQUAL(expected[0],res[0],1e-13); + CPPUNIT_ASSERT_DOUBLES_EQUAL(expected[1],res[1],1e-13); + } + //test 4 - RevIntegral + ParaMEDMEM::InterpKernelDEC dec4(*source_group,*target_group); + parafield->getField()->setNature(RevIntegral); + if (source_group->containsMyRank()) + { + dec4.setMethod("P0"); + dec4.attachLocalField(parafield); + dec4.synchronize(); + dec4.setForcedRenormalization(false); + dec4.sendData(); + } + else + { + dec4.setMethod("P0"); + dec4.attachLocalField(parafield); + dec4.synchronize(); + dec4.setForcedRenormalization(false); + dec4.recvData(); + const double *res=parafield->getField()->getArray()->getConstPointer(); + const double *expected=targetResults4[rank-nproc_source]; + CPPUNIT_ASSERT_DOUBLES_EQUAL(expected[0],res[0],1e-13); + CPPUNIT_ASSERT_DOUBLES_EQUAL(expected[1],res[1],1e-13); + } + //test 5 - Conservative volumic reversed + ParaMEDMEM::InterpKernelDEC dec5(*source_group,*target_group); + parafield->getField()->setNature(ConservativeVolumic); + if (source_group->containsMyRank()) + { + dec5.setMethod("P0"); + dec5.attachLocalField(parafield); + dec5.synchronize(); + dec5.setForcedRenormalization(false); + dec5.recvData(); + const double *res=parafield->getField()->getArray()->getConstPointer(); + CPPUNIT_ASSERT_EQUAL(1,parafield->getField()->getNumberOfTuples()); + const double expected[]={37.8518518518519,43.5333333333333}; + CPPUNIT_ASSERT_DOUBLES_EQUAL(expected[rank],res[0],1e-13); + } + else + { + dec5.setMethod("P0"); + dec5.attachLocalField(parafield); + dec5.synchronize(); + dec5.setForcedRenormalization(false); + double *res=parafield->getField()->getArray()->getPointer(); + const double *toSet=targetResults[rank-nproc_source]; + res[0]=toSet[0]; + res[1]=toSet[1]; + dec5.sendData(); + } + //test 6 - Integral reversed + ParaMEDMEM::InterpKernelDEC dec6(*source_group,*target_group); + parafield->getField()->setNature(Integral); + if (source_group->containsMyRank()) + { + dec6.setMethod("P0"); + dec6.attachLocalField(parafield); + dec6.synchronize(); + dec6.setForcedRenormalization(false); + dec6.recvData(); + const double *res=parafield->getField()->getArray()->getConstPointer(); + CPPUNIT_ASSERT_EQUAL(1,parafield->getField()->getNumberOfTuples()); + const double expected[]={0.794600591715977,1.35631163708087}; + CPPUNIT_ASSERT_DOUBLES_EQUAL(expected[rank],res[0],1e-13); + } + else + { + dec6.setMethod("P0"); + dec6.attachLocalField(parafield); + dec6.synchronize(); + dec6.setForcedRenormalization(false); + double *res=parafield->getField()->getArray()->getPointer(); + const double *toSet=targetResults2[rank-nproc_source]; + res[0]=toSet[0]; + res[1]=toSet[1]; + dec6.sendData(); + } + //test 7 - Integral with global constraint reversed + ParaMEDMEM::InterpKernelDEC dec7(*source_group,*target_group); + parafield->getField()->setNature(IntegralGlobConstraint); + if (source_group->containsMyRank()) + { + dec7.setMethod("P0"); + dec7.attachLocalField(parafield); + dec7.synchronize(); + dec7.setForcedRenormalization(false); + dec7.recvData(); + const double *res=parafield->getField()->getArray()->getConstPointer(); + CPPUNIT_ASSERT_EQUAL(1,parafield->getField()->getNumberOfTuples()); + const double expected[]={36.4592592592593,44.5407407407407}; + CPPUNIT_ASSERT_DOUBLES_EQUAL(expected[rank],res[0],1e-13); + } + else + { + dec7.setMethod("P0"); + dec7.attachLocalField(parafield); + dec7.synchronize(); + dec7.setForcedRenormalization(false); + double *res=parafield->getField()->getArray()->getPointer(); + const double *toSet=targetResults3[rank-nproc_source]; + res[0]=toSet[0]; + res[1]=toSet[1]; + dec7.sendData(); + } + //test 8 - Integral with RevIntegral reversed + ParaMEDMEM::InterpKernelDEC dec8(*source_group,*target_group); + parafield->getField()->setNature(RevIntegral); + if (source_group->containsMyRank()) + { + dec8.setMethod("P0"); + dec8.attachLocalField(parafield); + dec8.synchronize(); + dec8.setForcedRenormalization(false); + dec8.recvData(); + const double *res=parafield->getField()->getArray()->getConstPointer(); + CPPUNIT_ASSERT_EQUAL(1,parafield->getField()->getNumberOfTuples()); + const double expected[]={0.81314102564102553,1.3428994082840233}; + CPPUNIT_ASSERT_DOUBLES_EQUAL(expected[rank],res[0],1e-13); + } + else + { + dec8.setMethod("P0"); + dec8.attachLocalField(parafield); + dec8.synchronize(); + dec8.setForcedRenormalization(false); + double *res=parafield->getField()->getArray()->getPointer(); + const double *toSet=targetResults4[rank-nproc_source]; + res[0]=toSet[0]; + res[1]=toSet[1]; + dec8.sendData(); + } + // + delete parafield; + mesh->decrRef(); + delete paramesh; + delete self_group; + delete target_group; + delete source_group; + // + MPI_Barrier(MPI_COMM_WORLD); +} + +void ParaMEDMEMTest::testInterpKernelDECNonOverlapp_2D_P0P1P1P0() +{ + int size; + int rank; + MPI_Comm_size(MPI_COMM_WORLD,&size); + MPI_Comm_rank(MPI_COMM_WORLD,&rank); + // + if(size!=5) + return ; + int nproc_source = 2; + set self_procs; + set procs_source; + set procs_target; + + for (int i=0; icontainsMyRank()) + { + if(rank==0) + { + double coords[6]={-0.3,-0.3, 0.7,0.7, 0.7,-0.3}; + int conn[3]={0,1,2}; + //int globalNode[3]={1,2,0}; + mesh=MEDCouplingUMesh::New("Source mesh Proc0",2); + mesh->allocateCells(1); + mesh->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,conn); + mesh->finishInsertingCells(); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(3,2); + std::copy(coords,coords+6,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + } + if(rank==1) + { + double coords[6]={-0.3,-0.3, -0.3,0.7, 0.7,0.7}; + int conn[3]={0,1,2}; + //int globalNode[3]={1,3,2}; + mesh=MEDCouplingUMesh::New("Source mesh Proc1",2); + mesh->allocateCells(1); + mesh->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,conn); + mesh->finishInsertingCells(); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(3,2); + std::copy(coords,coords+6,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + } + paramesh=new ParaMESH(mesh,*source_group,"source mesh"); + ParaMEDMEM::ComponentTopology comptopo; + parafieldP0 = new ParaFIELD(ON_CELLS,NO_TIME,paramesh, comptopo); + parafieldP1 = new ParaFIELD(ON_NODES,NO_TIME,paramesh, comptopo); + double *valueP0=parafieldP0->getField()->getArray()->getPointer(); + double *valueP1=parafieldP1->getField()->getArray()->getPointer(); + parafieldP0->getField()->setNature(ConservativeVolumic); + parafieldP1->getField()->setNature(ConservativeVolumic); + if(rank==0) + { + valueP0[0]=31.; + valueP1[0]=34.; valueP1[1]=77.; valueP1[2]=53.; + } + if(rank==1) + { + valueP0[0]=47.; + valueP1[0]=34.; valueP1[1]=57.; valueP1[2]=77.; + } + } + else + { + const char targetMeshName[]="target mesh"; + if(rank==2) + { + double coords[10]={-0.3,-0.3, 0.2,-0.3, 0.7,-0.3, -0.3,0.2, 0.2,0.2 }; + int conn[7]={0,3,4,1, 1,4,2}; + //int globalNode[5]={4,3,0,2,1}; + mesh=MEDCouplingUMesh::New("Target mesh Proc2",2); + mesh->allocateCells(2); + mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,conn); + mesh->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,conn+4); + mesh->finishInsertingCells(); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(5,2); + std::copy(coords,coords+10,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + paramesh=new ParaMESH(mesh,*target_group,targetMeshName); + DataArrayInt *da=DataArrayInt::New(); + const int globalNumberingP2[5]={0,1,2,3,4}; + da->useArray(globalNumberingP2,false,CPP_DEALLOC,5,1); + paramesh->setNodeGlobal(da); + da->decrRef(); + } + if(rank==3) + { + double coords[6]={0.2,0.2, 0.7,-0.3, 0.7,0.2}; + int conn[3]={0,2,1}; + //int globalNode[3]={1,0,5}; + mesh=MEDCouplingUMesh::New("Target mesh Proc3",2); + mesh->allocateCells(1); + mesh->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,conn); + mesh->finishInsertingCells(); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(3,2); + std::copy(coords,coords+6,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + paramesh=new ParaMESH(mesh,*target_group,targetMeshName); + DataArrayInt *da=DataArrayInt::New(); + const int globalNumberingP3[3]={4,2,5}; + da->useArray(globalNumberingP3,false,CPP_DEALLOC,3,1); + paramesh->setNodeGlobal(da); + da->decrRef(); + } + if(rank==4) + { + double coords[12]={-0.3,0.2, -0.3,0.7, 0.2,0.7, 0.2,0.2, 0.7,0.7, 0.7,0.2}; + int conn[8]={0,1,2,3, 3,2,4,5}; + //int globalNode[6]={2,6,7,1,8,5}; + mesh=MEDCouplingUMesh::New("Target mesh Proc4",2); + mesh->allocateCells(2); + mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,conn); + mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,conn+4); + mesh->finishInsertingCells(); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(6,2); + std::copy(coords,coords+12,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + paramesh=new ParaMESH(mesh,*target_group,targetMeshName); + DataArrayInt *da=DataArrayInt::New(); + const int globalNumberingP4[6]={3,6,7,4,8,5}; + da->useArray(globalNumberingP4,false,CPP_DEALLOC,6,1); + paramesh->setNodeGlobal(da); + da->decrRef(); + } + ParaMEDMEM::ComponentTopology comptopo; + parafieldP0 = new ParaFIELD(ON_CELLS,NO_TIME,paramesh, comptopo); + parafieldP1 = new ParaFIELD(ON_NODES,NO_TIME,paramesh, comptopo); + parafieldP0->getField()->setNature(ConservativeVolumic); + parafieldP1->getField()->setNature(ConservativeVolumic); + } + // test 1 - P0 P1 + ParaMEDMEM::InterpKernelDEC dec(*source_group,*target_group); + if (source_group->containsMyRank()) + { + dec.setMethod("P0"); + dec.attachLocalField(parafieldP0); + dec.synchronize(); + dec.setForcedRenormalization(false); + dec.sendData(); + dec.recvData(); + const double *valueP0=parafieldP0->getField()->getArray()->getPointer(); + if(rank==0) + { + CPPUNIT_ASSERT_DOUBLES_EQUAL(34.42857143,valueP0[0],1e-7); + } + if(rank==1) + { + CPPUNIT_ASSERT_DOUBLES_EQUAL(44.,valueP0[0],1e-7); + } + } + else + { + dec.setMethod("P1"); + dec.attachLocalField(parafieldP1); + dec.synchronize(); + dec.setForcedRenormalization(false); + dec.recvData(); + const double *res=parafieldP1->getField()->getArray()->getConstPointer(); + if(rank==2) + { + const double expectP2[5]={39.0, 31.0, 31.0, 47.0, 39.0}; + CPPUNIT_ASSERT_EQUAL(5,parafieldP1->getField()->getNumberOfTuples()); + CPPUNIT_ASSERT_EQUAL(1,parafieldP1->getField()->getNumberOfComponents()); + for(int kk=0;kk<5;kk++) + CPPUNIT_ASSERT_DOUBLES_EQUAL(expectP2[kk],res[kk],1e-12); + } + if(rank==3) + { + const double expectP3[3]={39.0, 31.0, 31.0}; + CPPUNIT_ASSERT_EQUAL(3,parafieldP1->getField()->getNumberOfTuples()); + CPPUNIT_ASSERT_EQUAL(1,parafieldP1->getField()->getNumberOfComponents()); + for(int kk=0;kk<3;kk++) + CPPUNIT_ASSERT_DOUBLES_EQUAL(expectP3[kk],res[kk],1e-12); + } + if(rank==4) + { + const double expectP4[6]={47.0, 47.0, 47.0, 39.0, 39.0, 31.0}; + CPPUNIT_ASSERT_EQUAL(6,parafieldP1->getField()->getNumberOfTuples()); + CPPUNIT_ASSERT_EQUAL(1,parafieldP1->getField()->getNumberOfComponents()); + for(int kk=0;kk<6;kk++) + CPPUNIT_ASSERT_DOUBLES_EQUAL(expectP4[kk],res[kk],1e-12); + } + dec.sendData(); + } + // + delete parafieldP0; + delete parafieldP1; + mesh->decrRef(); + delete paramesh; + delete self_group; + delete target_group; + delete source_group; + // + MPI_Barrier(MPI_COMM_WORLD); +} + +void ParaMEDMEMTest::testInterpKernelDEC2DM1D_P0P0() +{ + int size; + int rank; + MPI_Comm_size(MPI_COMM_WORLD,&size); + MPI_Comm_rank(MPI_COMM_WORLD,&rank); + // + if(size!=3) + return ; + int nproc_source=2; + set procs_source; + set procs_target; + // + for (int i=0; icontainsMyRank()) + { + double targetCoords[18]={-0.3,-0.3, 0.2,-0.3, 0.7,-0.3, -0.3,0.2, 0.2,0.2, 0.7,0.2, -0.3,0.7, 0.2,0.7, 0.7,0.7 }; + mesh=MEDCouplingUMesh::New(); + mesh->setMeshDimension(2); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(9,2); + std::copy(targetCoords,targetCoords+18,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + if(rank==0) + { + int targetConn[7]={0,3,4,1, 1,4,2}; + mesh->allocateCells(2); + mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,targetConn); + mesh->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,targetConn+4); + mesh->finishInsertingCells(); + } + else + { + int targetConn[11]={4,5,2, 6,7,4,3, 7,8,5,4}; + mesh->allocateCells(3); + mesh->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,targetConn); + mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,targetConn+3); + mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,targetConn+7); + mesh->finishInsertingCells(); + } + ParaMEDMEM::ComponentTopology comptopo; + paramesh=new ParaMESH(mesh,*source_group,"source mesh"); + parafield=new ParaFIELD(ON_CELLS,NO_TIME,paramesh, comptopo); + parafield->getField()->setNature(ConservativeVolumic); + double *vals=parafield->getField()->getArray()->getPointer(); + if(rank==0) + { vals[0]=7.; vals[1]=8.; } + else + { vals[0]=9.; vals[1]=10.; vals[2]=11.; } + } + else + { + mesh=MEDCouplingUMesh::New("an example of -1 D mesh",-1); + ParaMEDMEM::ComponentTopology comptopo; + paramesh=new ParaMESH(mesh,*target_group,"target mesh"); + parafield=new ParaFIELD(ON_CELLS,NO_TIME,paramesh, comptopo); + parafield->getField()->setNature(ConservativeVolumic); + } + ParaMEDMEM::InterpKernelDEC dec(*source_group,*target_group); + if(source_group->containsMyRank()) + { + dec.setMethod("P0"); + dec.attachLocalField(parafield); + dec.synchronize(); + dec.setForcedRenormalization(false); + dec.sendData(); + dec.recvData(); + const double *res=parafield->getField()->getArray()->getConstPointer(); + if(rank==0) + { + CPPUNIT_ASSERT_DOUBLES_EQUAL(9.125,res[0],1e-12); + CPPUNIT_ASSERT_DOUBLES_EQUAL(9.125,res[1],1e-12); + } + else + { + CPPUNIT_ASSERT_DOUBLES_EQUAL(9.125,res[0],1e-12); + CPPUNIT_ASSERT_DOUBLES_EQUAL(9.125,res[1],1e-12); + CPPUNIT_ASSERT_DOUBLES_EQUAL(9.125,res[2],1e-12); + } + } + else + { + dec.setMethod("P0"); + dec.attachLocalField(parafield); + dec.synchronize(); + dec.setForcedRenormalization(false); + dec.recvData(); + const double *res=parafield->getField()->getArray()->getConstPointer(); + CPPUNIT_ASSERT_DOUBLES_EQUAL(9.125,res[0],1e-12); + dec.sendData(); + } + ParaMEDMEM::InterpKernelDEC dec2(*source_group,*target_group); + dec2.setMethod("P0"); + parafield->getField()->setNature(IntegralGlobConstraint); + if(source_group->containsMyRank()) + { + double *vals=parafield->getField()->getArray()->getPointer(); + if(rank==0) + { vals[0]=7.; vals[1]=8.; } + else + { vals[0]=9.; vals[1]=10.; vals[2]=11.; } + dec2.attachLocalField(parafield); + dec2.synchronize(); + dec2.sendData(); + dec2.recvData(); + const double *res=parafield->getField()->getArray()->getConstPointer(); + if(rank==0) + { + CPPUNIT_ASSERT_DOUBLES_EQUAL(11.25,res[0],1e-12); + CPPUNIT_ASSERT_DOUBLES_EQUAL(5.625,res[1],1e-12); + } + else + { + CPPUNIT_ASSERT_DOUBLES_EQUAL(5.625,res[0],1e-12); + CPPUNIT_ASSERT_DOUBLES_EQUAL(11.25,res[1],1e-12); + CPPUNIT_ASSERT_DOUBLES_EQUAL(11.25,res[2],1e-12); + } + } + else + { + dec2.attachLocalField(parafield); + dec2.synchronize(); + dec2.recvData(); + const double *res=parafield->getField()->getArray()->getConstPointer(); + CPPUNIT_ASSERT_DOUBLES_EQUAL(45.,res[0],1e-12); + dec2.sendData(); + } + // + ParaMEDMEM::InterpKernelDEC dec3(*source_group,*target_group); + dec3.setMethod("P0"); + parafield->getField()->setNature(Integral); + if(source_group->containsMyRank()) + { + double *vals=parafield->getField()->getArray()->getPointer(); + if(rank==0) + { vals[0]=7.; vals[1]=8.; } + else + { vals[0]=9.; vals[1]=10.; vals[2]=11.; } + dec3.attachLocalField(parafield); + dec3.synchronize(); + dec3.sendData(); + dec3.recvData(); + const double *res=parafield->getField()->getArray()->getConstPointer(); + if(rank==0) + { + CPPUNIT_ASSERT_DOUBLES_EQUAL(11.25,res[0],1e-12); + CPPUNIT_ASSERT_DOUBLES_EQUAL(5.625,res[1],1e-12); + } + else + { + CPPUNIT_ASSERT_DOUBLES_EQUAL(5.625,res[0],1e-12); + CPPUNIT_ASSERT_DOUBLES_EQUAL(11.25,res[1],1e-12); + CPPUNIT_ASSERT_DOUBLES_EQUAL(11.25,res[2],1e-12); + } + } + else + { + dec3.attachLocalField(parafield); + dec3.synchronize(); + dec3.recvData(); + const double *res=parafield->getField()->getArray()->getConstPointer(); + CPPUNIT_ASSERT_DOUBLES_EQUAL(45.,res[0],1e-12); + dec3.sendData(); + } + // + ParaMEDMEM::InterpKernelDEC dec4(*source_group,*target_group); + dec4.setMethod("P0"); + parafield->getField()->setNature(RevIntegral); + if(source_group->containsMyRank()) + { + double *vals=parafield->getField()->getArray()->getPointer(); + if(rank==0) + { vals[0]=7.; vals[1]=8.; } + else + { vals[0]=9.; vals[1]=10.; vals[2]=11.; } + dec4.attachLocalField(parafield); + dec4.synchronize(); + dec4.sendData(); + dec4.recvData(); + const double *res=parafield->getField()->getArray()->getConstPointer(); + if(rank==0) + { + CPPUNIT_ASSERT_DOUBLES_EQUAL(9.125,res[0],1e-12); + CPPUNIT_ASSERT_DOUBLES_EQUAL(9.125,res[1],1e-12); + } + else + { + CPPUNIT_ASSERT_DOUBLES_EQUAL(9.125,res[0],1e-12); + CPPUNIT_ASSERT_DOUBLES_EQUAL(9.125,res[1],1e-12); + CPPUNIT_ASSERT_DOUBLES_EQUAL(9.125,res[2],1e-12); + } + } + else + { + dec4.attachLocalField(parafield); + dec4.synchronize(); + dec4.recvData(); + const double *res=parafield->getField()->getArray()->getConstPointer(); + CPPUNIT_ASSERT_DOUBLES_EQUAL(9.125,res[0],1e-12); + dec4.sendData(); + } + delete parafield; + delete paramesh; + mesh->decrRef(); + delete target_group; + delete source_group; + // + MPI_Barrier(MPI_COMM_WORLD); +} + +void ParaMEDMEMTest::testInterpKernelDECPartialProcs() +{ + int size; + int rank; + MPI_Comm_size(MPI_COMM_WORLD,&size); + MPI_Comm_rank(MPI_COMM_WORLD,&rank); + // + if(size!=3) + return ; + set procs_source; + set procs_target; + // + procs_source.insert(0); + procs_target.insert(1); + // + ParaMEDMEM::MEDCouplingUMesh *mesh=0; + ParaMEDMEM::ParaMESH *paramesh=0; + ParaMEDMEM::ParaFIELD *parafield=0; + // + ParaMEDMEM::CommInterface interface; + // + MPI_Barrier(MPI_COMM_WORLD); + double targetCoords[8]={ 0.,0., 1., 0., 0., 1., 1., 1. }; + CommInterface comm; + int grpIds[2]={0,1}; + MPI_Group grp,group_world; + comm.commGroup(MPI_COMM_WORLD,&group_world); + comm.groupIncl(group_world,2,grpIds,&grp); + MPI_Comm partialComm; + comm.commCreate(MPI_COMM_WORLD,grp,&partialComm); + // + ProcessorGroup* target_group=0; + ProcessorGroup* source_group=0; + // + ParaMEDMEM::InterpKernelDEC *dec=0; + if(rank==0 || rank==1) + { + target_group = new ParaMEDMEM::MPIProcessorGroup(interface,procs_target,partialComm); + source_group = new ParaMEDMEM::MPIProcessorGroup(interface,procs_source,partialComm); + if(source_group->containsMyRank()) + { + mesh=MEDCouplingUMesh::New(); + mesh->setMeshDimension(2); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(4,2); + std::copy(targetCoords,targetCoords+8,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + int targetConn[4]={0,2,3,1}; + mesh->allocateCells(1); + mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,targetConn); + mesh->finishInsertingCells(); + ParaMEDMEM::ComponentTopology comptopo; + paramesh=new ParaMESH(mesh,*source_group,"source mesh"); + parafield=new ParaFIELD(ON_CELLS,NO_TIME,paramesh, comptopo); + parafield->getField()->setNature(ConservativeVolumic); + double *vals=parafield->getField()->getArray()->getPointer(); + vals[0]=7.; + dec=new ParaMEDMEM::InterpKernelDEC(*source_group,*target_group); + dec->attachLocalField(parafield); + dec->synchronize(); + dec->sendData(); + dec->recvData(); + } + else + { + mesh=MEDCouplingUMesh::New(); + mesh->setMeshDimension(2); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(4,2); + std::copy(targetCoords,targetCoords+8,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + int targetConn[6]={0,2,1,2,3,1}; + mesh->allocateCells(2); + mesh->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,targetConn); + mesh->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,targetConn+3); + mesh->finishInsertingCells(); + ParaMEDMEM::ComponentTopology comptopo; + paramesh=new ParaMESH(mesh,*target_group,"target mesh"); + parafield=new ParaFIELD(ON_CELLS,NO_TIME,paramesh, comptopo); + parafield->getField()->setNature(ConservativeVolumic); + dec=new ParaMEDMEM::InterpKernelDEC(*source_group,*target_group); + dec->attachLocalField(parafield); + dec->synchronize(); + dec->recvData(); + dec->sendData(); + } + } + delete parafield; + delete paramesh; + if(mesh) + mesh->decrRef(); + delete target_group; + delete source_group; + delete dec; + MPI_Barrier(MPI_COMM_WORLD); +} + +/*! + * This test reproduces bug of Gauthier on 13/9/2010 concerning 3DSurf meshes. + * It is possible to lead to dead lock in InterpKernelDEC when 3DSurfMeshes global bounding boxes intersects whereas cell bounding box intersecting only on one side. + */ +void ParaMEDMEMTest::testInterpKernelDEC3DSurfEmptyBBox() +{ + int size; + int rank; + MPI_Comm_size(MPI_COMM_WORLD,&size); + MPI_Comm_rank(MPI_COMM_WORLD,&rank); + // + if(size!=3) + return ; + int nproc_source = 1; + set self_procs; + set procs_source; + set procs_target; + + for (int i=0; icontainsMyRank()) + { + double coords[15]={1.,0.,0., 2.,0.,0., 2.,2.,0., 0.,2.,0., 0.5,0.5,1.}; + int conn[7]={0,1,2,3,0,3,4}; + mesh=MEDCouplingUMesh::New("Source mesh Proc0",2); + mesh->allocateCells(2); + mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,conn); + mesh->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,conn+4); + mesh->finishInsertingCells(); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(5,3); + std::copy(coords,coords+15,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + // + paramesh=new ParaMESH(mesh,*source_group,"source mesh"); + ParaMEDMEM::ComponentTopology comptopo; + parafieldP0 = new ParaFIELD(ON_CELLS,NO_TIME,paramesh, comptopo); + double *valueP0=parafieldP0->getField()->getArray()->getPointer(); + parafieldP0->getField()->setNature(ConservativeVolumic); + valueP0[0]=7.; valueP0[1]=8.; + } + else + { + const char targetMeshName[]="target mesh"; + if(rank==1) + { + double coords[12]={0.25,0.25,0.5, 0.,0.25,0.5, 0.,0.,0.5, 0.25,0.,0.5}; + int conn[4]={0,1,2,3}; + mesh=MEDCouplingUMesh::New("Target mesh Proc1",2); + mesh->allocateCells(1); + mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,conn); + mesh->finishInsertingCells(); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(4,3); + std::copy(coords,coords+12,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + paramesh=new ParaMESH(mesh,*target_group,targetMeshName); + } + if(rank==2) + { + double coords[12]={0.,0.25,0.5, 0.,0.,0.5, -1.,0.,0.5, -1.,0.25,0.5}; + int conn[4]={0,1,2,3}; + mesh=MEDCouplingUMesh::New("Target mesh Proc2",2); + mesh->allocateCells(1); + mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,conn); + mesh->finishInsertingCells(); + DataArrayDouble *myCoords=DataArrayDouble::New(); + myCoords->alloc(4,3); + std::copy(coords,coords+12,myCoords->getPointer()); + mesh->setCoords(myCoords); + myCoords->decrRef(); + paramesh=new ParaMESH(mesh,*target_group,targetMeshName); + } + ParaMEDMEM::ComponentTopology comptopo; + parafieldP0 = new ParaFIELD(ON_CELLS,NO_TIME,paramesh, comptopo); + parafieldP0->getField()->setNature(ConservativeVolumic); + } + // test 1 + ParaMEDMEM::InterpKernelDEC dec(*source_group,*target_group); + if (source_group->containsMyRank()) + { + dec.setMethod("P0"); + dec.attachLocalField(parafieldP0); + dec.synchronize(); + // dec.setForcedRenormalization(false); + // dec.sendData(); + // dec.recvData(); + // const double *valueP0=parafieldP0->getField()->getArray()->getPointer(); + // if(rank==0) + // { + // CPPUNIT_ASSERT_DOUBLES_EQUAL(7.4,valueP0[0],1e-7); + // CPPUNIT_ASSERT_DOUBLES_EQUAL(9.0540540540540544,valueP0[1],1e-7); + // } + // if(rank==1) + // { + // CPPUNIT_ASSERT_DOUBLES_EQUAL(8.64054054054054,valueP0[0],1e-7); + // } + // if(rank==2) + // { + // CPPUNIT_ASSERT_DOUBLES_EQUAL(9.0540540540540544,valueP0[0],1e-7); + // } + } + else + { + dec.setMethod("P0"); + dec.attachLocalField(parafieldP0); + dec.synchronize(); + // dec.setForcedRenormalization(false); + // dec.recvData(); + // const double *res=parafieldP0->getField()->getArray()->getConstPointer(); + // if(rank==3) + // { + // CPPUNIT_ASSERT_EQUAL(1,parafieldP0->getField()->getNumberOfTuples()); + // CPPUNIT_ASSERT_EQUAL(1,parafieldP0->getField()->getNumberOfComponents()); + // CPPUNIT_ASSERT_DOUBLES_EQUAL(7.4,res[0],1e-12); + // } + // if(rank==4) + // { + // CPPUNIT_ASSERT_EQUAL(1,parafieldP0->getField()->getNumberOfTuples()); + // CPPUNIT_ASSERT_EQUAL(1,parafieldP0->getField()->getNumberOfComponents()); + // CPPUNIT_ASSERT_DOUBLES_EQUAL(9.0540540540540526,res[0],1e-12); + // } + // dec.sendData(); + } + // + delete parafieldP0; + mesh->decrRef(); + delete paramesh; + delete self_group; + delete target_group; + delete source_group; + // + MPI_Barrier(MPI_COMM_WORLD); +} + +/*! + * Tests an asynchronous exchange between two codes + * one sends data with dtA as an interval, the max time being tmaxA + * the other one receives with dtB as an interval, the max time being tmaxB + */ +void ParaMEDMEMTest::testAsynchronousInterpKernelDEC_2D(double dtA, double tmaxA, + double dtB, double tmaxB, bool WithPointToPoint, bool Asynchronous, + bool WithInterp, const char *srcMeth, const char *targetMeth) +{ + std::string srcM(srcMeth); + std::string targetM(targetMeth); + int size; + int rank; + MPI_Comm_size(MPI_COMM_WORLD,&size); + MPI_Comm_rank(MPI_COMM_WORLD,&rank); + + //the test is meant to run on five processors + if (size !=5) return ; + + int nproc_source = 3; + set self_procs; + set procs_source; + set procs_target; + + for (int i=0; icontainsMyRank()) + { + string master = filename_xml1; + + ostringstream strstream; + strstream <getField()->setNature(ConservativeVolumic);//InvertIntegral);//ConservativeVolumic); + } + else + parafield = new ParaFIELD(ON_NODES,NO_TIME,paramesh, comptopo); + + int nb_local; + if(srcM=="P0") + nb_local=mesh->getNumberOfCells(); + else + nb_local=mesh->getNumberOfNodes(); + // double * value= new double[nb_local]; + double *value=parafield->getField()->getArray()->getPointer(); + for(int ielem=0; ielemgetField()); + + dec.attachLocalField(icocofield); + + + } + + //loading the geometry for the target group + if (target_group->containsMyRank()) + { + string master= filename_xml2; + ostringstream strstream; + strstream << master<<(rank-nproc_source+1)<<".med"; + ostringstream meshname ; + meshname<< "Mesh_3_"<getField()->setNature(ConservativeVolumic);//InvertIntegral);//ConservativeVolumic); + } + else + parafield = new ParaFIELD(ON_NODES,NO_TIME,paramesh, comptopo); + + int nb_local; + if(targetM=="P0") + nb_local=mesh->getNumberOfCells(); + else + nb_local=mesh->getNumberOfNodes(); + + double *value=parafield->getField()->getArray()->getPointer(); + for(int ielem=0; ielemgetField()); + + dec.attachLocalField(icocofield); + } + + + //attaching a DEC to the source group + + if (source_group->containsMyRank()) + { + cout<<"DEC usage"<getField()->getArray()->getPointer(); + int nb_local=parafield->getField()->getMesh()->getNumberOfCells(); + for (int i=0; icontainsMyRank()) + { + cout<<"DEC usage"< times; + for (double time=0; timegetVolumeIntegral(0,true); + cout << "testAsynchronousInterpKernelDEC_2D" << rank << " time " << time + << " VolumeIntegral " << vi + << " time*10000 " << time*10000 << endl ; + + CPPUNIT_ASSERT_DOUBLES_EQUAL(vi,time*10000,0.001); + } + + } + + delete source_group; + delete target_group; + delete self_group; + delete parafield ; + delete paramesh ; + mesh->decrRef() ; + delete icocofield ; + + cout << "testAsynchronousInterpKernelDEC_2D" << rank << " MPI_Barrier " << endl ; + + if (Asynchronous) MPI_Barrier(MPI_COMM_WORLD); + cout << "end of InterpKernelDEC_2D test"< + +#include +#include +#include +#include + +using namespace std; +using namespace INTERP_KERNEL; +using namespace ParaMEDMEM; + +void ParaMEDMEMTest::testMEDLoaderRead1() +{ + string fileName=getResourceFile("pointe.med"); + vector meshNames=MEDLoader::GetMeshNames(fileName.c_str()); + CPPUNIT_ASSERT_EQUAL(1,(int)meshNames.size()); + MEDCouplingUMesh *mesh=MEDLoader::ReadUMeshFromFile(fileName.c_str(),meshNames[0].c_str(),0); + CPPUNIT_ASSERT_EQUAL(3,mesh->getSpaceDimension()); + CPPUNIT_ASSERT_EQUAL(3,mesh->getMeshDimension()); + CPPUNIT_ASSERT_EQUAL(16,mesh->getNumberOfCells()); + CPPUNIT_ASSERT_EQUAL(19,mesh->getNumberOfNodes()); + CPPUNIT_ASSERT_EQUAL(3,(int)mesh->getAllGeoTypes().size()); + for(int i=0;i<12;i++) + CPPUNIT_ASSERT_EQUAL(NORM_TETRA4,mesh->getTypeOfCell(i)); + CPPUNIT_ASSERT_EQUAL(NORM_PYRA5,mesh->getTypeOfCell(12)); + CPPUNIT_ASSERT_EQUAL(NORM_HEXA8,mesh->getTypeOfCell(13)); + CPPUNIT_ASSERT_EQUAL(NORM_HEXA8,mesh->getTypeOfCell(14)); + CPPUNIT_ASSERT_EQUAL(NORM_PYRA5,mesh->getTypeOfCell(15)); + CPPUNIT_ASSERT_EQUAL((std::size_t)90,mesh->getNodalConnectivity()->getNbOfElems()); + CPPUNIT_ASSERT_EQUAL(701,std::accumulate(mesh->getNodalConnectivity()->getPointer(),mesh->getNodalConnectivity()->getPointer()+90,0)); + CPPUNIT_ASSERT_EQUAL(705,std::accumulate(mesh->getNodalConnectivityIndex()->getPointer(),mesh->getNodalConnectivityIndex()->getPointer()+17,0)); + CPPUNIT_ASSERT_DOUBLES_EQUAL(46.,std::accumulate(mesh->getCoords()->getPointer(),mesh->getCoords()->getPointer()+57,0),1e-12); + mesh->decrRef(); + // + vector families=MEDLoader::GetMeshFamiliesNames(fileName.c_str(),meshNames[0].c_str()); + CPPUNIT_ASSERT_EQUAL(8,(int)families.size()); + CPPUNIT_ASSERT(families[2]=="FAMILLE_ELEMENT_3"); + // + vector families2; + families2.push_back(families[2]); + mesh=MEDLoader::ReadUMeshFromFamilies(fileName.c_str(),meshNames[0].c_str(),0,families2); + CPPUNIT_ASSERT_EQUAL(3,mesh->getSpaceDimension()); + CPPUNIT_ASSERT_EQUAL(3,mesh->getMeshDimension()); + CPPUNIT_ASSERT_EQUAL(2,mesh->getNumberOfCells()); + CPPUNIT_ASSERT_EQUAL(19,mesh->getNumberOfNodes()); + CPPUNIT_ASSERT_EQUAL(2,(int)mesh->getAllGeoTypes().size()); + CPPUNIT_ASSERT_EQUAL(NORM_TETRA4,mesh->getTypeOfCell(0)); + CPPUNIT_ASSERT_EQUAL(NORM_PYRA5,mesh->getTypeOfCell(1)); + CPPUNIT_ASSERT_EQUAL((std::size_t)11,mesh->getNodalConnectivity()->getNbOfElems()); + CPPUNIT_ASSERT_EQUAL(132,std::accumulate(mesh->getNodalConnectivity()->getPointer(),mesh->getNodalConnectivity()->getPointer()+11,0)); + CPPUNIT_ASSERT_EQUAL(16,std::accumulate(mesh->getNodalConnectivityIndex()->getPointer(),mesh->getNodalConnectivityIndex()->getPointer()+3,0)); + CPPUNIT_ASSERT_DOUBLES_EQUAL(46.,std::accumulate(mesh->getCoords()->getPointer(),mesh->getCoords()->getPointer()+57,0),1e-12); + mesh->decrRef(); + // + vector groups=MEDLoader::GetMeshGroupsNames(fileName.c_str(),meshNames[0].c_str()); + CPPUNIT_ASSERT_EQUAL(5,(int)groups.size()); + CPPUNIT_ASSERT(groups[0]=="groupe1"); + CPPUNIT_ASSERT(groups[1]=="groupe2"); + CPPUNIT_ASSERT(groups[2]=="groupe3"); + CPPUNIT_ASSERT(groups[3]=="groupe4"); + CPPUNIT_ASSERT(groups[4]=="groupe5"); + vector groups2; + groups2.push_back(groups[0]); + mesh=MEDLoader::ReadUMeshFromGroups(fileName.c_str(),meshNames[0].c_str(),0,groups2); + CPPUNIT_ASSERT_EQUAL(3,mesh->getSpaceDimension()); + CPPUNIT_ASSERT_EQUAL(3,mesh->getMeshDimension()); + CPPUNIT_ASSERT_EQUAL(7,mesh->getNumberOfCells()); + CPPUNIT_ASSERT_EQUAL(19,mesh->getNumberOfNodes()); + CPPUNIT_ASSERT_EQUAL(2,(int)mesh->getAllGeoTypes().size()); + for(int i=0;i<6;i++) + CPPUNIT_ASSERT_EQUAL(NORM_TETRA4,mesh->getTypeOfCell(i)); + CPPUNIT_ASSERT_EQUAL(NORM_PYRA5,mesh->getTypeOfCell(6)); + CPPUNIT_ASSERT_EQUAL((std::size_t)36,mesh->getNodalConnectivity()->getNbOfElems()); + CPPUNIT_ASSERT_EQUAL(254,std::accumulate(mesh->getNodalConnectivity()->getPointer(),mesh->getNodalConnectivity()->getPointer()+36,0)); + CPPUNIT_ASSERT_EQUAL(141,std::accumulate(mesh->getNodalConnectivityIndex()->getPointer(),mesh->getNodalConnectivityIndex()->getPointer()+8,0)); + CPPUNIT_ASSERT_DOUBLES_EQUAL(46.,std::accumulate(mesh->getCoords()->getPointer(),mesh->getCoords()->getPointer()+57,0),1e-12); + mesh->decrRef(); + // + std::vector fieldsName=MEDLoader::GetCellFieldNamesOnMesh(fileName.c_str(),meshNames[0].c_str()); + CPPUNIT_ASSERT_EQUAL(2,(int)fieldsName.size()); + CPPUNIT_ASSERT(fieldsName[0]=="fieldcelldoublescalar"); + CPPUNIT_ASSERT(fieldsName[1]=="fieldcelldoublevector"); + std::vector > its0=MEDLoader::GetCellFieldIterations(fileName.c_str(),meshNames[0].c_str(),fieldsName[0].c_str()); + CPPUNIT_ASSERT_EQUAL(1,(int)its0.size()); + CPPUNIT_ASSERT_EQUAL(-1,its0[0].first); + CPPUNIT_ASSERT_EQUAL(-1,its0[0].second); + std::vector > its1=MEDLoader::GetCellFieldIterations(fileName.c_str(),meshNames[0].c_str(),fieldsName[1].c_str()); + CPPUNIT_ASSERT_EQUAL(1,(int)its1.size()); + CPPUNIT_ASSERT_EQUAL(-1,its1[0].first); + CPPUNIT_ASSERT_EQUAL(-1,its1[0].second); + // + MEDCouplingFieldDouble *field0=MEDLoader::ReadFieldCell(fileName.c_str(),meshNames[0].c_str(),0,fieldsName[0].c_str(),its0[0].first,its0[0].second); + field0->checkCoherency(); + CPPUNIT_ASSERT(field0->getName()==fieldsName[0]); + CPPUNIT_ASSERT_EQUAL(1,field0->getNumberOfComponents()); + CPPUNIT_ASSERT_EQUAL(16,field0->getNumberOfTuples()); + const double expectedValues[16]={1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,2.,3.,3.,2.}; + double diffValue[16]; + std::transform(field0->getArray()->getPointer(),field0->getArray()->getPointer()+16,expectedValues,diffValue,std::minus()); + CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,*std::max_element(diffValue,diffValue+16),1e-12); + CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,*std::min_element(diffValue,diffValue+16),1e-12); + const MEDCouplingUMesh *constMesh=dynamic_cast(field0->getMesh()); + CPPUNIT_ASSERT(constMesh); + CPPUNIT_ASSERT_EQUAL(3,constMesh->getSpaceDimension()); + CPPUNIT_ASSERT_EQUAL(3,constMesh->getMeshDimension()); + CPPUNIT_ASSERT_EQUAL(16,constMesh->getNumberOfCells()); + CPPUNIT_ASSERT_EQUAL(19,constMesh->getNumberOfNodes()); + CPPUNIT_ASSERT_EQUAL(3,(int)constMesh->getAllGeoTypes().size()); + for(int i=0;i<12;i++) + CPPUNIT_ASSERT_EQUAL(NORM_TETRA4,constMesh->getTypeOfCell(i)); + CPPUNIT_ASSERT_EQUAL(NORM_PYRA5,constMesh->getTypeOfCell(12)); + CPPUNIT_ASSERT_EQUAL(NORM_HEXA8,constMesh->getTypeOfCell(13)); + CPPUNIT_ASSERT_EQUAL(NORM_HEXA8,constMesh->getTypeOfCell(14)); + CPPUNIT_ASSERT_EQUAL(NORM_PYRA5,constMesh->getTypeOfCell(15)); + CPPUNIT_ASSERT_EQUAL((std::size_t)90,constMesh->getNodalConnectivity()->getNbOfElems()); + CPPUNIT_ASSERT_EQUAL(701,std::accumulate(constMesh->getNodalConnectivity()->getConstPointer(),constMesh->getNodalConnectivity()->getConstPointer()+90,0)); + CPPUNIT_ASSERT_EQUAL(705,std::accumulate(constMesh->getNodalConnectivityIndex()->getConstPointer(),constMesh->getNodalConnectivityIndex()->getConstPointer()+17,0)); + CPPUNIT_ASSERT_DOUBLES_EQUAL(46.,std::accumulate(constMesh->getCoords()->getConstPointer(),constMesh->getCoords()->getConstPointer()+57,0),1e-12); + field0->decrRef(); + // + MEDCouplingFieldDouble *field1=MEDLoader::ReadFieldCell(fileName.c_str(),meshNames[0].c_str(),0,fieldsName[1].c_str(),its1[0].first,its1[0].second); + field1->checkCoherency(); + CPPUNIT_ASSERT(field1->getName()==fieldsName[1]); + CPPUNIT_ASSERT_EQUAL(3,field1->getNumberOfComponents()); + CPPUNIT_ASSERT_EQUAL(16,field1->getNumberOfTuples()); + const double expectedValues2[48]={1.,0.,1.,1.,0.,1.,1.,0.,1.,2.,1.,0.,2.,1.,0.,2.,1.,0.,3.,0.,1.,3.,0.,1.,3.,0.,1.,4.,1.,0.,4.,1.,0.,4.,1.,0.,5.,0.,0.,6.,1.,1.,6.,0.,0.,5.,1.,1.}; + double diffValue2[48]; + std::transform(field1->getArray()->getPointer(),field1->getArray()->getPointer()+48,expectedValues2,diffValue2,std::minus()); + CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,*std::max_element(diffValue2,diffValue2+48),1e-12); + CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,*std::min_element(diffValue2,diffValue2+48),1e-12); + constMesh=dynamic_cast(field1->getMesh()); + CPPUNIT_ASSERT(constMesh); + CPPUNIT_ASSERT_EQUAL(3,constMesh->getSpaceDimension()); + CPPUNIT_ASSERT_EQUAL(3,constMesh->getMeshDimension()); + CPPUNIT_ASSERT_EQUAL(16,constMesh->getNumberOfCells()); + CPPUNIT_ASSERT_EQUAL(19,constMesh->getNumberOfNodes()); + CPPUNIT_ASSERT_EQUAL(3,(int)constMesh->getAllGeoTypes().size()); + for(int i=0;i<12;i++) + CPPUNIT_ASSERT_EQUAL(NORM_TETRA4,constMesh->getTypeOfCell(i)); + CPPUNIT_ASSERT_EQUAL(NORM_PYRA5,constMesh->getTypeOfCell(12)); + CPPUNIT_ASSERT_EQUAL(NORM_HEXA8,constMesh->getTypeOfCell(13)); + CPPUNIT_ASSERT_EQUAL(NORM_HEXA8,constMesh->getTypeOfCell(14)); + CPPUNIT_ASSERT_EQUAL(NORM_PYRA5,constMesh->getTypeOfCell(15)); + CPPUNIT_ASSERT_EQUAL((std::size_t)90,constMesh->getNodalConnectivity()->getNbOfElems()); + CPPUNIT_ASSERT_EQUAL(701,std::accumulate(constMesh->getNodalConnectivity()->getConstPointer(),constMesh->getNodalConnectivity()->getConstPointer()+90,0)); + CPPUNIT_ASSERT_EQUAL(705,std::accumulate(constMesh->getNodalConnectivityIndex()->getConstPointer(),constMesh->getNodalConnectivityIndex()->getConstPointer()+17,0)); + CPPUNIT_ASSERT_DOUBLES_EQUAL(46.,std::accumulate(constMesh->getCoords()->getConstPointer(),constMesh->getCoords()->getConstPointer()+57,0),1e-12); + field1->decrRef(); + //fields on nodes + std::vector fieldsNameNode=MEDLoader::GetNodeFieldNamesOnMesh(fileName.c_str(),meshNames[0].c_str()); + CPPUNIT_ASSERT_EQUAL(2,(int)fieldsNameNode.size()); + CPPUNIT_ASSERT(fieldsNameNode[0]=="fieldnodedouble"); + CPPUNIT_ASSERT(fieldsNameNode[1]=="fieldnodeint"); + std::vector > its0Node=MEDLoader::GetNodeFieldIterations(fileName.c_str(),meshNames[0].c_str(),fieldsNameNode[0].c_str()); + CPPUNIT_ASSERT_EQUAL(3,(int)its0Node.size()); + CPPUNIT_ASSERT_EQUAL(-1,its0Node[0].first); + CPPUNIT_ASSERT_EQUAL(-1,its0Node[0].second); + CPPUNIT_ASSERT_EQUAL(1,its0Node[1].first); + CPPUNIT_ASSERT_EQUAL(-1,its0Node[1].second); + CPPUNIT_ASSERT_EQUAL(2,its0Node[2].first); + CPPUNIT_ASSERT_EQUAL(-1,its0Node[2].second); + MEDCouplingFieldDouble *field0Nodes=MEDLoader::ReadFieldNode(fileName.c_str(),meshNames[0].c_str(),0,fieldsNameNode[0].c_str(),its0Node[0].first,its0Node[0].second); + field0Nodes->checkCoherency(); + CPPUNIT_ASSERT(field0Nodes->getName()==fieldsNameNode[0]); + CPPUNIT_ASSERT_EQUAL(1,field0Nodes->getNumberOfComponents()); + CPPUNIT_ASSERT_EQUAL(19,field0Nodes->getNumberOfTuples()); + const double expectedValues3[19]={1.,1.,1.,2.,2.,2.,3.,3.,3.,4.,4.,4.,5.,5.,5.,6.,6.,6.,7.}; + double diffValue3[19]; + std::transform(field0Nodes->getArray()->getPointer(),field0Nodes->getArray()->getPointer()+19,expectedValues3,diffValue3,std::minus()); + CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,*std::max_element(diffValue3,diffValue3+19),1e-12); + CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,*std::min_element(diffValue3,diffValue3+19),1e-12); + constMesh=dynamic_cast(field0Nodes->getMesh()); + CPPUNIT_ASSERT(constMesh); + field0Nodes->decrRef(); + // + field0Nodes=MEDLoader::ReadFieldNode(fileName.c_str(),meshNames[0].c_str(),0,fieldsNameNode[0].c_str(),its0Node[2].first,its0Node[2].second); + field0Nodes->checkCoherency(); + CPPUNIT_ASSERT(field0Nodes->getName()==fieldsNameNode[0]); + CPPUNIT_ASSERT_EQUAL(1,field0Nodes->getNumberOfComponents()); + CPPUNIT_ASSERT_EQUAL(19,field0Nodes->getNumberOfTuples()); + const double expectedValues4[19]={1.,2.,2.,2.,3.,3.,3.,4.,4.,4.,5.,5.,5.,6.,6.,6.,7.,7.,7.}; + std::transform(field0Nodes->getArray()->getPointer(),field0Nodes->getArray()->getPointer()+19,expectedValues4,diffValue3,std::minus()); + CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,*std::max_element(diffValue3,diffValue3+19),1e-12); + CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,*std::min_element(diffValue3,diffValue3+19),1e-12); + constMesh=dynamic_cast(field0Nodes->getMesh()); + CPPUNIT_ASSERT(constMesh); + CPPUNIT_ASSERT_EQUAL(3,constMesh->getSpaceDimension()); + CPPUNIT_ASSERT_EQUAL(3,constMesh->getMeshDimension()); + CPPUNIT_ASSERT_EQUAL(16,constMesh->getNumberOfCells()); + CPPUNIT_ASSERT_EQUAL(19,constMesh->getNumberOfNodes()); + CPPUNIT_ASSERT_EQUAL(3,(int)constMesh->getAllGeoTypes().size()); + for(int i=0;i<12;i++) + CPPUNIT_ASSERT_EQUAL(NORM_TETRA4,constMesh->getTypeOfCell(i)); + CPPUNIT_ASSERT_EQUAL(NORM_PYRA5,constMesh->getTypeOfCell(12)); + CPPUNIT_ASSERT_EQUAL(NORM_HEXA8,constMesh->getTypeOfCell(13)); + CPPUNIT_ASSERT_EQUAL(NORM_HEXA8,constMesh->getTypeOfCell(14)); + CPPUNIT_ASSERT_EQUAL(NORM_PYRA5,constMesh->getTypeOfCell(15)); + CPPUNIT_ASSERT_EQUAL((std::size_t)90,constMesh->getNodalConnectivity()->getNbOfElems()); + CPPUNIT_ASSERT_EQUAL(701,std::accumulate(constMesh->getNodalConnectivity()->getConstPointer(),constMesh->getNodalConnectivity()->getConstPointer()+90,0)); + CPPUNIT_ASSERT_EQUAL(705,std::accumulate(constMesh->getNodalConnectivityIndex()->getConstPointer(),constMesh->getNodalConnectivityIndex()->getConstPointer()+17,0)); + CPPUNIT_ASSERT_DOUBLES_EQUAL(46.,std::accumulate(constMesh->getCoords()->getConstPointer(),constMesh->getCoords()->getConstPointer()+57,0),1e-12); + field0Nodes->decrRef(); + // + field0Nodes=MEDLoader::ReadFieldNode(fileName.c_str(),meshNames[0].c_str(),0,fieldsNameNode[0].c_str(),its0Node[0].first,its0Node[0].second); + field0Nodes->checkCoherency(); + CPPUNIT_ASSERT(field0Nodes->getName()==fieldsNameNode[0]); + CPPUNIT_ASSERT_EQUAL(1,field0Nodes->getNumberOfComponents()); + CPPUNIT_ASSERT_EQUAL(19,field0Nodes->getNumberOfTuples()); + const double expectedValues5[19]={1.,1.,1.,2.,2.,2.,3.,3.,3.,4.,4.,4.,5.,5.,5.,6.,6.,6.,7.}; + std::transform(field0Nodes->getArray()->getPointer(),field0Nodes->getArray()->getPointer()+19,expectedValues5,diffValue3,std::minus()); + CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,*std::max_element(diffValue3,diffValue3+19),1e-12); + CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,*std::min_element(diffValue3,diffValue3+19),1e-12); + constMesh=dynamic_cast(field0Nodes->getMesh()); + CPPUNIT_ASSERT(constMesh); + CPPUNIT_ASSERT_EQUAL(3,constMesh->getSpaceDimension()); + CPPUNIT_ASSERT_EQUAL(3,constMesh->getMeshDimension()); + CPPUNIT_ASSERT_EQUAL(16,constMesh->getNumberOfCells()); + CPPUNIT_ASSERT_EQUAL(19,constMesh->getNumberOfNodes()); + CPPUNIT_ASSERT_EQUAL(3,(int)constMesh->getAllGeoTypes().size()); + for(int i=0;i<12;i++) + CPPUNIT_ASSERT_EQUAL(NORM_TETRA4,constMesh->getTypeOfCell(i)); + CPPUNIT_ASSERT_EQUAL(NORM_PYRA5,constMesh->getTypeOfCell(12)); + CPPUNIT_ASSERT_EQUAL(NORM_HEXA8,constMesh->getTypeOfCell(13)); + CPPUNIT_ASSERT_EQUAL(NORM_HEXA8,constMesh->getTypeOfCell(14)); + CPPUNIT_ASSERT_EQUAL(NORM_PYRA5,constMesh->getTypeOfCell(15)); + CPPUNIT_ASSERT_EQUAL((std::size_t)90,constMesh->getNodalConnectivity()->getNbOfElems()); + CPPUNIT_ASSERT_EQUAL(701,std::accumulate(constMesh->getNodalConnectivity()->getConstPointer(),constMesh->getNodalConnectivity()->getConstPointer()+90,0)); + CPPUNIT_ASSERT_EQUAL(705,std::accumulate(constMesh->getNodalConnectivityIndex()->getConstPointer(),constMesh->getNodalConnectivityIndex()->getConstPointer()+17,0)); + CPPUNIT_ASSERT_DOUBLES_EQUAL(46.,std::accumulate(constMesh->getCoords()->getConstPointer(),constMesh->getCoords()->getConstPointer()+57,0),1e-12); + field0Nodes->decrRef(); +} + +void ParaMEDMEMTest::testMEDLoaderPolygonRead() +{ + string fileName=getResourceFile("polygones.med"); + vector meshNames=MEDLoader::GetMeshNames(fileName.c_str()); + CPPUNIT_ASSERT_EQUAL(1,(int)meshNames.size()); + CPPUNIT_ASSERT(meshNames[0]=="Bord"); + MEDCouplingUMesh *mesh=MEDLoader::ReadUMeshFromFile(fileName.c_str(),meshNames[0].c_str(),0); + mesh->checkCoherency(); + CPPUNIT_ASSERT_EQUAL(3,mesh->getSpaceDimension()); + CPPUNIT_ASSERT_EQUAL(2,mesh->getMeshDimension()); + CPPUNIT_ASSERT_EQUAL(538,mesh->getNumberOfCells()); + CPPUNIT_ASSERT_EQUAL(579,mesh->getNumberOfNodes()); + CPPUNIT_ASSERT_EQUAL(2,(int)mesh->getAllGeoTypes().size()); + for(int i=0;i<514;i++) + CPPUNIT_ASSERT_EQUAL(NORM_QUAD4,mesh->getTypeOfCell(i)); + for(int i=514;i<538;i++) + CPPUNIT_ASSERT_EQUAL(NORM_POLYGON,mesh->getTypeOfCell(i)); + CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,std::accumulate(mesh->getCoords()->getPointer(),mesh->getCoords()->getPointer()+1737,0),1e-12); + const double expectedVals1[12]={1.4851585216522212,-0.5,0.,1.4851585216522212,-0.4,0.,1.4851585216522212,-0.3,0., 1.5741585216522211, -0.5, 0. }; + double diffValue1[12]; + std::transform(mesh->getCoords()->getPointer(),mesh->getCoords()->getPointer()+12,expectedVals1,diffValue1,std::minus()); + CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,*std::max_element(diffValue1,diffValue1+12),1e-12); + CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,*std::min_element(diffValue1,diffValue1+12),1e-12); + CPPUNIT_ASSERT_EQUAL((std::size_t)2768,mesh->getNodalConnectivity()->getNbOfElems()); + CPPUNIT_ASSERT_EQUAL(651050,std::accumulate(mesh->getNodalConnectivity()->getPointer(),mesh->getNodalConnectivity()->getPointer()+2768,0)); + CPPUNIT_ASSERT_EQUAL(725943,std::accumulate(mesh->getNodalConnectivityIndex()->getPointer(),mesh->getNodalConnectivityIndex()->getPointer()+539,0)); + mesh->decrRef(); + // + std::vector fieldsName=MEDLoader::GetCellFieldNamesOnMesh(fileName.c_str(),meshNames[0].c_str()); + CPPUNIT_ASSERT_EQUAL(3,(int)fieldsName.size()); + CPPUNIT_ASSERT(fieldsName[0]=="bord_:_distorsion"); + CPPUNIT_ASSERT(fieldsName[1]=="bord_:_familles"); + CPPUNIT_ASSERT(fieldsName[2]=="bord_:_non-ortho"); + std::vector > its0=MEDLoader::GetCellFieldIterations(fileName.c_str(),meshNames[0].c_str(),fieldsName[0].c_str()); + CPPUNIT_ASSERT_EQUAL(1,(int)its0.size()); + MEDCouplingFieldDouble *field=MEDLoader::ReadFieldCell(fileName.c_str(),meshNames[0].c_str(),0,fieldsName[0].c_str(),its0[0].first,its0[0].second); + field->checkCoherency(); + CPPUNIT_ASSERT(field->getName()==fieldsName[0]); + CPPUNIT_ASSERT_EQUAL(1,field->getNumberOfComponents()); + CPPUNIT_ASSERT_EQUAL(538,field->getNumberOfTuples()); + const MEDCouplingUMesh *constMesh=dynamic_cast(field->getMesh()); + CPPUNIT_ASSERT(constMesh); + CPPUNIT_ASSERT_EQUAL(3,constMesh->getSpaceDimension()); + CPPUNIT_ASSERT_EQUAL(2,constMesh->getMeshDimension()); + CPPUNIT_ASSERT_EQUAL(538,constMesh->getNumberOfCells()); + CPPUNIT_ASSERT_EQUAL(579,constMesh->getNumberOfNodes()); + CPPUNIT_ASSERT_EQUAL(2,(int)constMesh->getAllGeoTypes().size()); + for(int i=0;i<514;i++) + CPPUNIT_ASSERT_EQUAL(NORM_QUAD4,constMesh->getTypeOfCell(i)); + for(int i=514;i<538;i++) + CPPUNIT_ASSERT_EQUAL(NORM_POLYGON,constMesh->getTypeOfCell(i)); + CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,std::accumulate(constMesh->getCoords()->getConstPointer(),constMesh->getCoords()->getConstPointer()+1737,0),1e-12); + std::transform(constMesh->getCoords()->getConstPointer(),constMesh->getCoords()->getConstPointer()+12,expectedVals1,diffValue1,std::minus()); + CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,*std::max_element(diffValue1,diffValue1+12),1e-12); + CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,*std::min_element(diffValue1,diffValue1+12),1e-12); + CPPUNIT_ASSERT_EQUAL((std::size_t)2768,constMesh->getNodalConnectivity()->getNbOfElems()); + CPPUNIT_ASSERT_EQUAL(651050,std::accumulate(constMesh->getNodalConnectivity()->getConstPointer(),constMesh->getNodalConnectivity()->getConstPointer()+2768,0)); + CPPUNIT_ASSERT_EQUAL(725943,std::accumulate(constMesh->getNodalConnectivityIndex()->getConstPointer(),constMesh->getNodalConnectivityIndex()->getConstPointer()+539,0)); + const double *values=field->getArray()->getPointer(); + CPPUNIT_ASSERT_DOUBLES_EQUAL(2.87214203182918,std::accumulate(values,values+538,0.),1e-12); + field->decrRef(); +} + +void ParaMEDMEMTest::testMEDLoaderPolyhedronRead() +{ + string fileName=getResourceFile("poly3D.med"); + vector meshNames=MEDLoader::GetMeshNames(fileName.c_str()); + CPPUNIT_ASSERT_EQUAL(1,(int)meshNames.size()); + CPPUNIT_ASSERT(meshNames[0]=="poly3D"); + MEDCouplingUMesh *mesh=MEDLoader::ReadUMeshFromFile(fileName.c_str(),meshNames[0].c_str(),0); + mesh->checkCoherency(); + CPPUNIT_ASSERT_EQUAL(3,mesh->getSpaceDimension()); + CPPUNIT_ASSERT_EQUAL(3,mesh->getMeshDimension()); + CPPUNIT_ASSERT_EQUAL(3,mesh->getNumberOfCells()); + CPPUNIT_ASSERT_EQUAL(19,mesh->getNumberOfNodes()); + CPPUNIT_ASSERT_EQUAL(2,(int)mesh->getAllGeoTypes().size()); + CPPUNIT_ASSERT_EQUAL(NORM_TETRA4,mesh->getTypeOfCell(0)); + CPPUNIT_ASSERT_EQUAL(NORM_POLYHED,mesh->getTypeOfCell(1)); + CPPUNIT_ASSERT_EQUAL(NORM_POLYHED,mesh->getTypeOfCell(2)); + CPPUNIT_ASSERT_EQUAL((std::size_t)98,mesh->getNodalConnectivity()->getNbOfElems()); + CPPUNIT_ASSERT_EQUAL(725,std::accumulate(mesh->getNodalConnectivity()->getPointer(),mesh->getNodalConnectivity()->getPointer()+98,0)); + CPPUNIT_ASSERT_DOUBLES_EQUAL(110.,std::accumulate(mesh->getCoords()->getPointer(),mesh->getCoords()->getPointer()+57,0),1e-12); + CPPUNIT_ASSERT_EQUAL(155,std::accumulate(mesh->getNodalConnectivityIndex()->getPointer(),mesh->getNodalConnectivityIndex()->getPointer()+4,0)); + mesh->decrRef(); + // + mesh=MEDLoader::ReadUMeshFromFile(fileName.c_str(),meshNames[0].c_str(),-1); + mesh->checkCoherency(); + CPPUNIT_ASSERT_EQUAL(3,mesh->getSpaceDimension()); + CPPUNIT_ASSERT_EQUAL(2,mesh->getMeshDimension()); + CPPUNIT_ASSERT_EQUAL(17,mesh->getNumberOfCells()); + CPPUNIT_ASSERT_EQUAL(19,mesh->getNumberOfNodes()); + CPPUNIT_ASSERT_EQUAL(3,(int)mesh->getAllGeoTypes().size()); + CPPUNIT_ASSERT_EQUAL(NORM_POLYGON,mesh->getTypeOfCell(0)); + CPPUNIT_ASSERT_EQUAL(NORM_QUAD4,mesh->getTypeOfCell(1)); + CPPUNIT_ASSERT_EQUAL(NORM_QUAD4,mesh->getTypeOfCell(2)); + CPPUNIT_ASSERT_EQUAL(NORM_QUAD4,mesh->getTypeOfCell(3)); + CPPUNIT_ASSERT_EQUAL(NORM_QUAD4,mesh->getTypeOfCell(4)); + CPPUNIT_ASSERT_EQUAL(NORM_QUAD4,mesh->getTypeOfCell(5)); + CPPUNIT_ASSERT_EQUAL(NORM_QUAD4,mesh->getTypeOfCell(6)); + CPPUNIT_ASSERT_EQUAL(NORM_TRI3,mesh->getTypeOfCell(7)); + CPPUNIT_ASSERT_EQUAL(NORM_POLYGON,mesh->getTypeOfCell(8)); + CPPUNIT_ASSERT_EQUAL(NORM_POLYGON,mesh->getTypeOfCell(9)); + CPPUNIT_ASSERT_EQUAL(NORM_QUAD4,mesh->getTypeOfCell(10)); + CPPUNIT_ASSERT_EQUAL(NORM_TRI3,mesh->getTypeOfCell(11)); + CPPUNIT_ASSERT_EQUAL(NORM_TRI3,mesh->getTypeOfCell(12)); + CPPUNIT_ASSERT_EQUAL(NORM_TRI3,mesh->getTypeOfCell(13)); + CPPUNIT_ASSERT_EQUAL(NORM_TRI3,mesh->getTypeOfCell(14)); + CPPUNIT_ASSERT_EQUAL(NORM_QUAD4,mesh->getTypeOfCell(15)); + CPPUNIT_ASSERT_EQUAL(NORM_TRI3,mesh->getTypeOfCell(16)); + CPPUNIT_ASSERT_DOUBLES_EQUAL(110.,std::accumulate(mesh->getCoords()->getPointer(),mesh->getCoords()->getPointer()+57,0),1e-12); + CPPUNIT_ASSERT_EQUAL((std::size_t)83,mesh->getNodalConnectivity()->getNbOfElems()); + CPPUNIT_ASSERT_EQUAL(619,std::accumulate(mesh->getNodalConnectivity()->getPointer(),mesh->getNodalConnectivity()->getPointer()+83,0)); + mesh->decrRef(); + // + vector families=MEDLoader::GetMeshFamiliesNames(fileName.c_str(),meshNames[0].c_str()); + CPPUNIT_ASSERT_EQUAL(4,(int)families.size()); + CPPUNIT_ASSERT(families[0]=="FAMILLE_FACE_POLYGONS3"); + CPPUNIT_ASSERT(families[1]=="FAMILLE_FACE_QUAD41"); + CPPUNIT_ASSERT(families[2]=="FAMILLE_FACE_TRIA32"); + CPPUNIT_ASSERT(families[3]=="FAMILLE_ZERO"); + vector families2; + families2.push_back(families[0]); + mesh=MEDLoader::ReadUMeshFromFamilies(fileName.c_str(),meshNames[0].c_str(),-1,families2); + mesh->checkCoherency(); + CPPUNIT_ASSERT_EQUAL(3,mesh->getSpaceDimension()); + CPPUNIT_ASSERT_EQUAL(2,mesh->getMeshDimension()); + CPPUNIT_ASSERT_EQUAL(3,mesh->getNumberOfCells()); + CPPUNIT_ASSERT_EQUAL(19,mesh->getNumberOfNodes()); + CPPUNIT_ASSERT_EQUAL(1,(int)mesh->getAllGeoTypes().size()); + for(int i=0;i<3;i++) + CPPUNIT_ASSERT_EQUAL(NORM_POLYGON,mesh->getTypeOfCell(i)); + CPPUNIT_ASSERT_EQUAL((std::size_t)19,mesh->getNodalConnectivity()->getNbOfElems()); + CPPUNIT_ASSERT_EQUAL(117,std::accumulate(mesh->getNodalConnectivity()->getPointer(),mesh->getNodalConnectivity()->getPointer()+19,0)); + mesh->decrRef(); + // + mesh=MEDLoader::ReadUMeshFromFamilies(fileName.c_str(),meshNames[0].c_str(),0,families2); + CPPUNIT_ASSERT_EQUAL(3,mesh->getSpaceDimension()); + CPPUNIT_ASSERT_EQUAL(0,mesh->getNumberOfCells()); + CPPUNIT_ASSERT_EQUAL(19,mesh->getNumberOfNodes()); + CPPUNIT_ASSERT_EQUAL(3,mesh->getMeshDimension()); + CPPUNIT_ASSERT_EQUAL(0,(int)mesh->getAllGeoTypes().size()); + mesh->decrRef(); +} diff --git a/src/ParaMEDMEMTest/ParaMEDMEMTest_MPIProcessorGroup.cxx b/src/ParaMEDMEMTest/ParaMEDMEMTest_MPIProcessorGroup.cxx new file mode 100644 index 000000000..91ef8bb8a --- /dev/null +++ b/src/ParaMEDMEMTest/ParaMEDMEMTest_MPIProcessorGroup.cxx @@ -0,0 +1,149 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "ParaMEDMEMTest.hxx" +#include +#include "CommInterface.hxx" +#include "ProcessorGroup.hxx" +#include "MPIProcessorGroup.hxx" +#include "InterpolationUtils.hxx" + +#include + +// use this define to enable lines, execution of which leads to Segmentation Fault +#define ENABLE_FAULTS + +// use this define to enable CPPUNIT asserts and fails, showing bugs +#define ENABLE_FORCED_FAILURES + + +using namespace std; +using namespace ParaMEDMEM; + +/* + * Check methods defined in MPPIProcessorGroup.hxx + * + (+) MPIProcessorGroup(const CommInterface& interface); + (+) MPIProcessorGroup(const CommInterface& interface, set proc_ids); + (u) MPIProcessorGroup (const ProcessorGroup& proc_group, set proc_ids); + (+) MPIProcessorGroup(const CommInterface& interface,int pstart, int pend); + (+) virtual ~MPIProcessorGroup(); + (+) virtual ProcessorGroup* fuse (const ProcessorGroup&) const; + (u) void intersect (ProcessorGroup&){}; + (+) int myRank() const {int rank; MPI_Comm_rank(_comm,&rank); return rank;} + (+) bool containsMyRank() const { int rank; MPI_Group_rank(_group, &rank); return (rank!=MPI_UNDEFINED);} + (+) int translateRank(const ProcessorGroup* group, int rank) const; + (+) const MPI_Comm* getComm() const {return &_comm;} + (+) ProcessorGroup* createComplementProcGroup() const; + (o) ProcessorGroup* createProcGroup() const; + +*/ + +void ParaMEDMEMTest::testMPIProcessorGroup_constructor() +{ + CommInterface comm_interface; + MPIProcessorGroup* group = new MPIProcessorGroup(comm_interface);; + int size; + MPI_Comm_size(MPI_COMM_WORLD, &size); + CPPUNIT_ASSERT_EQUAL(size,group->size()); + int size2; + const MPI_Comm* communicator=group->getComm(); + MPI_Comm_size(*communicator, &size2); + CPPUNIT_ASSERT_EQUAL(size,size2); + delete group; + + set procs; + + procs.insert(0); + procs.insert(1); + if (size==1) + CPPUNIT_ASSERT_THROW(group=new MPIProcessorGroup(comm_interface,procs),INTERP_KERNEL::Exception); + else + { + CPPUNIT_ASSERT_NO_THROW( group=new MPIProcessorGroup(comm_interface,procs)); + CPPUNIT_ASSERT_EQUAL (group->size(),2); + delete group; + } + + //throws because plast1) + { + group=new MPIProcessorGroup(comm_interface,0,size-2); + CPPUNIT_ASSERT_EQUAL(group->size(),size-1); + delete group; + } + +} + +void ParaMEDMEMTest::testMPIProcessorGroup_boolean() +{ + int size; + MPI_Comm_size(MPI_COMM_WORLD, &size); + + CommInterface comm_interface; + MPIProcessorGroup group(comm_interface,0,0); + MPIProcessorGroup group2(comm_interface,size-1,size-1); + ProcessorGroup* group_fuse=group.fuse(group2); + int group_fuse_size=(size==1)?1:2; + CPPUNIT_ASSERT_EQUAL(group_fuse_size,group_fuse->size()); + + ProcessorGroup* group_complement=((MPIProcessorGroup*)group_fuse)->createComplementProcGroup(); + CPPUNIT_ASSERT_EQUAL(group_complement->size(),size-group_fuse_size); + + delete group_fuse; + delete group_complement; + + //intersect not implemented yet + // if (size>1) + // { + // MPIProcessorGroup group3(comm_interface,0,size-2); + // MPIProcessorGroup group4(comm_interface,1,size-1); + // group3.intersect(group4); + // CPPUNIT_ASSERT_EQUAL(group3.size(),size-2); + // } +} + +void ParaMEDMEMTest::testMPIProcessorGroup_rank() +{ + int size; + MPI_Comm_size(MPI_COMM_WORLD, &size); + int rank; + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + + CommInterface comm_interface; + MPIProcessorGroup group(comm_interface,0,0); + MPIProcessorGroup group2(comm_interface,size-1,size-1); + ProcessorGroup* group_fuse=group2.fuse(group); + + if (group.containsMyRank()) + CPPUNIT_ASSERT_EQUAL (group.myRank(), rank); + + if (group2.containsMyRank()) + { + int trank=group_fuse->translateRank(&group2,0); + if (size==1) + CPPUNIT_ASSERT_EQUAL(trank,0); + else + CPPUNIT_ASSERT_EQUAL(trank,1); + } + delete group_fuse; +} diff --git a/src/ParaMEDMEMTest/ParaMEDMEMTest_NonCoincidentDEC.cxx b/src/ParaMEDMEMTest/ParaMEDMEMTest_NonCoincidentDEC.cxx new file mode 100644 index 000000000..6ab7130df --- /dev/null +++ b/src/ParaMEDMEMTest/ParaMEDMEMTest_NonCoincidentDEC.cxx @@ -0,0 +1,256 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifdef MED_ENABLE_FVM + +#include "ParaMEDMEMTest.hxx" +#include + +#include "MEDMEM_Exception.hxx" +#include "CommInterface.hxx" +#include "ProcessorGroup.hxx" +#include "MPIProcessorGroup.hxx" +#include "Topology.hxx" +#include "DEC.hxx" +#include "NonCoincidentDEC.hxx" +#include "ParaMESH.hxx" +#include "ParaFIELD.hxx" +#include "UnstructuredParaSUPPORT.hxx" +#include "ICoCoMEDField.hxx" + +#include + +// use this define to enable lines, execution of which leads to Segmentation Fault +#define ENABLE_FAULTS + +// use this define to enable CPPUNIT asserts and fails, showing bugs +#define ENABLE_FORCED_FAILURES + + +using namespace std; +using namespace ParaMEDMEM; +using namespace MEDMEM; + +/* + * Check methods defined in InterpKernelDEC.hxx + * + InterpKernelDEC(); + InterpKernelDEC(ProcessorGroup& local_group, ProcessorGroup& distant_group); + virtual ~InterpKernelDEC(); + void synchronize(); + void recvData(); + void sendData(); +*/ + +void ParaMEDMEMTest::testNonCoincidentDEC_2D() +{ + + int size; + MPI_Comm_size(MPI_COMM_WORLD,&size); + + //the test is meant to run on five processors + if (size !=5) return ; + + testNonCoincidentDEC( "/share/salome/resources/med/square1_split", + "Mesh_2", + "/share/salome/resources/med/square2_split", + "Mesh_3", + 3, + 1e-6); +} + +void ParaMEDMEMTest::testNonCoincidentDEC_3D() +{ + int size; + MPI_Comm_size(MPI_COMM_WORLD,&size); + + //the test is meant to run on five processors + if (size !=4) return ; + + testNonCoincidentDEC( "/share/salome/resources/med/blade_12000_split2", + "Mesh_1", + "/share/salome/resources/med/blade_3000_split2", + "Mesh_1", + 2, + 1e4); +} + +void ParaMEDMEMTest::testNonCoincidentDEC(const string& filename1, + const string& meshname1, + const string& filename2, + const string& meshname2, + int nproc_source, + double epsilon) +{ + int size; + int rank; + MPI_Comm_size(MPI_COMM_WORLD,&size); + MPI_Comm_rank(MPI_COMM_WORLD,&rank); + + set self_procs; + set procs_source; + set procs_target; + + for (int i=0; i* field; + ParaMEDMEM::ParaMESH* paramesh; + ParaMEDMEM::ParaFIELD* parafield; + + string filename_xml1 = getResourceFile(filename1); + string filename_xml2 = getResourceFile(filename2); + //string filename_seq_wr = makeTmpFile(""); + //string filename_seq_med = makeTmpFile("myWrField_seq_pointe221.med"); + + // To remove tmp files from disk + ParaMEDMEMTest_TmpFilesRemover aRemover; + //aRemover.Register(filename_seq_wr); + //aRemover.Register(filename_seq_med); + MPI_Barrier(MPI_COMM_WORLD); + ICoCo::Field* icocofield; + if (source_group->containsMyRank()) + { + string master = filename_xml1; + + ostringstream strstream; + strstream <getNumberOfElements(MED_EN::MED_ALL_ELEMENTS); + double * value= new double[nb_local]; + for(int ielem=0; ielemgetField()->setValue(value); + + icocofield=new ICoCo::MEDField(paramesh,parafield); + + dec.attachLocalField(icocofield); + delete [] value; + } + + //loading the geometry for the target group + if (target_group->containsMyRank()) + { + string master= filename_xml2; + ostringstream strstream; + strstream << master<<(rank-nproc_source+1)<<".med"; + ostringstream meshname ; + meshname<< meshname2<<"_"<getNumberOfElements(MED_EN::MED_ALL_ELEMENTS); + double * value= new double[nb_local]; + for(int ielem=0; ielemgetField()->setValue(value); + icocofield=new ICoCo::MEDField(paramesh,parafield); + + dec.attachLocalField(icocofield); + delete [] value; + } + + + //attaching a DEC to the source group + double field_before_int; + double field_after_int; + + if (source_group->containsMyRank()) + { + field_before_int = parafield->getVolumeIntegral(1); + MPI_Bcast(&field_before_int, 1,MPI_DOUBLE, 0,MPI_COMM_WORLD); + dec.synchronize(); + cout<<"DEC usage"<write(MED_DRIVER,"./sourcesquarenc"); + //parafield->write(MED_DRIVER,"./sourcesquarenc","boundary"); + + + } + + //attaching a DEC to the target group + if (target_group->containsMyRank()) + { + MPI_Bcast(&field_before_int, 1,MPI_DOUBLE, 0,MPI_COMM_WORLD); + + dec.synchronize(); + dec.setOption("ForcedRenormalization",false); + dec.recvData(); + //paramesh->write(MED_DRIVER, "./targetsquarenc"); + //parafield->write(MED_DRIVER, "./targetsquarenc", "boundary"); + field_after_int = parafield->getVolumeIntegral(1); + + } + MPI_Bcast(&field_before_int,1,MPI_DOUBLE,0,MPI_COMM_WORLD); + MPI_Bcast(&field_after_int, 1,MPI_DOUBLE, size-1,MPI_COMM_WORLD); + + CPPUNIT_ASSERT_DOUBLES_EQUAL(field_before_int, field_after_int, epsilon); + + delete source_group; + delete target_group; + delete self_group; + delete icocofield; + delete paramesh; + delete parafield; + delete support; + delete parasupport; + delete mesh; + MPI_Barrier(MPI_COMM_WORLD); + +} +#endif diff --git a/src/ParaMEDMEMTest/ParaMEDMEMTest_OverlapDEC.cxx b/src/ParaMEDMEMTest/ParaMEDMEMTest_OverlapDEC.cxx new file mode 100644 index 000000000..c7a610461 --- /dev/null +++ b/src/ParaMEDMEMTest/ParaMEDMEMTest_OverlapDEC.cxx @@ -0,0 +1,212 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "ParaMEDMEMTest.hxx" +#include + +#include "CommInterface.hxx" +#include "ProcessorGroup.hxx" +#include "MPIProcessorGroup.hxx" +#include "Topology.hxx" +#include "OverlapDEC.hxx" +#include "ParaMESH.hxx" +#include "ParaFIELD.hxx" +#include "ComponentTopology.hxx" + +#include "MEDCouplingUMesh.hxx" + +#include + +void ParaMEDMEMTest::testOverlapDEC1() +{ + std::string srcM("P0"); + std::string targetM("P0"); + int size; + int rank; + MPI_Comm_size(MPI_COMM_WORLD,&size); + MPI_Comm_rank(MPI_COMM_WORLD,&rank); + + if (size != 3) return ; + + int nproc = 3; + std::set procs; + + for (int i=0; isetMeshDimension(2); + ParaMEDMEM::DataArrayDouble *myCoords=ParaMEDMEM::DataArrayDouble::New(); + myCoords->alloc(5,2); + std::copy(coordsS,coordsS+10,myCoords->getPointer()); + meshS->setCoords(myCoords); + myCoords->decrRef(); + int connS[7]={0,3,4,1, 1,4,2}; + meshS->allocateCells(2); + meshS->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,connS); + meshS->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,connS+4); + meshS->finishInsertingCells(); + ParaMEDMEM::ComponentTopology comptopo; + parameshS=new ParaMEDMEM::ParaMESH(meshS,*dec.getGrp(),"source mesh"); + parafieldS=new ParaMEDMEM::ParaFIELD(ParaMEDMEM::ON_CELLS,ParaMEDMEM::NO_TIME,parameshS,comptopo); + parafieldS->getField()->setNature(ParaMEDMEM::ConservativeVolumic);//IntegralGlobConstraint + double *valsS=parafieldS->getField()->getArray()->getPointer(); + valsS[0]=7.; valsS[1]=8.; + // + meshT=ParaMEDMEM::MEDCouplingUMesh::New(); + meshT->setMeshDimension(2); + myCoords=ParaMEDMEM::DataArrayDouble::New(); + myCoords->alloc(3,2); + std::copy(coordsT,coordsT+6,myCoords->getPointer()); + meshT->setCoords(myCoords); + myCoords->decrRef(); + int connT[3]={0,2,1}; + meshT->allocateCells(1); + meshT->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,connT); + meshT->finishInsertingCells(); + parameshT=new ParaMEDMEM::ParaMESH(meshT,*dec.getGrp(),"target mesh"); + parafieldT=new ParaMEDMEM::ParaFIELD(ParaMEDMEM::ON_CELLS,ParaMEDMEM::NO_TIME,parameshT,comptopo); + parafieldT->getField()->setNature(ParaMEDMEM::ConservativeVolumic);//IntegralGlobConstraint + double *valsT=parafieldT->getField()->getArray()->getPointer(); + valsT[0]=7.; + } + // + if(rank==1) + { + const double coordsS[10]={1.,0.,0.5,0.5,1.,0.5,0.5,1.,1.,1.}; + const double coordsT[6]={0.,0.,0.5,0.5,0.,1.}; + meshS=ParaMEDMEM::MEDCouplingUMesh::New(); + meshS->setMeshDimension(2); + ParaMEDMEM::DataArrayDouble *myCoords=ParaMEDMEM::DataArrayDouble::New(); + myCoords->alloc(5,2); + std::copy(coordsS,coordsS+10,myCoords->getPointer()); + meshS->setCoords(myCoords); + myCoords->decrRef(); + int connS[7]={0,1,2, 1,3,4,2}; + meshS->allocateCells(2); + meshS->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,connS); + meshS->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,connS+3); + meshS->finishInsertingCells(); + ParaMEDMEM::ComponentTopology comptopo; + parameshS=new ParaMEDMEM::ParaMESH(meshS,*dec.getGrp(),"source mesh"); + parafieldS=new ParaMEDMEM::ParaFIELD(ParaMEDMEM::ON_CELLS,ParaMEDMEM::NO_TIME,parameshS,comptopo); + parafieldS->getField()->setNature(ParaMEDMEM::ConservativeVolumic);//IntegralGlobConstraint + double *valsS=parafieldS->getField()->getArray()->getPointer(); + valsS[0]=9.; valsS[1]=11.; + // + meshT=ParaMEDMEM::MEDCouplingUMesh::New(); + meshT->setMeshDimension(2); + myCoords=ParaMEDMEM::DataArrayDouble::New(); + myCoords->alloc(3,2); + std::copy(coordsT,coordsT+6,myCoords->getPointer()); + meshT->setCoords(myCoords); + myCoords->decrRef(); + int connT[3]={0,2,1}; + meshT->allocateCells(1); + meshT->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,connT); + meshT->finishInsertingCells(); + parameshT=new ParaMEDMEM::ParaMESH(meshT,*dec.getGrp(),"target mesh"); + parafieldT=new ParaMEDMEM::ParaFIELD(ParaMEDMEM::ON_CELLS,ParaMEDMEM::NO_TIME,parameshT,comptopo); + parafieldT->getField()->setNature(ParaMEDMEM::ConservativeVolumic);//IntegralGlobConstraint + double *valsT=parafieldT->getField()->getArray()->getPointer(); + valsT[0]=8.; + } + // + if(rank==2) + { + const double coordsS[8]={0.,0.5, 0.5,0.5, 0.,1., 0.5,1.}; + const double coordsT[6]={0.5,0.5,0.,1.,1.,1.}; + meshS=ParaMEDMEM::MEDCouplingUMesh::New(); + meshS->setMeshDimension(2); + ParaMEDMEM::DataArrayDouble *myCoords=ParaMEDMEM::DataArrayDouble::New(); + myCoords->alloc(4,2); + std::copy(coordsS,coordsS+8,myCoords->getPointer()); + meshS->setCoords(myCoords); + myCoords->decrRef(); + int connS[4]={0,2,3,1}; + meshS->allocateCells(1); + meshS->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,connS); + meshS->finishInsertingCells(); + ParaMEDMEM::ComponentTopology comptopo; + parameshS=new ParaMEDMEM::ParaMESH(meshS,*dec.getGrp(),"source mesh"); + parafieldS=new ParaMEDMEM::ParaFIELD(ParaMEDMEM::ON_CELLS,ParaMEDMEM::NO_TIME,parameshS,comptopo); + parafieldS->getField()->setNature(ParaMEDMEM::ConservativeVolumic);//IntegralGlobConstraint + double *valsS=parafieldS->getField()->getArray()->getPointer(); + valsS[0]=10.; + // + meshT=ParaMEDMEM::MEDCouplingUMesh::New(); + meshT->setMeshDimension(2); + myCoords=ParaMEDMEM::DataArrayDouble::New(); + myCoords->alloc(3,2); + std::copy(coordsT,coordsT+6,myCoords->getPointer()); + meshT->setCoords(myCoords); + myCoords->decrRef(); + int connT[3]={0,1,2}; + meshT->allocateCells(1); + meshT->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,connT); + meshT->finishInsertingCells(); + parameshT=new ParaMEDMEM::ParaMESH(meshT,*dec.getGrp(),"target mesh"); + parafieldT=new ParaMEDMEM::ParaFIELD(ParaMEDMEM::ON_CELLS,ParaMEDMEM::NO_TIME,parameshT,comptopo); + parafieldT->getField()->setNature(ParaMEDMEM::ConservativeVolumic);//IntegralGlobConstraint + double *valsT=parafieldT->getField()->getArray()->getPointer(); + valsT[0]=9.; + } + dec.attachSourceLocalField(parafieldS); + dec.attachTargetLocalField(parafieldT); + dec.synchronize(); + dec.sendRecvData(true); + // + if(rank==0) + { + CPPUNIT_ASSERT_DOUBLES_EQUAL(8.75,parafieldT->getField()->getArray()->getIJ(0,0),1e-12); + } + if(rank==1) + { + CPPUNIT_ASSERT_DOUBLES_EQUAL(8.5,parafieldT->getField()->getArray()->getIJ(0,0),1e-12); + } + if(rank==2) + { + CPPUNIT_ASSERT_DOUBLES_EQUAL(10.5,parafieldT->getField()->getArray()->getIJ(0,0),1e-12); + } + delete parafieldS; + delete parafieldT; + delete parameshS; + delete parameshT; + meshS->decrRef(); + meshT->decrRef(); + + MPI_Barrier(MPI_COMM_WORLD); +} + diff --git a/src/ParaMEDMEMTest/ParaMEDMEMTest_StructuredCoincidentDEC.cxx b/src/ParaMEDMEMTest/ParaMEDMEMTest_StructuredCoincidentDEC.cxx new file mode 100644 index 000000000..491bbf9e9 --- /dev/null +++ b/src/ParaMEDMEMTest/ParaMEDMEMTest_StructuredCoincidentDEC.cxx @@ -0,0 +1,160 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "ParaMEDMEMTest.hxx" +#include + +#include "CommInterface.hxx" +#include "ProcessorGroup.hxx" +#include "MPIProcessorGroup.hxx" +#include "Topology.hxx" +#include "DEC.hxx" +#include "StructuredCoincidentDEC.hxx" +#include "ParaMESH.hxx" +#include "ParaFIELD.hxx" +#include "ComponentTopology.hxx" +#include "ICoCoMEDField.hxx" +#include "MEDLoader.hxx" + +#include + +// use this define to enable lines, execution of which leads to Segmentation Fault +#define ENABLE_FAULTS + +// use this define to enable CPPUNIT asserts and fails, showing bugs +#define ENABLE_FORCED_FAILURES + +using namespace std; +using namespace ParaMEDMEM; + +/* + * Check methods defined in StructuredCoincidentDEC.hxx + * + StructuredCoincidentDEC(); + StructuredCoincidentDEC(ProcessorGroup& local_group, ProcessorGroup& distant_group); + virtual ~StructuredCoincidentDEC(); + void synchronize(); + void recvData(); + void sendData(); +*/ + +void ParaMEDMEMTest::testStructuredCoincidentDEC() { + string testname="ParaMEDMEM - testStructured CoincidentDEC"; + // MPI_Init(&argc, &argv); + int size; + int rank; + MPI_Comm_size(MPI_COMM_WORLD, &size); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + if (size<4) { + return; + } + + ParaMEDMEM::CommInterface interface; + + ParaMEDMEM::MPIProcessorGroup self_group (interface,rank,rank); + ParaMEDMEM::MPIProcessorGroup target_group(interface,3,size-1); + ParaMEDMEM::MPIProcessorGroup source_group (interface,0,2); + + ParaMEDMEM::MEDCouplingUMesh* mesh; + ParaMEDMEM::ParaMESH* paramesh; + ParaMEDMEM::ParaFIELD* parafield; + + string filename_xml1 = getResourceFile("square1_split"); + string filename_2 = getResourceFile("square1.med"); + //string filename_seq_wr = makeTmpFile(""); + //string filename_seq_med = makeTmpFile("myWrField_seq_pointe221.med"); + + // To remove tmp files from disk + ParaMEDMEMTest_TmpFilesRemover aRemover; + + //loading the geometry for the source group + + ParaMEDMEM::StructuredCoincidentDEC dec(source_group, target_group); + + MPI_Barrier(MPI_COMM_WORLD); + if (source_group.containsMyRank()) { + string master = filename_xml1; + + ostringstream strstream; + strstream <getNumberOfCells(); + const int* global_numbering = paramesh->getGlobalNumberingCell(); + + double *value=parafield->getField()->getArray()->getPointer(); + for(int ielem=0; ielemgetCellMesh(),parafield->getField()); + + dec.attachLocalField(parafield); + dec.synchronize(); + dec.sendData(); + //delete icocofield; + } + + //loading the geometry for the target group + if (target_group.containsMyRank()) { + + string meshname2("Mesh_2"); + mesh = MEDLoader::ReadUMeshFromFile(filename_2.c_str(),meshname2.c_str(),0); + + paramesh=new ParaMESH (mesh,self_group,"target mesh"); + ParaMEDMEM::ComponentTopology comptopo(6, &target_group); + + parafield = new ParaFIELD(ON_CELLS,NO_TIME,paramesh, comptopo); + + int nb_local=mesh->getNumberOfCells(); + double *value=parafield->getField()->getArray()->getPointer(); + for (int ielem=0; ielemgetCellMesh(),parafield->getField()); + + dec.attachLocalField(parafield); + dec.synchronize(); + dec.recvData(); + + //checking validity of field + const double* recv_value = parafield->getField()->getArray()->getPointer(); + for (int i=0; i< nb_local; i++) { + int first = comptopo.firstLocalComponent(); + for (int icomp = 0; icomp < comptopo.nbLocalComponents(); icomp++) + CPPUNIT_ASSERT_DOUBLES_EQUAL(recv_value[i*comptopo.nbLocalComponents()+icomp],(double)(i*6+icomp+first),1e-12); + } + //delete icocofield; + } + delete parafield; + delete paramesh; + mesh->decrRef(); + + // MPI_Barrier(MPI_COMM_WORLD); + +} diff --git a/src/ParaMEDMEMTest/TestMPIAccess.cxx b/src/ParaMEDMEMTest/TestMPIAccess.cxx new file mode 100644 index 000000000..3b456a52e --- /dev/null +++ b/src/ParaMEDMEMTest/TestMPIAccess.cxx @@ -0,0 +1,30 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +// --- include all MPIAccess Test +// +#include "MPIAccessTest.hxx" + +// --- Registers the fixture into the 'registry' + +CPPUNIT_TEST_SUITE_REGISTRATION( MPIAccessTest ); + +// --- generic Main program from KERNEL_SRC/src/Basics/Test + +#include "MPIMainTest.hxx" diff --git a/src/ParaMEDMEMTest/TestMPIAccessDEC.cxx b/src/ParaMEDMEMTest/TestMPIAccessDEC.cxx new file mode 100644 index 000000000..15ed2081d --- /dev/null +++ b/src/ParaMEDMEMTest/TestMPIAccessDEC.cxx @@ -0,0 +1,30 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +// --- include all MPIAccessDEC Test +// +#include "MPIAccessDECTest.hxx" + +// --- Registers the fixture into the 'registry' + +CPPUNIT_TEST_SUITE_REGISTRATION( MPIAccessDECTest ); + +// --- generic Main program from KERNEL_SRC/src/Basics/Test + +#include "MPIMainTest.hxx" diff --git a/src/ParaMEDMEMTest/TestParaMEDMEM.cxx b/src/ParaMEDMEMTest/TestParaMEDMEM.cxx new file mode 100644 index 000000000..e1b804c9a --- /dev/null +++ b/src/ParaMEDMEMTest/TestParaMEDMEM.cxx @@ -0,0 +1,30 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +// --- include all MEDMEM Test +// +#include "ParaMEDMEMTest.hxx" + +// --- Registers the fixture into the 'registry' + +CPPUNIT_TEST_SUITE_REGISTRATION( ParaMEDMEMTest ); + +// --- generic Main program from KERNEL_SRC/src/Basics/Test + +#include "MPIMainTest.hxx" diff --git a/src/ParaMEDMEMTest/test_AllToAllDEC.cxx b/src/ParaMEDMEMTest/test_AllToAllDEC.cxx new file mode 100644 index 000000000..f5e702845 --- /dev/null +++ b/src/ParaMEDMEMTest/test_AllToAllDEC.cxx @@ -0,0 +1,170 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include +#include +#include +#include + +#include "MPIAccessDECTest.hxx" +#include +#include "MPIAccessDEC.hxx" + +// use this define to enable lines, execution of which leads to Segmentation Fault +#define ENABLE_FAULTS + +// use this define to enable CPPUNIT asserts and fails, showing bugs +#define ENABLE_FORCED_FAILURES + +using namespace std; +using namespace ParaMEDMEM; + +void MPIAccessDECTest::test_AllToAllDECSynchronousPointToPoint() { + test_AllToAllDEC( false ) ; +} +void MPIAccessDECTest::test_AllToAllDECAsynchronousPointToPoint() { + test_AllToAllDEC( true ) ; +} + +static void chksts( int sts , int myrank , ParaMEDMEM::MPIAccess mpi_access ) { + char msgerr[MPI_MAX_ERROR_STRING] ; + int lenerr ; + if ( sts != MPI_SUCCESS ) { + mpi_access.errorString(sts, msgerr, &lenerr) ; + cout << "test" << myrank << " lenerr " << lenerr << " " + << msgerr << endl ; + ostringstream strstream ; + strstream << "===========================================================" << endl + << "test_AllToAllDEC" << myrank << " KO" << endl + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + return ; +} + +void MPIAccessDECTest::test_AllToAllDEC( bool Asynchronous ) { + + cout << "test_AllToAllDEC" << endl ; + + // MPI_Init(&argc, &argv) ; + + int size ; + int myrank ; + MPI_Comm_size(MPI_COMM_WORLD,&size) ; + MPI_Comm_rank(MPI_COMM_WORLD,&myrank) ; + + if ( size < 2 || size > 11 ) { + ostringstream strstream ; + strstream << "usage :" << endl + << "mpirun -np test_AllToAllDEC" << endl + << " (nbprocs >=2)" << endl + << "test must be runned with more than 1 proc and less than 12 procs" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + + cout << "test_AllToAllDEC" << myrank << endl ; + + ParaMEDMEM::CommInterface interface ; + std::set sourceprocs; + std::set targetprocs; + int i ; + for ( i = 0 ; i < size/2 ; i++ ) { + sourceprocs.insert(i); + } + for ( i = size/2 ; i < size ; i++ ) { + targetprocs.insert(i); + } + + ParaMEDMEM::MPIProcessorGroup* sourcegroup = new ParaMEDMEM::MPIProcessorGroup(interface,sourceprocs) ; + ParaMEDMEM::MPIProcessorGroup* targetgroup = new ParaMEDMEM::MPIProcessorGroup(interface,targetprocs) ; + + MPIAccessDEC * MyMPIAccessDEC = new MPIAccessDEC( *sourcegroup , *targetgroup , + Asynchronous ) ; + + MPIAccess * mpi_access = MyMPIAccessDEC->getMPIAccess() ; + +#define maxreq 100 +#define datamsglength 10 + + // int sts ; + int sendcount = datamsglength ; + int recvcount = datamsglength ; + int * recvbuf = new int[datamsglength*size] ; + + int ireq ; + for ( ireq = 0 ; ireq < maxreq ; ireq++ ) { + int * sendbuf = new int[datamsglength*size] ; + int j ; + for ( j = 0 ; j < datamsglength*size ; j++ ) { + sendbuf[j] = myrank*1000000 + ireq*1000 + j ; + recvbuf[j] = -1 ; + } + + MyMPIAccessDEC->allToAll( sendbuf, sendcount , MPI_INT , + recvbuf, recvcount , MPI_INT ) ; + + int nRecvReq = mpi_access->recvRequestIdsSize() ; + int *ArrayOfRecvRequests = new int[nRecvReq] ; + int nReq = mpi_access->recvRequestIds( nRecvReq, ArrayOfRecvRequests ) ; + mpi_access->waitAll( nReq , ArrayOfRecvRequests ) ; + mpi_access->deleteRequests( nReq , ArrayOfRecvRequests ) ; + delete [] ArrayOfRecvRequests ; + } + + int nSendReq = mpi_access->sendRequestIdsSize() ; + cout << "test_AllToAllDEC" << myrank << " final SendRequestIds " << nSendReq << " SendRequests" + << endl ; + if ( nSendReq ) { + int *ArrayOfSendRequests = new int[nSendReq] ; + int nReq = mpi_access->sendRequestIds( nSendReq, ArrayOfSendRequests ) ; + mpi_access->waitAll( nReq , ArrayOfSendRequests ) ; + delete [] ArrayOfSendRequests ; + } + + int nRecvReq = mpi_access->recvRequestIdsSize() ; + if ( nRecvReq ) { + ostringstream strstream ; + strstream << "test_AllToAllDEC" << myrank << " final RecvRequestIds " << nRecvReq + << " RecvRequests # 0 Error" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "test_AllToAllDEC" << myrank << " final RecvRequestIds " << nRecvReq + << " RecvRequests = 0 OK" << endl ; + } + + mpi_access->barrier() ; + + delete sourcegroup ; + delete targetgroup ; + delete MyMPIAccessDEC ; + delete [] recvbuf ; + + // MPI_Finalize(); + + cout << "test_AllToAllDEC" << myrank << " OK" << endl ; + + return ; +} diff --git a/src/ParaMEDMEMTest/test_AllToAllTimeDEC.cxx b/src/ParaMEDMEMTest/test_AllToAllTimeDEC.cxx new file mode 100644 index 000000000..a46114e8c --- /dev/null +++ b/src/ParaMEDMEMTest/test_AllToAllTimeDEC.cxx @@ -0,0 +1,267 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include +#include +#include +#include + +#include "MPIAccessDECTest.hxx" +#include + +//#include "CommInterface.hxx" +//#include "ProcessorGroup.hxx" +//#include "MPIProcessorGroup.hxx" +#include "MPIAccessDEC.hxx" +#include "LinearTimeInterpolator.hxx" + +// use this define to enable lines, execution of which leads to Segmentation Fault +#define ENABLE_FAULTS + +// use this define to enable CPPUNIT asserts and fails, showing bugs +#define ENABLE_FORCED_FAILURES + +using namespace std; +using namespace ParaMEDMEM; + +void MPIAccessDECTest::test_AllToAllTimeDECSynchronousPointToPoint() { + test_AllToAllTimeDEC( false ) ; +} +void MPIAccessDECTest::test_AllToAllTimeDECAsynchronousPointToPoint() { + test_AllToAllTimeDEC( true ) ; +} + +static void chksts( int sts , int myrank , ParaMEDMEM::MPIAccess * mpi_access ) { + char msgerr[MPI_MAX_ERROR_STRING] ; + int lenerr ; + if ( sts != MPI_SUCCESS ) { + mpi_access->errorString(sts, msgerr, &lenerr) ; + cout << "test_AllToAllTimeDEC" << myrank << " lenerr " << lenerr << " " + << msgerr << endl ; + ostringstream strstream ; + strstream << "===========================================================" + << "test_AllToAllTimeDEC" << myrank << " KO" + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + return ; +} + +void MPIAccessDECTest::test_AllToAllTimeDEC( bool Asynchronous ) { + + cout << "test_AllToAllTimeDEC" << endl ; + + // MPI_Init(&argc, &argv) ; + + int size ; + int myrank ; + MPI_Comm_size(MPI_COMM_WORLD,&size) ; + MPI_Comm_rank(MPI_COMM_WORLD,&myrank) ; + + if ( size < 2 || size > 11 ) { + ostringstream strstream ; + strstream << "usage :" << endl + << "mpirun -np test_AllToAllTimeDEC" << endl + << " (nbprocs >=2)" << endl + << "test must be runned with more than 1 proc and less than 12 procs" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + + // int Asynchronous = atoi(argv[1]); + + cout << "test_AllToAllTimeDEC" << myrank << " Asynchronous " << Asynchronous << endl ; + + ParaMEDMEM::CommInterface interface ; + std::set sourceprocs; + std::set targetprocs; + int i ; + for ( i = 0 ; i < size/2 ; i++ ) { + sourceprocs.insert(i); + } + for ( i = size/2 ; i < size ; i++ ) { + targetprocs.insert(i); + } + + ParaMEDMEM::MPIProcessorGroup* sourcegroup = new ParaMEDMEM::MPIProcessorGroup(interface,sourceprocs) ; + ParaMEDMEM::MPIProcessorGroup* targetgroup = new ParaMEDMEM::MPIProcessorGroup(interface,targetprocs) ; + + // LinearTimeInterpolator * aLinearInterpDEC = new LinearTimeInterpolator( 0.5 ) ; + MPIAccessDEC * MyMPIAccessDEC = new MPIAccessDEC( *sourcegroup , *targetgroup , + Asynchronous ) ; + // Asynchronous , LinearInterp , 0.5 ) ; + MyMPIAccessDEC->setTimeInterpolator( LinearTimeInterp ) ; + MPIAccess * mpi_access = MyMPIAccessDEC->getMPIAccess() ; + + cout << "test_AllToAllTimeDEC" << myrank << " Barrier :" << endl ; + mpi_access->barrier() ; + cout << "test_AllToAllTimeDEC" << myrank << " Barrier done" << endl ; + +#define maxproc 11 +#define maxreq 10000 +#define datamsglength 10 + + int sts ; + int sendcount = datamsglength ; + int recvcount = datamsglength ; + + double time = 0 ; + // double deltatime[maxproc] = {1.,2.1,3.2,4.3,5.4,6.5,7.6,8.7,9.8,10.9,11.} ; + double deltatime[maxproc] = {1.,2.,3.,4.,5.,6.,7.,8.,9.,10.,11.} ; + double maxtime = maxreq ; + double nextdeltatime = deltatime[myrank] ; + // MyMPIAccessDEC->InitTime( time , deltatime[myrank] , maxtime ) ; + // for ( time = 0 ; time <= maxtime ; time+=deltatime[myrank] ) { + for ( time = 0 ; time <= maxtime && nextdeltatime != 0 ; time+=nextdeltatime ) { + if ( time != 0 ) { + nextdeltatime = deltatime[myrank] ; + if ( time+nextdeltatime > maxtime ) { + nextdeltatime = 0 ; + } + // MyMPIAccessDEC->NextTime( nextdeltatime ) ; + } + MyMPIAccessDEC->setTime( time , nextdeltatime ) ; + cout << "test_AllToAllTimeDEC" << myrank << "=====TIME " << time << "=====DELTATIME " + << nextdeltatime << "=====MAXTIME " << maxtime << " ======" << endl ; + int * sendbuf = new int[datamsglength*size] ; + // int * sendbuf = (int *) malloc(sizeof(int)*datamsglength*size) ; + int * recvbuf = new int[datamsglength*size] ; + int j ; + for ( j = 0 ; j < datamsglength*size ; j++ ) { + sendbuf[j] = myrank*1000000 + (j/datamsglength)*1000 + j ; + recvbuf[j] = -1 ; + } + + int sts = MyMPIAccessDEC->allToAllTime( sendbuf, sendcount , MPI_INT , + recvbuf, recvcount , MPI_INT ) ; + chksts( sts , myrank , mpi_access ) ; + + // cout << "test_AllToAllTimeDEC" << myrank << " recvbuf before CheckSent" ; + // for ( i = 0 ; i < datamsglength*size ; i++ ) { + // cout << " " << recvbuf[i] ; + // } + // cout << endl ; + + // cout << "test_AllToAllTimeDEC" << myrank << " sendbuf " << sendbuf << endl ; + // MyMPIAccessDEC->CheckSent() ; + + int nRecvReq = mpi_access->recvRequestIdsSize() ; + if ( nRecvReq != 0 ) { + ostringstream strstream ; + strstream << "=============================================================" << endl + << "test_AllToAllTimeDEC" << myrank << " WaitAllRecv " << nRecvReq << " Requests # 0 ERROR" + << endl << "=============================================================" + << endl ; + int *ArrayOfRecvRequests = new int[nRecvReq] ; + int nReq = mpi_access->recvRequestIds( nRecvReq, ArrayOfRecvRequests ) ; + mpi_access->waitAll( nReq , ArrayOfRecvRequests ) ; + delete [] ArrayOfRecvRequests ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + + // cout << "test_AllToAllTimeDEC" << myrank << " recvbuf" << endl ; + bool badrecvbuf = false ; + for ( i = 0 ; i < datamsglength*size ; i++ ) { + if ( recvbuf[i] != (i/datamsglength)*1000000 + myrank*1000 + + myrank*datamsglength+(i%datamsglength) ) { + badrecvbuf = true ; + cout << "test_AllToAllTimeDEC" << myrank << " recvbuf[" << i << "] " + << recvbuf[i] << " # " << (i/datamsglength)*1000000 + myrank*1000 + + myrank*datamsglength+(i%datamsglength) << endl ; + } + else if ( badrecvbuf ) { + cout << "test_AllToAllTimeDEC" << myrank << " recvbuf[" << i << "] " + << recvbuf[i] << " == " << (i/datamsglength)*1000000 + myrank*1000 + + myrank*datamsglength+(i%datamsglength) << endl ; + } + } + if ( badrecvbuf ) { + ostringstream strstream ; + strstream << "==============================================================" << endl + << "test_AllToAllTimeDEC" << myrank << " badrecvbuf" + << endl << "=============================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + delete [] recvbuf ; + } + + cout << "test_AllToAllTimeDEC" << myrank << " final CheckSent" << endl ; + sts = MyMPIAccessDEC->checkSent() ; + if ( sts != MPI_SUCCESS ) { + ostringstream strstream ; + strstream << "================================================================" << endl + << "test_AllToAllTimeDEC" << myrank << " final CheckSent ERROR" + << endl << "================================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + + int nSendReq = mpi_access->sendRequestIdsSize() ; + cout << "test_AllToAllTimeDEC" << myrank << " final SendRequestIds " << nSendReq << " SendRequests" + << endl ; + if ( nSendReq ) { + int *ArrayOfSendRequests = new int[nSendReq] ; + int nReq = mpi_access->sendRequestIds( nSendReq, ArrayOfSendRequests ) ; + mpi_access->waitAll( nReq , ArrayOfSendRequests ) ; + delete [] ArrayOfSendRequests ; + } + + int nRecvReq = mpi_access->recvRequestIdsSize() ; + if ( nRecvReq ) { + ostringstream strstream ; + strstream << "===============================================================" << endl + << "test_AllToAllTimeDEC" << myrank << " RecvRequestIds " << nRecvReq + << " RecvRequests # 0 Error" + << endl << "===============================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "test_AllToAllTimeDEC" << myrank << " RecvRequestIds " << nRecvReq + << " RecvRequests = 0 OK" << endl ; + } + + cout << "test_AllToAllTimeDEC" << myrank << " Barrier :" << endl ; + mpi_access->barrier() ; + cout << "test_AllToAllTimeDEC" << myrank << " Barrier done" << endl ; + + delete sourcegroup ; + delete targetgroup ; + // delete aLinearInterpDEC ; + delete MyMPIAccessDEC ; + + // MPI_Finalize(); + + cout << "test_AllToAllTimeDEC" << myrank << " OK" << endl ; + + return ; +} + + + + diff --git a/src/ParaMEDMEMTest/test_AllToAllvDEC.cxx b/src/ParaMEDMEMTest/test_AllToAllvDEC.cxx new file mode 100644 index 000000000..f0ec8e292 --- /dev/null +++ b/src/ParaMEDMEMTest/test_AllToAllvDEC.cxx @@ -0,0 +1,212 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include +#include +#include +#include + +#include "MPIAccessDECTest.hxx" +#include + +//#include "CommInterface.hxx" +//#include "ProcessorGroup.hxx" +//#include "MPIProcessorGroup.hxx" +#include "MPIAccessDEC.hxx" + +// use this define to enable lines, execution of which leads to Segmentation Fault +#define ENABLE_FAULTS + +// use this define to enable CPPUNIT asserts and fails, showing bugs +#define ENABLE_FORCED_FAILURES + +using namespace std; +using namespace ParaMEDMEM; + +void MPIAccessDECTest::test_AllToAllvDECSynchronousPointToPoint() { + test_AllToAllvDEC( false ) ; +} +void MPIAccessDECTest::test_AllToAllvDECAsynchronousPointToPoint() { + test_AllToAllvDEC( true ) ; +} + +static void chksts( int sts , int myrank , ParaMEDMEM::MPIAccess mpi_access ) { + char msgerr[MPI_MAX_ERROR_STRING] ; + int lenerr ; + if ( sts != MPI_SUCCESS ) { + mpi_access.errorString(sts, msgerr, &lenerr) ; + cout << "test_AllToAllvDEC" << myrank << " lenerr " << lenerr << " " + << msgerr << endl ; + ostringstream strstream ; + strstream << "===========================================================" + << "test_AllToAllvDEC" << myrank << " KO" + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + return ; +} + +void MPIAccessDECTest::test_AllToAllvDEC( bool Asynchronous ) { + + cout << "test_AllToAllvDEC" << endl ; + + // MPI_Init(&argc, &argv) ; + + int size ; + int myrank ; + MPI_Comm_size(MPI_COMM_WORLD,&size) ; + MPI_Comm_rank(MPI_COMM_WORLD,&myrank) ; + + if ( size < 2 || size > 11 ) { + ostringstream strstream ; + strstream << "usage :" << endl + << "mpirun -np test_AllToAllvDEC" << endl + << " (nbprocs >=2)" << endl + << "test must be runned with more than 1 proc and less than 12 procs" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + + // int Asynchronous = atoi(argv[1]); + + cout << "test_AllToAllvDEC" << myrank << endl ; + + ParaMEDMEM::CommInterface interface ; + std::set sourceprocs; + std::set targetprocs; + int i ; + for ( i = 0 ; i < size/2 ; i++ ) { + sourceprocs.insert(i); + } + for ( i = size/2 ; i < size ; i++ ) { + targetprocs.insert(i); + } + + ParaMEDMEM::MPIProcessorGroup* sourcegroup = new ParaMEDMEM::MPIProcessorGroup(interface,sourceprocs) ; + ParaMEDMEM::MPIProcessorGroup* targetgroup = new ParaMEDMEM::MPIProcessorGroup(interface,targetprocs) ; + + MPIAccessDEC * MyMPIAccessDEC = new MPIAccessDEC( *sourcegroup , *targetgroup , + Asynchronous ) ; + + MPIAccess * mpi_access = MyMPIAccessDEC->getMPIAccess() ; + +#define maxreq 100 +#define datamsglength 10 + + // int sts ; + int *sendcounts = new int[size] ; + int *sdispls = new int[size] ; + int *recvcounts = new int[size] ; + int *rdispls = new int[size] ; + for ( i = 0 ; i < size ; i++ ) { + sendcounts[i] = datamsglength-i; + sdispls[i] = i*datamsglength ; + recvcounts[i] = datamsglength-myrank; + rdispls[i] = i*datamsglength ; + } + int * recvbuf = new int[datamsglength*size] ; + + int ireq ; + for ( ireq = 0 ; ireq < maxreq ; ireq++ ) { + int * sendbuf = new int[datamsglength*size] ; + // int * sendbuf = (int *) malloc( sizeof(int)*datamsglength*size) ; + int j ; + for ( j = 0 ; j < datamsglength*size ; j++ ) { + sendbuf[j] = myrank*1000000 + ireq*1000 + j ; + recvbuf[j] = -1 ; + } + + MyMPIAccessDEC->allToAllv( sendbuf, sendcounts , sdispls , MPI_INT , + recvbuf, recvcounts , rdispls , MPI_INT ) ; + + // cout << "test_AllToAllvDEC" << myrank << " recvbuf before CheckSent" ; + // for ( i = 0 ; i < datamsglength*size ; i++ ) { + // cout << " " << recvbuf[i] ; + // } + // cout << endl ; + + // cout << "test_AllToAllvDEC" << myrank << " sendbuf " << sendbuf << endl ; + // MyMPIAccessDEC->CheckSent() ; + + int nRecvReq = mpi_access->recvRequestIdsSize() ; + // cout << "test_AllToAllvDEC" << myrank << " WaitAllRecv " << nRecvReq << " Requests" << endl ; + int *ArrayOfRecvRequests = new int[nRecvReq] ; + int nReq = mpi_access->recvRequestIds( nRecvReq, ArrayOfRecvRequests ) ; + mpi_access->waitAll( nReq , ArrayOfRecvRequests ) ; + mpi_access->deleteRequests( nReq , ArrayOfRecvRequests ) ; + delete [] ArrayOfRecvRequests ; + + // cout << "test_AllToAllvDEC" << myrank << " recvbuf" ; + // for ( i = 0 ; i < datamsglength*size ; i++ ) { + // cout << " " << recvbuf[i] ; + // } + // cout << endl ; + } + + // cout << "test_AllToAllvDEC" << myrank << " final CheckSent" << endl ; + // MyMPIAccessDEC->CheckSent() ; + + int nSendReq = mpi_access->sendRequestIdsSize() ; + cout << "test_AllToAllvDEC" << myrank << " final SendRequestIds " << nSendReq << " SendRequests" + << endl ; + if ( nSendReq ) { + int *ArrayOfSendRequests = new int[nSendReq] ; + int nReq = mpi_access->sendRequestIds( nSendReq, ArrayOfSendRequests ) ; + mpi_access->waitAll( nReq , ArrayOfSendRequests ) ; + delete [] ArrayOfSendRequests ; + } + + int nRecvReq = mpi_access->recvRequestIdsSize() ; + if ( nRecvReq ) { + ostringstream strstream ; + strstream << "test_AllToAllvDEC" << myrank << " final RecvRequestIds " << nRecvReq + << " RecvRequests # 0 Error" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "test_AllToAllvDEC" << myrank << " final RecvRequestIds " << nRecvReq + << " RecvRequests = 0 OK" << endl ; + } + + mpi_access->barrier() ; + + delete sourcegroup ; + delete targetgroup ; + delete MyMPIAccessDEC ; + delete [] sendcounts ; + delete [] sdispls ; + delete [] recvcounts ; + delete [] rdispls ; + delete [] recvbuf ; + + // MPI_Finalize(); + + cout << "test_AllToAllvDEC" << myrank << " OK" << endl ; + + return ; +} + + + + diff --git a/src/ParaMEDMEMTest/test_AllToAllvTimeDEC.cxx b/src/ParaMEDMEMTest/test_AllToAllvTimeDEC.cxx new file mode 100644 index 000000000..78d8d47c0 --- /dev/null +++ b/src/ParaMEDMEMTest/test_AllToAllvTimeDEC.cxx @@ -0,0 +1,363 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include +#include +#include +#include +#include + +#include "MPIAccessDECTest.hxx" +#include + +//#include "CommInterface.hxx" +//#include "ProcessorGroup.hxx" +//#include "MPIProcessorGroup.hxx" +#include "MPIAccessDEC.hxx" +#include "LinearTimeInterpolator.hxx" + +// use this define to enable lines, execution of which leads to Segmentation Fault +#define ENABLE_FAULTS + +// use this define to enable CPPUNIT asserts and fails, showing bugs +#define ENABLE_FORCED_FAILURES + +using namespace std; +using namespace ParaMEDMEM; + +void MPIAccessDECTest::test_AllToAllvTimeDECSynchronousNative() { + test_AllToAllvTimeDEC( false , true ) ; +} +void MPIAccessDECTest::test_AllToAllvTimeDECSynchronousPointToPoint() { + test_AllToAllvTimeDEC( false , false ) ; +} +void MPIAccessDECTest::test_AllToAllvTimeDECAsynchronousPointToPoint() { + test_AllToAllvTimeDEC( true , false ) ; +} + +static void chksts( int sts , int myrank , ParaMEDMEM::MPIAccess * mpi_access ) { + char msgerr[MPI_MAX_ERROR_STRING] ; + int lenerr ; + if ( sts != MPI_SUCCESS ) { + mpi_access->errorString(sts, msgerr, &lenerr) ; + cout << "test_AllToAllvTimeDEC" << myrank << " lenerr " << lenerr << " " + << msgerr << endl ; + ostringstream strstream ; + strstream << "===========================================================" + << "test_AllToAllvTimeDEC" << myrank << " KO" + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + return ; +} + +void MPIAccessDECTest::test_AllToAllvTimeDEC( bool Asynchronous , bool UseMPINative ) { + + cout << "test_AllToAllvTimeDEC" << endl ; + + // MPI_Init(&argc, &argv) ; + + int size ; + int myrank ; + MPI_Comm_size(MPI_COMM_WORLD,&size) ; + MPI_Comm_rank(MPI_COMM_WORLD,&myrank) ; + + if ( size < 2 || size > 11 ) { + ostringstream strstream ; + strstream << "usage :" << endl + << "mpirun -np test_AllToAllTimeDEC" << endl + << " (nbprocs >=2)" << endl + << "test must be runned with more than 1 proc and less than 12 procs" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + + // int Asynchronous = atoi(argv[1]) ; + int UseMPI_Alltoallv = UseMPINative ; + // if ( argc == 3 ) { + // UseMPI_Alltoallv = atoi(argv[2]) ; + // } + + cout << "test_AllToAllvTimeDEC" << myrank << " Asynchronous " << Asynchronous + << " UseMPI_Alltoallv " << UseMPI_Alltoallv << endl ; + + ParaMEDMEM::CommInterface interface ; + std::set sourceprocs; + std::set targetprocs; + int i ; + for ( i = 0 ; i < size/2 ; i++ ) { + sourceprocs.insert(i); + } + for ( i = size/2 ; i < size ; i++ ) { + targetprocs.insert(i); + } + + ParaMEDMEM::MPIProcessorGroup* sourcegroup = new ParaMEDMEM::MPIProcessorGroup(interface,sourceprocs) ; + ParaMEDMEM::MPIProcessorGroup* targetgroup = new ParaMEDMEM::MPIProcessorGroup(interface,targetprocs) ; + + // TimeInterpolator * aLinearInterpDEC = new LinearTimeInterpolator( 0.5 ) ; + MPIAccessDEC * MyMPIAccessDEC = new MPIAccessDEC( *sourcegroup , *targetgroup , + Asynchronous ) ; + // Asynchronous , LinearInterp , 0.5 ) ; + MyMPIAccessDEC->setTimeInterpolator( LinearTimeInterp , 0.5 ) ; + MPIAccess * mpi_access = MyMPIAccessDEC->getMPIAccess() ; + + cout << "test_AllToAllvTimeDEC" << myrank << " Barrier :" << endl ; + mpi_access->barrier() ; + cout << "test_AllToAllvTimeDEC" << myrank << " Barrier done" << endl ; + +#define maxproc 11 +#define maxreq 10000 +#define datamsglength 10 + + int sts ; + int *sendcounts = new int[size] ; + int *sdispls = new int[size] ; + int *recvcounts = new int[size] ; + int *rdispls = new int[size] ; + int *sendtimecounts = new int[size] ; + int *stimedispls = new int[size] ; + int *recvtimecounts = new int[size] ; + int *rtimedispls = new int[size] ; + for ( i = 0 ; i < size ; i++ ) { + sendcounts[i] = datamsglength-i ; + sdispls[i] = i*datamsglength ; + recvcounts[i] = datamsglength-myrank ; + rdispls[i] = i*datamsglength ; + sendtimecounts[i] = 1 ; + stimedispls[i] = 0 ; + recvtimecounts[i] = 1 ; + rtimedispls[i] = i ; + //rtimedispls[i] = i*mpi_access->TimeExtent() ; + } + + double timeLoc = 0 ; + double deltatime[maxproc] = {1.,2.1,3.2,4.3,5.4,6.5,7.6,8.7,9.8,10.9,11.} ; + double maxtime ; + double nextdeltatime = deltatime[myrank] ; + if ( UseMPI_Alltoallv ) { + maxtime = maxreq*nextdeltatime - 0.1 ; + } + else { + maxtime = maxreq ; + // MyMPIAccessDEC->InitTime( time , nextdeltatime , maxtime ) ; + } + time_t begintime = time(NULL) ; + // for ( time = 0 ; time <= maxtime ; time+=deltatime[myrank] ) { + for ( timeLoc = 0 ; timeLoc <= maxtime && nextdeltatime != 0 ; timeLoc+=nextdeltatime ) { + nextdeltatime = deltatime[myrank] ; + if ( timeLoc != 0 ) { + nextdeltatime = deltatime[myrank] ; + if ( timeLoc+nextdeltatime > maxtime ) { + nextdeltatime = 0 ; + } + // MyMPIAccessDEC->NextTime( nextdeltatime ) ; + } + MyMPIAccessDEC->setTime( timeLoc , nextdeltatime ) ; + cout << "test_AllToAllvTimeDEC" << myrank << "=====TIME " << time << "=====DELTATIME " + << nextdeltatime << "=====MAXTIME " << maxtime << " ======" << endl ; + int * sendbuf = new int[datamsglength*size] ; + // int * sendbuf = (int *) malloc(sizeof(int)*datamsglength*size) ; + int * recvbuf = new int[datamsglength*size] ; + int j ; + for ( j = 0 ; j < datamsglength*size ; j++ ) { + sendbuf[j] = myrank*1000000 + (j/datamsglength)*1000 + j ; + recvbuf[j] = -1 ; + } + + if ( UseMPI_Alltoallv ) { + const MPI_Comm* comm = MyMPIAccessDEC->getComm(); + TimeMessage * aSendTimeMessage = new TimeMessage ; + aSendTimeMessage->time = timeLoc ; + // aSendTimeMessage->deltatime = deltatime[myrank] ; + aSendTimeMessage->deltatime = nextdeltatime ; + // aSendTimeMessage->maxtime = maxtime ; + aSendTimeMessage->tag = (int ) (timeLoc/deltatime[myrank]) ; + TimeMessage * aRecvTimeMessage = new TimeMessage[size] ; + interface.allToAllV(aSendTimeMessage, sendtimecounts , stimedispls , + mpi_access->timeType() , + aRecvTimeMessage, recvtimecounts , rtimedispls , + mpi_access->timeType() , *comm ) ; + // for ( j = 0 ; j < size ; j++ ) { + // cout << "test_AllToAllvTimeDEC" << myrank << " TimeMessage received " << j << " " + // << aRecvTimeMessage[j] << endl ; + // } + delete aSendTimeMessage ; + delete [] aRecvTimeMessage ; + interface.allToAllV(sendbuf, sendcounts , sdispls , MPI_INT , + recvbuf, recvcounts , rdispls , MPI_INT , *comm ) ; + // free(sendbuf) ; + delete [] sendbuf ; + } + else { + int sts = MyMPIAccessDEC->allToAllvTime( sendbuf, sendcounts , sdispls , MPI_INT , + recvbuf, recvcounts , rdispls , MPI_INT ) ; + chksts( sts , myrank , mpi_access ) ; + } + + // cout << "test_AllToAllvTimeDEC" << myrank << " recvbuf before CheckSent" ; + // for ( i = 0 ; i < datamsglength*size ; i++ ) { + // cout << " " << recvbuf[i] ; + // } + // cout << endl ; + + // cout << "test_AllToAllvTimeDEC" << myrank << " sendbuf " << sendbuf << endl ; + // MyMPIAccessDEC->CheckSent() ; + + int nRecvReq = mpi_access->recvRequestIdsSize() ; + if ( nRecvReq != 0 ) { + ostringstream strstream ; + strstream << "=============================================================" << endl + << "test_AllToAllvTimeDEC" << myrank << " WaitAllRecv " << nRecvReq << " Requests # 0 ERROR" + << endl << "=============================================================" + << endl ; + int *ArrayOfRecvRequests = new int[nRecvReq] ; + int nReq = mpi_access->recvRequestIds( nRecvReq, ArrayOfRecvRequests ) ; + mpi_access->waitAll( nReq , ArrayOfRecvRequests ) ; + delete [] ArrayOfRecvRequests ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + + // cout << "test_AllToAllvTimeDEC" << myrank << " check of recvbuf" << endl ; + bool badrecvbuf = false ; + for ( i = 0 ; i < size ; i++ ) { + int j ; + for ( j = 0 ; j < datamsglength ; j++ ) { + int index = i*datamsglength+j ; + if ( j < recvcounts[i] ) { + if ( recvbuf[index] != (index/datamsglength)*1000000 + myrank*1000 + + myrank*datamsglength+(index%datamsglength) ) { + badrecvbuf = true ; + cout << "test_AllToAllvTimeDEC" << myrank << " recvbuf[" << index << "] " + << recvbuf[index] << " # " << (index/datamsglength)*1000000 + + myrank*1000 + + myrank*datamsglength+(index%datamsglength) << endl ; + } + else if ( badrecvbuf ) { + cout << "test_AllToAllvTimeDEC" << myrank << " recvbuf[" << index << "] " + << recvbuf[index] << " == " << (index/datamsglength)*1000000 + + myrank*1000 + + myrank*datamsglength+(index%datamsglength) << endl ; + } + } + else if ( recvbuf[index] != -1 ) { + badrecvbuf = true ; + cout << "test_AllToAllvTimeDEC" << myrank << " recvbuf[" << index << "] " + << recvbuf[index] << " # -1" << endl ; + } + } + } + if ( badrecvbuf ) { + ostringstream strstream ; + strstream << "==============================================================" << endl + << "test_AllToAllvTimeDEC" << myrank << " badrecvbuf" + << endl << "=============================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + delete [] recvbuf ; + } + + cout << "test_AllToAllvTimeDEC" << myrank << " Barrier :" << endl ; + mpi_access->barrier() ; + cout << "test_AllToAllvTimeDEC" << myrank << " Barrier done" << endl ; + + cout << "test_AllToAllvTimeDEC" << myrank << " CheckFinalSent" << endl ; + sts = MyMPIAccessDEC->checkFinalSent() ; + if ( sts != MPI_SUCCESS ) { + ostringstream strstream ; + strstream << "================================================================" << endl + << "test_AllToAllvTimeDEC" << myrank << " final CheckSent ERROR" + << endl << "================================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + + cout << "test_AllToAllvTimeDEC" << myrank << " CheckFinalRecv" << endl ; + sts = MyMPIAccessDEC->checkFinalRecv() ; + if ( sts != MPI_SUCCESS ) { + ostringstream strstream ; + strstream << "================================================================" << endl + << "test_AllToAllvTimeDEC" << myrank << " CheckFinalRecv ERROR" + << endl << "================================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + + int nRecvReq = mpi_access->recvRequestIdsSize() ; + if ( nRecvReq ) { + ostringstream strstream ; + strstream << "===============================================================" << endl + << "test_AllToAllvTimeDEC" << myrank << " RecvRequestIds " << nRecvReq + << " RecvRequests # 0 Error" + << endl << "===============================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "test_AllToAllvTimeDEC" << myrank << " RecvRequestIds " << nRecvReq + << " RecvRequests = 0 OK" << endl ; + } + + time_t endtime = time(NULL) ; + cout << "test_AllToAllvTimeDEC" << myrank << " begintime " << begintime << " endtime " << endtime + << " elapse " << endtime-begintime << " " << maxtime/deltatime[myrank] + << " calls to AllToAll" << endl ; + + cout << "test_AllToAllvTimeDEC" << myrank << " Barrier :" << endl ; + mpi_access->barrier() ; + cout << "test_AllToAllvTimeDEC" << myrank << " Barrier done" << endl ; + + delete sourcegroup ; + delete targetgroup ; + delete MyMPIAccessDEC ; + // delete aLinearInterpDEC ; + + delete [] sendcounts ; + delete [] sdispls ; + delete [] recvcounts ; + delete [] rdispls ; + delete [] sendtimecounts ; + delete [] stimedispls ; + delete [] recvtimecounts ; + delete [] rtimedispls ; + + // MPI_Finalize(); + + endtime = time(NULL) ; + + cout << "test_AllToAllvTimeDEC" << myrank << " OK begintime " << begintime << " endtime " << endtime + << " elapse " << endtime-begintime << " " << maxtime/deltatime[myrank] + << " calls to AllToAll" << endl ; + + return ; +} + + + + diff --git a/src/ParaMEDMEMTest/test_AllToAllvTimeDoubleDEC.cxx b/src/ParaMEDMEMTest/test_AllToAllvTimeDoubleDEC.cxx new file mode 100644 index 000000000..f69c44285 --- /dev/null +++ b/src/ParaMEDMEMTest/test_AllToAllvTimeDoubleDEC.cxx @@ -0,0 +1,337 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include +#include +#include +#include +#include +#include + +#include "MPIAccessDECTest.hxx" +#include + +//#include "CommInterface.hxx" +//#include "ProcessorGroup.hxx" +//#include "MPIProcessorGroup.hxx" +#include "MPIAccessDEC.hxx" +#include "LinearTimeInterpolator.hxx" + +// use this define to enable lines, execution of which leads to Segmentation Fault +#define ENABLE_FAULTS + +// use this define to enable CPPUNIT asserts and fails, showing bugs +#define ENABLE_FORCED_FAILURES + +using namespace std; +using namespace ParaMEDMEM; + +void MPIAccessDECTest::test_AllToAllvTimeDoubleDECSynchronousPointToPoint() { + test_AllToAllvTimeDoubleDEC( false ) ; +} +void MPIAccessDECTest::test_AllToAllvTimeDoubleDECAsynchronousPointToPoint() { + test_AllToAllvTimeDoubleDEC( true ) ; +} + +static void chksts( int sts , int myrank , ParaMEDMEM::MPIAccess * mpi_access ) { + char msgerr[MPI_MAX_ERROR_STRING] ; + int lenerr ; + if ( sts != MPI_SUCCESS ) { + mpi_access->errorString(sts, msgerr, &lenerr) ; + cout << "test" << myrank << " lenerr " << lenerr << " " + << msgerr << endl ; + ostringstream strstream ; + strstream << "===========================================================" + << "test" << myrank << " KO" + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + return ; +} + +void MPIAccessDECTest::test_AllToAllvTimeDoubleDEC( bool Asynchronous ) { + + cout << "test_AllToAllvTimeDoubleDEC" << endl ; + +// MPI_Init(&argc, &argv) ; + + int size ; + int myrank ; + MPI_Comm_size(MPI_COMM_WORLD,&size) ; + MPI_Comm_rank(MPI_COMM_WORLD,&myrank) ; + + if ( size < 2 || size > 11 ) { + ostringstream strstream ; + strstream << "usage :" << endl + << "mpirun -np test_AllToAllTimeDEC" << endl + << " (nbprocs >=2)" << endl + << "test must be runned with more than 1 proc and less than 12 procs" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + +// int Asynchronous = atoi(argv[1]) ; + + cout << "test_AllToAllvTimeDoubleDEC" << myrank << " Asynchronous " << Asynchronous << endl ; + + ParaMEDMEM::CommInterface interface ; + std::set sourceprocs; + std::set targetprocs; + int i ; + for ( i = 0 ; i < size/2 ; i++ ) { + sourceprocs.insert(i); + } + for ( i = size/2 ; i < size ; i++ ) { + targetprocs.insert(i); + } + + ParaMEDMEM::MPIProcessorGroup* sourcegroup = new ParaMEDMEM::MPIProcessorGroup(interface,sourceprocs) ; + ParaMEDMEM::MPIProcessorGroup* targetgroup = new ParaMEDMEM::MPIProcessorGroup(interface,targetprocs) ; + +// TimeInterpolator * aLinearInterpDEC = new LinearTimeInterpolator( 0 ) ; + MPIAccessDEC * MyMPIAccessDEC = new MPIAccessDEC( *sourcegroup , *targetgroup , + Asynchronous ) ; +// Asynchronous , LinearInterp , 0.5 ) ; + MyMPIAccessDEC->setTimeInterpolator( LinearTimeInterp ) ; + MPIAccess * mpi_access = MyMPIAccessDEC->getMPIAccess() ; + + cout << "test_AllToAllvTimeDoubleDEC" << myrank << " Barrier :" << endl ; + mpi_access->barrier() ; + +#define maxproc 11 +#define maxreq 100 +#define datamsglength 10 + + int sts ; + int *sendcounts = new int[size] ; + int *sdispls = new int[size] ; + int *recvcounts = new int[size] ; + int *rdispls = new int[size] ; + int *sendtimecounts = new int[size] ; + int *stimedispls = new int[size] ; + int *recvtimecounts = new int[size] ; + int *rtimedispls = new int[size] ; + for ( i = 0 ; i < size ; i++ ) { + sendcounts[i] = datamsglength-i ; + sdispls[i] = i*datamsglength ; + recvcounts[i] = datamsglength-myrank ; + rdispls[i] = i*datamsglength ; + sendtimecounts[i] = 1 ; + stimedispls[i] = 0 ; + recvtimecounts[i] = 1 ; + rtimedispls[i] = i ; + } + + double timeLoc[maxproc] ; + double deltatime[maxproc] = {1.,2.1,3.2,4.3,5.4,6.5,7.6,8.7,9.8,10.9,11.} ; + double maxtime[maxproc] ; + double nextdeltatime[maxproc] ; + for ( i = 0 ; i < size ; i++ ) { + timeLoc[i] = 0 ; + maxtime[i] = maxreq ; + nextdeltatime[i] = deltatime[i] ; + } + time_t begintime = time(NULL) ; + for ( timeLoc[myrank] = 0 ; timeLoc[myrank] <= maxtime[myrank] && nextdeltatime[myrank] != 0 ; + timeLoc[myrank]+=nextdeltatime[myrank] ) { +//local and target times + int target ; + for ( target = 0 ; target < size ; target++ ) { + nextdeltatime[target] = deltatime[target] ; + if ( timeLoc[target] != 0 ) { + if ( timeLoc[target]+nextdeltatime[target] > maxtime[target] ) { + nextdeltatime[target] = 0 ; + } + } + if ( target != myrank ) { + while ( timeLoc[myrank] >= timeLoc[target] ) { + timeLoc[target] += deltatime[target] ; + } + } + } + MyMPIAccessDEC->setTime( timeLoc[myrank] , nextdeltatime[myrank] ) ; + cout << "test" << myrank << "=====TIME " << timeLoc[myrank] << "=====DELTATIME " + << nextdeltatime[myrank] << "=====MAXTIME " << maxtime[myrank] << " ======" + << endl ; + double * sendbuf = new double[datamsglength*size] ; +// double * sendbuf = (double *) malloc(sizeof(double)*datamsglength*size) ; + double * recvbuf = new double[datamsglength*size] ; + int j ; + //cout << "test_AllToAllvTimeDoubleDEC" << myrank << " sendbuf" ; + for ( target = 0 ; target < size ; target++ ) { + for ( j = 0 ; j < datamsglength ; j++ ) { + //sendbuf[j] = myrank*10000 + (j/datamsglength)*100 + j ; + sendbuf[target*datamsglength+j] = myrank*1000000 + target*10000 + + (timeLoc[myrank]/deltatime[myrank])*100 + j ; + //cout << " " << (int ) sendbuf[target*datamsglength+j] ; + recvbuf[target*datamsglength+j] = -1 ; + } + //cout << endl ; + } + + int sts = MyMPIAccessDEC->allToAllvTime( sendbuf, sendcounts , sdispls , MPI_DOUBLE , + recvbuf, recvcounts , rdispls , MPI_DOUBLE ) ; + chksts( sts , myrank , mpi_access ) ; + +// cout << "test_AllToAllvTimeDoubleDEC" << myrank << " recvbuf before CheckSent" ; +// for ( i = 0 ; i < datamsglength*size ; i++ ) { +// cout << " " << recvbuf[i] ; +// } +// cout << endl ; + + int nRecvReq = mpi_access->recvRequestIdsSize() ; + if ( nRecvReq != 0 ) { + ostringstream strstream ; + strstream << "=============================================================" << endl + << "test_AllToAllvTimeDoubleDEC" << myrank << " WaitAllRecv " + << nRecvReq << " Requests # 0 ERROR" + << endl << "============================================================" + << endl ; + int *ArrayOfRecvRequests = new int[nRecvReq] ; + int nReq = mpi_access->recvRequestIds( nRecvReq, ArrayOfRecvRequests ) ; + mpi_access->waitAll( nReq , ArrayOfRecvRequests ) ; + delete [] ArrayOfRecvRequests ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + +// cout << "test_AllToAllvTimeDoubleDEC" << myrank << " check of recvbuf" << endl ; + bool badrecvbuf = false ; + for ( target = 0 ; target < size ; target++ ) { + int j ; + for ( j = 0 ; j < datamsglength ; j++ ) { + int index = target*datamsglength+j ; + if ( j < recvcounts[target] ) { + if ( fabs(recvbuf[index] - (target*1000000 + myrank*10000 + + (timeLoc[target]/deltatime[target])*100 + j)) > 101) { + badrecvbuf = true ; + cout << "test_AllToAllvTimeDoubleDEC" << myrank << " target " << target << " timeLoc[target] " + << timeLoc[target] << " recvbuf[" << index << "] " << (int ) recvbuf[index] + << " # " << (int ) (target*1000000 + + myrank*10000 + (timeLoc[target]/deltatime[target])*100 + j) + << endl ; + } + else if ( badrecvbuf ) { + cout << "test_AllToAllvTimeDoubleDEC" << myrank << " recvbuf[" << index << "] " + << recvbuf[index] << " ~= " << (int ) (target*1000000 + + myrank*10000 + (timeLoc[target]/deltatime[target])*100 + j) << endl ; + } + } + else if ( recvbuf[index] != -1 ) { + badrecvbuf = true ; + cout << "test_AllToAllvTimeDoubleDEC" << myrank << " recvbuf[" << index << "] " + << recvbuf[index] << " # -1" << endl ; + } + } + } + if ( badrecvbuf ) { + ostringstream strstream ; + strstream << "==================================================================" << endl + << "test_AllToAllvTimeDoubleDEC" << myrank << " badrecvbuf" + << endl << "==================================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + delete [] recvbuf ; + } + + cout << "test_AllToAllvTimeDoubleDEC" << myrank << " Barrier :" << endl ; + mpi_access->barrier() ; + + cout << "test_AllToAllvTimeDoubleDEC" << myrank << " CheckFinalSent" << endl ; + sts = MyMPIAccessDEC->checkFinalSent() ; + if ( sts != MPI_SUCCESS ) { + ostringstream strstream ; + strstream << "=================================================================" << endl + << "test_AllToAllvTimeDoubleDEC" << myrank << " CheckFinalSent ERROR" + << endl << "=================================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + + cout << "test_AllToAllvTimeDoubleDEC" << myrank << " CheckFinalRecv" << endl ; + sts = MyMPIAccessDEC->checkFinalRecv() ; + if ( sts != MPI_SUCCESS ) { + ostringstream strstream ; + strstream << "=================================================================" << endl + << "test_AllToAllvTimeDoubleDEC" << myrank << " CheckFinalRecv ERROR" + << endl << "================================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + + int nRecvReq = mpi_access->recvRequestIdsSize() ; + if ( nRecvReq ) { + ostringstream strstream ; + strstream << "===============================================================" << endl + << "test_AllToAllvTimeDoubleDEC" << myrank << " RecvRequestIds " << nRecvReq + << " RecvRequests # 0 Error" + << endl << "===============================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "test_AllToAllvTimeDoubleDEC" << myrank << " RecvRequestIds " << nRecvReq + << " RecvRequests = 0 OK" << endl ; + } + + time_t endtime = time(NULL) ; + cout << "test_AllToAllvTimeDoubleDEC" << myrank << " begintime " << begintime << " endtime " << endtime + << " elapse " << endtime-begintime << " " << maxtime[myrank]/deltatime[myrank] + << " calls to AllToAll" << endl ; + + cout << "test" << myrank << " Barrier :" << endl ; + mpi_access->barrier() ; + + delete sourcegroup ; + delete targetgroup ; + delete MyMPIAccessDEC ; +// delete aLinearInterpDEC ; + + delete [] sendcounts ; + delete [] sdispls ; + delete [] recvcounts ; + delete [] rdispls ; + delete [] sendtimecounts ; + delete [] stimedispls ; + delete [] recvtimecounts ; + delete [] rtimedispls ; + +// MPI_Finalize(); + + endtime = time(NULL) ; + + cout << "test_AllToAllvTimeDoubleDEC" << myrank << " OK begintime " << begintime << " endtime " << endtime + << " elapse " << endtime-begintime << " " << maxtime[myrank]/deltatime[myrank] + << " calls to AllToAll" << endl ; + + return ; +} + + + + diff --git a/src/ParaMEDMEMTest/test_MPI_Access_Cancel.cxx b/src/ParaMEDMEMTest/test_MPI_Access_Cancel.cxx new file mode 100644 index 000000000..133a2c658 --- /dev/null +++ b/src/ParaMEDMEMTest/test_MPI_Access_Cancel.cxx @@ -0,0 +1,325 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include +#include +#include +#include +#include + +#ifndef WIN32 +#include +#endif + +#include "MPIAccessTest.hxx" +#include + +//#include "CommInterface.hxx" +//#include "ProcessorGroup.hxx" +//#include "MPIProcessorGroup.hxx" +#include "MPIAccess.hxx" + +// use this define to enable lines, execution of which leads to Segmentation Fault +#define ENABLE_FAULTS + +// use this define to enable CPPUNIT asserts and fails, showing bugs +#define ENABLE_FORCED_FAILURES + +using namespace std; +using namespace ParaMEDMEM; + +void MPIAccessTest::test_MPI_Access_Cancel() { + + cout << "test_MPI_Access_Cancel" << endl ; + +// MPI_Init(&argc, &argv) ; + + int size ; + int myrank ; + MPI_Comm_size(MPI_COMM_WORLD,&size) ; + MPI_Comm_rank(MPI_COMM_WORLD,&myrank) ; + + if ( size < 2 ) { + ostringstream strstream ; + strstream << "test_MPI_Access_Cancel must be runned with 2 procs" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + + cout << "test_MPI_Access_Cancel" << myrank << endl ; + + ParaMEDMEM::CommInterface interface ; + + ParaMEDMEM::MPIProcessorGroup* group = new ParaMEDMEM::MPIProcessorGroup(interface) ; + + ParaMEDMEM::MPIAccess mpi_access( group ) ; + + if ( myrank >= 2 ) { + mpi_access.barrier() ; + delete group ; + return ; + } + + int target = 1 - myrank ; + int intsendbuf[5] ; + double doublesendbuf[10] ; + int RequestId[10] ; + int sts ; + int i , j ; + for ( j = 0 ; j < 3 ; j++ ) { + for ( i = 0 ; i < 10 ; i++ ) { + cout << "test" << myrank << " ============================ i " << i + << "============================" << endl ; + if ( myrank == 0 ) { + if ( i < 5 ) { + intsendbuf[i] = i ; + sts = mpi_access.ISend(&intsendbuf[i],1,MPI_INT,target, RequestId[i]) ; + cout << "test" << myrank << " Send MPI_INT RequestId " << RequestId[i] + << endl ; + } + else { + doublesendbuf[i] = i ; + sts = mpi_access.ISend(&doublesendbuf[i],1,MPI_DOUBLE,target, + RequestId[i]) ; + cout << "test" << myrank << " Send MPI_DOUBLE RequestId " << RequestId[i] + << endl ; + } + } + else { + int flag = false ; + while ( !flag ) { + int source, tag, outcount ; + MPI_Datatype datatype ; + sts = mpi_access.IProbe(target, source, tag, datatype, outcount, + flag ) ; + if ( flag ) { + cout << "test" << myrank << " " << i << " IProbe target " << target + << " source " << source << " tag " << tag + << " outcount " << outcount << " flag " << flag << endl ; + } + else { + cout << "test" << myrank << " flag " << flag << endl ; + sleep( 1 ) ; + } + if ( flag ) { + int recvbuf ; + sts = mpi_access.IRecv(&recvbuf,outcount,MPI_INT,source, + RequestId[i] ) ; + if ( datatype == MPI_INT ) { + int source, tag, error, outcount ; + mpi_access.wait( RequestId[i] ) ; + mpi_access.status( RequestId[i], source, tag, error, outcount, + true ) ; + if ( (outcount != 1) | (recvbuf != i) ) { + ostringstream strstream ; + strstream << "======================================================" + << endl << "test" << myrank << " outcount " << outcount + << " recvbuf " << recvbuf << " KO" << endl + << "======================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + cout << "========================================================" + << endl << "test" << myrank << " outcount " << outcount + << " recvbuf " << recvbuf << " OK" << endl + << "========================================================" + << endl ; + } + } + } + } + char msgerr[MPI_MAX_ERROR_STRING] ; + int lenerr ; + mpi_access.errorString(sts, msgerr, &lenerr) ; + cout << "test" << myrank << " lenerr " << lenerr << " " + << msgerr << endl ; + if ( sts != MPI_SUCCESS ) { + ostringstream strstream ; + strstream << "===========================================================" + << endl << "test" << myrank << " KO" + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + mpi_access.check() ; + } + + if ( myrank != 0 ) { + int iprobe ; + for ( iprobe = 5 ; iprobe < 10 ; iprobe++ ) { + cout << "test" << myrank << " ============================ iprobe " + << iprobe << "============================" << endl ; + int source, tag, outcount ; + MPI_Datatype datatype ; + int probeflag = false ; + while ( !probeflag ) { + sts = mpi_access.IProbe( target, source, tag, datatype, outcount, + probeflag ) ; + char msgerr[MPI_MAX_ERROR_STRING] ; + int lenerr ; + mpi_access.errorString(sts, msgerr, &lenerr) ; + cout << "test" << myrank << " IProbe iprobe " << iprobe + << " target " << target << " probeflag " << probeflag + << " tag " << tag << " outcount " << outcount << " datatype " + << datatype << " lenerr " << lenerr << " " << msgerr << endl ; + if ( sts != MPI_SUCCESS ) { + ostringstream strstream ; + strstream << "==========================================================" + << endl << "test" << myrank << " IProbe KO iprobe " << iprobe + << endl + << "==========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + if ( !probeflag ) { + //cout << "========================================================" + // << endl << "test" << myrank << " IProbe KO(OK) iprobe " << iprobe + // << " probeflag " << probeflag << endl + // << "========================================================" + // << endl ; + } + else { + cout << "test" << myrank << " " << iprobe << " IProbe target " + << target << " source " << source << " tag " << tag + << " outcount " << outcount << " probeflag " << probeflag + << endl ; + if ( datatype != MPI_DOUBLE ) { + ostringstream strstream ; + strstream << "========================================================" + << endl << "test" << myrank << " MPI_DOUBLE KO" << endl + << "========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + int flag ; + sts = mpi_access.cancel( source, tag, datatype, outcount, flag ) ; + if ( sts != MPI_SUCCESS || !flag ) { + mpi_access.errorString(sts, msgerr, &lenerr) ; + cout << "======================================================" + << endl << "test" << myrank << " lenerr " << lenerr << " " + << msgerr << endl << "test" << myrank + << " Cancel PendingIrecv KO flag " << flag << " iprobe " + << iprobe << " Irecv completed" << endl + << "======================================================" + << endl ; + //return 1 ; + } + else { + cout << "======================================================" + << endl << "test" << myrank + << " Cancel PendingIrecv OK RequestId " << " flag " + << flag << " iprobe " << iprobe << endl + << "======================================================" + << endl ; + } + } + int Reqtarget, Reqtag, Reqerror, Reqoutcount ; + mpi_access.status( RequestId[iprobe], Reqtarget, Reqtag, Reqerror, + Reqoutcount, true ) ; + cout << "test" << myrank << " Status Reqtarget "<< Reqtarget + << " Reqtag " << Reqtag << " Reqoutcount " << Reqoutcount + << endl ; + int Reqflag ; + sts = mpi_access.cancel( RequestId[iprobe] , Reqflag ) ; + cout << "test" << myrank << " " << iprobe + << " Cancel Irecv done Reqtarget " << Reqtarget + << " Reqtag " << Reqtag << " Reqoutcount " << Reqoutcount + << " Reqflag " << Reqflag << endl ; + if ( sts != MPI_SUCCESS || !Reqflag ) { + mpi_access.errorString(sts, msgerr, &lenerr) ; + ostringstream strstream ; + strstream << "========================================================" + << endl << "test" << myrank << " lenerr " << lenerr << " " + << msgerr << endl << "test" << myrank + << " Cancel Irecv KO Reqflag " << Reqflag << " iprobe " + << iprobe << endl + << "========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "========================================================" + << endl << "test" << myrank + << " Cancel Irecv OK RequestId " << RequestId[iprobe] + << " Reqflag " << Reqflag << " iprobe " << iprobe << endl + << "========================================================" + << endl ; + probeflag = Reqflag ; + } + } + } + } + } + mpi_access.waitAll(10,RequestId) ; + mpi_access.deleteRequests(10,RequestId) ; + } + + int source, tag, outcount, flag ; + MPI_Datatype datatype ; + sts = mpi_access.IProbe(target, source, tag, datatype, outcount, flag ) ; + char msgerr[MPI_MAX_ERROR_STRING] ; + int lenerr ; + mpi_access.errorString(sts, msgerr, &lenerr) ; + cout << "test" << myrank << " lenerr " << lenerr << " " + << msgerr << endl ; + if ( sts != MPI_SUCCESS || flag ) { + ostringstream strstream ; + strstream << "===========================================================" + << endl << "test" << myrank << " IProbe KO flag " << flag + << " remaining unread/cancelled message :" << endl + << " source " << source << " tag " << tag << endl + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + + mpi_access.testAll(10,RequestId,flag) ; + mpi_access.waitAll(10,RequestId) ; + mpi_access.deleteRequests(10,RequestId) ; + mpi_access.testAll(10,RequestId,flag) ; + if ( !flag ) { + ostringstream strstream ; + strstream << "test" << myrank << " flag " << flag << " KO" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + mpi_access.check() ; + + mpi_access.barrier() ; + + delete group ; + +// MPI_Finalize(); + + cout << "test" << myrank << " OK" << endl ; + + return ; +} + + + + diff --git a/src/ParaMEDMEMTest/test_MPI_Access_Cyclic_ISend_IRecv.cxx b/src/ParaMEDMEMTest/test_MPI_Access_Cyclic_ISend_IRecv.cxx new file mode 100644 index 000000000..ef785ab0f --- /dev/null +++ b/src/ParaMEDMEMTest/test_MPI_Access_Cyclic_ISend_IRecv.cxx @@ -0,0 +1,270 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include +#include +#include +#include + +#include "MPIAccessTest.hxx" +#include + +//#include "CommInterface.hxx" +//#include "ProcessorGroup.hxx" +//#include "MPIProcessorGroup.hxx" +#include "MPIAccess.hxx" + +// use this define to enable lines, execution of which leads to Segmentation Fault +#define ENABLE_FAULTS + +// use this define to enable CPPUNIT asserts and fails, showing bugs +#define ENABLE_FORCED_FAILURES + +using namespace std; +using namespace ParaMEDMEM; + +void MPIAccessTest::test_MPI_Access_Cyclic_ISend_IRecv() { + + cout << "test_MPI_Access_Cyclic_ISend_IRecv" << endl ; + +// MPI_Init(&argc, &argv) ; + + int size ; + int myrank ; + MPI_Comm_size(MPI_COMM_WORLD,&size) ; + MPI_Comm_rank(MPI_COMM_WORLD,&myrank) ; + + if ( size < 3 ) { + cout << "test_MPI_Access_Cyclic_ISend_IRecv must be runned with 3 procs" << endl ; + CPPUNIT_FAIL("test_MPI_Access_Cyclic_ISend_IRecv must be runned with 3 procs") ; + } + + cout << "test_MPI_Access_Cyclic_ISend_IRecv" << myrank << endl ; + + ParaMEDMEM::CommInterface interface ; + + ParaMEDMEM::MPIProcessorGroup* group = new ParaMEDMEM::MPIProcessorGroup(interface) ; + + ParaMEDMEM::MPIAccess mpi_access( group ) ; + +#define maxsend 100 + + if ( myrank >= 3 ) { + mpi_access.barrier() ; + delete group ; + return ; + } + + int alltarget[3] = {1 , 2 , 0 } ; + int allsource[3] = {2 , 0 , 1 } ; + int SendRequestId[maxsend] ; + int RecvRequestId[maxsend] ; + int sendbuf[maxsend] ; + int recvbuf[maxsend] ; + int sts ; + int i = 0 ; + if ( myrank == 0 ) { + sendbuf[i] = i ; + sts = mpi_access.ISend(&sendbuf[i],1,MPI_INT,alltarget[myrank], + SendRequestId[i]) ; + cout << "test" << myrank << " Send RequestId " << SendRequestId[i] + << " tag " << mpi_access.sendMPITag(alltarget[myrank]) << endl ; + } + for ( i = 0 ; i < maxsend ; i++ ) { + recvbuf[i] = -1 ; + sts = mpi_access.IRecv(&recvbuf[i],1,MPI_INT,allsource[myrank], + RecvRequestId[i]) ; + cout << "test" << myrank << " Recv RequestId " << RecvRequestId[i] + << " tag " << mpi_access.recvMPITag(allsource[myrank]) << endl ; + char msgerr[MPI_MAX_ERROR_STRING] ; + int lenerr ; + mpi_access.errorString(sts, msgerr, &lenerr) ; + cout << "test" << myrank << " lenerr " << lenerr + << " " << msgerr << endl ; + + if ( sts != MPI_SUCCESS ) { + ostringstream strstream ; + strstream << "===========================================================" + << "test" << myrank << " KO" + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + int j ; + for (j = 0 ; j <= i ; j++) { + int flag ; + if ( j < i ) { + cout << "test" << myrank << " " << j << " -> Test-Send("<< SendRequestId[j] + << ")" << endl ; + mpi_access.test( SendRequestId[j], flag ) ; + if ( flag ) { + int target, tag, error, outcount ; + mpi_access.status( SendRequestId[j], target, tag, error, outcount, + true ) ; + cout << "test" << myrank << " Send RequestId " << SendRequestId[j] + << " target " << target << " tag " << tag << " error " << error + << endl ; + mpi_access.deleteRequest( SendRequestId[j] ) ; + } + } + cout << "test" << myrank << " " << j << " -> Test-Recv("<< SendRequestId[j] + << ")" << endl ; + mpi_access.test( RecvRequestId[j], flag ) ; + if ( flag ) { + int source, tag, error, outcount ; + mpi_access.status( RecvRequestId[j], source, tag, error, outcount, + true ) ; + cout << "test" << myrank << " Recv RequestId" << j << " " + << RecvRequestId[j] << " source " << source << " tag " << tag + << " error " << error << " outcount " << outcount << endl ; + if ( (outcount != 1) | (recvbuf[j] != j) ) { + ostringstream strstream ; + strstream << "=====================================================" + << endl << "test" << myrank << " outcount " + << outcount << " recvbuf[ " << j << " ] " << recvbuf[j] << " KO" + << endl << "=====================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + } + } + if ( myrank == 0 ) { + if ( i != maxsend-1 ) { + sendbuf[i+1] = i + 1 ; + sts = mpi_access.ISend(&sendbuf[i+1],1,MPI_INT,alltarget[myrank], + SendRequestId[i+1]) ; + cout << "test" << myrank << " Send RequestId " << SendRequestId[i+1] + << " tag " << mpi_access.sendMPITag(alltarget[myrank]) << endl ; + } + } + else { + sendbuf[i] = i ; + sts = mpi_access.ISend(&sendbuf[i],1,MPI_INT,alltarget[myrank], + SendRequestId[i]) ; + cout << "test" << myrank << " Send RequestId " << SendRequestId[i] + << " tag " << mpi_access.sendMPITag(alltarget[myrank]) << endl ; + } + mpi_access.errorString(sts, msgerr, &lenerr) ; + cout << "test" << myrank << " lenerr " << lenerr + << " " << msgerr << endl ; + + if ( sts != MPI_SUCCESS ) { + ostringstream strstream ; + strstream << "===========================================================" + << "test" << myrank << " KO" + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + mpi_access.check() ; + } + + int flag ; + mpi_access.testAll(maxsend,SendRequestId,flag) ; + mpi_access.testAll(maxsend,RecvRequestId,flag) ; + mpi_access.waitAll(maxsend,SendRequestId) ; + mpi_access.deleteRequests(maxsend,SendRequestId) ; + mpi_access.waitAll(maxsend,RecvRequestId) ; + mpi_access.deleteRequests(maxsend,RecvRequestId) ; + mpi_access.check() ; + mpi_access.testAll(maxsend,SendRequestId,flag) ; + if ( !flag ) { + ostringstream strstream ; + strstream << "=========================================================" << endl + << "test" << myrank << " TestAllSendflag " << flag << " KO" << endl + << "=========================================================" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "=========================================================" << endl + << "test" << myrank << " TestAllSendflag " << flag << " OK" << endl + << "=========================================================" << endl ; + } + mpi_access.testAll(maxsend,RecvRequestId,flag) ; + if ( !flag ) { + ostringstream strstream ; + strstream << "=========================================================" << endl + << "test" << myrank << " TestAllRecvflag " << flag << " KO" << endl + << "=========================================================" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "=========================================================" << endl + << "test" << myrank << " TestAllRecvflag " << flag << " OK" << endl + << "=========================================================" << endl ; + } + + int sendrequests[maxsend] ; + int sendreqsize = mpi_access.sendRequestIds( alltarget[myrank] , maxsend , + sendrequests ) ; + if ( sendreqsize != 0 ) { + ostringstream strstream ; + strstream << "=========================================================" << endl + << "test" << myrank << " sendreqsize " << sendreqsize << " KO" << endl + << "=========================================================" << endl ; + cout << strstream.str() << endl ; + int source, tag, error, outcount ; + mpi_access.status(sendrequests[0], source, tag, error, outcount, true) ; + cout << "test" << myrank << " RequestId " << sendrequests[0] + << " source " << source << " tag " << tag << " error " << error + << " outcount " << outcount << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "=========================================================" << endl + << "test" << myrank << " sendreqsize " << sendreqsize << " OK" << endl + << "=========================================================" << endl ; + } + int recvrequests[maxsend] ; + int recvreqsize = mpi_access.sendRequestIds( allsource[myrank] , maxsend , + recvrequests ) ; + if ( recvreqsize != 0 ) { + ostringstream strstream ; + strstream << "=========================================================" << endl + << "test" << myrank << " recvreqsize " << recvreqsize << " KO" << endl + << "=========================================================" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "=========================================================" << endl + << "test" << myrank << " recvreqsize " << recvreqsize << " OK" << endl + << "=========================================================" << endl ; + } + + mpi_access.barrier() ; + + delete group ; + +// MPI_Finalize(); + + cout << "test" << myrank << " OK" << endl ; + + return ; +} + + + + diff --git a/src/ParaMEDMEMTest/test_MPI_Access_Cyclic_Send_Recv.cxx b/src/ParaMEDMEMTest/test_MPI_Access_Cyclic_Send_Recv.cxx new file mode 100644 index 000000000..21ee606e8 --- /dev/null +++ b/src/ParaMEDMEMTest/test_MPI_Access_Cyclic_Send_Recv.cxx @@ -0,0 +1,187 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include +#include +#include +#include +#include "MPIAccessTest.hxx" +#include + +//#include "CommInterface.hxx" +//#include "ProcessorGroup.hxx" +//#include "MPIProcessorGroup.hxx" +#include "MPIAccess.hxx" + +// use this define to enable lines, execution of which leads to Segmentation Fault +#define ENABLE_FAULTS + +// use this define to enable CPPUNIT asserts and fails, showing bugs +#define ENABLE_FORCED_FAILURES + +using namespace std; +using namespace ParaMEDMEM; + +void MPIAccessTest::test_MPI_Access_Cyclic_Send_Recv() { + + cout << "test_MPI_Access_Cyclic_Send_Recv" << endl ; + +// MPI_Init(&argc, &argv) ; + + int size ; + int myrank ; + MPI_Comm_size(MPI_COMM_WORLD,&size) ; + MPI_Comm_rank(MPI_COMM_WORLD,&myrank) ; + + if ( size < 3 ) { + cout << "test_MPI_Access_Send_Recv must be runned with 3 procs" << endl ; + CPPUNIT_FAIL("test_MPI_Access_Send_Recv must be runned with 3 procs") ; + } + + cout << "test_MPI_Access_Cyclic_Send_Recv" << myrank << endl ; + + ParaMEDMEM::CommInterface interface ; + + ParaMEDMEM::MPIProcessorGroup* group = new ParaMEDMEM::MPIProcessorGroup(interface) ; + + ParaMEDMEM::MPIAccess mpi_access( group ) ; + + if ( myrank >= 3 ) { + mpi_access.barrier() ; + delete group ; + return ; + } + + int alltarget[3] = {1 , 2 , 0 } ; + int allsource[3] = {2 , 0 , 1 } ; + int RequestId[10] ; + int sts ; + int i = 0 ; + if ( myrank == 0 ) { + sts = mpi_access.send(&i,1,MPI_INT,alltarget[myrank], RequestId[i]) ; + cout << "test" << myrank << " Send RequestId " << RequestId[i] + << " tag " << mpi_access.sendMPITag(alltarget[myrank]) << endl ; + } + for ( i = 0 ; i < 10 ; i++ ) { + int recvbuf ; + int outcount ; + if ( i & 1 ) { + outcount = 0 ; + sts = mpi_access.recv(&recvbuf,1,MPI_INT,allsource[myrank], RequestId[i], + &outcount) ; + } + else { + sts = mpi_access.recv(&recvbuf,1,MPI_INT,allsource[myrank], RequestId[i]) ; + outcount = 1 ; + } + //int source, tag, error, outcount ; + //mpi_access.Status( RequestId[i], source, tag, error, outcount, true) ; + cout << "test" << myrank << " Recv RequestId " << RequestId[i] + << " tag " << mpi_access.recvMPITag(allsource[myrank]) + << " outcount " << outcount << endl ; + if ( (outcount != 1) | (recvbuf != i) ) { + ostringstream strstream ; + strstream << "===========================================================" + << "test" << myrank << " outcount " + << outcount << " recvbuf " << recvbuf << " KO" + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + if ( myrank == 0 ) { + if ( i != 9 ) { + int ii = i + 1 ; + sts = mpi_access.send(&ii,1,MPI_INT,alltarget[myrank], RequestId[i]) ; + cout << "test" << myrank << " Send RequestId " << RequestId[i] + << " tag " << mpi_access.sendMPITag(alltarget[myrank]) << endl ; + } + } + else { + sts = mpi_access.send(&i,1,MPI_INT,alltarget[myrank], RequestId[i]) ; + cout << "test" << myrank << " Send RequestId " << RequestId[i] + << " tag " << mpi_access.sendMPITag(alltarget[myrank]) << endl ; + } + char msgerr[MPI_MAX_ERROR_STRING] ; + int lenerr ; + mpi_access.errorString(sts, msgerr, &lenerr) ; + cout << "test" << myrank << " lenerr " << lenerr + << " " << msgerr << endl ; + + if ( sts != MPI_SUCCESS ) { + ostringstream strstream ; + strstream << "===========================================================" + << "test" << myrank << " KO" + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + mpi_access.check() ; + } + + int flag ; + mpi_access.testAll(10,RequestId,flag) ; + if ( !flag ) { + ostringstream strstream ; + strstream << "test" << myrank << " flag " << flag << " KO" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + mpi_access.waitAll(10,RequestId) ; + mpi_access.check() ; + + int sendrequests[10] ; + int sendreqsize = mpi_access.sendRequestIds( alltarget[myrank] , 10 , + sendrequests ) ; + if ( sendreqsize != 0 ) { + ostringstream strstream ; + strstream << "=========================================================" << endl + << "test" << myrank << " sendreqsize " << sendreqsize << " KO" << endl + << "=========================================================" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + int recvrequests[10] ; + int recvreqsize = mpi_access.sendRequestIds( allsource[myrank] , 10 , + recvrequests ) ; + if ( recvreqsize != 0 ) { + ostringstream strstream ; + strstream << "=========================================================" << endl + << "test" << myrank << " recvreqsize " << recvreqsize << " KO" << endl + << "=========================================================" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + + mpi_access.barrier() ; + + delete group ; + +// MPI_Finalize(); + + cout << "test" << myrank << " OK" << endl ; + + return ; +} + + + + diff --git a/src/ParaMEDMEMTest/test_MPI_Access_IProbe.cxx b/src/ParaMEDMEMTest/test_MPI_Access_IProbe.cxx new file mode 100644 index 000000000..92fdcf2f2 --- /dev/null +++ b/src/ParaMEDMEMTest/test_MPI_Access_IProbe.cxx @@ -0,0 +1,172 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include +#include +#include +#include +#include + +#ifndef WIN32 +#include +#endif + +#include "MPIAccessTest.hxx" +#include + +//#include "CommInterface.hxx" +//#include "ProcessorGroup.hxx" +//#include "MPIProcessorGroup.hxx" +#include "MPIAccess.hxx" + +// use this define to enable lines, execution of which leads to Segmentation Fault +#define ENABLE_FAULTS + +// use this define to enable CPPUNIT asserts and fails, showing bugs +#define ENABLE_FORCED_FAILURES + +using namespace std; +using namespace ParaMEDMEM; + +void MPIAccessTest::test_MPI_Access_IProbe() { + + cout << "test_MPI_Access_IProbe" << endl ; + +// MPI_Init(&argc, &argv) ; + + int size ; + int myrank ; + MPI_Comm_size(MPI_COMM_WORLD,&size) ; + MPI_Comm_rank(MPI_COMM_WORLD,&myrank) ; + + if ( size < 2 ) { + ostringstream strstream ; + strstream << "test_MPI_Access_IProbe must be runned with 2 procs" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + + cout << "test_MPI_Access_IProbe" << myrank << endl ; + + ParaMEDMEM::CommInterface interface ; + + ParaMEDMEM::MPIProcessorGroup* group = new ParaMEDMEM::MPIProcessorGroup(interface) ; + + ParaMEDMEM::MPIAccess mpi_access( group ) ; + + if ( myrank >= 2 ) { + mpi_access.barrier() ; + delete group ; + return ; + } + + int target = 1 - myrank ; + int sendbuf[10] ; + int RequestId[10] ; + int sts ; + int i ; + for ( i = 0 ; i < 10 ; i++ ) { + if ( myrank == 0 ) { + sendbuf[i] = i ; + sts = mpi_access.ISend(&sendbuf[i],1,MPI_INT,target, RequestId[i]) ; + cout << "test" << myrank << " Send RequestId " << RequestId[i] + << endl ; + } + else { + int flag = false ; + while ( !flag ) { + int source, tag, outcount ; + MPI_Datatype datatype ; + sts = mpi_access.IProbe(target, source, tag, datatype, outcount, flag ) ; + if ( flag ) { + cout << "test" << myrank << " " << i << " IProbe target " << target + << " source " << source << " tag " << tag + << " outcount " << outcount << " flag " << flag << endl ; + } + else { + cout << "test" << myrank << " IProbe flag " << flag << endl ; + sleep( 1 ) ; + } + if ( flag ) { + int recvbuf ; + sts = mpi_access.recv(&recvbuf,outcount,datatype,source, RequestId[i], + &outcount) ; + if ( (outcount != 1) | (recvbuf != i) ) { + ostringstream strstream ; + strstream << "===========================================================" + << endl << "test" << myrank << " outcount " << outcount + << " recvbuf " << recvbuf << " KO" << endl + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + cout << "===========================================================" + << endl << "test" << myrank << " outcount " << outcount + << " recvbuf " << recvbuf << " OK" << endl + << "===========================================================" + << endl ; + } + } + } + char msgerr[MPI_MAX_ERROR_STRING] ; + int lenerr ; + mpi_access.errorString(sts, msgerr, &lenerr) ; + cout << "test" << myrank << " lenerr " << lenerr << " " + << msgerr << endl ; + + if ( sts != MPI_SUCCESS ) { + ostringstream strstream ; + strstream << "===========================================================" + << "test" << myrank << " KO" + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + mpi_access.check() ; + } + int flag ; + mpi_access.testAll(10,RequestId,flag) ; + mpi_access.waitAll(10,RequestId) ; + mpi_access.deleteRequests(10,RequestId) ; + mpi_access.testAll(10,RequestId,flag) ; + if ( !flag ) { + ostringstream strstream ; + strstream << "test" << myrank << " flag " << flag << " KO" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + mpi_access.check() ; + + mpi_access.barrier() ; + + delete group ; + +// MPI_Finalize(); + + cout << "test" << myrank << " OK" << endl ; + + return ; +} + + + + diff --git a/src/ParaMEDMEMTest/test_MPI_Access_ISendRecv.cxx b/src/ParaMEDMEMTest/test_MPI_Access_ISendRecv.cxx new file mode 100644 index 000000000..07dcb41aa --- /dev/null +++ b/src/ParaMEDMEMTest/test_MPI_Access_ISendRecv.cxx @@ -0,0 +1,216 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include +#include +#include +#include + +#include "MPIAccessTest.hxx" +#include + +//#include "CommInterface.hxx" +//#include "ProcessorGroup.hxx" +//#include "MPIProcessorGroup.hxx" +#include "MPIAccess.hxx" + +// use this define to enable lines, execution of which leads to Segmentation Fault +#define ENABLE_FAULTS + +// use this define to enable CPPUNIT asserts and fails, showing bugs +#define ENABLE_FORCED_FAILURES + +using namespace std; +using namespace ParaMEDMEM; + +void MPIAccessTest::test_MPI_Access_ISendRecv() { + + cout << "test_MPI_Access_ISendRecv" << endl ; + +// MPI_Init(&argc, &argv) ; + + int size ; + int myrank ; + MPI_Comm_size(MPI_COMM_WORLD,&size) ; + MPI_Comm_rank(MPI_COMM_WORLD,&myrank) ; + + if ( size < 2 ) { + cout << "test_MPI_Access_ISendRecv must be runned with 2 procs" << endl ; + CPPUNIT_FAIL("test_MPI_Access_ISendRecv must be runned with 2 procs") ; + } + + cout << "test_MPI_Access_ISendRecv" << myrank << endl ; + + ParaMEDMEM::CommInterface interface ; + + ParaMEDMEM::MPIProcessorGroup* group = new ParaMEDMEM::MPIProcessorGroup(interface) ; + + ParaMEDMEM::MPIAccess mpi_access( group ) ; + + if ( myrank >= 2 ) { + mpi_access.barrier() ; + delete group ; + return ; + } + + int target = 1 - myrank ; + int SendRequestId[10] ; + int RecvRequestId[10] ; + int sendbuf[10] ; + int recvbuf[10] ; + int sts ; + int i ; + for ( i = 0 ; i < 10 ; i++ ) { + sendbuf[i] = i ; + sts = mpi_access.ISendRecv(&sendbuf[i],1,MPI_INT,target, SendRequestId[i], + &recvbuf[i],1,MPI_INT,target, RecvRequestId[i]) ; + cout << "test" << myrank << " Send sendRequestId " << SendRequestId[i] + << " tag " << mpi_access.sendMPITag(target) + << " recvRequestId " << RecvRequestId[i] + << " tag " << mpi_access.recvMPITag(target) << endl ; + char msgerr[MPI_MAX_ERROR_STRING] ; + int lenerr ; + mpi_access.errorString(sts, msgerr, &lenerr) ; + cout << "test" << myrank << " lenerr " << lenerr + << " " << msgerr << endl ; + + if ( sts != MPI_SUCCESS ) { + ostringstream strstream ; + strstream << "===========================================================" + << "test" << myrank << " KO" + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + int j ; + for (j = 0 ; j <= i ; j++) { + int flag ; + if ( j < i ) { + cout << "test" << myrank << " " << j << " -> Test-Send("<< SendRequestId[j] + << ")" << endl ; + mpi_access.test( SendRequestId[j], flag ) ; + if ( flag ) { + int target, tag, error, outcount ; + mpi_access.status( SendRequestId[j], target, tag, error, outcount, + true ) ; + cout << "test" << myrank << " Send RequestId " << SendRequestId[j] + << " target " << target << " tag " << tag << " error " << error + << endl ; + mpi_access.deleteRequest( SendRequestId[j] ) ; + } + } + cout << "test" << myrank << " " << j << " -> Test-Recv("<< SendRequestId[j] + << ")" << endl ; + mpi_access.test( RecvRequestId[j], flag ) ; + if ( flag ) { + int source, tag, error, outcount ; + mpi_access.status( RecvRequestId[j], source, tag, error, outcount, + true ) ; + cout << "test" << myrank << " Recv RequestId" << j << " " + << RecvRequestId[j] << " source " << source << " tag " << tag + << " error " << error << " outcount " << outcount << endl ; + if ( (outcount != 1) | (recvbuf[j] != j) ) { + ostringstream strstream ; + strstream << "===========================================================" + << "test" << myrank << " outcount " + << outcount << " recvbuf[ " << j << " ] " << recvbuf[j] << " KO" + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + } + } + mpi_access.errorString(sts, msgerr, &lenerr) ; + cout << "test" << myrank << " lenerr " << lenerr << " " + << msgerr << endl ; + mpi_access.check() ; + } + + int flag ; + mpi_access.testAll(10,SendRequestId,flag) ; + mpi_access.waitAll(10,SendRequestId) ; + mpi_access.deleteRequests(10,SendRequestId) ; + mpi_access.testAll(10,SendRequestId,flag) ; + if ( !flag ) { + ostringstream strstream ; + strstream << "test" << myrank << " flag " << flag << " KO" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + + mpi_access.testAll(10,RecvRequestId,flag) ; + mpi_access.waitAll(10,RecvRequestId) ; + mpi_access.deleteRequests(10,RecvRequestId) ; + mpi_access.testAll(10,RecvRequestId,flag) ; + if ( !flag ) { + ostringstream strstream ; + strstream << "test" << myrank << " flag " << flag << " KO" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + mpi_access.check() ; + + int sendrequests[10] ; + int sendreqsize = mpi_access.sendRequestIds( target , 10 , sendrequests ) ; + if ( sendreqsize != 0 ) { + ostringstream strstream ; + strstream << "=========================================================" << endl + << "test" << myrank << " sendreqsize " << sendreqsize << " KO" << endl + << "=========================================================" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "=========================================================" << endl + << "test" << myrank << " sendreqsize " << sendreqsize << " OK" << endl + << "=========================================================" << endl ; + } + int recvrequests[10] ; + int recvreqsize = mpi_access.sendRequestIds( target , 10 , recvrequests ) ; + if ( recvreqsize != 0 ) { + ostringstream strstream ; + strstream << "=========================================================" << endl + << "test" << myrank << " recvreqsize " << recvreqsize << " KO" << endl + << "=========================================================" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "=========================================================" << endl + << "test" << myrank << " recvreqsize " << recvreqsize << " OK" << endl + << "=========================================================" << endl ; + } + + mpi_access.barrier() ; + + delete group ; + +// MPI_Finalize(); + + cout << "test" << myrank << " OK" << endl ; + + return ; +} + + + + diff --git a/src/ParaMEDMEMTest/test_MPI_Access_ISend_IRecv.cxx b/src/ParaMEDMEMTest/test_MPI_Access_ISend_IRecv.cxx new file mode 100644 index 000000000..3498074df --- /dev/null +++ b/src/ParaMEDMEMTest/test_MPI_Access_ISend_IRecv.cxx @@ -0,0 +1,221 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include +#include +#include +#include + +#include "MPIAccessTest.hxx" +#include + +//#include "CommInterface.hxx" +//#include "ProcessorGroup.hxx" +//#include "MPIProcessorGroup.hxx" +#include "MPIAccess.hxx" + +// use this define to enable lines, execution of which leads to Segmentation Fault +#define ENABLE_FAULTS + +// use this define to enable CPPUNIT asserts and fails, showing bugs +#define ENABLE_FORCED_FAILURES + +using namespace std; +using namespace ParaMEDMEM; + +void MPIAccessTest::test_MPI_Access_ISend_IRecv() { + + cout << "test_MPI_Access_ISend_IRecv" << endl ; + + // MPI_Init(&argc, &argv) ; + + int size ; + int myrank ; + MPI_Comm_size(MPI_COMM_WORLD,&size) ; + MPI_Comm_rank(MPI_COMM_WORLD,&myrank) ; + + if ( size < 2 ) { + cout << "test_MPI_Access_ISend_IRecv must be runned with 2 procs" << endl ; + CPPUNIT_FAIL("test_MPI_Access_ISend_IRecv must be runned with 2 procs") ; + } + + cout << "test_MPI_Access_ISend_IRecv" << myrank << endl ; + + ParaMEDMEM::CommInterface interface ; + + ParaMEDMEM::MPIProcessorGroup* group = new ParaMEDMEM::MPIProcessorGroup(interface) ; + + ParaMEDMEM::MPIAccess mpi_access( group ) ; + +#define maxreq 100 + + if ( myrank >= 2 ) { + mpi_access.barrier() ; + delete group ; + return ; + } + + int target = 1 - myrank ; + int SendRequestId[maxreq] ; + int RecvRequestId[maxreq] ; + int sts ; + int sendbuf[maxreq] ; + int recvbuf[maxreq] ; + int i ; + for ( i = 0 ; i < maxreq ; i++ ) { + if ( myrank == 0 ) { + sendbuf[i] = i ; + sts = mpi_access.ISend(&sendbuf[i],1,MPI_INT,target, SendRequestId[i]) ; + cout << "test" << myrank << " ISend RequestId " << SendRequestId[i] + << " tag " << mpi_access.sendMPITag(target) << endl ; + } + else { + sts = mpi_access.IRecv(&recvbuf[i],1,MPI_INT,target, RecvRequestId[i]) ; + cout << "test" << myrank << " IRecv RequestId " << RecvRequestId[i] + << " tag " << mpi_access.recvMPITag(target) << endl ; + } + int j ; + for (j = 0 ; j <= i ; j++) { + int flag ; + if ( myrank == 0 ) { + mpi_access.test( SendRequestId[j], flag ) ; + } + else { + mpi_access.test( RecvRequestId[j], flag ) ; + } + if ( flag ) { + int target,source, tag, error, outcount ; + if ( myrank == 0 ) { + mpi_access.status( SendRequestId[j], target, tag, error, outcount, + true ) ; + cout << "test" << myrank << " Test(Send RequestId " << SendRequestId[j] + << ") : target " << target << " tag " << tag << " error " << error + << " flag " << flag << endl ; + } + else { + mpi_access.status( RecvRequestId[j], source, tag, error, outcount, + true ) ; + cout << "test" << myrank << " Test(Recv RequestId " + << RecvRequestId[j] << ") : source " << source << " tag " << tag + << " error " << error << " outcount " << outcount + << " flag " << flag << endl ; + if ( (outcount != 1) | (recvbuf[j] != j) ) { + ostringstream strstream ; + strstream << "===========================================================" + << endl << "test" << myrank << " outcount " + << outcount << " recvbuf " << recvbuf[j] << " KO" << endl + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + //else { + // cout << "===========================================================" + // << endl << "test" << myrank << " outcount " << outcount + // << " RequestId " << RecvRequestId[j] << " recvbuf " + // << recvbuf[j] << " OK" << endl + // << "===========================================================" + // << endl ; + //} + } + } + } + char msgerr[MPI_MAX_ERROR_STRING] ; + int lenerr ; + mpi_access.errorString(sts, msgerr, &lenerr) ; + cout << "test" << myrank << " lenerr " << lenerr << " " + << msgerr << endl ; + + if ( sts != MPI_SUCCESS ) { + ostringstream strstream ; + strstream << "===========================================================" + << "test" << myrank << " KO" + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + } + + mpi_access.check() ; + if ( myrank == 0 ) { + mpi_access.waitAll(maxreq, SendRequestId) ; + mpi_access.deleteRequests(maxreq, SendRequestId) ; + } + else { + mpi_access.waitAll(maxreq, RecvRequestId) ; + mpi_access.deleteRequests(maxreq, RecvRequestId) ; + } + mpi_access.check() ; + + if ( myrank == 0 ) { + int sendrequests[maxreq] ; + int sendreqsize = mpi_access.sendRequestIds( target , maxreq , sendrequests ) ; + int i ; + if ( sendreqsize != 0 ) { + ostringstream strstream ; + strstream << "=========================================================" << endl + << "test" << myrank << " sendreqsize " << sendreqsize << " KO" << endl + << "=========================================================" << endl ; + cout << strstream.str() << endl ; + for ( i = 0 ; i < sendreqsize ; i++ ) { + cout << "test" << myrank << " sendrequests[ " << i << " ] = " + << sendrequests[i] << endl ; + } + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "=========================================================" << endl + << "test" << myrank << " sendreqsize " << sendreqsize << " OK" << endl + << "=========================================================" << endl ; + } + } + else { + int recvrequests[maxreq] ; + int recvreqsize = mpi_access.sendRequestIds( target , maxreq , recvrequests ) ; + if ( recvreqsize != 0 ) { + ostringstream strstream ; + strstream << "=========================================================" << endl + << "test" << myrank << " recvreqsize " << recvreqsize << " KO" << endl + << "=========================================================" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "=========================================================" << endl + << "test" << myrank << " recvreqsize " << recvreqsize << " OK" << endl + << "=========================================================" << endl ; + } + } + + mpi_access.barrier() ; + + delete group ; + + // MPI_Finalize(); + + cout << "test" << myrank << " OK" << endl ; + + return ; +} + + + + diff --git a/src/ParaMEDMEMTest/test_MPI_Access_ISend_IRecv_BottleNeck.cxx b/src/ParaMEDMEMTest/test_MPI_Access_ISend_IRecv_BottleNeck.cxx new file mode 100644 index 000000000..5bdf39a5f --- /dev/null +++ b/src/ParaMEDMEMTest/test_MPI_Access_ISend_IRecv_BottleNeck.cxx @@ -0,0 +1,225 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include +#include +#include +#include +#include + +#include "MPIAccessTest.hxx" +#include + +//#include "CommInterface.hxx" +//#include "ProcessorGroup.hxx" +//#include "MPIProcessorGroup.hxx" +#include "MPIAccess.hxx" + +// use this define to enable lines, execution of which leads to Segmentation Fault +#define ENABLE_FAULTS + +// use this define to enable CPPUNIT asserts and fails, showing bugs +#define ENABLE_FORCED_FAILURES + +using namespace std; +using namespace ParaMEDMEM; + +void MPIAccessTest::test_MPI_Access_ISend_IRecv_BottleNeck() { + + cout << "test_MPI_Access_ISend_IRecv_BottleNeck" << endl ; + +// MPI_Init(&argc, &argv) ; + + int size ; + int myrank ; + MPI_Comm_size(MPI_COMM_WORLD,&size) ; + MPI_Comm_rank(MPI_COMM_WORLD,&myrank) ; + + if ( size < 2 ) { + ostringstream strstream ; + strstream << "test_MPI_Access_ISend_IRecv_BottleNeck must be runned with 2 procs" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + + cout << "test_MPI_Access_ISend_IRecv_BottleNeck" << myrank << endl ; + + ParaMEDMEM::CommInterface interface ; + + ParaMEDMEM::MPIProcessorGroup* group = new ParaMEDMEM::MPIProcessorGroup(interface) ; + + ParaMEDMEM::MPIAccess mpi_access( group ) ; + +#define maxreq 10000 + + if ( myrank >= 2 ) { + mpi_access.barrier() ; + delete group ; + return ; + } + + int target = 1 - myrank ; + int SendRequestId[maxreq] ; + int RecvRequestId[maxreq] ; + int sts ; + int sendbuf[maxreq] ; + int recvbuf[maxreq] ; + int i ; + for ( i = 0 ; i < maxreq ; i++ ) { + if ( myrank == 0 ) { + sendbuf[i] = i ; + sts = mpi_access.ISend(sendbuf,i,MPI_INT,target, SendRequestId[i]) ; + cout << "test" << myrank << " ISend RequestId " << SendRequestId[i] + << " tag " << mpi_access.sendMPITag(target) << endl ; + } + else { + //sleep( 1 ) ; + sts = mpi_access.IRecv(recvbuf,i,MPI_INT,target, RecvRequestId[i]) ; + cout << "test" << myrank << " IRecv RequestId " << RecvRequestId[i] + << " tag " << mpi_access.recvMPITag(target) << endl ; + int recvreqsize = mpi_access.recvRequestIdsSize() ; + int * recvrequests = new int[ recvreqsize ] ; + recvreqsize = mpi_access.recvRequestIds( target , recvreqsize , recvrequests ) ; + int j ; + for (j = 0 ; j < recvreqsize ; j++) { + int flag ; + mpi_access.test( recvrequests[j], flag ) ; + if ( flag ) { + int source, tag, error, outcount ; + mpi_access.status( recvrequests[j], source, tag, error, outcount, + true ) ; + cout << "test" << myrank << " Test(Recv RequestId " + << recvrequests[j] << ") : source " << source << " tag " << tag + << " error " << error << " outcount " << outcount + << " flag " << flag << " : DeleteRequest" << endl ; + mpi_access.deleteRequest( recvrequests[j] ) ; + } + else { +// cout << "test" << myrank << " Test(Recv RequestId " +// << recvrequests[j] << ") flag " << flag << endl ; + } + } + delete [] recvrequests ; + } + if ( sts != MPI_SUCCESS ) { + char msgerr[MPI_MAX_ERROR_STRING] ; + int lenerr ; + mpi_access.errorString(sts, msgerr, &lenerr) ; + cout << "test" << myrank << " lenerr " << lenerr << " " + << msgerr << endl ; + } + + if ( sts != MPI_SUCCESS ) { + ostringstream strstream ; + strstream << "===========================================================" + << "test" << myrank << " KO" + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + } + + mpi_access.check() ; + if ( myrank == 0 ) { + int size = mpi_access.sendRequestIdsSize() ; + cout << "test" << myrank << " before WaitAll sendreqsize " << size << endl ; + mpi_access.waitAll(maxreq, SendRequestId) ; + size = mpi_access.sendRequestIdsSize() ; + cout << "test" << myrank << " after WaitAll sendreqsize " << size << endl ; + int * ArrayOfSendRequests = new int[ size ] ; + int nSendRequest = mpi_access.sendRequestIds( size , ArrayOfSendRequests ) ; + int i ; + for ( i = 0 ; i < nSendRequest ; i++ ) { + mpi_access.deleteRequest( ArrayOfSendRequests[i] ) ; + } + delete [] ArrayOfSendRequests ; + } + else { + int size = mpi_access.recvRequestIdsSize() ; + cout << "test" << myrank << " before WaitAll recvreqsize " << size << endl ; + mpi_access.waitAll(maxreq, RecvRequestId) ; + size = mpi_access.recvRequestIdsSize() ; + cout << "test" << myrank << " after WaitAll recvreqsize " << size << endl ; + int * ArrayOfRecvRequests = new int[ size ] ; + int nRecvRequest = mpi_access.recvRequestIds( size , ArrayOfRecvRequests ) ; + int i ; + for ( i = 0 ; i < nRecvRequest ; i++ ) { + mpi_access.deleteRequest( ArrayOfRecvRequests[i] ) ; + } + delete [] ArrayOfRecvRequests ; + } + mpi_access.check() ; + + if ( myrank == 0 ) { + int sendrequests[maxreq] ; + int sendreqsize = mpi_access.sendRequestIds( target , maxreq , sendrequests ) ; + int i ; + if ( sendreqsize != 0 ) { + ostringstream strstream ; + strstream << "=========================================================" << endl + << "test" << myrank << " sendreqsize " << sendreqsize << " KO" << endl + << "=========================================================" << endl ; + cout << strstream.str() << endl ; + for ( i = 0 ; i < sendreqsize ; i++ ) { + cout << "test" << myrank << " sendrequests[ " << i << " ] = " + << sendrequests[i] << endl ; + } + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "=========================================================" << endl + << "test" << myrank << " sendreqsize " << sendreqsize << " OK" << endl + << "=========================================================" << endl ; + } + } + else { + int recvrequests[maxreq] ; + int recvreqsize = mpi_access.recvRequestIds( target , maxreq , recvrequests ) ; + if ( recvreqsize != 0 ) { + ostringstream strstream ; + strstream << "=========================================================" << endl + << "test" << myrank << " recvreqsize " << recvreqsize << " KO" << endl + << "=========================================================" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "=========================================================" << endl + << "test" << myrank << " recvreqsize " << recvreqsize << " OK" << endl + << "=========================================================" << endl ; + } + } + + mpi_access.barrier() ; + + delete group ; + +// MPI_Finalize(); + + cout << "test" << myrank << " OK" << endl ; + + return ; +} + + + + diff --git a/src/ParaMEDMEMTest/test_MPI_Access_ISend_IRecv_Length.cxx b/src/ParaMEDMEMTest/test_MPI_Access_ISend_IRecv_Length.cxx new file mode 100644 index 000000000..16c575557 --- /dev/null +++ b/src/ParaMEDMEMTest/test_MPI_Access_ISend_IRecv_Length.cxx @@ -0,0 +1,234 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include +#include +#include +#include + +#include "MPIAccessTest.hxx" +#include + +//#include "CommInterface.hxx" +//#include "ProcessorGroup.hxx" +//#include "MPIProcessorGroup.hxx" +#include "MPIAccess.hxx" + +// use this define to enable lines, execution of which leads to Segmentation Fault +#define ENABLE_FAULTS + +// use this define to enable CPPUNIT asserts and fails, showing bugs +#define ENABLE_FORCED_FAILURES + +using namespace std; +using namespace ParaMEDMEM; + +void MPIAccessTest::test_MPI_Access_ISend_IRecv_Length() { + + cout << "test_MPI_Access_ISend_IRecv_Length" << endl ; + + // MPI_Init(&argc, &argv) ; + + int size ; + int myrank ; + MPI_Comm_size(MPI_COMM_WORLD,&size) ; + MPI_Comm_rank(MPI_COMM_WORLD,&myrank) ; + + if ( size < 2 ) { + ostringstream strstream ; + strstream << "test_MPI_Access_ISend_IRecv_Length must be runned with 2 procs" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + + cout << "test_MPI_Access_ISend_IRecv_Length" << myrank << endl ; + + ParaMEDMEM::CommInterface interface ; + + ParaMEDMEM::MPIProcessorGroup* group = new ParaMEDMEM::MPIProcessorGroup(interface) ; + + ParaMEDMEM::MPIAccess mpi_access( group ) ; + +#define maxreq 10 + + if ( myrank >= 2 ) { + mpi_access.barrier() ; + delete group ; + return ; + } + + int target = 1 - myrank ; + int SendRequestId[maxreq] ; + int RecvRequestId[maxreq] ; + int sts ; + int sendbuf[1000*(maxreq-1)] ; + int recvbuf[maxreq-1][1000*(maxreq-1)] ; + int i ; + for ( i = 0 ; i < 1000*(maxreq-1) ; i++ ) { + sendbuf[i] = i ; + } + for ( i = 0 ; i < maxreq ; i++ ) { + if ( myrank == 0 ) { + sts = mpi_access.ISend( sendbuf, 1000*i, MPI_INT, target, SendRequestId[i] ) ; + cout << "test" << myrank << " ISend RequestId " << SendRequestId[i] + << " tag " << mpi_access.sendMPITag(target) << endl ; + } + else { + sts = mpi_access.IRecv( recvbuf[i], 1000*i, MPI_INT, target, + RecvRequestId[i] ) ; + cout << "test" << myrank << " IRecv RequestId " << RecvRequestId[i] + << " tag " << mpi_access.recvMPITag(target) << endl ; + } + int j ; + for (j = 0 ; j <= i ; j++) { + int flag ; + if ( myrank == 0 ) { + mpi_access.test( SendRequestId[j], flag ) ; + } + else { + mpi_access.test( RecvRequestId[j], flag ) ; + } + if ( flag ) { + int target,source, tag, error, outcount ; + if ( myrank == 0 ) { + mpi_access.status( SendRequestId[j], target, tag, error, outcount, + true ) ; + cout << "test" << myrank << " Test(Send RequestId " << SendRequestId[j] + << ") : target " << target << " tag " << tag << " error " << error + << " flag " << flag << endl ; + } + else { + mpi_access.status( RecvRequestId[j], source, tag, error, outcount, + true ) ; + cout << "test" << myrank << " Test(Recv RequestId " + << RecvRequestId[j] << ") : source " << source << " tag " << tag + << " error " << error << " outcount " << outcount + << " flag " << flag << endl ; + if ( outcount != 0 ) { + if ( (outcount != 1000*j) | + (recvbuf[j][outcount-1] != (outcount-1)) ) { + ostringstream strstream ; + strstream << "===========================================================" + << endl << "test" << myrank << " outcount " + << outcount << " recvbuf " << recvbuf[j][outcount-1] << " KO" + << endl + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "===========================================================" + << endl << "test" << myrank << " outcount " << outcount + << " RequestId " << RecvRequestId[j] << " recvbuf " + << recvbuf[j][outcount-1] << " OK" << endl + << "===========================================================" + << endl ; + } + } + else { + cout << "===========================================================" + << endl << "test" << myrank << " outcount " << outcount + << " RequestId " << RecvRequestId[j] << " OK" << endl + << "===========================================================" + << endl ; + } + } + } + } + char msgerr[MPI_MAX_ERROR_STRING] ; + int lenerr ; + mpi_access.errorString(sts, msgerr, &lenerr) ; + cout << "test" << myrank << " lenerr " << lenerr << " " + << msgerr << endl ; + + if ( sts != MPI_SUCCESS ) { + ostringstream strstream ; + strstream << "===========================================================" + << "test" << myrank << " KO" + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + } + + mpi_access.check() ; + cout << "test" << myrank << " WaitAll" << endl ; + if ( myrank == 0 ) { + mpi_access.waitAll(maxreq, SendRequestId) ; + mpi_access.deleteRequests(maxreq, SendRequestId) ; + } + else { + mpi_access.waitAll(maxreq, RecvRequestId) ; + mpi_access.deleteRequests(maxreq, RecvRequestId) ; + } + mpi_access.check() ; + + if ( myrank == 0 ) { + int sendrequests[maxreq] ; + int sendreqsize = mpi_access.sendRequestIds( target , maxreq , sendrequests ) ; + sendreqsize = mpi_access.sendRequestIds( target , maxreq , sendrequests ) ; + if ( sendreqsize != 0 ) { + ostringstream strstream ; + strstream << "=========================================================" << endl + << "test" << myrank << " sendreqsize " << sendreqsize << " KO" << endl + << "=========================================================" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "=========================================================" << endl + << "test" << myrank << " sendreqsize " << sendreqsize << " OK" << endl + << "=========================================================" << endl ; + } + } + else { + int recvrequests[maxreq] ; + int recvreqsize = mpi_access.sendRequestIds( target , maxreq , recvrequests ) ; + if ( recvreqsize != 0 ) { + ostringstream strstream ; + strstream << "=========================================================" << endl + << "test" << myrank << " recvreqsize " << recvreqsize << " KO" << endl + << "=========================================================" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "=========================================================" << endl + << "test" << myrank << " recvreqsize " << recvreqsize << " OK" << endl + << "=========================================================" << endl ; + } + } + + mpi_access.barrier() ; + + delete group ; + + // MPI_Finalize(); + + cout << "test" << myrank << " OK" << endl ; + + return ; +} + + + + diff --git a/src/ParaMEDMEMTest/test_MPI_Access_ISend_IRecv_Length_1.cxx b/src/ParaMEDMEMTest/test_MPI_Access_ISend_IRecv_Length_1.cxx new file mode 100644 index 000000000..888c961d2 --- /dev/null +++ b/src/ParaMEDMEMTest/test_MPI_Access_ISend_IRecv_Length_1.cxx @@ -0,0 +1,305 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include +#include +#include +#include + +#include "MPIAccessTest.hxx" +#include + +//#include "CommInterface.hxx" +//#include "ProcessorGroup.hxx" +//#include "MPIProcessorGroup.hxx" +#include "MPIAccess.hxx" + +// use this define to enable lines, execution of which leads to Segmentation Fault +#define ENABLE_FAULTS + +// use this define to enable CPPUNIT asserts and fails, showing bugs +#define ENABLE_FORCED_FAILURES + +using namespace std; +using namespace ParaMEDMEM; + +void MPIAccessTest::test_MPI_Access_ISend_IRecv_Length_1() { + + // MPI_Init(&argc, &argv) ; + + int size ; + int myrank ; + MPI_Comm_size(MPI_COMM_WORLD,&size) ; + MPI_Comm_rank(MPI_COMM_WORLD,&myrank) ; + + if ( size < 2 ) { + ostringstream strstream ; + strstream << "test_MPI_Access_ISend_IRecv_Length_1 must be runned with 2 procs" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + + cout << "test_MPI_Access_ISend_IRecv_Length_1" << myrank << endl ; + + ParaMEDMEM::CommInterface interface ; + + ParaMEDMEM::MPIProcessorGroup* group = new ParaMEDMEM::MPIProcessorGroup(interface) ; + + ParaMEDMEM::MPIAccess mpi_access( group ) ; + +#define maxreq 10 + + if ( myrank >= 2 ) { + mpi_access.barrier() ; + delete group ; + return ; + } + + int target = 1 - myrank ; + int SendRequestId[maxreq] ; + int RecvRequestId[maxreq] ; + int sts ; + int sendbuf[1000*(maxreq-1)] ; + int recvbuf[maxreq-1][1000*(maxreq-1)] ; + int maxirecv = 1 ; + int i ; + RecvRequestId[0] = -1 ; + for ( i = 0 ; i < 1000*(maxreq-1) ; i++ ) { + sendbuf[i] = i ; + } + for ( i = 0 ; i < maxreq ; i++ ) { + sts = MPI_SUCCESS ; + if ( myrank == 0 ) { + sts = mpi_access.ISend( sendbuf, 1000*i, MPI_INT, target, SendRequestId[i] ) ; + cout << "test" << myrank << " ISend RequestId " << SendRequestId[i] + << " tag " << mpi_access.sendMPITag(target) << endl ; + } + int j ; + for (j = 1 ; j <= i ; j++) { + int source ; + MPI_Datatype datatype ; + int outcount ; + int flag ; + if ( myrank == 0 ) { + mpi_access.test( SendRequestId[j], flag ) ; + } + else { + int MPITag ; + sts = mpi_access.IProbe( target , source, MPITag, datatype, + outcount, flag) ; + char msgerr[MPI_MAX_ERROR_STRING] ; + int lenerr ; + mpi_access.errorString(sts, msgerr, &lenerr) ; + cout << "test" << myrank << " IProbe lenerr " << lenerr << " " + << msgerr << endl ; + if ( sts != MPI_SUCCESS ) { + ostringstream strstream ; + strstream << "===========================================================" + << "test" << myrank << " IProbe KO" + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + cout << "test" << myrank << " IProbe i/j " << i << "/" << j + << " MPITag " << MPITag << " datatype " << datatype + << " outcount " << outcount << " flag " << flag << endl ; + } + if ( flag ) { + if ( myrank == 0 ) { + int target, tag, error, outcount ; + mpi_access.status( SendRequestId[j], target, tag, error, outcount, + true ) ; + cout << "test" << myrank << " Test(Send RequestId " << SendRequestId[j] + << ") : target " << target << " tag " << tag << " error " << error + << " flag " << flag << endl ; + } + else { + sts = mpi_access.IRecv( recvbuf[maxirecv], outcount, datatype, source, + RecvRequestId[maxirecv] ) ; + cout << "test" << myrank << " maxirecv " << maxirecv << " IRecv RequestId " + << RecvRequestId[maxirecv] << " source " << source + << " outcount " << outcount << " tag " + << mpi_access.recvMPITag(target) << endl ; + maxirecv = maxirecv + 1 ; + } + } + else if ( myrank == 1 && i == maxreq-1 && j >= maxirecv ) { + sts = mpi_access.IRecv( recvbuf[j], 1000*j, MPI_INT, target, + RecvRequestId[j] ) ; + cout << "test" << myrank << " maxirecv " << maxirecv << " IRecv RequestId " + << RecvRequestId[j] << " target " << target << " length " << 1000*j + << " tag " << mpi_access.recvMPITag(target) << endl ; + maxirecv = maxirecv + 1 ; + } + } + char msgerr[MPI_MAX_ERROR_STRING] ; + int lenerr ; + mpi_access.errorString(sts, msgerr, &lenerr) ; + cout << "test" << myrank << " lenerr " << lenerr << " " + << msgerr << endl ; + + if ( sts != MPI_SUCCESS ) { + ostringstream strstream ; + strstream << "===========================================================" + << endl << "test" << myrank << " KO" << endl + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + } + + mpi_access.check() ; + int flag ; + if ( myrank == 0 ) { + mpi_access.testAll( maxreq, SendRequestId, flag ) ; + cout << "test" << myrank << " TestAll SendRequest flag " << flag << endl ; + } + else { + int i ; + int source ; + int outcount ; + int flag ; + if ( maxirecv != maxreq ) { + ostringstream strstream ; + strstream << "===========================================================" + << endl << "test" << myrank << " KO" << " maxirecv " << maxirecv + << " != maxreq " << maxreq << endl + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + while ( maxirecv > 0 ) { + for ( i = 1 ; i < maxreq ; i++ ) { + cout << "test" << myrank << " IProbe : " << endl ; + sts = mpi_access.test( RecvRequestId[i] , flag ) ; + char msgerr[MPI_MAX_ERROR_STRING] ; + int lenerr ; + mpi_access.errorString(sts, msgerr, &lenerr) ; + cout << "test" << myrank << " flag " << flag << " lenerr " + << lenerr << " " << msgerr << " maxirecv " << maxirecv << endl ; + if ( sts != MPI_SUCCESS ) { + ostringstream strstream ; + strstream << "===========================================================" + << "test" << myrank << " KO" + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + cout << "test" << myrank << " Test flag " << flag << endl ; + if ( flag ) { + int tag, error ; + mpi_access.status( RecvRequestId[i] , source , tag , error , + outcount ) ; + if ( i != 0 ) { + if ( outcount != 1000*i | + (recvbuf[i][outcount-1] != (outcount-1)) ) { + ostringstream strstream ; + strstream << "========================================================" + << endl << "test" << myrank << " outcount " << outcount + << " KO" << " i " << i + << " recvbuf " << recvbuf[i][outcount-1] << endl + << "========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + } + else if ( outcount != 0 ) { + ostringstream strstream ; + strstream << "========================================================" + << endl << "test" << myrank << " outcount " << outcount + << " KO" << " i " << i << endl + << "========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + maxirecv = maxirecv - 1 ; + } + } + } + mpi_access.testAll( maxreq, RecvRequestId, flag ) ; + cout << "test" << myrank << " TestAll RecvRequest flag " << flag << endl ; + } + mpi_access.check() ; + cout << "test" << myrank << " WaitAll :" << endl ; + if ( myrank == 0 ) { + mpi_access.waitAll( maxreq, SendRequestId ) ; + mpi_access.deleteRequests( maxreq, SendRequestId ) ; + } + else { + mpi_access.waitAll( maxreq, RecvRequestId ) ; + mpi_access.deleteRequests( maxreq, RecvRequestId ) ; + } + + if ( myrank == 0 ) { + int sendrequests[maxreq] ; + int sendreqsize = mpi_access.sendRequestIds( target , maxreq , sendrequests ) ; + sendreqsize = mpi_access.sendRequestIds( target , maxreq , sendrequests ) ; + if ( sendreqsize != 0 ) { + ostringstream strstream ; + strstream << "=========================================================" << endl + << "test" << myrank << " sendreqsize " << sendreqsize << " KO" << endl + << "=========================================================" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "=========================================================" << endl + << "test" << myrank << " sendreqsize " << sendreqsize << " OK" << endl + << "=========================================================" << endl ; + } + } + else { + int recvrequests[maxreq] ; + int recvreqsize = mpi_access.sendRequestIds( target , maxreq , recvrequests ) ; + if ( recvreqsize != 0 ) { + ostringstream strstream ; + strstream << "=========================================================" << endl + << "test" << myrank << " recvreqsize " << recvreqsize << " KO" << endl + << "=========================================================" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "=========================================================" << endl + << "test" << myrank << " recvreqsize " << recvreqsize << " OK" << endl + << "=========================================================" << endl ; + } + } + + mpi_access.barrier() ; + + delete group ; + + // MPI_Finalize(); + + cout << "test" << myrank << " OK" << endl ; + + return ; +} + + + + diff --git a/src/ParaMEDMEMTest/test_MPI_Access_Probe.cxx b/src/ParaMEDMEMTest/test_MPI_Access_Probe.cxx new file mode 100644 index 000000000..8e3bdadda --- /dev/null +++ b/src/ParaMEDMEMTest/test_MPI_Access_Probe.cxx @@ -0,0 +1,144 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include +#include +#include +#include + +#include "MPIAccessTest.hxx" +#include + +//#include "CommInterface.hxx" +//#include "ProcessorGroup.hxx" +//#include "MPIProcessorGroup.hxx" +#include "MPIAccess.hxx" + +// use this define to enable lines, execution of which leads to Segmentation Fault +#define ENABLE_FAULTS + +// use this define to enable CPPUNIT asserts and fails, showing bugs +#define ENABLE_FORCED_FAILURES + +using namespace std; +using namespace ParaMEDMEM; + +void MPIAccessTest::test_MPI_Access_Probe() { + + cout << "test_MPI_Access_Probe" << endl ; + +// MPI_Init(&argc, &argv) ; + + int size ; + int myrank ; + MPI_Comm_size(MPI_COMM_WORLD,&size) ; + MPI_Comm_rank(MPI_COMM_WORLD,&myrank) ; + + if ( size < 2 ) { + cout << "test_MPI_Access_Probe must be runned with 2 procs" << endl ; + CPPUNIT_FAIL("test_MPI_Access_Probe must be runned with 2 procs") ; + } + + cout << "test_MPI_Access_Probe" << myrank << endl ; + + ParaMEDMEM::CommInterface interface ; + + ParaMEDMEM::MPIProcessorGroup* group = new ParaMEDMEM::MPIProcessorGroup(interface) ; + + ParaMEDMEM::MPIAccess mpi_access( group ) ; + + if ( myrank >= 2 ) { + mpi_access.barrier() ; + delete group ; + return ; + } + + int target = 1 - myrank ; + int RequestId[10] ; + int sts ; + int i ; + for ( i = 0 ; i < 10 ; i++ ) { + if ( myrank == 0 ) { + sts = mpi_access.send(&i,1,MPI_INT,target, RequestId[i]) ; + cout << "test" << myrank << " Send RequestId " << RequestId[i] + << endl ; + } + else { + int source, tag, outcount ; + MPI_Datatype datatype ; + sts = mpi_access.probe(target, source, tag, datatype, outcount ) ; + cout << "test" << myrank << " Probe target " << target << " source " << source + << " tag " << tag << " outcount " << outcount << endl ; + int recvbuf ; + sts = mpi_access.recv(&recvbuf,outcount,datatype,source, RequestId[i], + &outcount) ; + if ( (outcount != 1) | (recvbuf != i) ) { + ostringstream strstream ; + strstream << "===========================================================" + << "test" << myrank << " outcount " << outcount + << " recvbuf " << recvbuf << " KO" + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + } + char msgerr[MPI_MAX_ERROR_STRING] ; + int lenerr ; + mpi_access.errorString(sts, msgerr, &lenerr) ; + cout << "test" << myrank << " lenerr " << lenerr << " " + << msgerr << endl ; + + if ( sts != MPI_SUCCESS ) { + ostringstream strstream ; + strstream << "===========================================================" + << "test" << myrank << " KO" + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + mpi_access.check() ; + } + int flag ; + mpi_access.testAll(10,RequestId,flag) ; + if ( !flag ) { + ostringstream strstream ; + strstream << "test" << myrank << " flag " << flag << " KO" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + mpi_access.waitAll(10,RequestId) ; + mpi_access.check() ; + + mpi_access.barrier() ; + + delete group ; + +// MPI_Finalize(); + + cout << "test" << myrank << " OK" << endl ; + + return ; +} + + + + diff --git a/src/ParaMEDMEMTest/test_MPI_Access_SendRecv.cxx b/src/ParaMEDMEMTest/test_MPI_Access_SendRecv.cxx new file mode 100644 index 000000000..6055857e9 --- /dev/null +++ b/src/ParaMEDMEMTest/test_MPI_Access_SendRecv.cxx @@ -0,0 +1,180 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include +#include +#include +#include + +#include "MPIAccessTest.hxx" +#include + +//#include "CommInterface.hxx" +//#include "ProcessorGroup.hxx" +//#include "MPIProcessorGroup.hxx" +#include "MPIAccess.hxx" + +// use this define to enable lines, execution of which leads to Segmentation Fault +#define ENABLE_FAULTS + +// use this define to enable CPPUNIT asserts and fails, showing bugs +#define ENABLE_FORCED_FAILURES + +using namespace std; +using namespace ParaMEDMEM; + +void MPIAccessTest::test_MPI_Access_SendRecv() { + + cout << "MPIAccessTest::test_MPI_Access_SendRecv" << endl ; + +// MPI_Init(&argc, &argv) ; + + int size ; + int myrank ; + MPI_Comm_size(MPI_COMM_WORLD,&size) ; + MPI_Comm_rank(MPI_COMM_WORLD,&myrank) ; + + if ( size < 2 ) { + cout << "MPIAccessTest::test_MPI_Access_SendRecv must be runned with 2 procs" << endl ; + CPPUNIT_FAIL("test_MPI_Access_SendRecv must be runned with 2 procs") ; + } + + cout << "MPIAccessTest::test_MPI_Access_SendRecv" << myrank << endl ; + + ParaMEDMEM::CommInterface interface ; + + ParaMEDMEM::MPIProcessorGroup* group = new ParaMEDMEM::MPIProcessorGroup(interface) ; + + ParaMEDMEM::MPIAccess mpi_access( group ) ; + + if ( myrank >= 2 ) { + mpi_access.barrier() ; + delete group ; + return ; + } + + int target = 1 - myrank ; + int sendRequestId[10] ; + int recvRequestId[10] ; + int sts ; + int i ; + for ( i = 0 ; i < 10 ; i++ ) { + int recvbuf ; + int outcount ; + if ( i & 1 ) { + outcount = -1 ; + sts = mpi_access.sendRecv(&i,1,MPI_INT,target, sendRequestId[i], + &recvbuf,1,MPI_INT,target, recvRequestId[i], + &outcount) ; + } + else { + sts = mpi_access.sendRecv(&i,1,MPI_INT,target, sendRequestId[i], + &recvbuf,1,MPI_INT,target, recvRequestId[i]) ; +// outcount = mpi_access.MPIOutCount( recvRequestId[i] ) ; + outcount = 1 ; + } + cout << "test" << myrank << " Send sendRequestId " << sendRequestId[i] + << " tag " << mpi_access.sendMPITag(target) + << " recvRequestId " << recvRequestId[i] + << " tag " << mpi_access.recvMPITag(target) + << " outcount " << outcount << " MPIOutCount " + << mpi_access.MPIOutCount( recvRequestId[i] ) << endl ; + if ( (outcount != 1) | (recvbuf != i) ) { + ostringstream strstream ; + strstream << "===========================================================" + << "test" << myrank << " outcount " << outcount + << " recvbuf " << recvbuf << " KO" + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + char msgerr[MPI_MAX_ERROR_STRING] ; + int lenerr ; + mpi_access.errorString(sts, msgerr, &lenerr) ; + cout << "test" << myrank << " lenerr " << lenerr << " " + << msgerr << endl ; + + if ( sts != MPI_SUCCESS ) { + ostringstream strstream ; + strstream << "===========================================================" + << "test" << myrank << " KO" + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + mpi_access.check() ; + } + + int flag ; + mpi_access.testAll(10,sendRequestId,flag) ; + if ( !flag ) { + ostringstream strstream ; + strstream << "test" << myrank << " flag " << flag << " KO" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + mpi_access.waitAll(10,sendRequestId) ; + mpi_access.testAll(10,recvRequestId,flag) ; + if ( !flag ) { + ostringstream strstream ; + strstream << "test" << myrank << " flag " << flag << " KO" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + mpi_access.waitAll(10,recvRequestId) ; + mpi_access.check() ; + + int sendrequests[10] ; + int sendreqsize = mpi_access.sendRequestIds( target , 10 , sendrequests ) ; + if ( sendreqsize != 0 ) { + ostringstream strstream ; + strstream << "=========================================================" << endl + << "test" << myrank << " sendreqsize " << sendreqsize << " KO" << endl + << "=========================================================" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + int recvrequests[10] ; + int recvreqsize = mpi_access.sendRequestIds( target , 10 , recvrequests ) ; + if ( recvreqsize != 0 ) { + ostringstream strstream ; + strstream << "=========================================================" << endl + << "test" << myrank << " recvreqsize " << recvreqsize << " KO" << endl + << "=========================================================" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + + mpi_access.barrier() ; + + delete group ; + +// MPI_Finalize(); + + cout << "test" << myrank << " OK" << endl ; + + return ; +} + + + + diff --git a/src/ParaMEDMEMTest/test_MPI_Access_Send_Recv.cxx b/src/ParaMEDMEMTest/test_MPI_Access_Send_Recv.cxx new file mode 100644 index 000000000..547df625c --- /dev/null +++ b/src/ParaMEDMEMTest/test_MPI_Access_Send_Recv.cxx @@ -0,0 +1,166 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include +#include +#include +#include + +#include "MPIAccessTest.hxx" +#include + +//#include "CommInterface.hxx" +//#include "ProcessorGroup.hxx" +//#include "MPIProcessorGroup.hxx" +#include "MPIAccess.hxx" + +// use this define to enable lines, execution of which leads to Segmentation Fault +#define ENABLE_FAULTS + +// use this define to enable CPPUNIT asserts and fails, showing bugs +#define ENABLE_FORCED_FAILURES + +using namespace std; +using namespace ParaMEDMEM; + +void MPIAccessTest::test_MPI_Access_Send_Recv() { + + cout << "test_MPI_Access_Send_Recv" << endl ; + + int size ; + int myrank ; + MPI_Comm_size(MPI_COMM_WORLD,&size) ; + MPI_Comm_rank(MPI_COMM_WORLD,&myrank) ; + + if ( size < 2 ) { + cout << "test_MPI_Access_Send_Recv must be runned with 2 procs" << endl ; + CPPUNIT_FAIL("test_MPI_Access_Send_Recv must be runned with 2 procs") ; + } + + cout << "test_MPI_Access_Send_Recv" << myrank << endl ; + + ParaMEDMEM::CommInterface interface ; + + ParaMEDMEM::MPIProcessorGroup* group = new ParaMEDMEM::MPIProcessorGroup(interface) ; + + ParaMEDMEM::MPIAccess mpi_access( group ) ; + + if ( myrank >= 2 ) { + mpi_access.barrier() ; + delete group ; + return ; + } + + int target = 1 - myrank ; + int RequestId[10] ; + int sts ; + int i ; + for ( i = 0 ; i < 10 ; i++ ) { + if ( myrank == 0 ) { + sts = mpi_access.send(&i,1,MPI_INT,target, RequestId[i]) ; + cout << "test" << myrank << " Send RequestId " << RequestId[i] + << " tag " << mpi_access.sendMPITag(target) << endl ; + } + else { + int recvbuf ; + int outcount ; + sts = mpi_access.recv(&recvbuf,1,MPI_INT,target, RequestId[i],&outcount) ; + //int source, tag, error, outcount ; + //mpi_access.Status( RequestId[i], source, tag, error, outcount, true) ; + cout << "test" << myrank << " Recv RequestId " << RequestId[i] + << " tag " << mpi_access.recvMPITag(target) + << " outcount " << outcount << endl ; + if ( (outcount != 1) | (recvbuf != i) ) { + ostringstream strstream ; + strstream << "===========================================================" + << "test" << myrank << " outcount " << outcount + << " recvbuf " << recvbuf << " KO" + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + } + char msgerr[MPI_MAX_ERROR_STRING] ; + int lenerr ; + mpi_access.errorString(sts, msgerr, &lenerr) ; + cout << "test" << myrank << " lenerr " << lenerr << " " + << msgerr << endl ; + + if ( sts != MPI_SUCCESS ) { + ostringstream strstream ; + strstream << "===========================================================" + << "test" << myrank << " KO" + << "===========================================================" + << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + mpi_access.check() ; + } + int flag ; + mpi_access.testAll(10,RequestId,flag) ; + if ( !flag ) { + ostringstream strstream ; + strstream << "test" << myrank << " flag " << flag << " KO" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + mpi_access.waitAll(10,RequestId) ; + mpi_access.check() ; + + if ( myrank == 0 ) { + int sendrequests[10] ; + int sendreqsize = mpi_access.sendRequestIds( target , 10 , sendrequests ) ; + if ( sendreqsize != 0 ) { + ostringstream strstream ; + strstream << "=========================================================" << endl + << "test" << myrank << " sendreqsize " << sendreqsize << " KO" << endl + << "=========================================================" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + } + else { + int recvrequests[10] ; + int recvreqsize = mpi_access.sendRequestIds( target , 10 , recvrequests ) ; + if ( recvreqsize != 0 ) { + ostringstream strstream ; + strstream << "=========================================================" << endl + << "test" << myrank << " recvreqsize " << recvreqsize << " KO" << endl + << "=========================================================" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + } + + mpi_access.barrier() ; + + delete group ; + +// MPI_Finalize(); + + cout << "test" << myrank << " OK" << endl ; + + return ; +} + + + + diff --git a/src/ParaMEDMEMTest/test_MPI_Access_Send_Recv_Length.cxx b/src/ParaMEDMEMTest/test_MPI_Access_Send_Recv_Length.cxx new file mode 100644 index 000000000..3e034b661 --- /dev/null +++ b/src/ParaMEDMEMTest/test_MPI_Access_Send_Recv_Length.cxx @@ -0,0 +1,190 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include +#include +#include +#include + +#include "MPIAccessTest.hxx" +#include + +//#include "CommInterface.hxx" +//#include "ProcessorGroup.hxx" +//#include "MPIProcessorGroup.hxx" +#include "MPIAccess.hxx" + +// use this define to enable lines, execution of which leads to Segmentation Fault +#define ENABLE_FAULTS + +// use this define to enable CPPUNIT asserts and fails, showing bugs +#define ENABLE_FORCED_FAILURES + +using namespace std; +using namespace ParaMEDMEM; + +void MPIAccessTest::test_MPI_Access_Send_Recv_Length() { + + cout << "test_MPI_Access_Send_Recv_Length" << endl ; + +// MPI_Init(&argc, &argv) ; + + int size ; + int myrank ; + MPI_Comm_size(MPI_COMM_WORLD,&size) ; + MPI_Comm_rank(MPI_COMM_WORLD,&myrank) ; + + if ( size < 2 ) { + ostringstream strstream ; + strstream << "test_MPI_Access_Send_Recv_Length must be runned with 2 procs" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + + cout << "test_MPI_Access_Send_Recv_Length" << myrank << endl ; + + ParaMEDMEM::CommInterface interface ; + + ParaMEDMEM::MPIProcessorGroup* group = new ParaMEDMEM::MPIProcessorGroup(interface) ; + + ParaMEDMEM::MPIAccess mpi_access( group ) ; + + if ( myrank >= 2 ) { + mpi_access.barrier() ; + delete group ; + return ; + } + + int target = 1 - myrank ; + int RequestId[10] ; + int sendbuf[9000] ; + int recvbuf[9000] ; + bool recvbufok ; + int sts ; + int i , j ; + for ( i = 0 ; i < 9000 ; i++ ) { + sendbuf[i] = i ; + } + for ( i = 0 ; i < 10 ; i++ ) { + if ( myrank == 0 ) { + sts = mpi_access.send( sendbuf, 1000*i, MPI_INT, target, RequestId[i] ) ; + cout << "test" << myrank << " Send RequestId " << RequestId[i] + << " tag " << mpi_access.sendMPITag(target) << endl ; + } + else { + sts = MPI_SUCCESS ; + RequestId[i] = -1 ; + int outcount = 0 ; + if ( i != 0 ) { + sts = mpi_access.recv( recvbuf,1000*i+1,MPI_INT,target, RequestId[i], + &outcount ) ; + } + //int source, tag, error, outcount ; + //mpi_access.Status( RequestId[i], source, tag, error, outcount, true) ; + cout << "test" << myrank << " Recv RequestId " << RequestId[i] + << " tag " << mpi_access.recvMPITag(target) + << " outcount " << outcount << endl ; + recvbufok = true ; + for ( j = 0 ; j < outcount ; j++ ) { + if ( recvbuf[j] != j ) { + cout << "test" << myrank << " recvbuf[ " << j << " ] = " << recvbuf[j] + << endl ; + recvbufok = false ; + break ; + } + } + if ( (outcount != 1000*i) | !recvbufok ) { + ostringstream strstream ; + strstream << "===========================================================" + << endl << "test" << myrank << " outcount " << outcount + << " recvbuf " << recvbuf << " KO" + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + } + char msgerr[MPI_MAX_ERROR_STRING] ; + int lenerr ; + mpi_access.errorString(sts, msgerr, &lenerr) ; + cout << "test" << myrank << " lenerr " << lenerr << " " + << msgerr << endl ; + + if ( sts != MPI_SUCCESS ) { + ostringstream strstream ; + strstream << "===========================================================" + << "test" << myrank << " KO" + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + mpi_access.check() ; + } + int flag ; + mpi_access.testAll(10,RequestId,flag) ; + if ( !flag ) { + ostringstream strstream ; + strstream << "test" << myrank << " flag " << flag << " KO" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + mpi_access.waitAll(10,RequestId) ; + mpi_access.check() ; + + if ( myrank == 0 ) { + int sendrequests[10] ; + int sendreqsize = mpi_access.sendRequestIds( target , 10 , sendrequests ) ; + if ( sendreqsize != 0 ) { + ostringstream strstream ; + strstream << "=========================================================" << endl + << "test" << myrank << " sendreqsize " << sendreqsize << " KO" << endl + << "=========================================================" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + } + else { + int recvrequests[10] ; + int recvreqsize = mpi_access.sendRequestIds( target , 10 , recvrequests ) ; + if ( recvreqsize != 0 ) { + ostringstream strstream ; + strstream << "=========================================================" << endl + << "test" << myrank << " recvreqsize " << recvreqsize << " KO" << endl + << "=========================================================" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + } + + mpi_access.barrier() ; + + delete group ; + +// MPI_Finalize(); + + cout << "test" << myrank << " OK" << endl ; + + return ; +} + + + + diff --git a/src/ParaMEDMEMTest/test_MPI_Access_Time.cxx b/src/ParaMEDMEMTest/test_MPI_Access_Time.cxx new file mode 100644 index 000000000..d8e89e555 --- /dev/null +++ b/src/ParaMEDMEMTest/test_MPI_Access_Time.cxx @@ -0,0 +1,290 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include +#include +#include +#include + +#include "MPIAccessTest.hxx" +#include + +//#include "CommInterface.hxx" +//#include "ProcessorGroup.hxx" +//#include "MPIProcessorGroup.hxx" +#include "MPIAccess.hxx" + +// use this define to enable lines, execution of which leads to Segmentation Fault +#define ENABLE_FAULTS + +// use this define to enable CPPUNIT asserts and fails, showing bugs +#define ENABLE_FORCED_FAILURES + +using namespace std; +using namespace ParaMEDMEM; + +void MPIAccessTest::test_MPI_Access_Time() { + + cout << "test_MPI_Access_Time" << endl ; + + // MPI_Init(&argc, &argv) ; + + int size ; + int myrank ; + MPI_Comm_size(MPI_COMM_WORLD,&size) ; + MPI_Comm_rank(MPI_COMM_WORLD,&myrank) ; + + if ( size < 2 ) { + ostringstream strstream ; + strstream << "test_MPI_Access_Time must be runned with 2 procs" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + + cout << "test_MPI_Access_Time" << myrank << endl ; + + ParaMEDMEM::CommInterface interface ; + + ParaMEDMEM::MPIProcessorGroup* group = new ParaMEDMEM::MPIProcessorGroup(interface) ; + + ParaMEDMEM::MPIAccess mpi_access( group ) ; + +#define maxreq 10 + + if ( myrank >= 2 ) { + cout << "test_MPI_Access_Time_0 rank" << myrank << " --> mpi_access->Barrier" << endl ; + mpi_access.barrier() ; + cout << "test_MPI_Access_Time_0 rank" << myrank << " <-- mpi_access->Barrier" << endl ; + delete group ; + cout << "test_MPI_Access_Time" << myrank << " OK" << endl ; + return ; + } + + int target = 1 - myrank ; + int SendTimeRequestId[maxreq] ; + int RecvTimeRequestId[maxreq] ; + int SendRequestId[maxreq] ; + int RecvRequestId[maxreq] ; + int sts ; + int sendbuf[maxreq] ; + int recvbuf[maxreq] ; + int i = 0 ; + ParaMEDMEM::TimeMessage aSendTimeMsg[maxreq] ; + ParaMEDMEM::TimeMessage aRecvTimeMsg[maxreq] ; + double t ; + double dt = 1. ; + double maxt = 10. ; + for ( t = 0 ; t < maxt ; t = t+dt ) { + if ( myrank == 0 ) { + aSendTimeMsg[i].time = t ; + aSendTimeMsg[i].deltatime = dt ; + //aSendTimeMsg[i].maxtime = maxt ; + //sts = mpi_access.ISend( &aSendTimeMsg , mpi_access.timeExtent() , + sts = mpi_access.ISend( &aSendTimeMsg[i] , 1 , + mpi_access.timeType() , target , + SendTimeRequestId[i]) ; + cout << "test" << myrank << " ISend RequestId " << SendTimeRequestId[i] + << " tag " << mpi_access.sendMPITag(target) << endl ; + sendbuf[i] = i ; + sts = mpi_access.ISend(&sendbuf[i],1,MPI_INT,target, SendRequestId[i]) ; + cout << "test" << myrank << " ISend RequestId " << SendRequestId[i] + << " tag " << mpi_access.sendMPITag(target) << endl ; + } + else { + //sts = mpi_access.IRecv( &aRecvTimeMsg , mpi_access.timeExtent() , + sts = mpi_access.IRecv( &aRecvTimeMsg[i] , 1 , + mpi_access.timeType() , target , + RecvTimeRequestId[i]) ; + cout << "test" << myrank << " IRecv RequestId " << RecvTimeRequestId[i] + << " tag " << mpi_access.recvMPITag(target) << endl ; + sts = mpi_access.IRecv(&recvbuf[i],1,MPI_INT,target, RecvRequestId[i]) ; + cout << "test" << myrank << " IRecv RequestId " << RecvRequestId[i] + << " tag " << mpi_access.recvMPITag(target) << endl ; + } + int j ; + for (j = 0 ; j <= i ; j++) { + int flag ; + if ( myrank == 0 ) { + mpi_access.test( SendTimeRequestId[j], flag ) ; + } + else { + mpi_access.test( RecvTimeRequestId[j], flag ) ; + } + if ( flag ) { + int target,source, tag, error, outcount ; + if ( myrank == 0 ) { + mpi_access.status( SendTimeRequestId[j], target, tag, error, outcount, + true ) ; + cout << "test" << myrank << " Test(Send TimeRequestId " << SendTimeRequestId[j] + << ") : target " << target << " tag " << tag << " error " << error + << " flag " << flag << aSendTimeMsg[j] << endl ; + } + else { + mpi_access.status( RecvTimeRequestId[j], source, tag, error, outcount, + true ) ; + cout << "test" << myrank << " Test(Recv TimeRequestId " + << RecvTimeRequestId[j] << ") : source " << source << " tag " << tag + << " error " << error << " outcount " << outcount + << " flag " << flag << aRecvTimeMsg[j] << endl ; + if ( (outcount != 1) | (aRecvTimeMsg[j].time != j) ) { + ostringstream strstream ; + strstream << "===========================================================" + << endl << "test" << myrank << " outcount " << outcount << " KO" + << " RecvTimeRequestId " << RecvTimeRequestId[j] << endl + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "===========================================================" + << endl << "test" << myrank << " outcount " << outcount + << " RecvTimeRequestId " << RecvTimeRequestId[j] << " OK" << endl + << "===========================================================" + << endl ; + } + } + } + if ( myrank == 0 ) { + mpi_access.test( SendRequestId[j], flag ) ; + } + else { + mpi_access.test( RecvRequestId[j], flag ) ; + } + if ( flag ) { + int target,source, tag, error, outcount ; + if ( myrank == 0 ) { + mpi_access.status( SendRequestId[j], target, tag, error, outcount, + true ) ; + cout << "test" << myrank << " Test(Send RequestId " << SendRequestId[j] + << ") : target " << target << " tag " << tag << " error " << error + << " flag " << flag << endl ; + } + else { + mpi_access.status( RecvRequestId[j], source, tag, error, outcount, + true ) ; + cout << "test" << myrank << " Test(Recv RequestId " + << RecvRequestId[j] << ") : source " << source << " tag " << tag + << " error " << error << " outcount " << outcount + << " flag " << flag << endl ; + if ( (outcount != 1) | (recvbuf[j] != j) ) { + ostringstream strstream ; + strstream << "===========================================================" + << endl << "test" << myrank << " outcount " + << outcount << " recvbuf " << recvbuf[j] << " KO" << endl + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "===========================================================" + << endl << "test" << myrank << " outcount " << outcount + << " RequestId " << RecvRequestId[j] << " OK" << endl + << "===========================================================" + << endl ; + } + } + } + } + char msgerr[MPI_MAX_ERROR_STRING] ; + int lenerr ; + mpi_access.errorString(sts, msgerr, &lenerr) ; + cout << "test" << myrank << " lenerr " << lenerr << " " + << msgerr << endl ; + + if ( sts != MPI_SUCCESS ) { + ostringstream strstream ; + strstream << "===========================================================" + << "test" << myrank << " KO" + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + i = i + 1 ; + } + + mpi_access.check() ; + if ( myrank == 0 ) { + mpi_access.waitAll(maxreq, SendTimeRequestId) ; + mpi_access.deleteRequests(maxreq, SendTimeRequestId) ; + mpi_access.waitAll(maxreq, SendRequestId) ; + mpi_access.deleteRequests(maxreq, SendRequestId) ; + } + else { + mpi_access.waitAll(maxreq, RecvTimeRequestId) ; + mpi_access.deleteRequests(maxreq, RecvTimeRequestId) ; + mpi_access.waitAll(maxreq, RecvRequestId) ; + mpi_access.deleteRequests(maxreq, RecvRequestId) ; + } + mpi_access.check() ; + + if ( myrank == 0 ) { + int sendrequests[2*maxreq] ; + int sendreqsize = mpi_access.sendRequestIds( target , 2*maxreq , sendrequests ) ; + if ( sendreqsize != 0 ) { + ostringstream strstream ; + strstream << "=========================================================" << endl + << "test" << myrank << " sendreqsize " << sendreqsize << " KO" << endl + << "=========================================================" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "=========================================================" << endl + << "test" << myrank << " sendreqsize " << sendreqsize << " OK" << endl + << "=========================================================" << endl ; + } + } + else { + int recvrequests[2*maxreq] ; + int recvreqsize = mpi_access.sendRequestIds( target , 2*maxreq , recvrequests ) ; + if ( recvreqsize != 0 ) { + ostringstream strstream ; + strstream << "=========================================================" << endl + << "test" << myrank << " recvreqsize " << recvreqsize << " KO" << endl + << "=========================================================" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "=========================================================" << endl + << "test" << myrank << " recvreqsize " << recvreqsize << " OK" << endl + << "=========================================================" << endl ; + } + } + + cout << "test_MPI_Access_Time_0 rank" << myrank << " --> mpi_access->Barrier" << endl ; + mpi_access.barrier() ; + cout << "test_MPI_Access_Time_0 rank" << myrank << " <-- mpi_access->Barrier" << endl ; + + delete group ; + + // MPI_Finalize(); + + cout << "test_MPI_Access_Time" << myrank << " OK" << endl ; + + return ; +} + + + + diff --git a/src/ParaMEDMEMTest/test_MPI_Access_Time_0.cxx b/src/ParaMEDMEMTest/test_MPI_Access_Time_0.cxx new file mode 100644 index 000000000..087814673 --- /dev/null +++ b/src/ParaMEDMEMTest/test_MPI_Access_Time_0.cxx @@ -0,0 +1,471 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include +#include +#include +#include + +#include "MPIAccessTest.hxx" +#include + +//#include "CommInterface.hxx" +//#include "ProcessorGroup.hxx" +//#include "MPIProcessorGroup.hxx" +#include "MPIAccess.hxx" + +// use this define to enable lines, execution of which leads to Segmentation Fault +#define ENABLE_FAULTS + +// use this define to enable CPPUNIT asserts and fails, showing bugs +#define ENABLE_FORCED_FAILURES + +using namespace std; +using namespace ParaMEDMEM; + +void chksts( int sts , int myrank , ParaMEDMEM::MPIAccess * mpi_access ) { + char msgerr[MPI_MAX_ERROR_STRING] ; + int lenerr ; + if ( sts != MPI_SUCCESS ) { + mpi_access->errorString(sts, msgerr, &lenerr) ; + cout << "test" << myrank << " lenerr " << lenerr << " " + << msgerr << endl ; + ostringstream strstream ; + strstream << "===========================================================" + << "test" << myrank << " KO" + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } +return ; +} + +void MPIAccessTest::test_MPI_Access_Time_0() { + + cout << "test_MPI_Access_Time_0" << endl ; + +// MPI_Init(&argc, &argv) ; + + int size ; + int myrank ; + MPI_Comm_size(MPI_COMM_WORLD,&size) ; + MPI_Comm_rank(MPI_COMM_WORLD,&myrank) ; + + if ( size < 2 ) { + ostringstream strstream ; + strstream << "usage :" << endl + << "mpirun -np test_MPI_Access_Time_0" <= 2 ) { + cout << "test_MPI_Access_Time_0 rank" << myrank << " --> mpi_access->barrier" << endl ; + mpi_access->barrier() ; + cout << "test_MPI_Access_Time_0 rank" << myrank << " <-- mpi_access->barrier" << endl ; + cout << "test_MPI_Access_Time_0 rank" << myrank << " --> mpi_access->barrier" << endl ; + mpi_access->barrier() ; + cout << "test_MPI_Access_Time_0 rank" << myrank << " <-- mpi_access->barrier" << endl ; + delete group ; + delete mpi_access ; + cout << "test_MPI_Access_Time" << myrank << " OK" << endl ; + return ; + } + + int target = 1 - myrank ; + int SendTimeRequestId[maxreq] ; + int RecvTimeRequestId[maxreq] ; + int SendRequestId[maxreq] ; + int RecvRequestId[maxreq] ; + int sts ; + int sendbuf[maxreq] ; + int recvbuf[maxreq] ; + ParaMEDMEM::TimeMessage aSendTimeMsg[maxreq] ; + int lasttime = -1 ; + ParaMEDMEM::TimeMessage RecvTimeMessages[maxreq+1] ; + ParaMEDMEM::TimeMessage *aRecvTimeMsg = &RecvTimeMessages[1] ; +// mpi_access->Trace() ; + int istep = 0 ; + for ( t = 0 ; t < maxt ; t = t+dt[myrank] ) { + cout << "test" << myrank << " ==========================TIME " << t + << " ==========================" << endl ; + if ( myrank == 0 ) { + aSendTimeMsg[istep].time = t ; + aSendTimeMsg[istep].deltatime = dt[myrank] ; + //aSendTimeMsg[istep].maxtime = maxt ; + if ( t+dt[myrank] >= maxt ) { + aSendTimeMsg[istep].deltatime = 0 ; + } + sts = mpi_access->ISend( &aSendTimeMsg[istep] , 1 , + mpi_access->timeType() , target , + SendTimeRequestId[istep]) ; + cout << "test" << myrank << " ISend TimeRequestId " << SendTimeRequestId[istep] + << " tag " << mpi_access->MPITag(SendTimeRequestId[istep]) << endl ; + chksts( sts , myrank , mpi_access ) ; + sendbuf[istep] = istep ; + sts = mpi_access->ISend(&sendbuf[istep],1,MPI_INT,target, SendRequestId[istep]) ; + cout << "test" << myrank << " ISend Data RequestId " << SendRequestId[istep] + << " tag " << mpi_access->MPITag(SendRequestId[istep]) << endl ; + chksts( sts , myrank , mpi_access ) ; +//CheckSent +//========= + int sendrequests[2*maxreq] ; + int sendreqsize = mpi_access->sendRequestIds( target , 2*maxreq , + sendrequests ) ; + int j , flag ; + for ( j = 0 ; j < sendreqsize ; j++ ) { + sts = mpi_access->test( sendrequests[j] , flag ) ; + chksts( sts , myrank , mpi_access ) ; + if ( flag ) { + mpi_access->deleteRequest( sendrequests[j] ) ; + cout << "test" << myrank << " " << j << ". " << sendrequests[j] + << " sendrequest deleted" << endl ; + } + } + } + else { +//InitRecv +//======== + if ( t == 0 ) { + aRecvTimeMsg[lasttime].time = 0 ; + sts = mpi_access->IRecv( &aRecvTimeMsg[lasttime+1] , 1 , + mpi_access->timeType() , + target , RecvTimeRequestId[lasttime+1]) ; + cout << "test" << myrank << " t == 0 IRecv TimeRequestId " + << RecvTimeRequestId[lasttime+1] + << " MPITag " << mpi_access->MPITag( RecvTimeRequestId[lasttime+1] ) + << " MPICompleted " + << mpi_access->MPICompleted( RecvTimeRequestId[lasttime+1] ) << endl ; + chksts( sts , myrank , mpi_access ) ; + } + else { + cout << "test" << myrank << " t # 0 lasttime " << lasttime << endl ; +//InitialOutTime +//============== + bool outtime = false ; + if ( lasttime != -1 ) { + if ( t <= aRecvTimeMsg[lasttime-1].time ) { + ostringstream strstream ; + strstream << "===========================================================" + << endl << "test" << myrank << " t " << t << " <= " + << "aRecvTimeMsg[ " << lasttime << "-1 ].time " + << aRecvTimeMsg[lasttime-1].time << " KO" << endl + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "===========================================================" + << endl << "test" << myrank << " t " << t << " > " + << "aRecvTimeMsg[ " << lasttime << "-1 ].time " + << aRecvTimeMsg[lasttime-1].time << " OK" << endl + << "===========================================================" + << endl ; + } + //outtime = ((aRecvTimeMsg[lasttime].time + + // aRecvTimeMsg[lasttime].deltatime) >= + // aRecvTimeMsg[lasttime].maxtime) ; + outtime = aRecvTimeMsg[lasttime].deltatime == 0 ; + } +// CheckRecv - CheckTime +// On a lasttime tel que : +// aRecvTimeMsg[ lasttime-1 ].time < T(i-1) <= aRecvTimeMsg[ lasttime ].time +// On cherche lasttime tel que : +// aRecvTimeMsg[ lasttime-1 ].time < T(i) <= aRecvTimeMsg[ lasttime ].time + if ( t <= aRecvTimeMsg[lasttime].time ) { + outtime = false ; + } + cout << "test" << myrank << " while outtime( " << outtime << " && t " << t + << " > aRecvTimeMsg[ " << lasttime << " ] " + << aRecvTimeMsg[lasttime].time << " )" << endl ; + while ( !outtime && (t > aRecvTimeMsg[lasttime].time) ) { + lasttime += 1 ; +//TimeMessage +//=========== + sts = mpi_access->wait( RecvTimeRequestId[lasttime] ) ; + chksts( sts , myrank , mpi_access ) ; + cout << "test" << myrank << " Wait done RecvTimeRequestId " + << RecvTimeRequestId[lasttime] << " lasttime " << lasttime + << " tag " << mpi_access->MPITag(RecvTimeRequestId[lasttime]) + << aRecvTimeMsg[lasttime] << endl ; + if ( lasttime == 0 ) { + aRecvTimeMsg[lasttime-1] = aRecvTimeMsg[lasttime] ; + } + mpi_access->deleteRequest( RecvTimeRequestId[lasttime] ) ; + + double deltatime = aRecvTimeMsg[lasttime].deltatime ; + //double maxtime = aRecvTimeMsg[lasttime].maxtime ; + double nexttime = aRecvTimeMsg[lasttime].time + deltatime ; + cout << "test" << myrank << " t " << t << " lasttime " << lasttime + << " deltatime " << deltatime + << " nexttime " << nexttime << endl ; + //if ( nexttime < maxtime && t > nexttime ) { + if ( deltatime != 0 && t > nexttime ) { +//CheckRecv : +//========= + //while ( nexttime < maxtime && t > nexttime ) { + while ( deltatime != 0 && t > nexttime ) { + int source, MPITag, outcount ; + MPI_Datatype datatype ; + sts = mpi_access->probe( target , source, MPITag, datatype, + outcount ) ; + chksts( sts , myrank , mpi_access ) ; +// Cancel DataMessages jusqu'a un TimeMessage + int cancelflag ; + while ( !mpi_access->isTimeMessage( MPITag ) ) { + sts = mpi_access->cancel( source, MPITag, datatype, outcount , + //sts = mpi_access->cancel( source, datatype, outcount , + //RecvRequestId[lasttime] , + cancelflag ) ; + cout << "test" << myrank << " Recv TO CANCEL RequestId " + << RecvRequestId[lasttime] + << " tag " << mpi_access->recvMPITag( target ) + << " cancelflag " << cancelflag << endl ; + chksts( sts , myrank , mpi_access ) ; + sts = mpi_access->probe( target , source, MPITag, datatype, + outcount ) ; + chksts( sts , myrank , mpi_access ) ; + } +//On peut avancer en temps + nexttime += deltatime ; + //if ( nexttime < maxtime && t > nexttime ) { + if ( deltatime != 0 && t > nexttime ) { +// Cancel du TimeMessage + sts = mpi_access->cancel( source, MPITag, datatype, outcount , + //sts = mpi_access->cancel( source, datatype, outcount , + //RecvRequestId[lasttime] , + cancelflag ) ; + cout << "test" << myrank << " Time TO CANCEL RequestId " + << RecvRequestId[lasttime] + << " tag " << mpi_access->recvMPITag( target ) + << " cancelflag " << cancelflag << endl ; + chksts( sts , myrank , mpi_access ) ; + } + } + } + else { +//DoRecv +//====== + cout << "test" << myrank << " Recv target " << target + << " lasttime " << lasttime + << " lasttime-1 " << aRecvTimeMsg[lasttime-1] + << " lasttime " << aRecvTimeMsg[lasttime] + << endl ; + sts = mpi_access->recv(&recvbuf[lasttime],1,MPI_INT,target, + RecvRequestId[lasttime]) ; + cout << "test" << myrank << " Recv RequestId " + << RecvRequestId[lasttime] + << " tag " << mpi_access->recvMPITag( target ) + << endl ; + chksts( sts , myrank , mpi_access ) ; + } + //outtime = ((aRecvTimeMsg[lasttime].time + + // aRecvTimeMsg[lasttime].deltatime) >= + // aRecvTimeMsg[lasttime].maxtime) ; + outtime = aRecvTimeMsg[lasttime].deltatime == 0 ; + if ( !outtime ) { +// Une lecture asynchrone d'un message temps a l'avance + sts = mpi_access->IRecv( &aRecvTimeMsg[lasttime+1] , 1 , + mpi_access->timeType() , target , + RecvTimeRequestId[lasttime+1]) ; + cout << "test" << myrank << " IRecv TimeRequestId " + << RecvTimeRequestId[lasttime+1] << " MPITag " + << mpi_access->MPITag( RecvTimeRequestId[lasttime+1] ) + << " MPICompleted " + << mpi_access->MPICompleted( RecvTimeRequestId[lasttime+1] ) + << endl ; + chksts( sts , myrank , mpi_access ) ; + } + else if ( t <= aRecvTimeMsg[lasttime].time ) { + outtime = false ; + } + } + + //printf("DEBUG t %.15f Msg[lasttime-1] %.15f Msg[lasttime] %.15f \n",t, + // aRecvTimeMsg[lasttime-1].time,aRecvTimeMsg[lasttime].time) ; + if ( ((t <= aRecvTimeMsg[lasttime-1].time) || + (t > aRecvTimeMsg[lasttime].time)) && !outtime ) { + ostringstream strstream ; + strstream << "===========================================================" + << endl << "test" << myrank << " t " << t << " <= " + << "aRecvTimeMsg[ " << lasttime << "-1 ].time " + << aRecvTimeMsg[lasttime-1].time << " ou t " << t << " > " + << "aRecvTimeMsg[ " << lasttime << " ].time " + << aRecvTimeMsg[lasttime].time << endl + << " ou bien outtime " << outtime << " KO RequestTimeIds " + << RecvTimeRequestId[lasttime-1] << " " << RecvTimeRequestId[lasttime] + << " RequestIds " + << RecvRequestId[lasttime-1] << " " << RecvRequestId[lasttime] << endl + << "===========================================================" + << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "===========================================================" + << endl << "test" << myrank + << " aRecvTimeMsg[ " << lasttime << "-1 ].time " + << aRecvTimeMsg[lasttime-1].time << " < t " << t << " <= " + << "aRecvTimeMsg[ " << lasttime << " ].time " + << aRecvTimeMsg[lasttime].time << endl + << " ou bien outtime " << outtime << " OK RequestTimeIds " + << RecvTimeRequestId[lasttime-1] << " " << RecvTimeRequestId[lasttime] + << " RequestIds " + << RecvRequestId[lasttime-1] << " " << RecvRequestId[lasttime] << endl + << "===========================================================" + << endl ; + } + } + } + chksts( sts , myrank , mpi_access ) ; + istep = istep + 1 ; + } + + cout << "test" << myrank << " Barrier :" << endl ; + mpi_access->barrier() ; + + mpi_access->check() ; + + if ( myrank == 0 ) { +//CheckFinalSent +//============== + cout << "test" << myrank << " CheckFinalSent :" << endl ; + int sendrequests[2*maxreq] ; + int sendreqsize = mpi_access->sendRequestIds( target , 2*maxreq , sendrequests ) ; + int j ; + for ( j = 0 ; j < sendreqsize ; j++ ) { + sts = mpi_access->wait( sendrequests[j] ) ; + chksts( sts , myrank , mpi_access ) ; + mpi_access->deleteRequest( sendrequests[j] ) ; + cout << "test" << myrank << " " << j << ". " << sendrequests[j] << " deleted" + << endl ; + } + } + else { + cout << "test" << myrank << " CheckFinalRecv :" << endl ; + int recvrequests[2*maxreq] ; + int recvreqsize = mpi_access->recvRequestIds( target , 2*maxreq , recvrequests ) ; + int cancelflag ; + int j ; + for ( j = 0 ; j < recvreqsize ; j++ ) { + sts = mpi_access->cancel( recvrequests[j] , cancelflag ) ; + chksts( sts , myrank , mpi_access ) ; + mpi_access->deleteRequest( recvrequests[j] ) ; + cout << "test" << myrank << " " << j << ". " << recvrequests[j] << " deleted" + << " cancelflag " << cancelflag << endl ; + } + int source, MPITag, outcount , flag ; + MPI_Datatype datatype ; + sts = mpi_access->IProbe( target , source, MPITag, datatype, + outcount , flag ) ; + chksts( sts , myrank , mpi_access ) ; + while ( flag ) { + sts = mpi_access->cancel( source, MPITag, datatype, outcount , + //sts = mpi_access->cancel( source, datatype, outcount , + //RecvRequestId[lasttime] , + cancelflag ) ; + cout << "test" << myrank << " TO CANCEL RequestId " + << RecvRequestId[lasttime] + << " tag " << mpi_access->recvMPITag( target ) + << " cancelflag " << cancelflag << endl ; + chksts( sts , myrank , mpi_access ) ; + sts = mpi_access->IProbe( target , source, MPITag, datatype, + outcount , flag ) ; + chksts( sts , myrank , mpi_access ) ; + } + } + mpi_access->check() ; + + if ( myrank == 0 ) { + int sendrequests[2*maxreq] ; + int sendreqsize = mpi_access->sendRequestIds( target , 2*maxreq , sendrequests ) ; + if ( sendreqsize != 0 ) { + ostringstream strstream ; + strstream << "=========================================================" << endl + << "test" << myrank << " sendreqsize " << sendreqsize << " KO" << endl + << "=========================================================" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "=========================================================" << endl + << "test" << myrank << " sendreqsize " << sendreqsize << " OK" << endl + << "=========================================================" << endl ; + } + } + else { + int recvrequests[2*maxreq] ; + int recvreqsize = mpi_access->recvRequestIds( target , 2*maxreq , recvrequests ) ; + if ( recvreqsize != 0 ) { + ostringstream strstream ; + strstream << "=========================================================" << endl + << "test" << myrank << " recvreqsize " << recvreqsize << " KO" << endl + << "=========================================================" << endl ; + cout << strstream.str() << endl ; + CPPUNIT_FAIL( strstream.str() ) ; + } + else { + cout << "=========================================================" << endl + << "test" << myrank << " recvreqsize " << recvreqsize << " OK" << endl + << "=========================================================" << endl ; + } + } + + int i ; + for ( i = 0 ; i <= lasttime ; i++ ) { + cout << "test" << myrank << " " << i << ". RecvTimeMsg " + << aRecvTimeMsg[i].time << " recvbuf " << recvbuf[i] << endl ; + } + + cout << "test_MPI_Access_Time_0 rank" << myrank << " --> mpi_access->barrier" << endl ; + mpi_access->barrier() ; + cout << "test_MPI_Access_Time_0 rank" << myrank << " <-- mpi_access->barrier" << endl ; + + delete group ; + delete mpi_access ; + +// MPI_Finalize(); + + cout << "test" << myrank << " OK" << endl ; + + return ; +} + + + + diff --git a/src/ParaMEDMEMTest/test_perf.cxx b/src/ParaMEDMEMTest/test_perf.cxx new file mode 100644 index 000000000..2250280c0 --- /dev/null +++ b/src/ParaMEDMEMTest/test_perf.cxx @@ -0,0 +1,337 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include +#include +#include "ParaMEDMEMTest.hxx" +#include + +#include "CommInterface.hxx" +#include "ProcessorGroup.hxx" +#include "MPIProcessorGroup.hxx" +#include "Topology.hxx" +#include "DEC.hxx" +#include "MxN_Mapping.hxx" +#include "InterpKernelDEC.hxx" +#include "ParaMESH.hxx" +#include "ParaFIELD.hxx" +#include "ComponentTopology.hxx" +#include "ICoCoMEDField.hxx" +#include "MEDLoader.hxx" + +#include +#include + +// use this define to enable lines, execution of which leads to Segmentation Fault +#define ENABLE_FAULTS + +// use this define to enable CPPUNIT asserts and fails, showing bugs +#define ENABLE_FORCED_FAILURES + +#ifndef CLK_TCK +#include +#define CLK_TCK sysconf(_SC_CLK_TCK); +#endif + +using namespace std; +using namespace ParaMEDMEM; + +void testInterpKernelDEC_2D(const string& filename1, const string& meshname1, + const string& filename2, const string& meshname2, + int nproc_source, double epsilon, bool tri, bool all); +void get_time( float *telps, float *tuser, float *tsys, float *tcpu ); + +int main(int argc, char *argv[]) +{ + string filename1, filename2; + string meshname1, meshname2; + int nproc_source=1, rank; + double epsilon=1.e-6; + int count=0; + bool tri=false; + bool all=false; + + MPI_Init(&argc,&argv); + + for(int i=1;i self_procs; + set procs_source; + set procs_target; + + for (int i=0; icontainsMyRank()){ + string master = filename_xml1; + + ostringstream strstream; + if( nproc_source == 1 ) + strstream <getNumberOfCells(); + double *value=parafield->getField()->getArray()->getPointer(); + for(int ielem=0; ielemgetField()); + + dec.attachLocalField(icocofield); + } + + //loading the geometry for the target group + if (target_group->containsMyRank()){ + string master= filename_xml2; + ostringstream strstream; + if( (size-nproc_source) == 1 ) + strstream << master<<".med"; + else + strstream << master<<(rank-nproc_source+1)<<".med"; + ostringstream meshname ; + if( (size-nproc_source) == 1 ) + meshname<< meshname2; + else + meshname<< meshname2<<"_"<incrRef(); + + paramesh=new ParaMESH (mesh,*target_group,"target mesh"); + ParaMEDMEM::ComponentTopology comptopo; + parafield = new ParaFIELD(ON_CELLS,NO_TIME,paramesh, comptopo); + + int nb_local=mesh->getNumberOfCells(); + double *value=parafield->getField()->getArray()->getPointer(); + for(int ielem=0; ielemgetField()); + + dec.attachLocalField(icocofield); + } + + + //attaching a DEC to the source group + double field_before_int; + double field_after_int; + + if (source_group->containsMyRank()){ + field_before_int = parafield->getVolumeIntegral(0,true); + get_time( &telps, &tcpu_u, &tcpu_s, &tcpu ); + dec.synchronize(); + get_time( &telps, &tcpu_u, &tcpu_s, &tcpu ); + if( rank == 0 ) + cout << "SYNCHRONIZE : Telapse = " << telps << " TuserCPU = " << tcpu_u << " TsysCPU = " << tcpu_s << " TCPU = " << tcpu << endl; + cout<<"DEC usage"< + +using namespace ParaMEDMEM; +using namespace ICoCo; + +enum mpi_constants { mpi_comm_world, mpi_comm_self, mpi_double, mpi_int }; +%} + +%include "CommInterface.hxx" +%include "ProcessorGroup.hxx" +%include "DECOptions.hxx" +%include "ParaMESH.hxx" +%include "ParaFIELD.hxx" +%include "MPIProcessorGroup.hxx" +%include "ComponentTopology.hxx" +%include "DEC.hxx" +%include "InterpKernelDEC.hxx" +%include "StructuredCoincidentDEC.hxx" + +%rename(ICoCoMEDField) ICoCo::MEDField; +%include "ICoCoMEDField.hxx" + +%nodefaultctor; + +/* This object can be used only if MED_ENABLE_FVM is defined*/ +#ifdef MED_ENABLE_FVM +class NonCoincidentDEC : public DEC +{ +public: + NonCoincidentDEC(ProcessorGroup& source, ProcessorGroup& target); +}; +#endif + +%extend ParaMEDMEM::ParaMESH +{ + PyObject *getGlobalNumberingCell2() const + { + const int *tmp=self->getGlobalNumberingCell(); + int size=self->getCellMesh()->getNumberOfCells(); + PyObject *ret=PyList_New(size); + for(int i=0;igetGlobalNumberingFace(); + int size=self->getFaceMesh()->getNumberOfCells(); + PyObject *ret=PyList_New(size); + for(int i=0;igetGlobalNumberingNode(); + int size=self->getCellMesh()->getNumberOfNodes(); + PyObject *ret=PyList_New(size); + for(int i=0;i MPI_COMM_WORLD and MPI_COMM_SELF +%typemap(in) MPI_Comm +{ + switch (PyInt_AsLong($input)) + { + case mpi_comm_world: $1 = MPI_COMM_WORLD; break; + case mpi_comm_self: $1 = MPI_COMM_SELF; break; + default: + PyErr_SetString(PyExc_TypeError,"unexpected value of MPI_Comm"); + return NULL; + } +} +// Map mpi_double and mpi_int -> MPI_DOUBLE and MPI_INT +%typemap(in) MPI_Datatype +{ + switch (PyInt_AsLong($input)) + { + case mpi_double: $1 = MPI_DOUBLE; break; + case mpi_int: $1 = MPI_INT; break; + default: + PyErr_SetString(PyExc_TypeError,"unexpected value of MPI_Datatype"); + return NULL; + } +} +// The following code gets inserted into the result python file: +// create needed python symbols +%pythoncode %{ +MPI_COMM_WORLD = mpi_comm_world +MPI_COMM_SELF = mpi_comm_self +MPI_DOUBLE = mpi_double +MPI_INT = mpi_int +%} +//============================================================================================= + +// ============== +// MPI_Comm_size +// ============== +%inline %{ PyObject* MPI_Comm_size(MPI_Comm comm) + { + int res = 0; + int err = MPI_Comm_size(comm, &res); + if ( err != MPI_SUCCESS ) + { + PyErr_SetString(PyExc_RuntimeError,"Erorr in MPI_Comm_size()"); + return NULL; + } + return PyInt_FromLong( res ); + } %} + +// ============== +// MPI_Comm_rank +// ============== +%inline %{ PyObject* MPI_Comm_rank(MPI_Comm comm) + { + int res = 0; + int err = MPI_Comm_rank(comm, &res); + if ( err != MPI_SUCCESS ) + { + PyErr_SetString(PyExc_RuntimeError,"Erorr in MPI_Comm_rank()"); + return NULL; + } + return PyInt_FromLong( res ); + } + %} + +int MPI_Init(int *argc, char ***argv ); +int MPI_Barrier(MPI_Comm comm); +int MPI_Finalize(); + +// ========== +// MPI_Bcast +// ========== + +%inline %{ PyObject* MPI_Bcast(PyObject* buffer, int nb, MPI_Datatype type, int root, MPI_Comm c) + { + // buffer must be a list + if (!PyList_Check(buffer)) + { + PyErr_SetString(PyExc_TypeError, "buffer is expected to be a list"); + return NULL; + } + // check list size + int aSize = PyList_Size(buffer); + if ( aSize != nb ) + { + std::ostringstream stream; stream << "buffer is expected to be of size " << nb; + PyErr_SetString(PyExc_ValueError, stream.str().c_str()); + return NULL; + } + // allocate and fill a buffer + void* aBuf = 0; + int* intBuf = 0; + double* dblBuf = 0; + if ( type == MPI_DOUBLE ) + { + aBuf = (void*) ( dblBuf = new double[ nb ] ); + for ( int i = 0; i < aSize; ++i ) + dblBuf[i] = PyFloat_AS_DOUBLE( PyList_GetItem( buffer, i )); + } + else if ( type == MPI_INT ) + { + aBuf = (void*) ( intBuf = new int[ nb ] ); + for ( int i = 0; i < aSize; ++i ) + intBuf[i] = int( PyInt_AS_LONG( PyList_GetItem( buffer, i ))); + } + else + { + PyErr_SetString(PyExc_TypeError, "Only MPI_DOUBLE and MPI_INT supported"); + return NULL; + } + // call MPI_Bcast + int err = MPI_Bcast(aBuf, nb, type, root, c); + // treat error + if ( err != MPI_SUCCESS ) + { + PyErr_SetString(PyExc_RuntimeError,"Erorr in MPI_Bcast()"); + delete [] intBuf; delete [] dblBuf; + return NULL; + } + // put recieved data into the list + int pyerr = 0; + if ( type == MPI_DOUBLE ) + { + for ( int i = 0; i < aSize && !pyerr; ++i ) + pyerr = PyList_SetItem(buffer, i, PyFloat_FromDouble( dblBuf[i] )); + delete [] dblBuf; + } + else + { + for ( int i = 0; i < aSize && !pyerr; ++i ) + pyerr = PyList_SetItem(buffer, i, PyInt_FromLong( intBuf[i] )); + delete [] intBuf; + } + if ( pyerr ) + { + PyErr_SetString(PyExc_RuntimeError, "Error of PyList_SetItem()"); + return NULL; + } + return PyInt_FromLong( err ); + + } + %} + +%pythoncode %{ +def ParaMEDMEMDataArrayDoublenew(cls,*args): + import _ParaMEDMEM + return _ParaMEDMEM.DataArrayDouble____new___(cls,args) +def ParaMEDMEMDataArrayDoubleIadd(self,*args): + import _ParaMEDMEM + return _ParaMEDMEM.DataArrayDouble____iadd___(self, self, *args) +def ParaMEDMEMDataArrayDoubleIsub(self,*args): + import _ParaMEDMEM + return _ParaMEDMEM.DataArrayDouble____isub___(self, self, *args) +def ParaMEDMEMDataArrayDoubleImul(self,*args): + import _ParaMEDMEM + return _ParaMEDMEM.DataArrayDouble____imul___(self, self, *args) +def ParaMEDMEMDataArrayDoubleIdiv(self,*args): + import _ParaMEDMEM + return _ParaMEDMEM.DataArrayDouble____idiv___(self, self, *args) +def ParaMEDMEMDataArrayDoubleIpow(self,*args): + import _ParaMEDMEM + return _ParaMEDMEM.DataArrayDouble____ipow___(self, self, *args) +def ParaMEDMEMDataArrayDoubleTupleIadd(self,*args): + import _ParaMEDMEM + return _ParaMEDMEM.DataArrayDoubleTuple____iadd___(self, self, *args) +def ParaMEDMEMDataArrayDoubleTupleIsub(self,*args): + import _ParaMEDMEM + return _ParaMEDMEM.DataArrayDoubleTuple____isub___(self, self, *args) +def ParaMEDMEMDataArrayDoubleTupleImul(self,*args): + import _ParaMEDMEM + return _ParaMEDMEM.DataArrayDoubleTuple____imul___(self, self, *args) +def ParaMEDMEMDataArrayDoubleTupleIdiv(self,*args): + import _ParaMEDMEM + return _ParaMEDMEM.DataArrayDoubleTuple____idiv___(self, self, *args) +def ParaMEDMEMMEDCouplingFieldDoublenew(cls,*args): + import _ParaMEDMEM + return _ParaMEDMEM.MEDCouplingFieldDouble____new___(cls,args) +def ParaMEDMEMMEDCouplingFieldDoubleIadd(self,*args): + import _ParaMEDMEM + return _ParaMEDMEM.MEDCouplingFieldDouble____iadd___(self, self, *args) +def ParaMEDMEMMEDCouplingFieldDoubleIsub(self,*args): + import _ParaMEDMEM + return _ParaMEDMEM.MEDCouplingFieldDouble____isub___(self, self, *args) +def ParaMEDMEMMEDCouplingFieldDoubleImul(self,*args): + import _ParaMEDMEM + return _ParaMEDMEM.MEDCouplingFieldDouble____imul___(self, self, *args) +def ParaMEDMEMMEDCouplingFieldDoubleIdiv(self,*args): + import _ParaMEDMEM + return _ParaMEDMEM.MEDCouplingFieldDouble____idiv___(self, self, *args) +def ParaMEDMEMMEDCouplingFieldDoubleIpow(self,*args): + import _ParaMEDMEM + return _ParaMEDMEM.MEDCouplingFieldDouble____ipow___(self, self, *args) +def ParaMEDMEMDataArrayIntnew(cls,*args): + import _ParaMEDMEM + return _ParaMEDMEM.DataArrayInt____new___(cls,args) +def ParaMEDMEMDataArrayIntIadd(self,*args): + import _ParaMEDMEM + return _ParaMEDMEM.DataArrayInt____iadd___(self, self, *args) +def ParaMEDMEMDataArrayIntIsub(self,*args): + import _ParaMEDMEM + return _ParaMEDMEM.DataArrayInt____isub___(self, self, *args) +def ParaMEDMEMDataArrayIntImul(self,*args): + import _ParaMEDMEM + return _ParaMEDMEM.DataArrayInt____imul___(self, self, *args) +def ParaMEDMEMDataArrayIntIdiv(self,*args): + import _ParaMEDMEM + return _ParaMEDMEM.DataArrayInt____idiv___(self, self, *args) +def ParaMEDMEMDataArrayIntImod(self,*args): + import _ParaMEDMEM + return _ParaMEDMEM.DataArrayInt____imod___(self, self, *args) +def ParaMEDMEMDataArrayIntIpow(self,*args): + import _ParaMEDMEM + return _ParaMEDMEM.DataArrayInt____ipow___(self, self, *args) +def ParaMEDMEMDataArrayIntTupleIadd(self,*args): + import _ParaMEDMEM + return _ParaMEDMEM.DataArrayIntTuple____iadd___(self, self, *args) +def ParaMEDMEMDataArrayIntTupleIsub(self,*args): + import _ParaMEDMEM + return _ParaMEDMEM.DataArrayIntTuple____isub___(self, self, *args) +def ParaMEDMEMDataArrayIntTupleImul(self,*args): + import _ParaMEDMEM + return _ParaMEDMEM.DataArrayIntTuple____imul___(self, self, *args) +def ParaMEDMEMDataArrayIntTupleIdiv(self,*args): + import _ParaMEDMEM + return _ParaMEDMEM.DataArrayIntTuple____idiv___(self, self, *args) +def ParaMEDMEMDataArrayIntTupleImod(self,*args): + import _ParaMEDMEM + return _ParaMEDMEM.DataArrayIntTuple____imod___(self, self, *args) +%} + +%include "MEDCouplingFinalize.i" diff --git a/src/ParaMEDMEM_Swig/ParaMEDMEM.typemap b/src/ParaMEDMEM_Swig/ParaMEDMEM.typemap new file mode 100644 index 000000000..80eb7259c --- /dev/null +++ b/src/ParaMEDMEM_Swig/ParaMEDMEM.typemap @@ -0,0 +1,84 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +%include std_set.i +%include std_string.i + +%template() std::set; + +// Creates "int *argc, char ***argv" parameters from input list +%typemap(in) (int *argc, char ***argv) { + int i; + if (!PyList_Check($input)) { + PyErr_SetString(PyExc_ValueError, "Expecting a list"); + return NULL; + } + int aSize = PyList_Size($input); + $1 = &aSize; + char** aStrs = (char **) malloc((aSize+1)*sizeof(char *)); + for (i = 0; i < aSize; i++) { + PyObject *s = PyList_GetItem($input,i); + if (!PyString_Check(s)) { + free(aStrs); + PyErr_SetString(PyExc_ValueError, "List items must be strings"); + return NULL; + } + aStrs[i] = PyString_AsString(s); + } + aStrs[i] = 0; + $2 = &aStrs; +} + +%typemap(freearg) (int *argc, char ***argv) { + if ($2) free(*($2)); +} + +/* MACRO: IN typemap for std::set C++ object */ +%define TYPEMAP_INPUT_SET_BY_VALUE( TYPE ) +{ + /* typemap in for set */ + /* Check if is a list */ + if (PyList_Check($input)) + { + int size = PyList_Size($input); + std::set< TYPE > tmpSet; + + for (int i=0; i < size; i++) + { + PyObject * tmp = PyList_GetItem($input,i); + TYPE elem = PyInt_AsLong(tmp); + tmpSet.insert(elem); + } + $1 = tmpSet; + } + else + { + PyErr_SetString(PyExc_TypeError,"not a list"); + return NULL; + } +} +%enddef + +%typemap(in) std::set +{ + TYPEMAP_INPUT_SET_BY_VALUE( int ) +} +%typecheck(SWIG_TYPECHECK_POINTER) std::set { + $1 = PyList_Check($input) ? 1 : 0; +} diff --git a/src/ParaMEDMEM_Swig/test_InterpKernelDEC.py b/src/ParaMEDMEM_Swig/test_InterpKernelDEC.py new file mode 100755 index 000000000..0d6d6cdb6 --- /dev/null +++ b/src/ParaMEDMEM_Swig/test_InterpKernelDEC.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python +# -*- coding: iso-8859-1 -*- +# Copyright (C) 2007-2015 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +from ParaMEDMEM import * +import sys, os +import unittest +import math + +class ParaMEDMEMBasicsTest(unittest.TestCase): + def testInterpKernelDEC_2D(self): + MPI_Init(sys.argv) + size = MPI_Comm_size(MPI_COMM_WORLD) + rank = MPI_Comm_rank(MPI_COMM_WORLD) + if size != 5: + raise RuntimeError, "Expect MPI_COMM_WORLD size == 5" + print rank + nproc_source = 3 + procs_source = range( nproc_source ) + procs_target = range( size - nproc_source + 1, size) + + interface = CommInterface() + target_group = MPIProcessorGroup(interface, procs_target) + source_group = MPIProcessorGroup(interface, procs_source) + dec = InterpKernelDEC(source_group, target_group) + + mesh =0 + support =0 + paramesh =0 + parafield =0 + icocofield =0 + data_dir = os.environ['MED_ROOT_DIR'] + tmp_dir = os.environ['TMP'] + + if not tmp_dir or len(tmp_dir)==0: + tmp_dir = "/tmp" + pass + + filename_xml1 = os.path.join(data_dir, "share/salome/resources/med/square1_split") + filename_xml2 = os.path.join(data_dir, "share/salome/resources/med/square2_split") + + MPI_Barrier(MPI_COMM_WORLD) + if source_group.containsMyRank(): + filename = filename_xml1 + str(rank+1) + ".med" + meshname = "Mesh_2_" + str(rank+1) + mesh=MEDLoader.ReadUMeshFromFile(filename,meshname,0) + paramesh=ParaMESH(mesh,source_group,"source mesh") + comptopo = ComponentTopology() + parafield = ParaFIELD(ON_CELLS,NO_TIME,paramesh, comptopo) + parafield.getField().setNature(ConservativeVolumic) + nb_local=mesh.getNumberOfCells() + value = [1.0]*nb_local + parafield.getField().setValues(value) + icocofield = ICoCoMEDField(mesh,parafield.getField()) + dec.setMethod("P0") + dec.attachLocalField(icocofield) + pass + else: + filename = filename_xml2 + str(rank - nproc_source + 1) + ".med" + meshname = "Mesh_3_" + str(rank - nproc_source + 1) + mesh=MEDLoader.ReadUMeshFromFile(filename,meshname,0) + paramesh=ParaMESH(mesh,target_group,"target mesh") + comptopo = ComponentTopology() + parafield = ParaFIELD(ON_CELLS,NO_TIME,paramesh, comptopo) + parafield.getField().setNature(ConservativeVolumic) + nb_local=mesh.getNumberOfCells() + value = [0.0]*nb_local + parafield.getField().setValues(value) + icocofield = ICoCoMEDField(mesh,parafield.getField()) + dec.setMethod("P0") + dec.attachLocalField(icocofield) + pass + + if source_group.containsMyRank(): + field_before_int = parafield.getVolumeIntegral(0,True) + dec.synchronize() + dec.setForcedRenormalization(False) + dec.sendData() + dec.recvData() + field_after_int=parafield.getVolumeIntegral(0,True); + self.failUnless(math.fabs(field_after_int-field_before_int)<1e-8) + pass + else: + dec.synchronize() + dec.setForcedRenormalization(False) + dec.recvData() + dec.sendData() + pass + ## end + interface = 0 + target_group = 0 + source_group = 0 + dec = 0 + mesh =0 + support =0 + paramesh =0 + parafield =0 + icocofield =0 + MPI_Barrier(MPI_COMM_WORLD) + MPI_Finalize() + pass + pass + +unittest.main() diff --git a/src/ParaMEDMEM_Swig/test_NonCoincidentDEC.py b/src/ParaMEDMEM_Swig/test_NonCoincidentDEC.py new file mode 100755 index 000000000..acf78aa5e --- /dev/null +++ b/src/ParaMEDMEM_Swig/test_NonCoincidentDEC.py @@ -0,0 +1,144 @@ +#!/usr/bin/env python +# -*- coding: iso-8859-1 -*- +# Copyright (C) 2007-2015 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +from ParaMEDMEM import * +import sys, os + +MPI_Init(sys.argv) + +size = MPI_Comm_size(MPI_COMM_WORLD) +rank = MPI_Comm_rank(MPI_COMM_WORLD) +if size != 5: + raise RuntimeError, "Expect MPI_COMM_WORLD size == 5" + +nproc_source = 3 +procs_source = range( nproc_source ) +procs_target = range( size - nproc_source + 1, size) + +interface = CommInterface() + +target_group = MPIProcessorGroup(interface, procs_target) +source_group = MPIProcessorGroup(interface, procs_source) + +source_mesh= 0 +target_mesh= 0 +parasupport= 0 +mesh = 0 +support = 0 +field = 0 +paramesh = 0 +parafield = 0 +icocofield = 0 + +dec = NonCoincidentDEC(source_group, target_group) + +data_dir = os.environ['MED_ROOT_DIR'] +tmp_dir = os.environ['TMP'] +if tmp_dir == '': + tmp_dir = "/tmp" + pass + +filename_xml1 = data_dir + "/share/salome/resources/med/square1_split" +filename_xml2 = data_dir + "/share/salome/resources/med/square2_split" + +MPI_Barrier(MPI_COMM_WORLD) + +if source_group.containsMyRank(): + + filename = filename_xml1 + str(rank+1) + ".med" + meshname = "Mesh_2_" + str(rank+1) + + mesh = MESH(MED_DRIVER, filename, meshname) + support = SUPPORT(mesh, "all elements", MED_CELL) + paramesh = ParaMESH(mesh, source_group, "source mesh") + + parasupport = UnstructuredParaSUPPORT( support, source_group) + comptopo = ComponentTopology() + + parafield = ParaFIELD(parasupport, comptopo) + + nb_local = support.getNumberOfElements(MED_ALL_ELEMENTS); + + value = [1.0]*nb_local + + parafield.getField().setValue(value) + icocofield = ICoCo_MEDField(paramesh,parafield) + dec.attachLocalField(icocofield,'P0') + pass + +if target_group.containsMyRank(): + + filename = filename_xml2 + str(rank - nproc_source + 1) + ".med" + meshname = "Mesh_3_" + str(rank - nproc_source + 1) + + mesh = MESH(MED_DRIVER, filename, meshname) + support = SUPPORT(mesh, "all elements", MED_CELL) + paramesh = ParaMESH(mesh, target_group, "target mesh") + + parasupport = UnstructuredParaSUPPORT( support, target_group) + comptopo = ComponentTopology() + parafield = ParaFIELD(parasupport, comptopo) + + nb_local = support.getNumberOfElements(MED_ALL_ELEMENTS) + value = [0.0]*nb_local + + parafield.getField().setValue(value) + icocofield = ICoCo_MEDField(paramesh,parafield) + + dec.attachLocalField(icocofield, 'P0') + pass + +field_before_int = [0.0] +field_after_int = [0.0] + +if source_group.containsMyRank(): + + field_before_int = [parafield.getVolumeIntegral(1)] + MPI_Bcast(field_before_int, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); + dec.synchronize() + print "DEC usage" + dec.setForcedRenormalization(False) + + dec.sendData() + pass + +if target_group.containsMyRank(): + + MPI_Bcast(field_before_int, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD) + dec.synchronize() + dec.setForcedRenormalization(False) + dec.recvData() + field_after_int = [parafield.getVolumeIntegral(1)] + pass + +MPI_Bcast(field_before_int, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD) +MPI_Bcast(field_after_int , 1, MPI_DOUBLE, size-1, MPI_COMM_WORLD) + +epsilon = 1e-6 +if abs(field_before_int[0] - field_after_int[0]) > epsilon: + print "Field before is not equal field after: %s != %s"%\ + (field_before_int[0],field_after_int[0]) + pass + + +MPI_Barrier(MPI_COMM_WORLD) +MPI_Finalize() +print "# End of testNonCoincidentDEC" diff --git a/src/ParaMEDMEM_Swig/test_StructuredCoincidentDEC.py b/src/ParaMEDMEM_Swig/test_StructuredCoincidentDEC.py new file mode 100755 index 000000000..90c9aad2f --- /dev/null +++ b/src/ParaMEDMEM_Swig/test_StructuredCoincidentDEC.py @@ -0,0 +1,128 @@ +#!/usr/bin/env python +# -*- coding: iso-8859-1 -*- +# Copyright (C) 2007-2015 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +from ParaMEDMEM import * +import sys, os +import unittest +import math + +class ParaMEDMEMBasicsTest2(unittest.TestCase): + def testStructuredCoincidentDEC(self): + MPI_Init(sys.argv) + # + size = MPI_Comm_size(MPI_COMM_WORLD) + rank = MPI_Comm_rank(MPI_COMM_WORLD) + # + if size < 4: + raise RuntimeError, "Expect MPI_COMM_WORLD size >= 4" + # + interface = CommInterface() + # + self_group = MPIProcessorGroup(interface, rank, rank) + target_group = MPIProcessorGroup(interface, 3, size-1) + source_group = MPIProcessorGroup(interface, 0, 2) + # + mesh = 0 + support = 0 + paramesh = 0 + parafield = 0 + comptopo = 0 + icocofield= 0 + # + data_dir = os.environ['MED_ROOT_DIR'] + tmp_dir = os.environ['TMP'] + if tmp_dir == '': + tmp_dir = "/tmp" + pass + + filename_xml1 = data_dir + "/share/salome/resources/med/square1_split" + filename_2 = data_dir + "/share/salome/resources/med/square1.med" + filename_seq_wr = tmp_dir + "/" + filename_seq_med = tmp_dir + "/myWrField_seq_pointe221.med" + + dec = StructuredCoincidentDEC(source_group, target_group) + MPI_Barrier(MPI_COMM_WORLD) + if source_group.containsMyRank(): + filename = filename_xml1 + str(rank+1) + ".med" + meshname = "Mesh_2_" + str(rank+1) + mesh=MEDLoader.ReadUMeshFromFile(filename,meshname,0) + paramesh=ParaMESH(mesh,source_group,"source mesh") + comptopo=ComponentTopology(6) + parafield=ParaFIELD(ON_CELLS,NO_TIME,paramesh,comptopo) + parafield.getField().setNature(ConservativeVolumic) + nb_local=mesh.getNumberOfCells() + global_numbering=paramesh.getGlobalNumberingCell2() + value = [] + for ielem in range(nb_local): + for icomp in range(6): + value.append(global_numbering[ielem]*6.0+icomp); + pass + pass + parafield.getField().setValues(value) + icocofield = ICoCoMEDField(mesh,parafield.getField()) + dec.setMethod("P0") + dec.attachLocalField(parafield) + dec.synchronize() + dec.sendData() + pass + + if target_group.containsMyRank(): + meshname2 = "Mesh_2" + mesh=MEDLoader.ReadUMeshFromFile(filename_2, meshname2,0) + paramesh=ParaMESH(mesh, self_group, "target mesh") + comptopo=ComponentTopology(6,target_group) + parafield=ParaFIELD(ON_CELLS,NO_TIME,paramesh, comptopo) + parafield.getField().setNature(ConservativeVolumic) + nb_local=mesh.getNumberOfCells() + value = [0.0]*(nb_local*comptopo.nbLocalComponents()) + parafield.getField().setValues(value) + icocofield = ICoCoMEDField(mesh,parafield.getField()) + dec.setMethod("P0") + dec.attachLocalField(parafield) + dec.synchronize() + dec.recvData() + recv_value = parafield.getField().getArray().getValues() + for i in range(nb_local): + first=comptopo.firstLocalComponent() + for icomp in range(comptopo.nbLocalComponents()): + self.failUnless(math.fabs(recv_value[i*comptopo.nbLocalComponents()+icomp]- + (float)(i*6+icomp+first))<1e-12) + pass + pass + pass + comptopo=0 + interface = 0 + mesh =0 + support =0 + paramesh =0 + parafield =0 + icocofield =0 + dec=0 + self_group =0 + target_group = 0 + source_group = 0 + MPI_Barrier(MPI_COMM_WORLD) + MPI_Finalize() + print "End of test StructuredCoincidentDEC" + pass + + +unittest.main() diff --git a/src/RENUMBER/testRenumbering.py b/src/RENUMBER/testRenumbering.py index c18ba6795..5454f1357 100755 --- a/src/RENUMBER/testRenumbering.py +++ b/src/RENUMBER/testRenumbering.py @@ -189,21 +189,9 @@ class RenumberingTest(unittest.TestCase): pass def setUp(self): - srcdir = os.getenv("srcdir") - med_root = os.getenv("MED_ROOT_DIR") - if srcdir: - # make test is being performed - self.dir_renumber="./renumber" - self.dir_mesh = os.path.join( srcdir, "../../resources") - elif med_root: - # hope renumber has been already installed - self.dir_renumber=os.path.join( med_root, "bin/salome/renumber") - self.dir_mesh = os.path.join( med_root, "share/salome/resources/med") - else: - # initial version - self.dir_renumber="../../../MED_INSTALL/bin/salome/renumber" - self.dir_mesh="../../resources" - pass + med_root_dir=os.getenv("MEDTOOL_ROOT_DIR") + self.dir_renumber=os.path.join(med_root_dir, "bin/renumber") + self.dir_mesh=os.path.join(med_root_dir, "share","resources","med") pass pass diff --git a/src/RENUMBER_Swig/CMakeLists.txt b/src/RENUMBER_Swig/CMakeLists.txt index ca5363830..afd126fcb 100644 --- a/src/RENUMBER_Swig/CMakeLists.txt +++ b/src/RENUMBER_Swig/CMakeLists.txt @@ -66,9 +66,9 @@ INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/MEDRenumber.py DESTINATION ${MEDTOOL_I INSTALL(FILES MEDRenumber.i MEDRenumberCommon.i DESTINATION ${MEDTOOL_INSTALL_HEADERS}) INSTALL(FILES MEDRenumberTest.py DESTINATION ${MEDTOOL_INSTALL_SCRIPT_PYTHON}) -#SALOME_GENERATE_TESTS_ENVIRONMENT(tests_env) ADD_TEST(MEDRenumberTest ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/MEDRenumberTest.py) -SET_TESTS_PROPERTIES(MEDRenumberTest PROPERTIES ENVIRONMENT "${tests_env}") +SET(MEDRenumberTest_PYTHONPATH "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}:${CMAKE_CURRENT_BINARY_DIR}/../MEDCoupling_Swig") +SET_TESTS_PROPERTIES(MEDRenumberTest PROPERTIES ENVIRONMENT "${MEDRenumberTest_PYTHONPATH}") # Application tests