#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
-# Copyright (C) 2007-2015 CEA/DEN, EDF R&D
+# Copyright (C) 2007-2024 CEA, EDF
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
#
-from ParaMEDMEM import *
-import sys, os
+from medcoupling import *
+from mpi4py import MPI
+import unittest
+import os
-MPI_Init(sys.argv)
+class ParaMEDMEM_DEC_Tests(unittest.TestCase):
+ def test_NonCoincidentDEC_py(self):
+ size = MPI.COMM_WORLD.size
+ rank = MPI.COMM_WORLD.rank
-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"
+ if size != 5:
+ raise RuntimeError("Expect MPI.MPI_COMM_WORLD size == 5")
-nproc_source = 3
-procs_source = range( nproc_source )
-procs_target = range( size - nproc_source + 1, size)
+ nproc_source = 3
+ procs_source = list(range(nproc_source))
+ procs_target = list(range(size - nproc_source + 1, size))
-interface = CommInterface()
+ interface = CommInterface()
-target_group = MPIProcessorGroup(interface, procs_target)
-source_group = MPIProcessorGroup(interface, procs_source)
+ 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)
-dec = NonCoincidentDEC(source_group, target_group)
+ data_dir = os.path.join(os.environ['MEDCOUPLING_ROOT_DIR'], "share", "resources", "med")
+ if not os.path.isdir(data_dir):
+ data_dir = os.environ.get('MED_RESOURCES_DIR',"::").split(":")[1]
+ tmp_dir = os.environ.get('TMP', "")
+ if tmp_dir == '':
+ tmp_dir = "/tmp"
-data_dir = os.environ['MED_ROOT_DIR']
-tmp_dir = os.environ['TMP']
-if tmp_dir == '':
- tmp_dir = "/tmp"
- pass
+ filename_xml1 = os.path.join(data_dir, "square1_split")
+ filename_xml2 = os.path.join(data_dir, "square2_split")
-filename_xml1 = data_dir + "/share/salome/resources/med/square1_split"
-filename_xml2 = data_dir + "/share/salome/resources/med/square2_split"
+ MPI.COMM_WORLD.Barrier()
-MPI_Barrier(MPI_COMM_WORLD)
-
-if source_group.containsMyRank():
+ if source_group.containsMyRank():
+ filename = filename_xml1 + str(rank+1) + ".med"
+ meshname = "Mesh_2_" + str(rank+1)
- 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")
- 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()
- parasupport = UnstructuredParaSUPPORT( support, source_group)
- comptopo = ComponentTopology()
+ parafield = ParaFIELD(parasupport, comptopo)
- parafield = ParaFIELD(parasupport, comptopo)
+ nb_local = support.getNumberOfElements(MED_ALL_ELEMENTS);
- nb_local = support.getNumberOfElements(MED_ALL_ELEMENTS);
+ value = [1.0]*nb_local
- value = [1.0]*nb_local
+ parafield.getField().setValue(value)
+ icocofield = ICoCoMEDDoubleField(paramesh,parafield)
+ dec.attachLocalField(icocofield,'P0')
+ pass
- 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)
-if target_group.containsMyRank():
+ mesh = MESH(MED_DRIVER, filename, meshname)
+ support = SUPPORT(mesh, "all elements", MED_CELL)
+ paramesh = ParaMESH(mesh, target_group, "target mesh")
- filename = filename_xml2 + str(rank - nproc_source + 1) + ".med"
- meshname = "Mesh_3_" + str(rank - nproc_source + 1)
+ parasupport = UnstructuredParaSUPPORT( support, target_group)
+ comptopo = ComponentTopology()
+ parafield = ParaFIELD(parasupport, comptopo)
- mesh = MESH(MED_DRIVER, filename, meshname)
- support = SUPPORT(mesh, "all elements", MED_CELL)
- paramesh = ParaMESH(mesh, target_group, "target mesh")
+ nb_local = support.getNumberOfElements(MED_ALL_ELEMENTS)
+ value = [0.0]*nb_local
- parasupport = UnstructuredParaSUPPORT( support, target_group)
- comptopo = ComponentTopology()
- parafield = ParaFIELD(parasupport, comptopo)
+ parafield.getField().setValue(value)
+ icocofield = ICoCoMEDDoubleField(paramesh,parafield)
- nb_local = support.getNumberOfElements(MED_ALL_ELEMENTS)
- value = [0.0]*nb_local
+ dec.attachLocalField(icocofield, 'P0')
+ pass
- parafield.getField().setValue(value)
- icocofield = ICoCo_MEDField(paramesh,parafield)
+ field_before_int = [0.0]
+ field_after_int = [0.0]
- dec.attachLocalField(icocofield, 'P0')
- pass
+ if source_group.containsMyRank():
+ field_before_int = [parafield.getVolumeIntegral(1)]
+ MPI.MPI_Bcast(field_before_int, 1, MPI.MPI_DOUBLE, 0, MPI.MPI_COMM_WORLD);
+ dec.synchronize()
+ print("DEC usage")
+ dec.setForcedRenormalization(False)
+ dec.sendData()
+ pass
-field_before_int = [0.0]
-field_after_int = [0.0]
+ if target_group.containsMyRank():
+ MPI.MPI_Bcast(field_before_int, 1, MPI.MPI_DOUBLE, 0, MPI.MPI_COMM_WORLD)
+ dec.synchronize()
+ dec.setForcedRenormalization(False)
+ dec.recvData()
+ field_after_int = [parafield.getVolumeIntegral(1)]
+ pass
-if source_group.containsMyRank():
+ MPI.MPI_Bcast(field_before_int, 1, MPI.MPI_DOUBLE, 0, MPI.MPI_COMM_WORLD)
+ MPI.MPI_Bcast(field_after_int , 1, MPI.MPI_DOUBLE, size-1, MPI.MPI_COMM_WORLD)
- 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)
+ epsilon = 1e-6
+ self.assertDoubleEquals(field_before_int[0], field_after_int[0], epsilon)
- dec.sendData()
- pass
-
-if target_group.containsMyRank():
+ # Some clean up that still needs MPI communication, so to be done before MPI_Finalize()
+ dec.release()
+ target_group.release()
+ source_group.release()
- 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.COMM_WORLD.Barrier()
+ MPI.Finalize()
-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)
+if __name__ == "__main__":
+ unittest.main()
-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"